From 4c1747cce44da2bae1b1a222c34c5db7fef0b725 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 13:26:07 +0300 Subject: [PATCH 01/10] Handle view schema on table updates --- packages/server/src/api/controllers/table/internal.ts | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index 7317d11e18..4bf3d8c31b 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -9,7 +9,7 @@ import { fixAutoColumnSubType, } from "../../../utilities/rowProcessor" import { runStaticFormulaChecks } from "./bulkFormula" -import { Table } from "@budibase/types" +import { Table, ViewV2 } from "@budibase/types" import { quotas } from "@budibase/pro" import isEqual from "lodash/isEqual" import { cloneDeep } from "lodash/fp" @@ -97,6 +97,14 @@ export async function save(ctx: any) { const tableView = tableToSave.views[view] if (!tableView) continue + if (sdk.views.isV2(tableView)) { + tableToSave.views[view] = sdk.views.syncSchema( + oldTable!.views![view] as ViewV2, + tableToSave.schema + ) + continue + } + if (tableView.schema.group || tableView.schema.field) continue tableView.schema = tableToSave.schema } From 865238a82718b434a2b1cd8d7e06f3ba6e63ccbe Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 13:43:13 +0300 Subject: [PATCH 02/10] SyncSchema and tests --- packages/server/src/sdk/app/views/index.ts | 18 ++ .../src/sdk/app/views/tests/views.spec.ts | 261 +++++++++++++++--- 2 files changed, 236 insertions(+), 43 deletions(-) diff --git a/packages/server/src/sdk/app/views/index.ts b/packages/server/src/sdk/app/views/index.ts index 7e75f22060..3513df0c56 100644 --- a/packages/server/src/sdk/app/views/index.ts +++ b/packages/server/src/sdk/app/views/index.ts @@ -106,3 +106,21 @@ export function enrichSchema(view: View | ViewV2, tableSchema: TableSchema) { schema: schema, } } + +export function syncSchema(view: ViewV2, schema: TableSchema): ViewV2 { + if (view.schemaUI) { + for (const fieldName of Object.keys(view.schemaUI)) { + if (!schema[fieldName]) { + delete view.schemaUI[fieldName] + } + } + for (const fieldName of Object.keys(schema)) { + if (!view.schemaUI[fieldName]) { + view.schemaUI[fieldName] = { visible: false } + } + } + } + + view.columns = view.columns?.filter(x => schema[x]) + return view +} diff --git a/packages/server/src/sdk/app/views/tests/views.spec.ts b/packages/server/src/sdk/app/views/tests/views.spec.ts index 3b1cb84a42..1ba488a885 100644 --- a/packages/server/src/sdk/app/views/tests/views.spec.ts +++ b/packages/server/src/sdk/app/views/tests/views.spec.ts @@ -1,53 +1,54 @@ +import _ from "lodash" import { FieldType, Table, ViewV2 } from "@budibase/types" import { generator } from "@budibase/backend-core/tests" -import { enrichSchema } from ".." +import { enrichSchema, syncSchema } from ".." describe("table sdk", () => { - describe("enrichViewSchemas", () => { - const basicTable: Table = { - _id: generator.guid(), - name: "TestTable", - type: "table", - schema: { - name: { - type: FieldType.STRING, - name: "name", - visible: true, - width: 80, - order: 2, - constraints: { - type: "string", - }, - }, - description: { - type: FieldType.STRING, - name: "description", - visible: true, - width: 200, - constraints: { - type: "string", - }, - }, - id: { - type: FieldType.NUMBER, - name: "id", - visible: true, - order: 1, - constraints: { - type: "number", - }, - }, - hiddenField: { - type: FieldType.STRING, - name: "hiddenField", - visible: false, - constraints: { - type: "string", - }, + const basicTable: Table = { + _id: generator.guid(), + name: "TestTable", + type: "table", + schema: { + name: { + type: FieldType.STRING, + name: "name", + visible: true, + width: 80, + order: 2, + constraints: { + type: "string", }, }, - } + description: { + type: FieldType.STRING, + name: "description", + visible: true, + width: 200, + constraints: { + type: "string", + }, + }, + id: { + type: FieldType.NUMBER, + name: "id", + visible: true, + order: 1, + constraints: { + type: "number", + }, + }, + hiddenField: { + type: FieldType.STRING, + name: "hiddenField", + visible: false, + constraints: { + type: "string", + }, + }, + }, + } + describe("enrichViewSchemas", () => { it("should fetch the default schema if not overriden", async () => { const tableId = basicTable._id! const view: ViewV2 = { @@ -280,4 +281,178 @@ describe("table sdk", () => { ) }) }) + + describe.only("syncSchema", () => { + const basicView: ViewV2 = { + version: 2, + id: generator.guid(), + name: generator.guid(), + tableId: basicTable._id!, + } + + describe("view without schema", () => { + it("no table schema changes will not amend the view", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + } + const result = syncSchema(_.cloneDeep(view), basicTable.schema) + expect(result).toEqual(view) + }) + + it("adding new columns will not change the view schema", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + } + + const newTableSchema = { + ...basicTable.schema, + newField1: { + type: FieldType.STRING, + name: "newField1", + visible: true, + }, + newField2: { + type: FieldType.NUMBER, + name: "newField2", + visible: false, + }, + } + + const result = syncSchema(_.cloneDeep(view), newTableSchema) + expect(result).toEqual({ + ...view, + schemaUI: undefined, + }) + }) + + it("deleting columns will not change the view schema", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + } + const { name, description, ...newTableSchema } = basicTable.schema + + const result = syncSchema(_.cloneDeep(view), newTableSchema) + expect(result).toEqual({ + ...view, + columns: ["id"], + schemaUI: undefined, + }) + }) + }) + + describe("view with schema", () => { + it("no table schema changes will not amend the view", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true, width: 100 }, + id: { visible: true, width: 20 }, + description: { visible: false }, + hiddenField: { visible: false }, + }, + } + const result = syncSchema(_.cloneDeep(view), basicTable.schema) + expect(result).toEqual(view) + }) + + it("adding new columns will add them as not visible to the view", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true, width: 100 }, + id: { visible: true, width: 20 }, + description: { visible: false }, + hiddenField: { visible: false }, + }, + } + + const newTableSchema = { + ...basicTable.schema, + newField1: { + type: FieldType.STRING, + name: "newField1", + visible: true, + }, + newField2: { + type: FieldType.NUMBER, + name: "newField2", + visible: false, + }, + } + + const result = syncSchema(_.cloneDeep(view), newTableSchema) + expect(result).toEqual({ + ...view, + schemaUI: { + ...view.schemaUI, + newField1: { visible: false }, + newField2: { visible: false }, + }, + }) + }) + + it("deleting columns will remove them from the UI", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true, width: 100 }, + id: { visible: true, width: 20 }, + description: { visible: false }, + hiddenField: { visible: false }, + }, + } + const { name, description, ...newTableSchema } = basicTable.schema + + const result = syncSchema(_.cloneDeep(view), newTableSchema) + expect(result).toEqual({ + ...view, + columns: ["id"], + schemaUI: { + ...view.schemaUI, + name: undefined, + description: undefined, + }, + }) + }) + + it("can handle additions and deletions at the same them UI", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true, width: 100 }, + id: { visible: true, width: 20 }, + description: { visible: false }, + hiddenField: { visible: false }, + }, + } + const { name, description, ...newTableSchema } = { + ...basicTable.schema, + newField1: { + type: FieldType.STRING, + name: "newField1", + visible: true, + }, + } as any + + const result = syncSchema(_.cloneDeep(view), newTableSchema) + expect(result).toEqual({ + ...view, + columns: ["id"], + schemaUI: { + ...view.schemaUI, + name: undefined, + description: undefined, + newField1: { visible: false }, + }, + }) + }) + }) + }) }) From a843385e79826722c0fc31102691c251a3e0fb7d Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 13:43:55 +0300 Subject: [PATCH 03/10] Remove .only --- packages/server/src/sdk/app/views/tests/views.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/sdk/app/views/tests/views.spec.ts b/packages/server/src/sdk/app/views/tests/views.spec.ts index 1ba488a885..0b14b828d6 100644 --- a/packages/server/src/sdk/app/views/tests/views.spec.ts +++ b/packages/server/src/sdk/app/views/tests/views.spec.ts @@ -282,7 +282,7 @@ describe("table sdk", () => { }) }) - describe.only("syncSchema", () => { + describe("syncSchema", () => { const basicView: ViewV2 = { version: 2, id: generator.guid(), From dbbe9ff0ac6c9d8358c5ac4eeb1f23ebfd0222ed Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 14:08:54 +0300 Subject: [PATCH 04/10] Fix types --- packages/server/src/api/controllers/table/internal.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index 4bf3d8c31b..e80c11eed5 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -44,7 +44,7 @@ export async function save(ctx: any) { } // if the table obj had an _id then it will have been retrieved - let oldTable + let oldTable: Table | undefined if (ctx.request.body && ctx.request.body._id) { oldTable = await sdk.tables.getTable(ctx.request.body._id) } From 082166d8f9455683acd5402a6dc4edba3f2122e0 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 13:56:50 +0300 Subject: [PATCH 05/10] Typing table save --- .../src/api/controllers/table/external.ts | 6 +++-- .../server/src/api/controllers/table/index.ts | 4 +++- .../src/api/controllers/table/internal.ts | 24 ++++++++++++++----- packages/types/src/api/web/app/table.ts | 12 +++++++++- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index eb1eeb7256..a8f1c1ccbb 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -22,6 +22,8 @@ import { QueryJson, RelationshipType, RenameColumn, + SaveTableRequest, + SaveTableResponse, Table, TableRequest, UserCtx, @@ -198,8 +200,8 @@ function isRelationshipSetup(column: FieldSchema) { return column.foreignKey || column.through } -export async function save(ctx: UserCtx) { - const inputs: TableRequest = ctx.request.body +export async function save(ctx: UserCtx) { + const inputs = ctx.request.body const renamed = inputs?._rename // can't do this right now delete inputs.rows diff --git a/packages/server/src/api/controllers/table/index.ts b/packages/server/src/api/controllers/table/index.ts index 53202d6878..e44ac94881 100644 --- a/packages/server/src/api/controllers/table/index.ts +++ b/packages/server/src/api/controllers/table/index.ts @@ -9,6 +9,8 @@ import { isExternalTable, isSQL } from "../../../integrations/utils" import { events } from "@budibase/backend-core" import { FetchTablesResponse, + SaveTableResponse, + SaveTableRequest, Table, TableResponse, UserCtx, @@ -60,7 +62,7 @@ export async function find(ctx: UserCtx) { ctx.body = sdk.tables.enrichViewSchemas(table) } -export async function save(ctx: UserCtx) { +export async function save(ctx: UserCtx) { const appId = ctx.appId const table = ctx.request.body const isImport = table.rows diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index e80c11eed5..da4e5351d7 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -9,7 +9,15 @@ import { fixAutoColumnSubType, } from "../../../utilities/rowProcessor" import { runStaticFormulaChecks } from "./bulkFormula" -import { Table, ViewV2 } from "@budibase/types" +import { + SaveTableRequest, + SaveTableResponse, + Table, + TableRequest, + UserCtx, + ViewStatisticsSchema, + ViewV2, +} from "@budibase/types" import { quotas } from "@budibase/pro" import isEqual from "lodash/isEqual" import { cloneDeep } from "lodash/fp" @@ -33,10 +41,10 @@ function checkAutoColumns(table: Table, oldTable?: Table) { return table } -export async function save(ctx: any) { +export async function save(ctx: UserCtx) { const db = context.getAppDB() const { rows, ...rest } = ctx.request.body - let tableToSave = { + let tableToSave: TableRequest = { type: "table", _id: generateTableID(), views: {}, @@ -80,7 +88,7 @@ export async function save(ctx: any) { let { _rename } = tableToSave /* istanbul ignore next */ if (_rename && _rename.old === _rename.updated) { - _rename = null + _rename = undefined delete tableToSave._rename } @@ -105,7 +113,11 @@ export async function save(ctx: any) { continue } - if (tableView.schema.group || tableView.schema.field) continue + if ( + (tableView.schema as ViewStatisticsSchema).group || + tableView.schema.field + ) + continue tableView.schema = tableToSave.schema } @@ -120,7 +132,7 @@ export async function save(ctx: any) { tableToSave._rev = linkResp._rev } } catch (err) { - ctx.throw(400, err) + ctx.throw(400, err as string) } // don't perform any updates until relationships have been diff --git a/packages/types/src/api/web/app/table.ts b/packages/types/src/api/web/app/table.ts index 178f758254..ff288811c9 100644 --- a/packages/types/src/api/web/app/table.ts +++ b/packages/types/src/api/web/app/table.ts @@ -1,4 +1,10 @@ -import { Table, TableSchema, View, ViewV2 } from "../../../documents" +import { + Table, + TableRequest, + TableSchema, + View, + ViewV2, +} from "../../../documents" interface ViewV2Response extends ViewV2 { schema: TableSchema @@ -11,3 +17,7 @@ export interface TableResponse extends Table { } export type FetchTablesResponse = TableResponse[] + +export interface SaveTableRequest extends TableRequest {} + +export type SaveTableResponse = Table From 1b9784013c42a616502171c1671b39cb2ce52022 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 13:59:07 +0300 Subject: [PATCH 06/10] Tables --- packages/server/src/api/controllers/table/external.ts | 2 +- packages/server/src/api/controllers/table/utils.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index a8f1c1ccbb..20e345cab7 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -217,7 +217,7 @@ export async function save(ctx: UserCtx) { ...inputs, } - let oldTable + let oldTable: Table | undefined if (ctx.request.body && ctx.request.body._id) { oldTable = await sdk.tables.getTable(ctx.request.body._id) } diff --git a/packages/server/src/api/controllers/table/utils.ts b/packages/server/src/api/controllers/table/utils.ts index e1469bb267..0e5b784c66 100644 --- a/packages/server/src/api/controllers/table/utils.ts +++ b/packages/server/src/api/controllers/table/utils.ts @@ -418,7 +418,7 @@ export function areSwitchableTypes(type1: any, type2: any) { return false } -export function hasTypeChanged(table: any, oldTable: any) { +export function hasTypeChanged(table: Table, oldTable: Table | undefined) { if (!oldTable) { return false } From a17f81ffb312d8b10d580d36592d4b13ac4f6266 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 14:00:18 +0300 Subject: [PATCH 07/10] Handle view schemas on external --- packages/server/src/api/controllers/table/external.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index 20e345cab7..e2fc1aea54 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -27,6 +27,7 @@ import { Table, TableRequest, UserCtx, + ViewV2, } from "@budibase/types" import sdk from "../../../sdk" import { builderSocket } from "../../../websockets" @@ -226,6 +227,16 @@ export async function save(ctx: UserCtx) { ctx.throw(400, "A column type has changed.") } + for (let view in tableToSave.views) { + const tableView = tableToSave.views[view] + if (!tableView || !sdk.views.isV2(tableView)) continue + + tableToSave.views[view] = sdk.views.syncSchema( + oldTable!.views![view] as ViewV2, + tableToSave.schema + ) + } + const db = context.getAppDB() const datasource = await sdk.datasources.get(datasourceId) if (!datasource.entities) { From 3bf794c6baebf232110ee288b136c0a3a9568c38 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 16:25:05 +0300 Subject: [PATCH 08/10] Handle renames --- .../src/api/controllers/table/external.ts | 3 +- .../src/api/controllers/table/internal.ts | 3 +- packages/server/src/sdk/app/views/index.ts | 27 +++++- .../src/sdk/app/views/tests/views.spec.ts | 84 +++++++++++++++++-- 4 files changed, 103 insertions(+), 14 deletions(-) diff --git a/packages/server/src/api/controllers/table/external.ts b/packages/server/src/api/controllers/table/external.ts index e2fc1aea54..327904666d 100644 --- a/packages/server/src/api/controllers/table/external.ts +++ b/packages/server/src/api/controllers/table/external.ts @@ -233,7 +233,8 @@ export async function save(ctx: UserCtx) { tableToSave.views[view] = sdk.views.syncSchema( oldTable!.views![view] as ViewV2, - tableToSave.schema + tableToSave.schema, + renamed ) } diff --git a/packages/server/src/api/controllers/table/internal.ts b/packages/server/src/api/controllers/table/internal.ts index da4e5351d7..5f9a01bd0b 100644 --- a/packages/server/src/api/controllers/table/internal.ts +++ b/packages/server/src/api/controllers/table/internal.ts @@ -108,7 +108,8 @@ export async function save(ctx: UserCtx) { if (sdk.views.isV2(tableView)) { tableToSave.views[view] = sdk.views.syncSchema( oldTable!.views![view] as ViewV2, - tableToSave.schema + tableToSave.schema, + _rename ) continue } diff --git a/packages/server/src/sdk/app/views/index.ts b/packages/server/src/sdk/app/views/index.ts index 3513df0c56..fb3a1237d3 100644 --- a/packages/server/src/sdk/app/views/index.ts +++ b/packages/server/src/sdk/app/views/index.ts @@ -1,9 +1,14 @@ import { HTTPError, context } from "@budibase/backend-core" -import { FieldSchema, TableSchema, View, ViewV2 } from "@budibase/types" +import { + FieldSchema, + RenameColumn, + TableSchema, + View, + ViewV2, +} from "@budibase/types" import sdk from "../../../sdk" import * as utils from "../../../db/utils" -import merge from "lodash/merge" export async function get(viewId: string): Promise { const { tableId } = utils.extractViewInfoFromID(viewId) @@ -107,7 +112,22 @@ export function enrichSchema(view: View | ViewV2, tableSchema: TableSchema) { } } -export function syncSchema(view: ViewV2, schema: TableSchema): ViewV2 { +export function syncSchema( + view: ViewV2, + schema: TableSchema, + renameColumn: RenameColumn | undefined +): ViewV2 { + if (renameColumn) { + if (view.columns) { + view.columns[view.columns.indexOf(renameColumn.old)] = + renameColumn.updated + } + if (view.schemaUI) { + view.schemaUI[renameColumn.updated] = view.schemaUI[renameColumn.old] + delete view.schemaUI[renameColumn.old] + } + } + if (view.schemaUI) { for (const fieldName of Object.keys(view.schemaUI)) { if (!schema[fieldName]) { @@ -122,5 +142,6 @@ export function syncSchema(view: ViewV2, schema: TableSchema): ViewV2 { } view.columns = view.columns?.filter(x => schema[x]) + return view } diff --git a/packages/server/src/sdk/app/views/tests/views.spec.ts b/packages/server/src/sdk/app/views/tests/views.spec.ts index 0b14b828d6..d3b2b138a1 100644 --- a/packages/server/src/sdk/app/views/tests/views.spec.ts +++ b/packages/server/src/sdk/app/views/tests/views.spec.ts @@ -1,5 +1,5 @@ import _ from "lodash" -import { FieldType, Table, ViewV2 } from "@budibase/types" +import { FieldType, Table, TableSchema, ViewV2 } from "@budibase/types" import { generator } from "@budibase/backend-core/tests" import { enrichSchema, syncSchema } from ".." @@ -296,7 +296,11 @@ describe("table sdk", () => { ...basicView, columns: ["name", "id", "description"], } - const result = syncSchema(_.cloneDeep(view), basicTable.schema) + const result = syncSchema( + _.cloneDeep(view), + basicTable.schema, + undefined + ) expect(result).toEqual(view) }) @@ -320,7 +324,7 @@ describe("table sdk", () => { }, } - const result = syncSchema(_.cloneDeep(view), newTableSchema) + const result = syncSchema(_.cloneDeep(view), newTableSchema, undefined) expect(result).toEqual({ ...view, schemaUI: undefined, @@ -334,13 +338,37 @@ describe("table sdk", () => { } const { name, description, ...newTableSchema } = basicTable.schema - const result = syncSchema(_.cloneDeep(view), newTableSchema) + const result = syncSchema(_.cloneDeep(view), newTableSchema, undefined) expect(result).toEqual({ ...view, columns: ["id"], schemaUI: undefined, }) }) + + it("renaming mapped columns will update the view column mapping", () => { + const view = { + ...basicView, + columns: ["name", "id", "description"], + } + const { description, ...newTableSchema } = { + ...basicTable.schema, + updatedDescription: { + ...basicTable.schema.description, + name: "updatedDescription", + }, + } as TableSchema + + const result = syncSchema(_.cloneDeep(view), newTableSchema, { + old: "description", + updated: "updatedDescription", + }) + expect(result).toEqual({ + ...view, + columns: ["name", "id", "updatedDescription"], + schemaUI: undefined, + }) + }) }) describe("view with schema", () => { @@ -355,7 +383,11 @@ describe("table sdk", () => { hiddenField: { visible: false }, }, } - const result = syncSchema(_.cloneDeep(view), basicTable.schema) + const result = syncSchema( + _.cloneDeep(view), + basicTable.schema, + undefined + ) expect(result).toEqual(view) }) @@ -385,7 +417,7 @@ describe("table sdk", () => { }, } - const result = syncSchema(_.cloneDeep(view), newTableSchema) + const result = syncSchema(_.cloneDeep(view), newTableSchema, undefined) expect(result).toEqual({ ...view, schemaUI: { @@ -409,7 +441,7 @@ describe("table sdk", () => { } const { name, description, ...newTableSchema } = basicTable.schema - const result = syncSchema(_.cloneDeep(view), newTableSchema) + const result = syncSchema(_.cloneDeep(view), newTableSchema, undefined) expect(result).toEqual({ ...view, columns: ["id"], @@ -439,9 +471,9 @@ describe("table sdk", () => { name: "newField1", visible: true, }, - } as any + } as TableSchema - const result = syncSchema(_.cloneDeep(view), newTableSchema) + const result = syncSchema(_.cloneDeep(view), newTableSchema, undefined) expect(result).toEqual({ ...view, columns: ["id"], @@ -453,6 +485,40 @@ describe("table sdk", () => { }, }) }) + + it("renaming mapped columns will update the view column mapping and it's schema", () => { + const view: ViewV2 = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true }, + id: { visible: true }, + description: { visible: true, width: 150, icon: "ic-any" }, + hiddenField: { visible: false }, + }, + } + const { description, ...newTableSchema } = { + ...basicTable.schema, + updatedDescription: { + ...basicTable.schema.description, + name: "updatedDescription", + }, + } as TableSchema + + const result = syncSchema(_.cloneDeep(view), newTableSchema, { + old: "description", + updated: "updatedDescription", + }) + expect(result).toEqual({ + ...view, + columns: ["name", "id", "updatedDescription"], + schemaUI: { + ...view.schemaUI, + description: undefined, + updatedDescription: { visible: true, width: 150, icon: "ic-any" }, + }, + }) + }) }) }) }) From 4f27197cceef07dbf5ff13f828e9dee7cb68c036 Mon Sep 17 00:00:00 2001 From: Adria Navarro Date: Wed, 9 Aug 2023 16:28:17 +0300 Subject: [PATCH 09/10] Add extra tests --- .../src/sdk/app/views/tests/views.spec.ts | 66 ++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/packages/server/src/sdk/app/views/tests/views.spec.ts b/packages/server/src/sdk/app/views/tests/views.spec.ts index d3b2b138a1..d3d938f9cf 100644 --- a/packages/server/src/sdk/app/views/tests/views.spec.ts +++ b/packages/server/src/sdk/app/views/tests/views.spec.ts @@ -292,7 +292,7 @@ describe("table sdk", () => { describe("view without schema", () => { it("no table schema changes will not amend the view", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], } @@ -305,7 +305,7 @@ describe("table sdk", () => { }) it("adding new columns will not change the view schema", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], } @@ -332,7 +332,7 @@ describe("table sdk", () => { }) it("deleting columns will not change the view schema", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], } @@ -347,7 +347,7 @@ describe("table sdk", () => { }) it("renaming mapped columns will update the view column mapping", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], } @@ -373,7 +373,7 @@ describe("table sdk", () => { describe("view with schema", () => { it("no table schema changes will not amend the view", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], schemaUI: { @@ -392,7 +392,7 @@ describe("table sdk", () => { }) it("adding new columns will add them as not visible to the view", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], schemaUI: { @@ -429,7 +429,7 @@ describe("table sdk", () => { }) it("deleting columns will remove them from the UI", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], schemaUI: { @@ -454,7 +454,7 @@ describe("table sdk", () => { }) it("can handle additions and deletions at the same them UI", () => { - const view = { + const view: ViewV2 = { ...basicView, columns: ["name", "id", "description"], schemaUI: { @@ -519,6 +519,56 @@ describe("table sdk", () => { }, }) }) + + it("changing no UI schema will not affect the view", () => { + const view: ViewV2 = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true, width: 100 }, + id: { visible: true, width: 20 }, + description: { visible: false }, + hiddenField: { visible: false }, + }, + } + const result = syncSchema( + _.cloneDeep(view), + { + ...basicTable.schema, + id: { + ...basicTable.schema.id, + type: FieldType.NUMBER, + }, + }, + undefined + ) + expect(result).toEqual(view) + }) + + it("changing table column UI fields will not affect the view schema", () => { + const view: ViewV2 = { + ...basicView, + columns: ["name", "id", "description"], + schemaUI: { + name: { visible: true, width: 100 }, + id: { visible: true, width: 20 }, + description: { visible: false }, + hiddenField: { visible: false }, + }, + } + const result = syncSchema( + _.cloneDeep(view), + { + ...basicTable.schema, + id: { + ...basicTable.schema.id, + visible: !basicTable.schema.id.visible, + }, + }, + undefined + ) + expect(result).toEqual(view) + }) }) }) }) From cc0877df2f2080fb508d3f3fed612cdf972a124a Mon Sep 17 00:00:00 2001 From: Budibase Staging Release Bot <> Date: Fri, 11 Aug 2023 13:37:14 +0000 Subject: [PATCH 10/10] Bump version to 2.9.24-alpha.4 --- lerna.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lerna.json b/lerna.json index 8a0649b8bb..1514e668d2 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "2.9.24-alpha.3", + "version": "2.9.24-alpha.4", "npmClient": "yarn", "packages": [ "packages/*"