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"