diff --git a/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts b/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts new file mode 100644 index 0000000000..114364a765 --- /dev/null +++ b/frontend/src/lib/components/apps/editor/componentsPanel/componentControlUtils.ts @@ -0,0 +1,102 @@ +import { components } from '../component' + +export type ComponentFunction = { + title: string + description: string + example: string + documentation: string +} + +const setTab = { + title: 'setTab', + description: 'Use the setTab function to manually set the tab of a Tab component.', + example: 'setTab(id: string, index: string)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#settab' +} + +const openModal = { + title: 'openModal', + description: 'Use the openModal function to open a modal.', + example: 'openModal(id: string)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#openmodal' +} + +const closeModal = { + title: 'closeModal', + description: 'Use the closeModal function to close a modal.', + example: 'closeModal(id: string)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#closemodal' +} + +const recompute = { + title: 'recompute', + description: 'Use the recompute function to recompute the value of a component.', + example: 'recompute(id: string)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#recompute' +} + +const getAgGrid = { + title: 'getAgGrid', + description: 'Use the getAgGrid function to get the ag-grid instance of a table.', + example: 'getAgGrid(id: string)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#getaggrid' +} + +const setValue = { + title: 'setValue', + description: + "The setValue function is meant to set or force the value of a component. This can be convenient in cases where connection is not the easiest pattern. Note that it's a bad idea to mix dynamic default value and setValue together.", + example: 'setValue(id: string, value: any)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#setvalue' +} + +const setSelectedIndex = { + title: 'setSelectedIndex', + description: 'Use the setSelectedIndex function to select a row in a table or an AG Grid table.', + example: 'setSelectedIndex(id: string, index: number)', + documentation: 'https://www.windmill.dev/docs/apps/app-runnable-panel#setselectedindex' +} + +export function getComponentControl(type: keyof typeof components): Array { + switch (type) { + case 'tabscomponent': + return [setTab] + case 'selectstepcomponent': + return [setTab, setValue] + case 'selecttabcomponent': + return [setTab, setValue] + case 'conditionalwrapper': + return [setTab] + case 'steppercomponent': + return [setTab] + case 'modalcomponent': + return [openModal, closeModal] + case 'aggridcomponent': + return [getAgGrid] + case 'displaycomponent': + case 'dateinputcomponent': + case 'textinputcomponent': + case 'numberinputcomponent': + case 'currencycomponent': + case 'checkboxcomponent': + case 'formcomponent': + case 'rangecomponent': + case 'multiselectcomponent': + case 'selectcomponent': + case 'slidercomponent': + case 'schemaformcomponent': + case 'quillcomponent': + case 'textcomponent': + case 'textareainputcomponent': + return [setValue] + case 'tablecomponent': + case 'aggridcomponent': + return [setSelectedIndex] + default: + if (components[type].initialData['componentInput']) { + return [recompute] + } else { + return [] + } + } +} diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentControl.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentControl.svelte new file mode 100644 index 0000000000..8106453b54 --- /dev/null +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentControl.svelte @@ -0,0 +1,69 @@ + + +{#if componentControls?.length > 0 } + + +
+ +
+ + {#if collapsed} +
+ {#each componentControls as control} + + {control.title} + + {/each} +
+ {:else} +
This component can be controlled by frontend scripts using these functions:
+ {#each componentControls as control} +
+ {control.title} +
+
+ {control.description} +
+
+ +
+ + +
+ See documentation + +
+
+ + {/each} + {/if} +
+{/if} \ No newline at end of file diff --git a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte index ca4d700d32..78fae2b719 100644 --- a/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte +++ b/frontend/src/lib/components/apps/editor/settingsPanel/ComponentPanel.svelte @@ -34,6 +34,8 @@ import GridGroup from './GridGroup.svelte' import { secondaryMenuLeft } from './secondaryMenu' + import ComponentControl from './ComponentControl.svelte' + export let componentSettings: { item: GridItem; parent: string | undefined } | undefined = undefined export let onDelete: (() => void) | undefined = undefined @@ -297,7 +299,11 @@ {/if} {/key} + {/if} + + + {#if componentSettings.item.data.type === 'tabscomponent'} {/if} + {/if}