Use existing definitions instead of using the manifest
This commit is contained in:
parent
2dc3a693a8
commit
3b0c4d1008
|
@ -1,46 +0,0 @@
|
||||||
import { Component, Screen, ScreenProps } from "@budibase/types"
|
|
||||||
import clientManifest from "@budibase/client/manifest.json"
|
|
||||||
|
|
||||||
export function findComponentsBySettingsType(
|
|
||||||
screen: Screen,
|
|
||||||
type: string | string[]
|
|
||||||
) {
|
|
||||||
const typesArray = Array.isArray(type) ? type : [type]
|
|
||||||
|
|
||||||
const result: {
|
|
||||||
component: Component
|
|
||||||
setting: {
|
|
||||||
type: string
|
|
||||||
key: string
|
|
||||||
}
|
|
||||||
}[] = []
|
|
||||||
function recurseFieldComponentsInChildren(component: ScreenProps) {
|
|
||||||
if (!component) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
const definition = getManifestDefinition(component)
|
|
||||||
const setting =
|
|
||||||
"settings" in definition &&
|
|
||||||
definition.settings.find((s: any) => typesArray.includes(s.type))
|
|
||||||
if (setting && "type" in setting) {
|
|
||||||
result.push({
|
|
||||||
component,
|
|
||||||
setting: { type: setting.type!, key: setting.key! },
|
|
||||||
})
|
|
||||||
}
|
|
||||||
component._children?.forEach(child => {
|
|
||||||
recurseFieldComponentsInChildren(child)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
recurseFieldComponentsInChildren(screen?.props)
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
function getManifestDefinition(component: Component) {
|
|
||||||
const componentType = component._component.split("/").slice(-1)[0]
|
|
||||||
const definition =
|
|
||||||
clientManifest[componentType as keyof typeof clientManifest]
|
|
||||||
return definition
|
|
||||||
}
|
|
|
@ -1,13 +1,18 @@
|
||||||
import { derived } from "svelte/store"
|
import { derived, get } from "svelte/store"
|
||||||
import { tables } from "./tables"
|
import { tables } from "./tables"
|
||||||
import { selectedScreen } from "./screens"
|
import { selectedScreen } from "./screens"
|
||||||
import { viewsV2 } from "./viewsV2"
|
import { viewsV2 } from "./viewsV2"
|
||||||
import { findComponentsBySettingsType } from "@/helpers/screen"
|
import {
|
||||||
import { UIDatasourceType, Screen } from "@budibase/types"
|
UIDatasourceType,
|
||||||
|
Screen,
|
||||||
|
Component,
|
||||||
|
ScreenProps,
|
||||||
|
} from "@budibase/types"
|
||||||
import { queries } from "./queries"
|
import { queries } from "./queries"
|
||||||
import { views } from "./views"
|
import { views } from "./views"
|
||||||
import { bindings, featureFlag } from "@/helpers"
|
import { bindings, featureFlag } from "@/helpers"
|
||||||
import { getBindableProperties } from "@/dataBinding"
|
import { getBindableProperties } from "@/dataBinding"
|
||||||
|
import { ComponentDefinition, componentStore } from "./components"
|
||||||
|
|
||||||
function reduceBy<TItem extends {}, TKey extends keyof TItem>(
|
function reduceBy<TItem extends {}, TKey extends keyof TItem>(
|
||||||
key: TKey,
|
key: TKey,
|
||||||
|
@ -38,11 +43,15 @@ const validationKeyByType: Record<UIDatasourceType, string | null> = {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const screenComponentErrors = derived(
|
export const screenComponentErrors = derived(
|
||||||
[selectedScreen, tables, views, viewsV2, queries],
|
[selectedScreen, tables, views, viewsV2, queries, componentStore],
|
||||||
([$selectedScreen, $tables, $views, $viewsV2, $queries]): Record<
|
([
|
||||||
string,
|
$selectedScreen,
|
||||||
string[]
|
$tables,
|
||||||
> => {
|
$views,
|
||||||
|
$viewsV2,
|
||||||
|
$queries,
|
||||||
|
$componentStore,
|
||||||
|
]): Record<string, string[]> => {
|
||||||
if (!featureFlag.isEnabled("CHECK_SCREEN_COMPONENT_SETTINGS_ERRORS")) {
|
if (!featureFlag.isEnabled("CHECK_SCREEN_COMPONENT_SETTINGS_ERRORS")) {
|
||||||
return {}
|
return {}
|
||||||
}
|
}
|
||||||
|
@ -51,9 +60,11 @@ export const screenComponentErrors = derived(
|
||||||
datasources: Record<string, any>
|
datasources: Record<string, any>
|
||||||
) {
|
) {
|
||||||
const result: Record<string, string[]> = {}
|
const result: Record<string, string[]> = {}
|
||||||
|
|
||||||
for (const { component, setting } of findComponentsBySettingsType(
|
for (const { component, setting } of findComponentsBySettingsType(
|
||||||
screen,
|
screen,
|
||||||
["table", "dataSource"]
|
["table", "dataSource"],
|
||||||
|
$componentStore.components
|
||||||
)) {
|
)) {
|
||||||
const componentSettings = component[setting.key]
|
const componentSettings = component[setting.key]
|
||||||
if (!componentSettings) {
|
if (!componentSettings) {
|
||||||
|
@ -111,3 +122,43 @@ export const screenComponentErrors = derived(
|
||||||
return getInvalidDatasources($selectedScreen, datasources)
|
return getInvalidDatasources($selectedScreen, datasources)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
function findComponentsBySettingsType(
|
||||||
|
screen: Screen,
|
||||||
|
type: string | string[],
|
||||||
|
definitions: Record<string, ComponentDefinition>
|
||||||
|
) {
|
||||||
|
const typesArray = Array.isArray(type) ? type : [type]
|
||||||
|
|
||||||
|
const result: {
|
||||||
|
component: Component
|
||||||
|
setting: {
|
||||||
|
type: string
|
||||||
|
key: string
|
||||||
|
}
|
||||||
|
}[] = []
|
||||||
|
|
||||||
|
function recurseFieldComponentsInChildren(component: ScreenProps) {
|
||||||
|
if (!component) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const definition = definitions[component._component]
|
||||||
|
|
||||||
|
const setting = definition?.settings?.find((s: any) =>
|
||||||
|
typesArray.includes(s.type)
|
||||||
|
)
|
||||||
|
if (setting && "type" in setting) {
|
||||||
|
result.push({
|
||||||
|
component,
|
||||||
|
setting: { type: setting.type!, key: setting.key! },
|
||||||
|
})
|
||||||
|
}
|
||||||
|
component._children?.forEach(child => {
|
||||||
|
recurseFieldComponentsInChildren(child)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
recurseFieldComponentsInChildren(screen?.props)
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue