Merge pull request #13852 from Budibase/BUDI-8285/support-existing-view-configurations
Support existing view configurations
This commit is contained in:
commit
861330df28
|
@ -49,12 +49,15 @@
|
||||||
|
|
||||||
const requiredTooltip = isRequired && "Required columns must be writable"
|
const requiredTooltip = isRequired && "Required columns must be writable"
|
||||||
|
|
||||||
|
const editEnabled =
|
||||||
|
!isRequired ||
|
||||||
|
columnToPermissionOptions(c) !== PERMISSION_OPTIONS.WRITABLE
|
||||||
const options = [
|
const options = [
|
||||||
{
|
{
|
||||||
icon: "Edit",
|
icon: "Edit",
|
||||||
value: PERMISSION_OPTIONS.WRITABLE,
|
value: PERMISSION_OPTIONS.WRITABLE,
|
||||||
tooltip: requiredTooltip || "Writable",
|
tooltip: (!editEnabled && requiredTooltip) || "Writable",
|
||||||
disabled: isRequired,
|
disabled: !editEnabled,
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
if ($datasource.type === "viewV2") {
|
if ($datasource.type === "viewV2") {
|
||||||
|
|
|
@ -22,7 +22,7 @@ import { generator, mocks } from "@budibase/backend-core/tests"
|
||||||
import { DatabaseName, getDatasource } from "../../../integrations/tests/utils"
|
import { DatabaseName, getDatasource } from "../../../integrations/tests/utils"
|
||||||
import merge from "lodash/merge"
|
import merge from "lodash/merge"
|
||||||
import { quotas } from "@budibase/pro"
|
import { quotas } from "@budibase/pro"
|
||||||
import { roles } from "@budibase/backend-core"
|
import { db, roles } from "@budibase/backend-core"
|
||||||
|
|
||||||
describe.each([
|
describe.each([
|
||||||
["internal", undefined],
|
["internal", undefined],
|
||||||
|
@ -840,6 +840,53 @@ describe.each([
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
isInternal &&
|
||||||
|
it("updating schema will only validate modified field", async () => {
|
||||||
|
let view = await config.api.viewV2.create({
|
||||||
|
tableId: table._id!,
|
||||||
|
name: generator.guid(),
|
||||||
|
schema: {
|
||||||
|
id: { visible: true },
|
||||||
|
Price: {
|
||||||
|
visible: true,
|
||||||
|
},
|
||||||
|
Category: { visible: true },
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
// Update the view to an invalid state
|
||||||
|
const tableToUpdate = await config.api.table.get(table._id!)
|
||||||
|
;(tableToUpdate.views![view.name] as ViewV2).schema!.id.visible = false
|
||||||
|
await db.getDB(config.appId!).put(tableToUpdate)
|
||||||
|
|
||||||
|
view = await config.api.viewV2.get(view.id)
|
||||||
|
await config.api.viewV2.update({
|
||||||
|
...view,
|
||||||
|
schema: {
|
||||||
|
...view.schema,
|
||||||
|
Price: {
|
||||||
|
visible: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
expect(await config.api.viewV2.get(view.id)).toEqual(
|
||||||
|
expect.objectContaining({
|
||||||
|
schema: {
|
||||||
|
id: expect.objectContaining({
|
||||||
|
visible: false,
|
||||||
|
}),
|
||||||
|
Price: expect.objectContaining({
|
||||||
|
visible: false,
|
||||||
|
}),
|
||||||
|
Category: expect.objectContaining({
|
||||||
|
visible: true,
|
||||||
|
}),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe("delete", () => {
|
describe("delete", () => {
|
||||||
|
|
|
@ -9,7 +9,7 @@ import {
|
||||||
import { HTTPError, db as dbCore } from "@budibase/backend-core"
|
import { HTTPError, db as dbCore } from "@budibase/backend-core"
|
||||||
import { features } from "@budibase/pro"
|
import { features } from "@budibase/pro"
|
||||||
import { helpers } from "@budibase/shared-core"
|
import { helpers } from "@budibase/shared-core"
|
||||||
import { cloneDeep } from "lodash"
|
import { cloneDeep } from "lodash/fp"
|
||||||
|
|
||||||
import * as utils from "../../../db/utils"
|
import * as utils from "../../../db/utils"
|
||||||
import { isExternalTableID } from "../../../integrations/utils"
|
import { isExternalTableID } from "../../../integrations/utils"
|
||||||
|
@ -68,16 +68,25 @@ async function guardViewSchema(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const existingView =
|
||||||
|
table?.views && (table.views[view.name] as ViewV2 | undefined)
|
||||||
|
|
||||||
for (const field of Object.values(table.schema)) {
|
for (const field of Object.values(table.schema)) {
|
||||||
if (!helpers.schema.isRequired(field.constraints)) {
|
if (!helpers.schema.isRequired(field.constraints)) {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
const viewSchemaField = viewSchema[field.name]
|
const viewSchemaField = viewSchema[field.name]
|
||||||
|
const existingViewSchema =
|
||||||
|
existingView?.schema && existingView.schema[field.name]
|
||||||
|
if (!viewSchemaField && !existingViewSchema?.visible) {
|
||||||
|
// Supporting existing configs with required columns but hidden in views
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
if (!viewSchemaField?.visible) {
|
if (!viewSchemaField?.visible) {
|
||||||
throw new HTTPError(
|
throw new HTTPError(
|
||||||
`You can't hide "${field.name} because it is a required field."`,
|
`You can't hide "${field.name}" because it is a required field.`,
|
||||||
400
|
400
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue