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" }, + }, + }) + }) }) }) })