From 3d77c1f38f98e1b8724bc265910dd5bca8dc618e Mon Sep 17 00:00:00 2001 From: Andrew Kingston Date: Thu, 21 Jan 2021 10:40:45 +0000 Subject: [PATCH] Add bindable properties from query datasources --- .../builder/src/builderStore/dataBinding.js | 70 +++++-------------- 1 file changed, 18 insertions(+), 52 deletions(-) diff --git a/packages/builder/src/builderStore/dataBinding.js b/packages/builder/src/builderStore/dataBinding.js index 6b114891b0..c16dad8609 100644 --- a/packages/builder/src/builderStore/dataBinding.js +++ b/packages/builder/src/builderStore/dataBinding.js @@ -11,9 +11,8 @@ const CAPTURE_VAR_INSIDE_MUSTACHE = /{{([^}]+)}}/g */ export const getBindableProperties = (rootComponent, componentId) => { const contextBindings = getContextBindings(rootComponent, componentId) - const queryBindings = getQueryBindings(rootComponent, componentId) const componentBindings = getComponentBindings(rootComponent) - return [...contextBindings, ...queryBindings, componentBindings] + return [...contextBindings, ...componentBindings] } /** @@ -82,10 +81,15 @@ export const getContextBindings = (rootComponent, componentId) => { return } - // Get schema and add _id and _rev fields + // Get schema and add _id and _rev fields for certain types let { schema, table } = getSchemaForDatasource(datasource) - schema["_id"] = { type: "string" } - schema["_rev"] = { type: "string " } + if (!schema || !table) { + return + } + if (datasource.type === "table" || datasource.type === "link") { + schema["_id"] = { type: "string" } + schema["_rev"] = { type: "string " } + } const keys = Object.keys(schema).sort() // Create bindable properties for each schema field @@ -137,62 +141,24 @@ export const getComponentBindings = rootComponent => { }) } -/** - * Gets all bindable query fields. These are fields of schemas of data contexts - * provided by data provider components, such as lists or row detail components. - */ -export const getQueryBindings = (rootComponent, componentId) => { - // Extract any components which provide data contexts - const dataProviders = getDataProviderComponents(rootComponent, componentId) - const queries = get(backendUiStore).queries - let queryBindings = [] - dataProviders.forEach(component => { - const datasource = getDatasourceForProvider(component) - if (!datasource) { - return - } - - // Find a query for this table ID - const queryId = datasource.tableId - const query = queries.find(query => query._id === queryId) - const schema = query?.schema - if (!schema) { - return - } - - // Add all schema fields as bindable values - const keys = Object.keys(schema).sort() - keys.forEach(key => { - const fieldSchema = schema[key] - queryBindings.push({ - type: "context", - fieldSchema, - runtimeBinding: `${component._id}.${key}`, - readableBinding: `${component._instanceName}.${query.name}.${key}`, - providerId: component._id, - tableId: datasource.tableId, - field: key, - }) - }) - }) - return queryBindings -} - /** * Gets a schema for a datasource object. */ export const getSchemaForDatasource = datasource => { let schema, table if (datasource) { - const tables = get(backendUiStore).tables const { type } = datasource - table = tables.find(table => table._id === datasource.tableId) + if (type === "query") { + const queries = get(backendUiStore).queries + table = queries.find(query => query._id === datasource._id) + } else { + const tables = get(backendUiStore).tables + table = tables.find(table => table._id === datasource.tableId) + } if (table) { - if (type === "table") { - schema = cloneDeep(table.schema) - } else if (type === "view") { + if (type === "view") { schema = cloneDeep(table.views?.[datasource.name]?.schema) - } else if (type === "link") { + } else { schema = cloneDeep(table.schema) } }