Merge pull request #13841 from Budibase/BUDI-8282/validate-configuration-for-hidden-views
Validate hidden configuration for views
This commit is contained in:
commit
eaa1af7da2
2 changed files with 66 additions and 3 deletions
|
@ -117,6 +117,9 @@ describe.each([
|
|||
const newView: CreateViewRequest = {
|
||||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
},
|
||||
}
|
||||
const res = await config.api.viewV2.create(newView)
|
||||
|
||||
|
@ -145,6 +148,7 @@ describe.each([
|
|||
type: SortType.STRING,
|
||||
},
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
},
|
||||
|
@ -155,6 +159,7 @@ describe.each([
|
|||
expect(res).toEqual({
|
||||
...newView,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
},
|
||||
|
@ -169,6 +174,11 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: {
|
||||
name: "id",
|
||||
type: FieldType.NUMBER,
|
||||
visible: true,
|
||||
},
|
||||
Price: {
|
||||
name: "Price",
|
||||
type: FieldType.NUMBER,
|
||||
|
@ -190,6 +200,7 @@ describe.each([
|
|||
expect(createdView).toEqual({
|
||||
...newView,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
order: 1,
|
||||
|
@ -206,6 +217,12 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: {
|
||||
name: "id",
|
||||
type: FieldType.AUTO,
|
||||
autocolumn: true,
|
||||
visible: true,
|
||||
},
|
||||
Price: {
|
||||
name: "Price",
|
||||
type: FieldType.NUMBER,
|
||||
|
@ -229,6 +246,7 @@ describe.each([
|
|||
tableId: table._id!,
|
||||
primaryDisplay: generator.word(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: { visible: true },
|
||||
Category: { visible: false },
|
||||
},
|
||||
|
@ -238,6 +256,7 @@ describe.each([
|
|||
expect(res).toEqual({
|
||||
...newView,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
},
|
||||
|
@ -252,6 +271,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
nonExisting: {
|
||||
visible: true,
|
||||
},
|
||||
|
@ -290,6 +310,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
name: {
|
||||
visible: true,
|
||||
readonly: true,
|
||||
|
@ -303,6 +324,7 @@ describe.each([
|
|||
|
||||
const res = await config.api.viewV2.create(newView)
|
||||
expect(res.schema).toEqual({
|
||||
id: { visible: true },
|
||||
name: {
|
||||
visible: true,
|
||||
readonly: true,
|
||||
|
@ -335,6 +357,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
name: {
|
||||
visible: true,
|
||||
readonly: true,
|
||||
|
@ -372,6 +395,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
name: {
|
||||
visible: false,
|
||||
readonly: true,
|
||||
|
@ -410,6 +434,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
name: {
|
||||
visible: true,
|
||||
readonly: true,
|
||||
|
@ -437,6 +462,9 @@ describe.each([
|
|||
view = await config.api.viewV2.create({
|
||||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -485,6 +513,7 @@ describe.each([
|
|||
type: SortType.STRING,
|
||||
},
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Category: {
|
||||
visible: false,
|
||||
},
|
||||
|
@ -502,7 +531,7 @@ describe.each([
|
|||
schema: {
|
||||
...table.schema,
|
||||
id: expect.objectContaining({
|
||||
visible: false,
|
||||
visible: true,
|
||||
}),
|
||||
Category: expect.objectContaining({
|
||||
visible: false,
|
||||
|
@ -599,6 +628,9 @@ describe.each([
|
|||
const anotherView = await config.api.viewV2.create({
|
||||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
},
|
||||
})
|
||||
const result = await config
|
||||
.request!.put(`/api/v2/views/${anotherView.id}`)
|
||||
|
@ -617,6 +649,7 @@ describe.each([
|
|||
const updatedView = await config.api.viewV2.update({
|
||||
...view,
|
||||
schema: {
|
||||
...view.schema,
|
||||
Price: {
|
||||
name: "Price",
|
||||
type: FieldType.NUMBER,
|
||||
|
@ -636,6 +669,7 @@ describe.each([
|
|||
expect(updatedView).toEqual({
|
||||
...view,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
order: 1,
|
||||
|
@ -652,6 +686,7 @@ describe.each([
|
|||
{
|
||||
...view,
|
||||
schema: {
|
||||
...view.schema,
|
||||
Price: {
|
||||
name: "Price",
|
||||
type: FieldType.NUMBER,
|
||||
|
@ -675,6 +710,7 @@ describe.each([
|
|||
view = await config.api.viewV2.update({
|
||||
...view,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
readonly: true,
|
||||
|
@ -697,6 +733,7 @@ describe.each([
|
|||
view = await config.api.viewV2.update({
|
||||
...view,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
readonly: true,
|
||||
|
@ -711,6 +748,7 @@ describe.each([
|
|||
const res = await config.api.viewV2.update({
|
||||
...view,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
readonly: false,
|
||||
|
@ -721,6 +759,7 @@ describe.each([
|
|||
expect.objectContaining({
|
||||
...view,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: {
|
||||
visible: true,
|
||||
readonly: false,
|
||||
|
@ -738,6 +777,9 @@ describe.each([
|
|||
view = await config.api.viewV2.create({
|
||||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
},
|
||||
})
|
||||
})
|
||||
|
||||
|
@ -760,6 +802,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: { visible: false },
|
||||
Category: { visible: true },
|
||||
},
|
||||
|
@ -782,6 +825,7 @@ describe.each([
|
|||
name: generator.name(),
|
||||
tableId: table._id!,
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Price: { visible: true, readonly: true },
|
||||
},
|
||||
})
|
||||
|
@ -817,6 +861,7 @@ describe.each([
|
|||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
Country: {
|
||||
visible: true,
|
||||
},
|
||||
|
@ -851,6 +896,7 @@ describe.each([
|
|||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
two: { visible: true },
|
||||
},
|
||||
})
|
||||
|
@ -876,6 +922,7 @@ describe.each([
|
|||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
one: { visible: true, readonly: true },
|
||||
two: { visible: true },
|
||||
},
|
||||
|
@ -917,6 +964,7 @@ describe.each([
|
|||
tableId: table._id!,
|
||||
name: generator.guid(),
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
one: { visible: true, readonly: true },
|
||||
two: { visible: true },
|
||||
},
|
||||
|
@ -984,6 +1032,7 @@ describe.each([
|
|||
rows.map(r => ({
|
||||
_viewId: view.id,
|
||||
tableId: table._id,
|
||||
id: r.id,
|
||||
_id: r._id,
|
||||
_rev: r._rev,
|
||||
...(isInternal
|
||||
|
@ -1024,6 +1073,7 @@ describe.each([
|
|||
},
|
||||
],
|
||||
schema: {
|
||||
id: { visible: true },
|
||||
two: { visible: true },
|
||||
},
|
||||
})
|
||||
|
@ -1035,6 +1085,7 @@ describe.each([
|
|||
{
|
||||
_viewId: view.id,
|
||||
tableId: table._id,
|
||||
id: two.id,
|
||||
two: two.two,
|
||||
_id: two._id,
|
||||
_rev: two._rev,
|
||||
|
@ -1188,7 +1239,11 @@ describe.each([
|
|||
|
||||
describe("sorting", () => {
|
||||
let table: Table
|
||||
const viewSchema = { age: { visible: true }, name: { visible: true } }
|
||||
const viewSchema = {
|
||||
id: { visible: true },
|
||||
age: { visible: true },
|
||||
name: { visible: true },
|
||||
}
|
||||
|
||||
beforeAll(async () => {
|
||||
table = await config.api.table.save(
|
||||
|
|
|
@ -74,7 +74,15 @@ async function guardViewSchema(
|
|||
}
|
||||
|
||||
const viewSchemaField = viewSchema[field.name]
|
||||
if (viewSchemaField?.readonly) {
|
||||
|
||||
if (!viewSchemaField?.visible) {
|
||||
throw new HTTPError(
|
||||
`You can't hide the required field "${field.name}"`,
|
||||
400
|
||||
)
|
||||
}
|
||||
|
||||
if (viewSchemaField.readonly) {
|
||||
throw new HTTPError(
|
||||
`You can't make field "${field.name}" readonly because it is a required field.`,
|
||||
400
|
||||
|
|
Loading…
Reference in a new issue