diff --git a/lerna.json b/lerna.json index c4d2219e21..b7c61852b9 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.10.12-alpha.23", + "version": "2.10.12-alpha.25", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/builder/src/stores/backend/tables.js b/packages/builder/src/stores/backend/tables.js index 201a67824d..457a58fdbb 100644 --- a/packages/builder/src/stores/backend/tables.js +++ b/packages/builder/src/stores/backend/tables.js @@ -1,7 +1,7 @@ import { get, writable, derived } from "svelte/store" import { cloneDeep } from "lodash/fp" import { API } from "api" -import { SWITCHABLE_TYPES } from "constants/backend" +import { SWITCHABLE_TYPES, FIELDS } from "constants/backend" export function createTablesStore() { const store = writable({ @@ -21,6 +21,23 @@ export function createTablesStore() { })) } + const singleFetch = async tableId => { + const table = await API.getTable(tableId) + store.update(state => { + const list = [] + // update the list, keep order accurate + for (let tbl of state.list) { + if (table._id === tbl._id) { + list.push(table) + } else { + list.push(tbl) + } + } + state.list = list + return state + }) + } + const select = tableId => { store.update(state => ({ ...state, @@ -63,6 +80,20 @@ export function createTablesStore() { const savedTable = await API.saveTable(updatedTable) replaceTable(savedTable._id, savedTable) select(savedTable._id) + // make sure tables up to date (related) + let tableIdsToFetch = [] + for (let column of Object.values(updatedTable?.schema || {})) { + if (column.type === FIELDS.LINK.type) { + tableIdsToFetch.push(column.tableId) + } + } + tableIdsToFetch = [...new Set(tableIdsToFetch)] + // too many tables to fetch, just get all + if (tableIdsToFetch.length > 3) { + await fetch() + } else { + await Promise.all(tableIdsToFetch.map(id => singleFetch(id))) + } return savedTable } diff --git a/packages/frontend-core/src/api/tables.js b/packages/frontend-core/src/api/tables.js index b84bd3076a..a08e35d3d8 100644 --- a/packages/frontend-core/src/api/tables.js +++ b/packages/frontend-core/src/api/tables.js @@ -82,8 +82,9 @@ export const buildTableEndpoints = API => ({ }, }) }, + /** - * Gets a list o tables. + * Gets a list of tables. */ getTables: async () => { return await API.get({ @@ -91,6 +92,15 @@ export const buildTableEndpoints = API => ({ }) }, + /** + * Get a single table based on table ID. + */ + getTable: async tableId => { + return await API.get({ + url: `/api/tables/${tableId}`, + }) + }, + /** * Saves a table. * @param table the table to save diff --git a/packages/server/src/api/controllers/row/ExternalRequest.ts b/packages/server/src/api/controllers/row/ExternalRequest.ts index e5b2a82311..064e4d1792 100644 --- a/packages/server/src/api/controllers/row/ExternalRequest.ts +++ b/packages/server/src/api/controllers/row/ExternalRequest.ts @@ -818,7 +818,10 @@ export class ExternalRequest { // can't really use response right now const response = await getDatasourceAndQuery(json) // handle many to many relationships now if we know the ID (could be auto increment) - if (operation !== Operation.READ && processed.manyRelationships) { + if ( + operation !== Operation.READ && + processed.manyRelationships?.length > 0 + ) { await this.handleManyRelationships( table._id || "", response[0], diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index 29c41ad985..5029856cf4 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -14,10 +14,12 @@ import { Table, TableResponse, UserCtx, + Datasource, } from "@budibase/types" import sdk from "../../../sdk" import { jsonFromCsvString } from "../../../utilities/csv" import { builderSocket } from "../../../websockets" +import { cloneDeep } from "lodash" function pickApi({ tableId, table }: { tableId?: string; table?: Table }) { if (table && !tableId) { @@ -35,16 +37,16 @@ function pickApi({ tableId, table }: { tableId?: string; table?: Table }) { export async function fetch(ctx: UserCtx) { const internal = await sdk.tables.getAllInternalTables() - const externalTables = await sdk.datasources.getExternalDatasources() + const datasources = await sdk.datasources.getExternalDatasources() - const external = externalTables.flatMap(table => { - let entities = table.entities + const external = datasources.flatMap(datasource => { + let entities = datasource.entities if (entities) { return Object.values(entities).map((entity: Table) => ({ ...entity, type: "external", - sourceId: table._id, - sql: isSQL(table), + sourceId: datasource._id, + sql: isSQL(datasource), })) } else { return [] @@ -80,7 +82,7 @@ export async function save(ctx: UserCtx) { ctx.eventEmitter && ctx.eventEmitter.emitTable(`table:save`, appId, { ...savedTable }) ctx.body = savedTable - builderSocket?.emitTableUpdate(ctx, { ...savedTable }) + builderSocket?.emitTableUpdate(ctx, cloneDeep(savedTable)) } export async function destroy(ctx: UserCtx) { diff --git a/packages/server/src/integrations/utils.ts b/packages/server/src/integrations/utils.ts index 75f4bcbfa1..b6b6f60fee 100644 --- a/packages/server/src/integrations/utils.ts +++ b/packages/server/src/integrations/utils.ts @@ -1,4 +1,4 @@ -import { SqlQuery, Table, SearchFilters } from "@budibase/types" +import { SqlQuery, Table, SearchFilters, Datasource } from "@budibase/types" import { DocumentType, SEPARATOR } from "../db/utils" import { FieldTypes, @@ -184,7 +184,9 @@ export function getSqlQuery(query: SqlQuery | string): SqlQuery { } } -export const isSQL = helpers.isSQL +export function isSQL(datasource: Datasource) { + return helpers.isSQL(datasource) +} export function isIsoDateString(str: string) { const trimmedValue = str.trim()