From 1e0938e93e2650e70764d309a1ba07251e415836 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Mon, 13 Jan 2025 16:09:01 +0000 Subject: [PATCH 01/81] Add dummy action buttons for new panels --- .../design/[screenId]/_components/AppPanel.svelte | 12 ++++++++++-- .../[screenId]/_components/BindingsPanel.svelte | 14 ++++++++++++++ .../[screenId]/_components/StatePanel.svelte | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte create mode 100644 packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte index 29e2ce03ff..3df2332543 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/AppPanel.svelte @@ -3,6 +3,9 @@ import AppPreview from "./AppPreview.svelte" import { screenStore, appStore } from "@/stores/builder" import UndoRedoControl from "@/components/common/UndoRedoControl.svelte" + import { ActionButton } from "@budibase/bbui" + import BindingsPanel from "./BindingsPanel.svelte" + import StatePanel from "./StatePanel.svelte"
@@ -10,12 +13,14 @@
-
-
{#if $appStore.clientFeatures.devicePreview} {/if}
+
+ + +
{#key $appStore.version} @@ -50,6 +55,9 @@ margin-bottom: 9px; } + .header-left { + display: flex; + } .header-left :global(div) { border-right: none; } diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte new file mode 100644 index 0000000000..73cac27331 --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte @@ -0,0 +1,14 @@ + + +Bindings + + + + Some awesome bindings content. + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte new file mode 100644 index 0000000000..5212f243af --- /dev/null +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -0,0 +1,14 @@ + + +State + + + + Some awesome state content. + + From 99537ae93d982b96d53fccb66d368cd026c3ac97 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Tue, 14 Jan 2025 15:06:17 +0000 Subject: [PATCH 02/81] Find components with state vars and allow user to select --- .../[screenId]/_components/StatePanel.svelte | 147 +++++++++++++++++- 1 file changed, 142 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte index 5212f243af..a98b03b0c2 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -1,14 +1,151 @@ - State - Some awesome state content. + +
+ +
{@html JSON.stringify(stateValue, null, 2)}
+
+ {#if componentsUsingState.length > 0} +
+

Components using this state:

+ {#each componentsUsingState as component} + + {/each} +
+ {/if}
+ + From cc765ef6b44e38ed5e7f82faae7a886b0726a3c5 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Tue, 14 Jan 2025 15:44:10 +0000 Subject: [PATCH 03/81] Use global context when requesting client context and no component is selected --- packages/client/src/constants.js | 1 + packages/client/src/index.js | 6 ++++-- packages/client/src/stores/components.js | 3 ++- packages/client/src/stores/screens.js | 6 +++--- 4 files changed, 10 insertions(+), 6 deletions(-) diff --git a/packages/client/src/constants.js b/packages/client/src/constants.js index f7e3e86d40..a3d06fd48f 100644 --- a/packages/client/src/constants.js +++ b/packages/client/src/constants.js @@ -15,6 +15,7 @@ export const ActionTypes = { export const DNDPlaceholderID = "dnd-placeholder" export const ScreenslotType = "screenslot" +export const ScreenslotID = "screenslot" export const GridRowHeight = 24 export const GridColumns = 12 export const GridSpacing = 4 diff --git a/packages/client/src/index.js b/packages/client/src/index.js index 9cef52bb1e..e3f5c34d3e 100644 --- a/packages/client/src/index.js +++ b/packages/client/src/index.js @@ -86,8 +86,10 @@ const loadBudibase = async () => { dndStore.actions.reset() } } else if (type === "request-context") { - const { selectedComponentInstance } = get(componentStore) - const context = selectedComponentInstance?.getDataContext() + const { selectedComponentInstance, screenslotInstance } = + get(componentStore) + const instance = selectedComponentInstance || screenslotInstance + const context = instance?.getDataContext() let stringifiedContext = null try { stringifiedContext = JSON.stringify(context) diff --git a/packages/client/src/stores/components.js b/packages/client/src/stores/components.js index d4afa6c7f1..8a8f82883d 100644 --- a/packages/client/src/stores/components.js +++ b/packages/client/src/stores/components.js @@ -6,7 +6,7 @@ import { screenStore } from "./screens" import { builderStore } from "./builder" import Router from "../components/Router.svelte" import * as AppComponents from "../components/app/index.js" -import { ScreenslotType } from "../constants.js" +import { ScreenslotID, ScreenslotType } from "../constants.js" export const BudibasePrefix = "@budibase/standard-components/" @@ -43,6 +43,7 @@ const createComponentStore = () => { selectedComponentDefinition: definition, selectedComponentPath: selectedPath?.map(component => component._id), mountedComponentCount: Object.keys($store.mountedComponents).length, + screenslotInstance: $store.mountedComponents[ScreenslotID], } } ) diff --git a/packages/client/src/stores/screens.js b/packages/client/src/stores/screens.js index bc87216660..7261ca375a 100644 --- a/packages/client/src/stores/screens.js +++ b/packages/client/src/stores/screens.js @@ -7,7 +7,7 @@ import { dndIndex, dndParent, dndIsNewComponent, dndBounds } from "./dnd.js" import { RoleUtils } from "@budibase/frontend-core" import { findComponentById, findComponentParent } from "../utils/components.js" import { Helpers } from "@budibase/bbui" -import { DNDPlaceholderID } from "constants" +import { DNDPlaceholderID, ScreenslotID, ScreenslotType } from "constants" const createScreenStore = () => { const store = derived( @@ -163,8 +163,8 @@ const createScreenStore = () => { _component: "@budibase/standard-components/layout", _children: [ { - _component: "screenslot", - _id: "screenslot", + _component: ScreenslotType, + _id: ScreenslotID, _styles: { normal: { flex: "1 1 auto", From 7bd718b0d9005f4c84a8711de075fda46fb95215 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Wed, 15 Jan 2025 09:53:27 +0000 Subject: [PATCH 04/81] work to highlight setting when selected --- .../[screenId]/_components/StatePanel.svelte | 114 +++++++++--------- 1 file changed, 56 insertions(+), 58 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte index a98b03b0c2..d3c579441b 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -1,7 +1,11 @@ State @@ -72,19 +104,15 @@ -
- -
{@html JSON.stringify(stateValue, null, 2)}
-
{#if componentsUsingState.length > 0}

Components using this state:

{#each componentsUsingState as component} {/each}
@@ -93,36 +121,6 @@
diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte index 73cac27331..6af802c570 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte @@ -1,14 +1,102 @@ - -Bindings +Bindings - - Some awesome bindings content. + + From 094881e807c011ccfbfdee94334d29e5867d1e74 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Wed, 15 Jan 2025 15:54:40 +0000 Subject: [PATCH 08/81] clear highlight state as part of component select --- .../settings/controls/PropertyControl.svelte | 7 ------- .../[screenId]/_components/StatePanel.svelte | 14 +++----------- packages/builder/src/stores/builder/components.ts | 6 ++++++ 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/packages/builder/src/components/design/settings/controls/PropertyControl.svelte b/packages/builder/src/components/design/settings/controls/PropertyControl.svelte index 52bcc7bce2..b3eca2485a 100644 --- a/packages/builder/src/components/design/settings/controls/PropertyControl.svelte +++ b/packages/builder/src/components/design/settings/controls/PropertyControl.svelte @@ -5,7 +5,6 @@ runtimeToReadableBinding, } from "@/dataBinding" import { builderStore } from "@/stores/builder" - import { onDestroy } from "svelte" export let label = "" export let labelHidden = false @@ -79,12 +78,6 @@ ? defaultValue : enriched } - - onDestroy(() => { - if (highlightedSettings) { - builderStore.highlightSetting(null) - } - })
- import { onDestroy } from "svelte" import { ActionButton, Modal, ModalContent, Combobox } from "@budibase/bbui" import { getAllStateVariables } from "@/dataBinding" import { @@ -94,17 +93,10 @@ }) { componentStore.select(component.id) - // Delay highlighting until after component selection and re-render (i know this is disgusting) - setTimeout(() => { - component.settings.forEach(setting => { - builderStore.highlightSetting(setting) - }) - }, 100) + component.settings.forEach(setting => { + builderStore.highlightSetting(setting) + }) } - - onDestroy(() => { - builderStore.highlightSetting(undefined) - }) State diff --git a/packages/builder/src/stores/builder/components.ts b/packages/builder/src/stores/builder/components.ts index 9ad9a75f84..450487a52f 100644 --- a/packages/builder/src/stores/builder/components.ts +++ b/packages/builder/src/stores/builder/components.ts @@ -20,6 +20,7 @@ import { previewStore, tables, componentTreeNodesStore, + builderStore, } from "@/stores/builder" import { buildFormSchema, getSchemaForDatasource } from "@/dataBinding" import { @@ -716,6 +717,11 @@ export class ComponentStore extends BudiStore { * @param {string} componentId */ select(componentId: string) { + builderStore.update(state => { + state.highlightedSettings = null + return state + }) + this.update(state => { state.selectedComponentId = componentId return state From cf291b60be9b099be244c8ee518c6380fda38c95 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 15 Jan 2025 21:08:37 +0000 Subject: [PATCH 09/81] Add style improvements --- .../BindingExplorer/BindingNode.svelte | 60 +++++++++------ .../_components/BindingsPanel.svelte | 77 ++++++++----------- 2 files changed, 68 insertions(+), 69 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte index 155312c03e..2253cc782c 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte @@ -1,5 +1,6 @@
- {#if label} + {#if label != null}
{#if expandable} @@ -107,7 +118,7 @@
{/if} - {#if expandable && (expanded || !label)} + {#if expandable && (expanded || label == null)}
{#each keys as key} - import { ActionButton, Modal, ModalContent } from "@budibase/bbui" + import { ActionButton, Modal, ModalContent, Helpers } from "@budibase/bbui" import { previewStore, selectedScreen, @@ -7,14 +7,8 @@ snippets, } from "@/stores/builder" import { getBindableProperties } from "@/dataBinding" - import { processObjectSync } from "@budibase/string-templates" import BindingNode from "./BindingExplorer/BindingNode.svelte" - - enum ValueType { - Object = "Object", - Array = "Array", - Primitive = "Primitive", - } + import { processObjectSync } from "@budibase/string-templates" // Minimal typing for the real data binding structure, as none exists type DataBinding = { @@ -23,45 +17,21 @@ readableBinding: string } - type BindingEntry = { - readableBinding: string - runtimeBinding: string | null - value: any - valueType: ValueType - } - - type BindingMap = { - [key: string]: BindingEntry - } - let modal: any - $: context = { - ...($previewStore.selectedComponentContext || {}), - date: new Date(), - string: "foo", - number: 1234, - undefined: undefined, - null: null, - true: true, - false: false, - array: [1, 2, 3], - object: { foo: "bar" }, - error: new Error(), - } + $: previewContext = $previewStore.selectedComponentContext || {} $: selectedComponentId = $componentStore.selectedComponentId + $: context = makeContext(previewContext, bindings) $: bindings = getBindableProperties($selectedScreen, selectedComponentId) - $: enrichedBindings = enrichBindings(bindings, context, $snippets) const show = () => { previewStore.requestComponentContext() modal.show() } - const enrichBindings = ( - bindings: DataBinding[], - context: Record, - snippets: any + const makeContext = ( + previewContext: Record, + bindings: DataBinding[] ) => { // Create a single big array to enrich in one go const bindingStrings = bindings.map(binding => { @@ -74,17 +44,36 @@ } }) const bindingEvauations = processObjectSync(bindingStrings, { - ...context, - snippets, + ...previewContext, + snippets: $snippets, }) as any[] // Enrich bindings with evaluations and highlighted HTML - const flatBindings = bindings.map((binding, idx) => ({ - ...binding, - value: bindingEvauations[idx], - })) + const enrichedBindings: any[] = bindings.map((binding, idx) => { + return { + ...binding, + value: bindingEvauations[idx], + } + }) - return flatBindings + let context = { + _dataTypes: { + date: new Date(), + string: "foo", + number: 1234, + undefined: undefined, + null: null, + true: true, + false: false, + array: [1, 2, 3], + object: { foo: "bar" }, + error: new Error(), + }, + } + for (let binding of enrichedBindings) { + Helpers.deepSet(context, binding.readableBinding, binding.value) + } + return context } From 59d71119ad002d8f83fab4e3b015bdccfa9c88bd Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Wed, 15 Jan 2025 21:25:48 +0000 Subject: [PATCH 10/81] Test --- asd | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 asd diff --git a/asd b/asd new file mode 100644 index 0000000000..e69de29bb2 From e14bf007dba0f53c5c9b3cf0e1afc21d7604fb3d Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Thu, 16 Jan 2025 08:59:04 +0000 Subject: [PATCH 11/81] some tidy up --- packages/bbui/src/Popover/Popover.svelte | 2 +- .../design/[screenId]/_components/StatePanel.svelte | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/bbui/src/Popover/Popover.svelte b/packages/bbui/src/Popover/Popover.svelte index 5a5b4b2c14..caba27cf25 100644 --- a/packages/bbui/src/Popover/Popover.svelte +++ b/packages/bbui/src/Popover/Popover.svelte @@ -9,7 +9,7 @@ const dispatch = createEventDispatcher() - export let anchor: any | undefined = undefined + export let anchor: HTMLElement | undefined = undefined export let align: string | undefined = "right" export let portalTarget: any | undefined = undefined export let minWidth: number | undefined = undefined diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte index 0786c76d20..10ba825423 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -73,7 +73,7 @@ return componentsUsingState } - function handleKeySelect(event: CustomEvent) { + function handleStateKeySelect(event: CustomEvent) { selectedKey = event.detail if (!selectedKey) { throw new Error("No state key selected") @@ -106,7 +106,7 @@ {#if componentsUsingState.length > 0}
From fa01802127dca5346ff2b2aba549d83a6cacab71 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 16 Jan 2025 10:52:13 +0000 Subject: [PATCH 12/81] Update import --- packages/client/src/stores/components.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/client/src/stores/components.js b/packages/client/src/stores/components.js index 8a8f82883d..024e7b4edc 100644 --- a/packages/client/src/stores/components.js +++ b/packages/client/src/stores/components.js @@ -6,7 +6,7 @@ import { screenStore } from "./screens" import { builderStore } from "./builder" import Router from "../components/Router.svelte" import * as AppComponents from "../components/app/index.js" -import { ScreenslotID, ScreenslotType } from "../constants.js" +import { ScreenslotID, ScreenslotType } from "../constants" export const BudibasePrefix = "@budibase/standard-components/" From 5acd6ab3d60ae2451f71590153b934b776ca0ff9 Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 16 Jan 2025 12:19:45 +0000 Subject: [PATCH 13/81] Add hover state and expansion to binding labels --- .../BindingExplorer/BindingNode.svelte | 34 +++++++++++++------ .../_components/BindingsPanel.svelte | 4 +-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte index 2253cc782c..2c4c5844fb 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingExplorer/BindingNode.svelte @@ -1,9 +1,8 @@ + + + + +
{#if label != null}
-
+
{#if expandable}
(expanded = !expanded)} > {label}
- (valueExpanded = !valueExpanded)} > -
- {displayValue} -
-
+ {displayValue} +
{/if} {#if expandable && (expanded || label == null)} @@ -150,24 +156,33 @@ overflow: hidden; } .binding-arrow { - margin-right: 2px; + margin: -3px 2px -2px 0; flex: 0 0 18px; + transition: transform 130ms ease-out; + } + .binding-arrow :global(svg) { + width: 9px; + } + .binding-arrow.expanded { + transform: rotate(90deg); } .binding-text { display: flex; flex-direction: row; - align-items: center; font-family: monospace; font-size: 12px; + align-items: flex-start; width: 100%; } .binding-children { display: flex; flex-direction: column; gap: 8px; - /* border-left: 1px solid var(--spectrum-global-color-gray-400); */ - /* margin-left: 20px; */ - padding-left: 18px; + /*padding-left: 18px;*/ + + border-left: 1px solid var(--spectrum-global-color-gray-400); + margin-left: 20px; + padding-left: 3px; } .binding-children.root { border-left: none; @@ -176,31 +191,40 @@ } /* Size label and value according to type */ - .binding-label, - .binding-value { + .binding-label { + flex: 0 1 auto; + margin-right: 8px; + transition: color 130ms ease-out; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } - .binding-label { - flex: 0 0 auto; - max-width: 50%; - margin-right: 8px; - transition: color 130ms ease-out; - } .binding-label.expandable:hover { cursor: pointer; color: var(--spectrum-global-color-gray-900); } .binding-value { - flex: 0 1 auto; - } - .binding-label.expandable { - flex: 0 1 auto; - max-width: none; - } - .binding-value.expandable { flex: 0 0 auto; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + transition: filter 130ms ease-out; + } + .binding-value.primitive:hover { + filter: brightness(1.25); + cursor: pointer; + } + .binding-value.expanded { + word-break: break-all; + white-space: wrap; + } + + .binding-label.primitive { + flex: 0 0 auto; + max-width: 50%; + } + .binding-value.primitive { + flex: 0 1 auto; } /* Trim spans in the highlighted HTML */ diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte index b7bc394539..1da4c42ac6 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/BindingsPanel.svelte @@ -1,5 +1,5 @@ -Bindings - - - + + + + Data context + + +
- - +
+
+ + From 3cdcc44cbeb74651b59b10d968204646315e7426 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Fri, 17 Jan 2025 10:10:52 +0000 Subject: [PATCH 16/81] further popover changes / ts updates --- packages/bbui/src/Form/Combobox.svelte | 21 +-- packages/bbui/src/Form/Core/Combobox.svelte | 14 +- packages/bbui/src/Icon/Icon.svelte | 31 ++-- .../[screenId]/_components/StatePanel.svelte | 162 +++++++++++------- 4 files changed, 134 insertions(+), 94 deletions(-) diff --git a/packages/bbui/src/Form/Combobox.svelte b/packages/bbui/src/Form/Combobox.svelte index 18a2359c30..44854d949e 100644 --- a/packages/bbui/src/Form/Combobox.svelte +++ b/packages/bbui/src/Form/Combobox.svelte @@ -1,17 +1,17 @@ - - import { ActionButton, Modal, ModalContent, Combobox } from "@budibase/bbui" + import { ActionButton, Popover, Divider, Icon, Select } from "@budibase/bbui" import { getAllStateVariables } from "@/dataBinding" import { componentStore, @@ -11,25 +11,33 @@ findHBSBlocks, isJSBinding, } from "@budibase/string-templates" + import { onMount } from "svelte" type ComponentUsingState = { id: string name: string settings: string[] - }[] - - let modal: Modal - let selectedKey: string | null = null - let componentsUsingState: ComponentUsingState = [] - let componentsUpdatingState: ComponentUsingState = [] + } const keyOptions = getAllStateVariables() + let popoverAnchor: any + let popover: any + let selectedKey: string | null + let componentsUsingState: ComponentUsingState[] = [] + let componentsUpdatingState: ComponentUsingState[] = [] + + onMount(() => { + if (selectedKey) { + searchComponents(selectedKey) + } + }) + function findComponentsUpdatingState( component: any, stateKey: string - ): ComponentUsingState { - let foundComponents: ComponentUsingState = [] + ): ComponentUsingState[] { + let foundComponents: ComponentUsingState[] = [] const eventHandlerProps = ["onClick", "onChange"] @@ -66,12 +74,8 @@ function findComponentsUsingState( component: any, stateKey: string - ): Array<{ id: string; name: string; settings: string[] }> { - let componentsUsingState: Array<{ - id: string - name: string - settings: string[] - }> = [] + ): ComponentUsingState[] { + let componentsUsingState: ComponentUsingState[] = [] const { _children, ...componentSettings } = component let settingsWithState: string[] = [] @@ -114,61 +118,83 @@ return componentsUsingState } + function searchComponents(stateKey: string) { + if (!stateKey || !$selectedScreen?.props) { + return + } + componentsUsingState = findComponentsUsingState( + $selectedScreen.props, + stateKey + ) + componentsUpdatingState = findComponentsUpdatingState( + $selectedScreen.props, + stateKey + ) + } + function handleStateKeySelect(event: CustomEvent) { selectedKey = event.detail if (!selectedKey) { throw new Error("No state key selected") } - if ($selectedScreen?.props) { - componentsUsingState = findComponentsUsingState( - $selectedScreen.props, - selectedKey - ) - componentsUpdatingState = findComponentsUpdatingState( - $selectedScreen.props, - selectedKey - ) - } + searchComponents(selectedKey) } - function onClickComponentLink(component: { - id: string - name: string - settings: string[] - }) { + function onClickComponentLink(component: ComponentUsingState) { componentStore.select(component.id) component.settings.forEach(setting => { builderStore.highlightSetting(setting) }) + popover.hide() } -State +
+ State +
+ + +
+
+
State
+
+ +
+
+
+ Showing state variables for {$selectedScreen?.routing?.route.split( + "/" + )[1]}: +
+
+ -
- -
state inspector here
- - - {#if componentsUsingState.length > 0} -
- Updates: - {#each componentsUsingState as component, i} - - {/each} -
- {/if} - {#if componentsUpdatingState.length > 0} -
- Updated by: - {#each componentsUpdatingState as component, i} - - {/each} -
- {/if} +
+
State
+
+ Showing state variables for {$selectedScreen?.routing?.route.split("/")[1]}:
- +
+ + {#if editorError} +
{editorError}
+ {/if}
@@ -211,29 +223,26 @@
Updates: {#each componentsUsingState as component, i} + {#if i > 0}{", "}{/if} {/each}
{/if} {#if componentsUpdatingState.length > 0}
- Updated by: + Controlled by: {#each componentsUpdatingState as component, i} + {#if i > 0}{", "}{/if} {/each}
@@ -255,6 +264,14 @@ color: var(--spectrum-global-color-gray-700); font-size: var(--spectrum-global-dimension-font-size-75); } + .error { + color: var( + --spectrum-semantic-negative-color-default, + var(--spectrum-global-color-red-500) + ); + font-size: var(--spectrum-global-dimension-font-size-75); + margin-top: var(--spectrum-global-dimension-size-75); + } .component-link { display: inline; border: none; @@ -268,10 +285,4 @@ .component-link:hover { text-decoration: underline; } - - .split-title { - display: flex; - justify-content: space-between; - align-items: center; - } From c199b681e3308c0233cf3d000b526383a1200a22 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Tue, 21 Jan 2025 16:04:14 +0000 Subject: [PATCH 34/81] some duplicate code --- .../design/[screenId]/_components/StatePanel.svelte | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte index 99f4b252a2..cf6cd12d91 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -178,10 +178,6 @@ editorError = null previewStore.updateState(stateUpdate) - previewStore.updateState(stateUpdate) - - previewStore.updateState(stateUpdate) - previewStore.setSelectedComponentContext({ ...$previewStore.selectedComponentContext, state: stateUpdate, From 8cab28d5b64147b6d6c1dd4bcb398e3cb8daa788 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Thu, 23 Jan 2025 10:08:34 +0000 Subject: [PATCH 35/81] add link for each individual setting --- .../Component/ComponentSettingsPanel.svelte | 9 + .../Component/ConditionalUISection.svelte | 23 ++- .../[screenId]/_components/StatePanel.svelte | 162 +++++++++++------- 3 files changed, 134 insertions(+), 60 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte index 30f11e6cab..d9862e6e14 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ComponentSettingsPanel.svelte @@ -16,6 +16,7 @@ } from "@/dataBinding" import { ActionButton, notifications } from "@budibase/bbui" import { capitalise } from "@/helpers" + import { builderStore } from "@/stores/builder" import TourWrap from "@/components/portal/onboarding/TourWrap.svelte" import { TOUR_STEP_KEYS } from "@/components/portal/onboarding/tours.js" @@ -55,6 +56,14 @@ $: id = $selectedComponent?._id $: id, (section = tabs[0]) $: componentName = getComponentName(componentInstance) + + $: highlightedSettings = $builderStore.highlightedSettings + $: if (highlightedSettings?.length) { + const settings = highlightedSettings.map(s => s.key) + if (settings.length === 1 && settings[0] === "_conditions") { + section = "conditions" + } + } {#if $selectedComponent} diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUISection.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUISection.svelte index b40a6af3c6..d91799b6da 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUISection.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/[componentId]/_components/Component/ConditionalUISection.svelte @@ -9,6 +9,7 @@ import { componentStore } from "@/stores/builder" import ConditionalUIDrawer from "./ConditionalUIDrawer.svelte" import ComponentSettingsSection from "./ComponentSettingsSection.svelte" + import { builderStore } from "@/stores/builder" export let componentInstance export let componentDefinition @@ -18,6 +19,10 @@ let tempValue let drawer + $: highlightCondition = $builderStore.highlightedSettings?.find( + setting => setting.key === "_conditions" + ) + const openDrawer = () => { tempValue = JSON.parse(JSON.stringify(componentInstance?._conditions ?? [])) drawer.show() @@ -52,7 +57,9 @@ /> - {conditionText} +
+ {conditionText} +
@@ -61,3 +68,17 @@ + + diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte index cf6cd12d91..9dc3d3137d 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -1,5 +1,5 @@
- State -
Showing state variables for this screen
0 ? false : "No state variables found"} options={keyOptions} on:change={handleStateKeySelect} />
-
- -
- + {#if selectedKey && keyOptions.length > 0} +
+ handleStateInspectorChange(e)} + {bindings} + /> +
+ {/if} {#if componentsUsingState.length > 0}
Updates: @@ -276,7 +288,6 @@ From 680f52adbd8e96c6e3998fe099802413838fd0c6 Mon Sep 17 00:00:00 2001 From: Peter Clement Date: Wed, 29 Jan 2025 09:35:13 +0000 Subject: [PATCH 54/81] remove link --- .../design/[screenId]/_components/StatePanel.svelte | 9 --------- 1 file changed, 9 deletions(-) diff --git a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte index e3fa50f07f..61630f3c98 100644 --- a/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte +++ b/packages/builder/src/pages/builder/app/[application]/design/[screenId]/_components/StatePanel.svelte @@ -246,15 +246,6 @@
-
0 ? false : "No state variables found"} - options={keyOptions} - on:change={handleStateKeySelect} - /> -
+