Add row action buttons to table autoscreens
This commit is contained in:
parent
82a727ae88
commit
624e13a49c
|
@ -213,7 +213,7 @@ export const getComponentText = component => {
|
||||||
return component._instanceName
|
return component._instanceName
|
||||||
}
|
}
|
||||||
const type =
|
const type =
|
||||||
component._component.replace("@budibase/standard-components/", "") ||
|
component._component?.replace("@budibase/standard-components/", "") ||
|
||||||
"component"
|
"component"
|
||||||
return capitalise(type)
|
return capitalise(type)
|
||||||
}
|
}
|
||||||
|
|
|
@ -103,21 +103,23 @@
|
||||||
|
|
||||||
const createBlankScreen = async ({ route }) => {
|
const createBlankScreen = async ({ route }) => {
|
||||||
const screenTemplates = screenTemplating.blank({ route, screens })
|
const screenTemplates = screenTemplating.blank({ route, screens })
|
||||||
|
|
||||||
const newScreens = await createScreens(screenTemplates)
|
const newScreens = await createScreens(screenTemplates)
|
||||||
loadNewScreen(newScreens[0])
|
loadNewScreen(newScreens[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
const createTableScreen = async type => {
|
const createTableScreen = async type => {
|
||||||
const screenTemplates = selectedTablesAndViews.flatMap(tableOrView =>
|
const screenTemplates = (
|
||||||
screenTemplating.table({
|
await Promise.all(
|
||||||
screens,
|
selectedTablesAndViews.map(tableOrView =>
|
||||||
tableOrView,
|
screenTemplating.table({
|
||||||
type,
|
screens,
|
||||||
permissions: permissions[tableOrView.id],
|
tableOrView,
|
||||||
})
|
type,
|
||||||
)
|
permissions: permissions[tableOrView.id],
|
||||||
|
})
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).flat()
|
||||||
const newScreens = await createScreens(screenTemplates)
|
const newScreens = await createScreens(screenTemplates)
|
||||||
loadNewScreen(newScreens[0])
|
loadNewScreen(newScreens[0])
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,21 +2,22 @@ import inline from "./inline"
|
||||||
import modal from "./modal"
|
import modal from "./modal"
|
||||||
import sidePanel from "./sidePanel"
|
import sidePanel from "./sidePanel"
|
||||||
import newScreen from "./newScreen"
|
import newScreen from "./newScreen"
|
||||||
|
import { getRowActionButtonTemplates } from "templates/rowActions"
|
||||||
|
|
||||||
const createScreen = ({ tableOrView, type, permissions, screens }) => {
|
const createScreen = async ({ tableOrView, type, permissions, screens }) => {
|
||||||
if (type === "inline") {
|
if (type === "inline") {
|
||||||
return inline({ tableOrView, permissions, screens })
|
return await inline({ tableOrView, permissions, screens })
|
||||||
}
|
}
|
||||||
if (type === "modal") {
|
if (type === "modal") {
|
||||||
return modal({ tableOrView, permissions, screens })
|
return await modal({ tableOrView, permissions, screens })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === "sidePanel") {
|
if (type === "sidePanel") {
|
||||||
return sidePanel({ tableOrView, permissions, screens })
|
return await sidePanel({ tableOrView, permissions, screens })
|
||||||
}
|
}
|
||||||
|
|
||||||
if (type === "newScreen") {
|
if (type === "newScreen") {
|
||||||
return newScreen({ tableOrView, permissions, screens })
|
return await newScreen({ tableOrView, permissions, screens })
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(`Unrecognized table type ${type}`)
|
throw new Error(`Unrecognized table type ${type}`)
|
||||||
|
|
|
@ -2,8 +2,9 @@ import { Screen } from "../Screen"
|
||||||
import { Component } from "../../Component"
|
import { Component } from "../../Component"
|
||||||
import { capitalise } from "helpers"
|
import { capitalise } from "helpers"
|
||||||
import getValidRoute from "../getValidRoute"
|
import getValidRoute from "../getValidRoute"
|
||||||
|
import { getRowActionButtonTemplates } from "templates/rowActions"
|
||||||
|
|
||||||
const inline = ({ tableOrView, permissions, screens }) => {
|
const inline = async ({ tableOrView, permissions, screens }) => {
|
||||||
const heading = new Component("@budibase/standard-components/heading")
|
const heading = new Component("@budibase/standard-components/heading")
|
||||||
.instanceName("Table heading")
|
.instanceName("Table heading")
|
||||||
.customProps({
|
.customProps({
|
||||||
|
@ -12,7 +13,7 @@ const inline = ({ tableOrView, permissions, screens }) => {
|
||||||
.gridDesktopColSpan(1, 13)
|
.gridDesktopColSpan(1, 13)
|
||||||
.gridDesktopRowSpan(1, 3)
|
.gridDesktopRowSpan(1, 3)
|
||||||
|
|
||||||
const tableBlock = new Component("@budibase/standard-components/gridblock")
|
let tableBlock = new Component("@budibase/standard-components/gridblock")
|
||||||
.instanceName(`${tableOrView.name} - Table`)
|
.instanceName(`${tableOrView.name} - Table`)
|
||||||
.customProps({
|
.customProps({
|
||||||
table: tableOrView.datasourceSelectFormat,
|
table: tableOrView.datasourceSelectFormat,
|
||||||
|
@ -20,6 +21,17 @@ const inline = ({ tableOrView, permissions, screens }) => {
|
||||||
.gridDesktopColSpan(1, 13)
|
.gridDesktopColSpan(1, 13)
|
||||||
.gridDesktopRowSpan(3, 21)
|
.gridDesktopRowSpan(3, 21)
|
||||||
|
|
||||||
|
// Add row actions to table
|
||||||
|
const rowActionButtons = await getRowActionButtonTemplates({
|
||||||
|
instance: tableBlock.json(),
|
||||||
|
})
|
||||||
|
if (rowActionButtons.length) {
|
||||||
|
tableBlock = tableBlock.customProps({
|
||||||
|
buttons: rowActionButtons,
|
||||||
|
buttonsCollapsed: rowActionButtons.length > 1,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const screenTemplate = new Screen()
|
const screenTemplate = new Screen()
|
||||||
.route(getValidRoute(screens, tableOrView.name, permissions.write))
|
.route(getValidRoute(screens, tableOrView.name, permissions.write))
|
||||||
.instanceName(`${tableOrView.name} - List`)
|
.instanceName(`${tableOrView.name} - List`)
|
||||||
|
|
|
@ -5,8 +5,9 @@ import { makePropSafe as safe } from "@budibase/string-templates"
|
||||||
import { Utils } from "@budibase/frontend-core"
|
import { Utils } from "@budibase/frontend-core"
|
||||||
import { capitalise } from "helpers"
|
import { capitalise } from "helpers"
|
||||||
import getValidRoute from "../getValidRoute"
|
import getValidRoute from "../getValidRoute"
|
||||||
|
import { getRowActionButtonTemplates } from "templates/rowActions"
|
||||||
|
|
||||||
const modal = ({ tableOrView, permissions, screens }) => {
|
const modal = async ({ tableOrView, permissions, screens }) => {
|
||||||
/*
|
/*
|
||||||
Create Row
|
Create Row
|
||||||
*/
|
*/
|
||||||
|
@ -56,7 +57,7 @@ const modal = ({ tableOrView, permissions, screens }) => {
|
||||||
createFormBlock.instanceName("Create row form block").customProps({
|
createFormBlock.instanceName("Create row form block").customProps({
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
labelPosition: "left",
|
labelPosition: "left",
|
||||||
buttonPosition: "top",
|
buttonPosition: "bottom",
|
||||||
actionType: "Create",
|
actionType: "Create",
|
||||||
title: "Create row",
|
title: "Create row",
|
||||||
buttons: Utils.buildFormBlockButtonConfig({
|
buttons: Utils.buildFormBlockButtonConfig({
|
||||||
|
@ -81,23 +82,34 @@ const modal = ({ tableOrView, permissions, screens }) => {
|
||||||
size: "large",
|
size: "large",
|
||||||
})
|
})
|
||||||
|
|
||||||
const editFormBlock = new Component("@budibase/standard-components/formblock")
|
let editFormBlock = new Component("@budibase/standard-components/formblock")
|
||||||
editFormBlock.instanceName("Edit row form block").customProps({
|
.instanceName("Edit row form block")
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
.customProps({
|
||||||
labelPosition: "left",
|
|
||||||
buttonPosition: "top",
|
|
||||||
actionType: "Update",
|
|
||||||
title: "Edit",
|
|
||||||
rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`,
|
|
||||||
buttons: Utils.buildFormBlockButtonConfig({
|
|
||||||
_id: editFormBlock._json._id,
|
|
||||||
showDeleteButton: true,
|
|
||||||
showSaveButton: true,
|
|
||||||
saveButtonLabel: "Save",
|
|
||||||
deleteButtonLabel: "Delete",
|
|
||||||
actionType: "Update",
|
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
}),
|
labelPosition: "left",
|
||||||
|
buttonPosition: "bottom",
|
||||||
|
actionType: "Update",
|
||||||
|
title: "Edit",
|
||||||
|
rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Generate button config including row actions
|
||||||
|
let buttons = Utils.buildFormBlockButtonConfig({
|
||||||
|
_id: editFormBlock._json._id,
|
||||||
|
showDeleteButton: true,
|
||||||
|
showSaveButton: true,
|
||||||
|
saveButtonLabel: "Save",
|
||||||
|
deleteButtonLabel: "Delete",
|
||||||
|
actionType: "Update",
|
||||||
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
|
})
|
||||||
|
const rowActionButtons = await getRowActionButtonTemplates({
|
||||||
|
instance: editFormBlock.json(),
|
||||||
|
})
|
||||||
|
buttons = [...(buttons || []), ...rowActionButtons]
|
||||||
|
editFormBlock = editFormBlock.customProps({
|
||||||
|
buttons,
|
||||||
|
buttonsCollapsed: buttons.length > 5,
|
||||||
})
|
})
|
||||||
|
|
||||||
detailsModal.addChild(editFormBlock)
|
detailsModal.addChild(editFormBlock)
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { capitalise } from "helpers"
|
||||||
import { makePropSafe as safe } from "@budibase/string-templates"
|
import { makePropSafe as safe } from "@budibase/string-templates"
|
||||||
import getValidRoute from "../getValidRoute"
|
import getValidRoute from "../getValidRoute"
|
||||||
import { Helpers } from "@budibase/bbui"
|
import { Helpers } from "@budibase/bbui"
|
||||||
|
import { getRowActionButtonTemplates } from "templates/rowActions"
|
||||||
|
|
||||||
const getTableScreenTemplate = ({
|
const getTableScreenTemplate = ({
|
||||||
route,
|
route,
|
||||||
|
@ -92,7 +93,7 @@ const getTableScreenTemplate = ({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const getUpdateScreenTemplate = ({
|
const getUpdateScreenTemplate = async ({
|
||||||
route,
|
route,
|
||||||
tableScreenRoute,
|
tableScreenRoute,
|
||||||
tableOrView,
|
tableOrView,
|
||||||
|
@ -102,27 +103,11 @@ const getUpdateScreenTemplate = ({
|
||||||
const formId = `${formBlockId}-form`
|
const formId = `${formBlockId}-form`
|
||||||
const repeaterId = `${formBlockId}-repeater`
|
const repeaterId = `${formBlockId}-repeater`
|
||||||
|
|
||||||
const backButton = new Component("@budibase/standard-components/button")
|
|
||||||
.instanceName("Back button")
|
|
||||||
.customProps({
|
|
||||||
type: "primary",
|
|
||||||
icon: "ri-arrow-go-back-fill",
|
|
||||||
text: "Back",
|
|
||||||
onClick: [
|
|
||||||
{
|
|
||||||
"##eventHandlerType": "Navigate To",
|
|
||||||
parameters: {
|
|
||||||
type: "url",
|
|
||||||
url: tableScreenRoute,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
|
|
||||||
const deleteButton = new Component("@budibase/standard-components/button")
|
const deleteButton = new Component("@budibase/standard-components/button")
|
||||||
.instanceName("Delete button")
|
.instanceName("Delete button")
|
||||||
.customProps({
|
.customProps({
|
||||||
type: "secondary",
|
type: "warning",
|
||||||
|
quiet: true,
|
||||||
text: "Delete",
|
text: "Delete",
|
||||||
onClick: [
|
onClick: [
|
||||||
{
|
{
|
||||||
|
@ -173,7 +158,7 @@ const getUpdateScreenTemplate = ({
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
|
|
||||||
const updateFormBlock = new Component(
|
let updateFormBlock = new Component(
|
||||||
"@budibase/standard-components/formblock",
|
"@budibase/standard-components/formblock",
|
||||||
formBlockId
|
formBlockId
|
||||||
)
|
)
|
||||||
|
@ -181,12 +166,22 @@ const getUpdateScreenTemplate = ({
|
||||||
.customProps({
|
.customProps({
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
labelPosition: "left",
|
labelPosition: "left",
|
||||||
buttonPosition: "top",
|
buttonPosition: "bottom",
|
||||||
actionType: "Update",
|
actionType: "Update",
|
||||||
title: `Update ${tableOrView.name} row`,
|
title: `Update ${tableOrView.name} row`,
|
||||||
buttons: [backButton.json(), saveButton.json(), deleteButton.json()],
|
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// Generate button config including row actions
|
||||||
|
let buttons = [saveButton.json(), deleteButton.json()]
|
||||||
|
const rowActionButtons = await getRowActionButtonTemplates({
|
||||||
|
instance: updateFormBlock.json(),
|
||||||
|
})
|
||||||
|
buttons = [...(buttons || []), ...rowActionButtons]
|
||||||
|
updateFormBlock = updateFormBlock.customProps({
|
||||||
|
buttons,
|
||||||
|
buttonsCollapsed: buttons.length > 5,
|
||||||
|
})
|
||||||
|
|
||||||
const template = new Screen()
|
const template = new Screen()
|
||||||
.route(route)
|
.route(route)
|
||||||
.instanceName(`Update row`)
|
.instanceName(`Update row`)
|
||||||
|
@ -210,23 +205,6 @@ const getCreateScreenTemplate = ({
|
||||||
const formBlockId = Helpers.uuid()
|
const formBlockId = Helpers.uuid()
|
||||||
const formId = `${formBlockId}-form`
|
const formId = `${formBlockId}-form`
|
||||||
|
|
||||||
const backButton = new Component("@budibase/standard-components/button")
|
|
||||||
.instanceName("Back button")
|
|
||||||
.customProps({
|
|
||||||
type: "primary",
|
|
||||||
icon: "ri-arrow-go-back-fill",
|
|
||||||
text: "Back",
|
|
||||||
onClick: [
|
|
||||||
{
|
|
||||||
"##eventHandlerType": "Navigate To",
|
|
||||||
parameters: {
|
|
||||||
type: "url",
|
|
||||||
url: tableScreenRoute,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
|
|
||||||
const saveButton = new Component("@budibase/standard-components/button")
|
const saveButton = new Component("@budibase/standard-components/button")
|
||||||
.instanceName("Save button")
|
.instanceName("Save button")
|
||||||
.customProps({
|
.customProps({
|
||||||
|
@ -264,10 +242,10 @@ const getCreateScreenTemplate = ({
|
||||||
.customProps({
|
.customProps({
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
labelPosition: "left",
|
labelPosition: "left",
|
||||||
buttonPosition: "top",
|
buttonPosition: "bottom",
|
||||||
actionType: "Create",
|
actionType: "Create",
|
||||||
title: `Create ${tableOrView.name} row`,
|
title: `Create ${tableOrView.name} row`,
|
||||||
buttons: [backButton.json(), saveButton.json()],
|
buttons: [saveButton.json()],
|
||||||
})
|
})
|
||||||
|
|
||||||
const template = new Screen()
|
const template = new Screen()
|
||||||
|
@ -284,7 +262,7 @@ const getCreateScreenTemplate = ({
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const newScreen = ({ tableOrView, permissions, screens }) => {
|
const newScreen = async ({ tableOrView, permissions, screens }) => {
|
||||||
const tableScreenRoute = getValidRoute(
|
const tableScreenRoute = getValidRoute(
|
||||||
screens,
|
screens,
|
||||||
tableOrView.name,
|
tableOrView.name,
|
||||||
|
@ -312,7 +290,7 @@ const newScreen = ({ tableOrView, permissions, screens }) => {
|
||||||
gridLayout: true,
|
gridLayout: true,
|
||||||
})
|
})
|
||||||
|
|
||||||
const updateScreenTemplate = getUpdateScreenTemplate({
|
const updateScreenTemplate = await getUpdateScreenTemplate({
|
||||||
route: updateScreenRoute,
|
route: updateScreenRoute,
|
||||||
tableScreenRoute,
|
tableScreenRoute,
|
||||||
tableOrView,
|
tableOrView,
|
||||||
|
|
|
@ -5,8 +5,9 @@ import { makePropSafe as safe } from "@budibase/string-templates"
|
||||||
import { Utils } from "@budibase/frontend-core"
|
import { Utils } from "@budibase/frontend-core"
|
||||||
import { capitalise } from "helpers"
|
import { capitalise } from "helpers"
|
||||||
import getValidRoute from "../getValidRoute"
|
import getValidRoute from "../getValidRoute"
|
||||||
|
import { getRowActionButtonTemplates } from "templates/rowActions"
|
||||||
|
|
||||||
const sidePanel = ({ tableOrView, permissions, screens }) => {
|
const sidePanel = async ({ tableOrView, permissions, screens }) => {
|
||||||
/*
|
/*
|
||||||
Create Row
|
Create Row
|
||||||
*/
|
*/
|
||||||
|
@ -54,7 +55,7 @@ const sidePanel = ({ tableOrView, permissions, screens }) => {
|
||||||
createFormBlock.instanceName("Create row form block").customProps({
|
createFormBlock.instanceName("Create row form block").customProps({
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
labelPosition: "left",
|
labelPosition: "left",
|
||||||
buttonPosition: "top",
|
buttonPosition: "bottom",
|
||||||
actionType: "Create",
|
actionType: "Create",
|
||||||
title: "Create row",
|
title: "Create row",
|
||||||
buttons: Utils.buildFormBlockButtonConfig({
|
buttons: Utils.buildFormBlockButtonConfig({
|
||||||
|
@ -77,23 +78,33 @@ const sidePanel = ({ tableOrView, permissions, screens }) => {
|
||||||
"@budibase/standard-components/sidepanel"
|
"@budibase/standard-components/sidepanel"
|
||||||
).instanceName("Edit row side panel")
|
).instanceName("Edit row side panel")
|
||||||
|
|
||||||
const editFormBlock = new Component("@budibase/standard-components/formblock")
|
let editFormBlock = new Component("@budibase/standard-components/formblock")
|
||||||
editFormBlock.instanceName("Edit row form block").customProps({
|
editFormBlock.instanceName("Edit row form block").customProps({
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
labelPosition: "left",
|
labelPosition: "left",
|
||||||
buttonPosition: "top",
|
buttonPosition: "bottom",
|
||||||
actionType: "Update",
|
actionType: "Update",
|
||||||
title: "Edit",
|
title: "Edit",
|
||||||
rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`,
|
rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`,
|
||||||
buttons: Utils.buildFormBlockButtonConfig({
|
})
|
||||||
_id: editFormBlock._json._id,
|
|
||||||
showDeleteButton: true,
|
// Generate button config including row actions
|
||||||
showSaveButton: true,
|
let buttons = Utils.buildFormBlockButtonConfig({
|
||||||
saveButtonLabel: "Save",
|
_id: editFormBlock._json._id,
|
||||||
deleteButtonLabel: "Delete",
|
showDeleteButton: true,
|
||||||
actionType: "Update",
|
showSaveButton: true,
|
||||||
dataSource: tableOrView.tableSelectFormat,
|
saveButtonLabel: "Save",
|
||||||
}),
|
deleteButtonLabel: "Delete",
|
||||||
|
actionType: "Update",
|
||||||
|
dataSource: tableOrView.tableSelectFormat,
|
||||||
|
})
|
||||||
|
const rowActionButtons = await getRowActionButtonTemplates({
|
||||||
|
instance: editFormBlock.json(),
|
||||||
|
})
|
||||||
|
buttons = [...(buttons || []), ...rowActionButtons]
|
||||||
|
editFormBlock = editFormBlock.customProps({
|
||||||
|
buttons,
|
||||||
|
buttonsCollapsed: buttons.length > 5,
|
||||||
})
|
})
|
||||||
|
|
||||||
detailsSidePanel.addChild(editFormBlock)
|
detailsSidePanel.addChild(editFormBlock)
|
||||||
|
|
Loading…
Reference in New Issue