diff --git a/packages/builder/src/stores/builder/screenComponent.ts b/packages/builder/src/stores/builder/screenComponent.ts index 76b69f6ec1..1cc295e0a8 100644 --- a/packages/builder/src/stores/builder/screenComponent.ts +++ b/packages/builder/src/stores/builder/screenComponent.ts @@ -112,6 +112,7 @@ function getInvalidDatasources( { key: setting.key, message: `The ${friendlyTypeName} named "${label}" could not be found`, + errorType: "setting", }, ] } @@ -180,6 +181,7 @@ function getMissingRequiredSettings(screen: Screen) { result[component._id!] = missingRequiredSettings.map((s: any) => ({ key: s.key, message: `Add the ${s.label} setting to start using your component`, + errorType: "setting", })) } } @@ -206,16 +208,19 @@ function getMissingAncestors(screen: Screen) { return name.endsWith("s") ? `${name}'` : `${name}s` } - const getAncestorName = (name: string) => { - const definition: any = getManifestDefinition(name) - return definition.name - } - - result[component._id!] = missingAncestors.map((s: any) => ({ - key: s.key, - message: `${pluralise(definition.name)} need to be inside a -${getAncestorName(s)}`, - })) + result[component._id!] = missingAncestors.map((ancestor: any) => { + const ancestorDefinition: any = getManifestDefinition(ancestor) + return { + key: ancestor.key, + message: `${pluralise(definition.name)} need to be inside a +${ancestorDefinition.name}`, + errorType: "ancestor-setting", + ancestor: { + name: ancestorDefinition.name, + fullType: `${BudibasePrefix}${ancestor}`, + }, + } + }) } } return result diff --git a/packages/client/src/components/error-states/ComponentErrorState.svelte b/packages/client/src/components/error-states/ComponentErrorState.svelte index a4122054d7..45740f4c2d 100644 --- a/packages/client/src/components/error-states/ComponentErrorState.svelte +++ b/packages/client/src/components/error-states/ComponentErrorState.svelte @@ -4,6 +4,7 @@ import MissingRequiredSetting from "./MissingRequiredSetting.svelte" import MissingRequiredAncestor from "./MissingRequiredAncestor.svelte" import { UIComponentError } from "@budibase/types" + import ComponentErrorStateCta from "./ComponentErrorStateCTA.svelte" export let missingRequiredSettings: | { key: string; label: string }[] @@ -28,19 +29,7 @@ {:else if errorMessage} {@html errorMessage.message} - {#if errorMessage.key} - - - - - { - builderStore.actions.highlightSetting(errorMessage.key) - }} - > - Show me - - {/if} + {:else if requiredSetting} {/if} diff --git a/packages/client/src/components/error-states/ComponentErrorStateCTA.svelte b/packages/client/src/components/error-states/ComponentErrorStateCTA.svelte new file mode 100644 index 0000000000..ef22f307f7 --- /dev/null +++ b/packages/client/src/components/error-states/ComponentErrorStateCTA.svelte @@ -0,0 +1,40 @@ + + +{#if error} + {#if error.errorType === "setting"} + - + + + { + builderStore.actions.highlightSetting(error.key) + }} + > + Show me + + {:else if error.errorType === "ancestor-setting"} + - + + + { + builderStore.actions.addParentComponent( + $component.id, + error.ancestor.fullType + ) + }} + > + Add {error.ancestor.name} + + {/if} +{/if} diff --git a/packages/client/src/index.ts b/packages/client/src/index.ts index 0e136f942c..08330a60fa 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -14,6 +14,10 @@ export interface SDK { }> & { actions: { highlightSetting: (key: string) => void + addParentComponent: ( + componentId: string, + fullAncestorType: string + ) => void } } } diff --git a/packages/types/src/ui/components/errors.ts b/packages/types/src/ui/components/errors.ts new file mode 100644 index 0000000000..ce86e2f517 --- /dev/null +++ b/packages/types/src/ui/components/errors.ts @@ -0,0 +1,20 @@ +interface BaseUIComponentError { + key: string + message: string +} + +interface UISettingComponentError extends BaseUIComponentError { + errorType: "setting" +} + +interface UIAncestorComponentError extends BaseUIComponentError { + errorType: "ancestor-setting" + ancestor: { + name: string + fullType: string + } +} + +export type UIComponentError = + | UISettingComponentError + | UIAncestorComponentError diff --git a/packages/types/src/ui/components/index.ts b/packages/types/src/ui/components/index.ts index 5518842382..611f92b9a4 100644 --- a/packages/types/src/ui/components/index.ts +++ b/packages/types/src/ui/components/index.ts @@ -1,7 +1,3 @@ export * from "./sidepanel" export * from "./codeEditor" - -export interface UIComponentError { - key: string - message: string -} +export * from "./errors"