diff --git a/packages/builder/src/builderStore/index.js b/packages/builder/src/builderStore/index.js index dd54dcf13e..ece17cb46f 100644 --- a/packages/builder/src/builderStore/index.js +++ b/packages/builder/src/builderStore/index.js @@ -8,7 +8,6 @@ import { derived, get } from "svelte/store" import { findComponent, findComponentPath } from "./componentUtils" import { RoleUtils } from "@budibase/frontend-core" import { createHistoryStore } from "builderStore/store/history" -import { cloneDeep } from "lodash/fp" export const store = getFrontendStore() export const automationStore = getAutomationStore() @@ -70,14 +69,7 @@ export const selectedComponent = derived( if (!$selectedScreen || !$store.selectedComponentId) { return null } - const selected = findComponent( - $selectedScreen?.props, - $store.selectedComponentId - ) - - const clone = selected ? cloneDeep(selected) : selected - store.actions.components.migrateSettings(clone) - return clone + return findComponent($selectedScreen?.props, $store.selectedComponentId) } ) diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js index 7e510c3d26..a4729b4a8a 100644 --- a/packages/builder/src/builderStore/store/frontend.js +++ b/packages/builder/src/builderStore/store/frontend.js @@ -601,36 +601,6 @@ export const getFrontendStore = () => { // Finally try an external table return validTables.find(table => table.sourceType === DB_TYPE_EXTERNAL) }, - migrateSettings: enrichedComponent => { - const componentPrefix = "@budibase/standard-components" - let migrated = false - - if (enrichedComponent?._component == `${componentPrefix}/formblock`) { - // Use default config if the 'buttons' prop has never been initialised - if (!("buttons" in enrichedComponent)) { - enrichedComponent["buttons"] = - Utils.buildDynamicButtonConfig(enrichedComponent) - migrated = true - } else if (enrichedComponent["buttons"] == null) { - // Ignore legacy config if 'buttons' has been reset by 'resetOn' - const { _id, actionType, dataSource } = enrichedComponent - enrichedComponent["buttons"] = Utils.buildDynamicButtonConfig({ - _id, - actionType, - dataSource, - }) - migrated = true - } - - // Ensure existing Formblocks position their buttons at the top. - if (!("buttonPosition" in enrichedComponent)) { - enrichedComponent["buttonPosition"] = "top" - migrated = true - } - } - - return migrated - }, enrichEmptySettings: (component, opts) => { if (!component?._component) { return @@ -702,6 +672,7 @@ export const getFrontendStore = () => { component[setting.key] = setting.defaultValue } } + // Validate non-empty settings else { if (setting.type === "dataProvider") { @@ -751,9 +722,6 @@ export const getFrontendStore = () => { useDefaultValues: true, }) - // Migrate nested component settings - store.actions.components.migrateSettings(instance) - // Add any extra properties the component needs let extras = {} if (definition.hasChildren) { @@ -877,13 +845,7 @@ export const getFrontendStore = () => { if (!component) { return false } - - // Mutates the fetched component with updates - const updated = patchFn(component, screen) - // Mutates the component with any required settings updates - const migrated = store.actions.components.migrateSettings(component) - - return updated || migrated + return patchFn(component, screen) } await store.actions.screens.patch(patchScreen, screenId) }, @@ -1285,13 +1247,9 @@ export const getFrontendStore = () => { const settings = getComponentSettings(component._component) const updatedSetting = settings.find(setting => setting.key === name) - // Can be a single string or array of strings - const resetFields = settings.filter(setting => { - return ( - name === setting.resetOn || - (Array.isArray(setting.resetOn) && setting.resetOn.includes(name)) - ) - }) + const resetFields = settings.filter( + setting => name === setting.resetOn + ) resetFields?.forEach(setting => { component[setting.key] = null }) @@ -1313,7 +1271,6 @@ export const getFrontendStore = () => { }) } component[name] = value - return true } }, requestEjectBlock: componentId => { @@ -1321,6 +1278,7 @@ export const getFrontendStore = () => { }, handleEjectBlock: async (componentId, ejectedDefinition) => { let nextSelectedComponentId + await store.actions.screens.patch(screen => { const block = findComponent(screen.props, componentId) const parent = findComponentParent(screen.props, componentId) diff --git a/packages/client/manifest.json b/packages/client/manifest.json index 3b99ddb7b5..fdb0ad9db1 100644 --- a/packages/client/manifest.json +++ b/packages/client/manifest.json @@ -6112,32 +6112,54 @@ } ] }, - { - "tag": "style", - "type": "select", - "label": "Button position", - "key": "buttonPosition", - "options": [ - { - "label": "Bottom", - "value": "bottom" - }, - { - "label": "Top", - "value": "top" - } - ], - "defaultValue": "bottom" - }, { "section": true, "name": "Buttons", + "dependsOn": { + "setting": "actionType", + "value": "View", + "invert": true + }, "settings": [ { - "type": "buttonConfiguration", - "key": "buttons", + "type": "text", + "key": "saveButtonLabel", + "label": "Save button", "nested": true, - "resetOn": ["actionType", "dataSource"] + "defaultValue": "Save" + }, + { + "type": "text", + "key": "deleteButtonLabel", + "label": "Delete button", + "nested": true, + "defaultValue": "Delete", + "dependsOn": { + "setting": "actionType", + "value": "Update" + } + }, + { + "type": "url", + "label": "Navigate after button press", + "key": "actionUrl", + "placeholder": "Choose a screen", + "dependsOn": { + "setting": "actionType", + "value": "View", + "invert": true + } + }, + { + "type": "boolean", + "label": "Hide notifications", + "key": "notificationOverride", + "defaultValue": false, + "dependsOn": { + "setting": "actionType", + "value": "View", + "invert": true + } } ] }, diff --git a/packages/client/src/components/app/blocks/TableBlock.svelte b/packages/client/src/components/app/blocks/TableBlock.svelte index c8b6a07e3d..1cb77cb3e5 100644 --- a/packages/client/src/components/app/blocks/TableBlock.svelte +++ b/packages/client/src/components/app/blocks/TableBlock.svelte @@ -5,7 +5,6 @@ import BlockComponent from "components/BlockComponent.svelte" import { makePropSafe as safe } from "@budibase/string-templates" import { enrichSearchColumns, enrichFilter } from "utils/blocks.js" - import { Utils } from "@budibase/frontend-core" export let title export let dataSource @@ -34,7 +33,6 @@ export let notificationOverride const { fetchDatasourceSchema, API } = getContext("sdk") - const component = getContext("component") const stateKey = `ID_${generate()}` let formId @@ -261,25 +259,16 @@ name="Details form block" type="formblock" bind:id={detailsFormBlockId} - context="form-edit" props={{ dataSource, - buttonPosition: "top", - buttons: Utils.buildDynamicButtonConfig({ - _id: $component.id + "-form-edit", - showDeleteButton: deleteLabel !== "", - showSaveButton: true, - saveButtonLabel: sidePanelSaveLabel || "Save", - deleteButtonLabel: deleteLabel, - notificationOverride, - actionType: "Update", - dataSource, - }), + saveButtonLabel: sidePanelSaveLabel || "Save", //always show + deleteButtonLabel: deleteLabel, actionType: "Update", rowId: `{{ ${safe("state")}.${safe(stateKey)} }}`, fields: sidePanelFields || normalFields, title: editTitle, labelPosition: "left", + notificationOverride, }} /> @@ -295,23 +284,16 @@ diff --git a/packages/client/src/components/app/blocks/form/FormBlock.svelte b/packages/client/src/components/app/blocks/form/FormBlock.svelte index f23ecf451d..e4d3b55eff 100644 --- a/packages/client/src/components/app/blocks/form/FormBlock.svelte +++ b/packages/client/src/components/app/blocks/form/FormBlock.svelte @@ -4,31 +4,28 @@ import Block from "components/Block.svelte" import { makePropSafe as safe } from "@budibase/string-templates" import InnerFormBlock from "./InnerFormBlock.svelte" - import { Utils } from "@budibase/frontend-core" export let actionType export let dataSource export let size export let disabled export let fields - export let buttons - export let buttonPosition - export let title export let description + export let showDeleteButton + export let showSaveButton + export let saveButtonLabel + export let deleteButtonLabel export let rowId export let actionUrl export let noRowsMessage export let notificationOverride - // Legacy - export let showDeleteButton - export let showSaveButton - export let saveButtonLabel - export let deleteButtonLabel + // Accommodate old config to ensure delete button does not reappear + $: deleteLabel = showDeleteButton === false ? "" : deleteButtonLabel?.trim() + $: saveLabel = showSaveButton === false ? "" : saveButtonLabel?.trim() const { fetchDatasourceSchema } = getContext("sdk") - const component = getContext("component") const convertOldFieldFormat = fields => { if (!fields) { @@ -101,23 +98,11 @@ fields: fieldsOrDefault, title, description, + saveButtonLabel: saveLabel, + deleteButtonLabel: deleteLabel, schema, repeaterId, notificationOverride, - buttons: - buttons || - Utils.buildDynamicButtonConfig({ - _id: $component.id, - showDeleteButton, - showSaveButton, - saveButtonLabel, - deleteButtonLabel, - notificationOverride, - actionType, - actionUrl, - dataSource, - }), - buttonPosition: buttons ? buttonPosition : "top", } const fetchSchema = async () => { schema = (await fetchDatasourceSchema(dataSource)) || {} diff --git a/packages/client/src/components/app/blocks/form/InnerFormBlock.svelte b/packages/client/src/components/app/blocks/form/InnerFormBlock.svelte index 24d4cfa14c..52ef3ac80c 100644 --- a/packages/client/src/components/app/blocks/form/InnerFormBlock.svelte +++ b/packages/client/src/components/app/blocks/form/InnerFormBlock.svelte @@ -1,18 +1,22 @@