From 9f92f3414ae9c6b693496603b441dc8f24ac10f7 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Mon, 27 Jan 2025 13:22:43 +0100 Subject: [PATCH] Add CTA on component error --- .../src/stores/builder/screenComponent.ts | 26 ++++++++++++------- .../error-states/ComponentErrorState.svelte | 18 +++++++++++-- packages/client/src/index.ts | 6 ++++- packages/types/src/ui/components/index.ts | 5 ++++ 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/packages/builder/src/stores/builder/screenComponent.ts b/packages/builder/src/stores/builder/screenComponent.ts index 35e76464cf..c2a41355dd 100644 --- a/packages/builder/src/stores/builder/screenComponent.ts +++ b/packages/builder/src/stores/builder/screenComponent.ts @@ -6,7 +6,12 @@ import { findComponentsBySettingsType, getManifestDefinition, } from "@/helpers/screen" -import { UIDatasourceType, Screen, Component } from "@budibase/types" +import { + UIDatasourceType, + Screen, + Component, + UIComponentError, +} from "@budibase/types" import { queries } from "./queries" import { views } from "./views" import { featureFlag } from "@/helpers" @@ -41,7 +46,7 @@ export const screenComponentErrors = derived( [selectedScreen, tables, views, viewsV2, queries], ([$selectedScreen, $tables, $views, $viewsV2, $queries]): Record< string, - string[] + UIComponentError[] > => { if (!featureFlag.isEnabled("CHECK_SCREEN_COMPONENT_SETTINGS_ERRORS")) { return {} @@ -66,7 +71,7 @@ function getInvalidDatasources( screen: Screen, datasources: Record ) { - const result: Record = {} + const result: Record = {} for (const { component, setting } of findComponentsBySettingsType(screen, [ "table", "dataSource", @@ -87,7 +92,10 @@ function getInvalidDatasources( if (!datasources[resourceId]) { const friendlyTypeName = friendlyNameByType[type] ?? type result[component._id!] = [ - `The ${friendlyTypeName} named "${label}" could not be found`, + { + key: setting.key, + message: `The ${friendlyTypeName} named "${label}" could not be found`, + }, ] } } @@ -108,7 +116,7 @@ function getAllComponentsInScreen(screen: Screen) { function getMissingRequiredSettings(screen: Screen) { const allComponents = getAllComponentsInScreen(screen) - const result: Record = {} + const result: Record = {} for (const component of allComponents) { const definition = getManifestDefinition(component) if (!("settings" in definition)) { @@ -152,10 +160,10 @@ function getMissingRequiredSettings(screen: Screen) { ) if (missingRequiredSettings.length) { - result[component._id!] = missingRequiredSettings.map( - (s: any) => - `Add the ${s.label} setting to start using your component` - ) + result[component._id!] = missingRequiredSettings.map((s: any) => ({ + key: s.key, + message: `Add the ${s.label} setting to start using your component`, + })) } } diff --git a/packages/client/src/components/error-states/ComponentErrorState.svelte b/packages/client/src/components/error-states/ComponentErrorState.svelte index 7292ffe55b..a4122054d7 100644 --- a/packages/client/src/components/error-states/ComponentErrorState.svelte +++ b/packages/client/src/components/error-states/ComponentErrorState.svelte @@ -3,12 +3,13 @@ import { Icon } from "@budibase/bbui" import MissingRequiredSetting from "./MissingRequiredSetting.svelte" import MissingRequiredAncestor from "./MissingRequiredAncestor.svelte" + import { UIComponentError } from "@budibase/types" export let missingRequiredSettings: | { key: string; label: string }[] | undefined export let missingRequiredAncestors: string[] | undefined - export let componentErrors: string[] | undefined + export let componentErrors: UIComponentError[] | undefined const component = getContext("component") const { styleable, builderStore } = getContext("sdk") @@ -26,7 +27,20 @@ {#if requiredAncestor} {:else if errorMessage} - {@html 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/index.ts b/packages/client/src/index.ts index 2a435c2f8c..0e136f942c 100644 --- a/packages/client/src/index.ts +++ b/packages/client/src/index.ts @@ -11,7 +11,11 @@ export interface SDK { generateGoldenSample: any builderStore: Readable<{ inBuilder: boolean - }> + }> & { + actions: { + highlightSetting: (key: string) => void + } + } } export type Component = Readable<{ diff --git a/packages/types/src/ui/components/index.ts b/packages/types/src/ui/components/index.ts index 8dc1638f8c..5518842382 100644 --- a/packages/types/src/ui/components/index.ts +++ b/packages/types/src/ui/components/index.ts @@ -1,2 +1,7 @@ export * from "./sidepanel" export * from "./codeEditor" + +export interface UIComponentError { + key: string + message: string +}