Refactor button definitions, rename button action components and add button manifest
This commit is contained in:
parent
42fb4949ab
commit
ab1e5abd5e
|
@ -19,16 +19,13 @@ import {
|
||||||
convertJSONSchemaToTableSchema,
|
convertJSONSchemaToTableSchema,
|
||||||
getJSONArrayDatasourceSchema,
|
getJSONArrayDatasourceSchema,
|
||||||
} from "./jsonUtils"
|
} from "./jsonUtils"
|
||||||
import { getAvailableActions } from "components/design/PropertiesPanel/PropertyControls/EventsEditor/actions"
|
import ActionDefinitions from "components/design/PropertiesPanel/PropertyControls/ButtonActionEditor/manifest.json"
|
||||||
|
|
||||||
// Regex to match all instances of template strings
|
// Regex to match all instances of template strings
|
||||||
const CAPTURE_VAR_INSIDE_TEMPLATE = /{{([^}]+)}}/g
|
const CAPTURE_VAR_INSIDE_TEMPLATE = /{{([^}]+)}}/g
|
||||||
const CAPTURE_VAR_INSIDE_JS = /\$\("([^")]+)"\)/g
|
const CAPTURE_VAR_INSIDE_JS = /\$\("([^")]+)"\)/g
|
||||||
const CAPTURE_HBS_TEMPLATE = /{{[\S\s]*?}}/g
|
const CAPTURE_HBS_TEMPLATE = /{{[\S\s]*?}}/g
|
||||||
|
|
||||||
// List of all available button actions
|
|
||||||
const AllButtonActions = getAvailableActions(true)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets all bindable data context fields and instance fields.
|
* Gets all bindable data context fields and instance fields.
|
||||||
*/
|
*/
|
||||||
|
@ -375,7 +372,7 @@ export const getButtonContextBindings = (actions, actionId) => {
|
||||||
// Generate bindings for any steps which provide context
|
// Generate bindings for any steps which provide context
|
||||||
let bindings = []
|
let bindings = []
|
||||||
prevActions.forEach((action, idx) => {
|
prevActions.forEach((action, idx) => {
|
||||||
const def = AllButtonActions.find(
|
const def = ActionDefinitions.actions.find(
|
||||||
x => x.name === action["##eventHandlerType"]
|
x => x.name === action["##eventHandlerType"]
|
||||||
)
|
)
|
||||||
if (def.context) {
|
if (def.context) {
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
ActionMenu,
|
ActionMenu,
|
||||||
MenuItem,
|
MenuItem,
|
||||||
} from "@budibase/bbui"
|
} from "@budibase/bbui"
|
||||||
import { getAvailableActions } from "./actions"
|
import { getAvailableActions } from "./index"
|
||||||
import { generate } from "shortid"
|
import { generate } from "shortid"
|
||||||
import { getButtonContextBindings } from "builderStore/dataBinding"
|
import { getButtonContextBindings } from "builderStore/dataBinding"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
import { ActionButton, Button, Drawer } from "@budibase/bbui"
|
import { ActionButton, Button, Drawer } from "@budibase/bbui"
|
||||||
import { createEventDispatcher } from "svelte"
|
import { createEventDispatcher } from "svelte"
|
||||||
import { notifications } from "@budibase/bbui"
|
import { notifications } from "@budibase/bbui"
|
||||||
import EventEditor from "./EventEditor.svelte"
|
import ButtonActionDrawer from "./ButtonActionDrawer.svelte"
|
||||||
import { automationStore } from "builderStore"
|
import { automationStore } from "builderStore"
|
||||||
import { cloneDeep } from "lodash/fp"
|
import { cloneDeep } from "lodash/fp"
|
||||||
|
|
||||||
|
@ -67,7 +67,7 @@
|
||||||
Define what actions to run.
|
Define what actions to run.
|
||||||
</svelte:fragment>
|
</svelte:fragment>
|
||||||
<Button cta slot="buttons" on:click={saveEventData}>Save</Button>
|
<Button cta slot="buttons" on:click={saveEventData}>Save</Button>
|
||||||
<EventEditor
|
<ButtonActionDrawer
|
||||||
slot="body"
|
slot="body"
|
||||||
bind:actions={tmpValue}
|
bind:actions={tmpValue}
|
||||||
eventType={name}
|
eventType={name}
|
|
@ -0,0 +1,13 @@
|
||||||
|
export { default as NavigateTo } from "./NavigateTo.svelte"
|
||||||
|
export { default as SaveRow } from "./SaveRow.svelte"
|
||||||
|
export { default as DeleteRow } from "./DeleteRow.svelte"
|
||||||
|
export { default as ExecuteQuery } from "./ExecuteQuery.svelte"
|
||||||
|
export { default as TriggerAutomation } from "./TriggerAutomation.svelte"
|
||||||
|
export { default as ValidateForm } from "./ValidateForm.svelte"
|
||||||
|
export { default as LogOut } from "./LogOut.svelte"
|
||||||
|
export { default as ClearForm } from "./ClearForm.svelte"
|
||||||
|
export { default as CloseScreenModal } from "./CloseScreenModal.svelte"
|
||||||
|
export { default as ChangeFormStep } from "./ChangeFormStep.svelte"
|
||||||
|
export { default as UpdateState } from "./UpdateState.svelte"
|
||||||
|
export { default as RefreshDataProvider } from "./RefreshDataProvider.svelte"
|
||||||
|
export { default as DuplicateRow } from "./DuplicateRow.svelte"
|
|
@ -0,0 +1,33 @@
|
||||||
|
import * as ActionComponents from "./actions"
|
||||||
|
import { get } from "svelte/store"
|
||||||
|
import { store } from "builderStore"
|
||||||
|
import ActionDefinitions from "./manifest.json"
|
||||||
|
|
||||||
|
// Defines which actions are available to configure in the front end.
|
||||||
|
// Unfortunately the "name" property is used as the identifier so please don't
|
||||||
|
// change them.
|
||||||
|
// The client library removes any spaces when processing actions, so they can
|
||||||
|
// be considered as camel case too.
|
||||||
|
// There is technical debt here to sanitize all these and standardise them
|
||||||
|
// across the packages but it's a breaking change to existing apps.
|
||||||
|
export const getAvailableActions = (getAllActions = false) => {
|
||||||
|
return ActionDefinitions.actions
|
||||||
|
.filter(action => {
|
||||||
|
// Filter down actions to those supported by the current client lib version
|
||||||
|
if (getAllActions || !action.dependsOnFeature) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return get(store).clientFeatures?.[action.dependsOnFeature] === true
|
||||||
|
})
|
||||||
|
.map(action => {
|
||||||
|
// Then enrich the actions with real components
|
||||||
|
return {
|
||||||
|
...action,
|
||||||
|
component: ActionComponents[action.component],
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.filter(action => {
|
||||||
|
// Then strip any old actions for which we don't have constructors
|
||||||
|
return action.component != null
|
||||||
|
})
|
||||||
|
}
|
|
@ -0,0 +1,75 @@
|
||||||
|
{
|
||||||
|
"actions": [
|
||||||
|
{
|
||||||
|
"name": "Save Row",
|
||||||
|
"component": "SaveRow",
|
||||||
|
"context": [
|
||||||
|
{
|
||||||
|
"label": "Saved row",
|
||||||
|
"value": "row"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Duplicate Row",
|
||||||
|
"component": "DuplicateRow",
|
||||||
|
"context": [
|
||||||
|
{
|
||||||
|
"label": "Duplicated row",
|
||||||
|
"value": "row"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Delete Row",
|
||||||
|
"component": "DeleteRow"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Navigate To",
|
||||||
|
"component": "NavigateTo"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Execute Query",
|
||||||
|
"component": "ExecuteQuery",
|
||||||
|
"context": [
|
||||||
|
{
|
||||||
|
"label": "Query result",
|
||||||
|
"value": "result"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Trigger Automation",
|
||||||
|
"component": "TriggerAutomation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Validate Form",
|
||||||
|
"component": "ValidateForm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Log Out",
|
||||||
|
"component": "LogOut"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Clear Form",
|
||||||
|
"component": "ClearForm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Close Screen Modal",
|
||||||
|
"component": "CloseScreenModal"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Change Form Step",
|
||||||
|
"component": "ChangeFormStep"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Refresh Data Provider",
|
||||||
|
"component": "RefreshDataProvider"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Update State",
|
||||||
|
"component": "UpdateState",
|
||||||
|
"dependsOnFeature": "state"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
|
@ -1,103 +0,0 @@
|
||||||
import { store } from "builderStore"
|
|
||||||
import { get } from "svelte/store"
|
|
||||||
|
|
||||||
import NavigateTo from "./NavigateTo.svelte"
|
|
||||||
import SaveRow from "./SaveRow.svelte"
|
|
||||||
import DeleteRow from "./DeleteRow.svelte"
|
|
||||||
import ExecuteQuery from "./ExecuteQuery.svelte"
|
|
||||||
import TriggerAutomation from "./TriggerAutomation.svelte"
|
|
||||||
import ValidateForm from "./ValidateForm.svelte"
|
|
||||||
import LogOut from "./LogOut.svelte"
|
|
||||||
import ClearForm from "./ClearForm.svelte"
|
|
||||||
import CloseScreenModal from "./CloseScreenModal.svelte"
|
|
||||||
import ChangeFormStep from "./ChangeFormStep.svelte"
|
|
||||||
import UpdateStateStep from "./UpdateState.svelte"
|
|
||||||
import RefreshDataProvider from "./RefreshDataProvider.svelte"
|
|
||||||
import DuplicateRow from "./DuplicateRow.svelte"
|
|
||||||
|
|
||||||
// Defines which actions are available to configure in the front end.
|
|
||||||
// Unfortunately the "name" property is used as the identifier so please don't
|
|
||||||
// change them.
|
|
||||||
// The client library removes any spaces when processing actions, so they can
|
|
||||||
// be considered as camel case too.
|
|
||||||
// There is technical debt here to sanitize all these and standardise them
|
|
||||||
// across the packages but it's a breaking change to existing apps.
|
|
||||||
export const getAvailableActions = (getAllActions = false) => {
|
|
||||||
let actions = [
|
|
||||||
{
|
|
||||||
name: "Save Row",
|
|
||||||
component: SaveRow,
|
|
||||||
context: [
|
|
||||||
{
|
|
||||||
label: "Saved row",
|
|
||||||
value: "row",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Duplicate Row",
|
|
||||||
component: DuplicateRow,
|
|
||||||
context: [
|
|
||||||
{
|
|
||||||
label: "Duplicated row",
|
|
||||||
value: "row",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Delete Row",
|
|
||||||
component: DeleteRow,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Navigate To",
|
|
||||||
component: NavigateTo,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Execute Query",
|
|
||||||
component: ExecuteQuery,
|
|
||||||
context: [
|
|
||||||
{
|
|
||||||
label: "Query result",
|
|
||||||
value: "result",
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Trigger Automation",
|
|
||||||
component: TriggerAutomation,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Validate Form",
|
|
||||||
component: ValidateForm,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Log Out",
|
|
||||||
component: LogOut,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Clear Form",
|
|
||||||
component: ClearForm,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Close Screen Modal",
|
|
||||||
component: CloseScreenModal,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Change Form Step",
|
|
||||||
component: ChangeFormStep,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Refresh Data Provider",
|
|
||||||
component: RefreshDataProvider,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
|
|
||||||
if (getAllActions || get(store).clientFeatures?.state) {
|
|
||||||
actions.push({
|
|
||||||
name: "Update State",
|
|
||||||
component: UpdateStateStep,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return actions
|
|
||||||
}
|
|
|
@ -1,2 +0,0 @@
|
||||||
import EventsEditor from "./EventPropertyControl.svelte"
|
|
||||||
export default EventsEditor
|
|
|
@ -1,7 +1,7 @@
|
||||||
import { Checkbox, Select, Stepper } from "@budibase/bbui"
|
import { Checkbox, Select, Stepper } from "@budibase/bbui"
|
||||||
import DataSourceSelect from "./DataSourceSelect.svelte"
|
import DataSourceSelect from "./DataSourceSelect.svelte"
|
||||||
import DataProviderSelect from "./DataProviderSelect.svelte"
|
import DataProviderSelect from "./DataProviderSelect.svelte"
|
||||||
import EventsEditor from "./EventsEditor"
|
import ButtonActionEditor from "./ButtonActionEditor/ButtonActionEditor.svelte"
|
||||||
import TableSelect from "./TableSelect.svelte"
|
import TableSelect from "./TableSelect.svelte"
|
||||||
import ColorPicker from "./ColorPicker.svelte"
|
import ColorPicker from "./ColorPicker.svelte"
|
||||||
import { IconSelect } from "./IconSelect"
|
import { IconSelect } from "./IconSelect"
|
||||||
|
@ -24,7 +24,7 @@ const componentMap = {
|
||||||
dataProvider: DataProviderSelect,
|
dataProvider: DataProviderSelect,
|
||||||
boolean: Checkbox,
|
boolean: Checkbox,
|
||||||
number: Stepper,
|
number: Stepper,
|
||||||
event: EventsEditor,
|
event: ButtonActionEditor,
|
||||||
table: TableSelect,
|
table: TableSelect,
|
||||||
color: ColorPicker,
|
color: ColorPicker,
|
||||||
icon: IconSelect,
|
icon: IconSelect,
|
||||||
|
|
Loading…
Reference in New Issue