1
0
Fork 0
mirror of synced 2024-09-24 21:31:17 +12:00

Merge pull request #14592 from Budibase/remove-view-readonly-column-licensing-master

Make view readonly columns available for free
This commit is contained in:
Andrew Kingston 2024-09-20 11:21:33 +01:00 committed by GitHub
commit 4489fcb9b8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 6 additions and 117 deletions

View file

@ -102,10 +102,6 @@ export const useAppBuilders = () => {
return useFeature(Feature.APP_BUILDERS) return useFeature(Feature.APP_BUILDERS)
} }
export const useViewReadonlyColumns = () => {
return useFeature(Feature.VIEW_READONLY_COLUMNS)
}
// QUOTAS // QUOTAS
export const setAutomationLogsQuota = (value: number) => { export const setAutomationLogsQuota = (value: number) => {

View file

@ -1,6 +1,6 @@
<script> <script>
import { viewsV2 } from "stores/builder" import { viewsV2 } from "stores/builder"
import { admin, licensing } from "stores/portal" import { admin } from "stores/portal"
import { Grid } from "@budibase/frontend-core" import { Grid } from "@budibase/frontend-core"
import { API } from "api" import { API } from "api"
import GridCreateEditRowModal from "components/backend/DataTable/modals/grid/GridCreateEditRowModal.svelte" import GridCreateEditRowModal from "components/backend/DataTable/modals/grid/GridCreateEditRowModal.svelte"
@ -30,7 +30,6 @@
showAvatars={false} showAvatars={false}
on:updatedatasource={handleGridViewUpdate} on:updatedatasource={handleGridViewUpdate}
isCloud={$admin.cloud} isCloud={$admin.cloud}
allowViewReadonlyColumns={$licensing.isViewReadonlyColumnsEnabled}
canSetRelationshipSchemas={isEnabled(FeatureFlag.ENRICHED_RELATIONSHIPS)} canSetRelationshipSchemas={isEnabled(FeatureFlag.ENRICHED_RELATIONSHIPS)}
> >
<svelte:fragment slot="filter"> <svelte:fragment slot="filter">

View file

@ -140,10 +140,6 @@ export const createLicensingStore = () => {
Constants.Features.VIEW_PERMISSIONS Constants.Features.VIEW_PERMISSIONS
) )
const isViewReadonlyColumnsEnabled = license.features.includes(
Constants.Features.VIEW_READONLY_COLUMNS
)
const budibaseAIEnabled = license.features.includes( const budibaseAIEnabled = license.features.includes(
Constants.Features.BUDIBASE_AI Constants.Features.BUDIBASE_AI
) )
@ -173,7 +169,6 @@ export const createLicensingStore = () => {
triggerAutomationRunEnabled, triggerAutomationRunEnabled,
isViewPermissionsEnabled, isViewPermissionsEnabled,
perAppBuildersEnabled, perAppBuildersEnabled,
isViewReadonlyColumnsEnabled,
} }
}) })
}, },

View file

@ -4,16 +4,13 @@
import ColumnsSettingContent from "./ColumnsSettingContent.svelte" import ColumnsSettingContent from "./ColumnsSettingContent.svelte"
import { FieldPermissions } from "../../../constants" import { FieldPermissions } from "../../../constants"
export let allowViewReadonlyColumns = false
const { columns, datasource } = getContext("grid") const { columns, datasource } = getContext("grid")
let open = false let open = false
let anchor let anchor
$: anyRestricted = $columns.filter(col => !col.visible || col.readonly).length $: anyRestricted = $columns.filter(col => !col.visible || col.readonly).length
$: text = anyRestricted ? `Columns (${anyRestricted} restricted)` : "Columns" $: text = anyRestricted ? `Columns: (${anyRestricted} restricted)` : "Columns"
$: permissions = $: permissions =
$datasource.type === "viewV2" $datasource.type === "viewV2"
? [ ? [
@ -22,9 +19,6 @@
FieldPermissions.HIDDEN, FieldPermissions.HIDDEN,
] ]
: [FieldPermissions.WRITABLE, FieldPermissions.HIDDEN] : [FieldPermissions.WRITABLE, FieldPermissions.HIDDEN]
$: disabledPermissions = allowViewReadonlyColumns
? []
: [FieldPermissions.READONLY]
</script> </script>
<div bind:this={anchor}> <div bind:this={anchor}>
@ -41,9 +35,5 @@
</div> </div>
<Popover bind:open {anchor} align="left"> <Popover bind:open {anchor} align="left">
<ColumnsSettingContent <ColumnsSettingContent columns={$columns} {permissions} />
columns={$columns}
{permissions}
{disabledPermissions}
/>
</Popover> </Popover>

View file

@ -58,7 +58,6 @@
export let buttons = null export let buttons = null
export let darkMode export let darkMode
export let isCloud = null export let isCloud = null
export let allowViewReadonlyColumns = false
export let rowConditions = null export let rowConditions = null
// Unique identifier for DOM nodes inside this instance // Unique identifier for DOM nodes inside this instance
@ -115,7 +114,6 @@
buttons, buttons,
darkMode, darkMode,
isCloud, isCloud,
allowViewReadonlyColumns,
rowConditions, rowConditions,
}) })
@ -157,7 +155,7 @@
<div class="controls-left"> <div class="controls-left">
<slot name="filter" /> <slot name="filter" />
<SortButton /> <SortButton />
<ColumnsSettingButton {allowViewReadonlyColumns} /> <ColumnsSettingButton />
<SizeButton /> <SizeButton />
<slot name="controls" /> <slot name="controls" />
</div> </div>

View file

@ -309,10 +309,6 @@ describe.each([
}) })
describe("readonly fields", () => { describe("readonly fields", () => {
beforeEach(() => {
mocks.licenses.useViewReadonlyColumns()
})
it("readonly fields are persisted", async () => { it("readonly fields are persisted", async () => {
const table = await config.api.table.save( const table = await config.api.table.save(
saveTableRequest({ saveTableRequest({
@ -436,7 +432,7 @@ describe.each([
}) })
}) })
it("readonly fields cannot be used on free license", async () => { it("readonly fields can be used on free license", async () => {
mocks.licenses.useCloudFree() mocks.licenses.useCloudFree()
const table = await config.api.table.save( const table = await config.api.table.save(
saveTableRequest({ saveTableRequest({
@ -466,11 +462,7 @@ describe.each([
} }
await config.api.viewV2.create(newView, { await config.api.viewV2.create(newView, {
status: 400, status: 201,
body: {
message: "Readonly fields are not enabled",
status: 400,
},
}) })
}) })
}) })
@ -513,7 +505,6 @@ describe.each([
}) })
it("display fields can be readonly", async () => { it("display fields can be readonly", async () => {
mocks.licenses.useViewReadonlyColumns()
const table = await config.api.table.save( const table = await config.api.table.save(
saveTableRequest({ saveTableRequest({
schema: { schema: {
@ -588,7 +579,6 @@ describe.each([
}) })
it("can update all fields", async () => { it("can update all fields", async () => {
mocks.licenses.useViewReadonlyColumns()
const tableId = table._id! const tableId = table._id!
const updatedData: Required<UpdateViewRequest> = { const updatedData: Required<UpdateViewRequest> = {
@ -802,71 +792,6 @@ describe.each([
) )
}) })
it("cannot update views with readonly on on free license", async () => {
mocks.licenses.useViewReadonlyColumns()
view = await config.api.viewV2.update({
...view,
schema: {
id: { visible: true },
Price: {
visible: true,
readonly: true,
},
},
})
mocks.licenses.useCloudFree()
await config.api.viewV2.update(view, {
status: 400,
body: {
message: "Readonly fields are not enabled",
},
})
})
it("can remove readonly config after license downgrade", async () => {
mocks.licenses.useViewReadonlyColumns()
view = await config.api.viewV2.update({
...view,
schema: {
id: { visible: true },
Price: {
visible: true,
readonly: true,
},
Category: {
visible: true,
readonly: true,
},
},
})
mocks.licenses.useCloudFree()
const res = await config.api.viewV2.update({
...view,
schema: {
id: { visible: true },
Price: {
visible: true,
readonly: false,
},
},
})
expect(res).toEqual(
expect.objectContaining({
...view,
schema: {
id: { visible: true },
Price: {
visible: true,
readonly: false,
},
},
})
)
})
isInternal && isInternal &&
it("updating schema will only validate modified field", async () => { it("updating schema will only validate modified field", async () => {
let view = await config.api.viewV2.create({ let view = await config.api.viewV2.create({
@ -1046,7 +971,6 @@ describe.each([
}) })
it("should be able to fetch readonly config after downgrades", async () => { it("should be able to fetch readonly config after downgrades", async () => {
mocks.licenses.useViewReadonlyColumns()
const res = await config.api.viewV2.create({ const res = await config.api.viewV2.create({
name: generator.name(), name: generator.name(),
tableId: table._id!, tableId: table._id!,
@ -1112,8 +1036,6 @@ describe.each([
}) })
it("rejects if field is readonly in any view", async () => { it("rejects if field is readonly in any view", async () => {
mocks.licenses.useViewReadonlyColumns()
await config.api.viewV2.create({ await config.api.viewV2.create({
name: "view a", name: "view a",
tableId: table._id!, tableId: table._id!,
@ -1538,7 +1460,6 @@ describe.each([
}) })
it("can't persist readonly columns", async () => { it("can't persist readonly columns", async () => {
mocks.licenses.useViewReadonlyColumns()
const view = await config.api.viewV2.create({ const view = await config.api.viewV2.create({
tableId: table._id!, tableId: table._id!,
name: generator.guid(), name: generator.guid(),
@ -1607,7 +1528,6 @@ describe.each([
}) })
it("can't update readonly columns", async () => { it("can't update readonly columns", async () => {
mocks.licenses.useViewReadonlyColumns()
const view = await config.api.viewV2.create({ const view = await config.api.viewV2.create({
tableId: table._id!, tableId: table._id!,
name: generator.guid(), name: generator.guid(),

View file

@ -5,13 +5,11 @@ import {
Table, Table,
TableSchema, TableSchema,
View, View,
ViewFieldMetadata,
ViewV2, ViewV2,
ViewV2ColumnEnriched, ViewV2ColumnEnriched,
ViewV2Enriched, ViewV2Enriched,
} from "@budibase/types" } from "@budibase/types"
import { HTTPError } from "@budibase/backend-core" import { HTTPError } from "@budibase/backend-core"
import { features } from "@budibase/pro"
import { import {
helpers, helpers,
PROTECTED_EXTERNAL_COLUMNS, PROTECTED_EXTERNAL_COLUMNS,
@ -59,13 +57,6 @@ async function guardViewSchema(
} }
if (viewSchema[field].readonly) { if (viewSchema[field].readonly) {
if (
!(await features.isViewReadonlyColumnsEnabled()) &&
!(tableSchemaField as ViewFieldMetadata).readonly
) {
throw new HTTPError(`Readonly fields are not enabled`, 400)
}
if (!viewSchema[field].visible) { if (!viewSchema[field].visible) {
throw new HTTPError( throw new HTTPError(
`Field "${field}" must be visible if you want to make it readonly`, `Field "${field}" must be visible if you want to make it readonly`,