1
0
Fork 0
mirror of synced 2024-09-20 11:27:56 +12:00

Allow setting visibilities via parameter

This commit is contained in:
Adria Navarro 2024-08-20 10:29:59 +02:00
parent 8f9995d04c
commit 31c1fa8b7a
3 changed files with 79 additions and 41 deletions

View file

@ -2,16 +2,29 @@
import { getContext } from "svelte" import { getContext } from "svelte"
import { ActionButton, Popover } from "@budibase/bbui" import { ActionButton, Popover } from "@budibase/bbui"
import ColumnsSettingContent from "./ColumnsSettingContent.svelte" import ColumnsSettingContent from "./ColumnsSettingContent.svelte"
import { FieldPermissions } from "../../../constants"
export let allowViewReadonlyColumns = false export let allowViewReadonlyColumns = false
const { columns } = 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 =
$datasource.type === "viewV2"
? [
FieldPermissions.WRITABLE,
FieldPermissions.READONLY,
FieldPermissions.HIDDEN,
]
: [FieldPermissions.WRITABLE, FieldPermissions.HIDDEN]
$: disabledPermissions = allowViewReadonlyColumns
? []
: [FieldPermissions.READONLY]
</script> </script>
<div bind:this={anchor}> <div bind:this={anchor}>
@ -28,5 +41,9 @@
</div> </div>
<Popover bind:open {anchor} align="left"> <Popover bind:open {anchor} align="left">
<ColumnsSettingContent columns={$columns} {allowViewReadonlyColumns} /> <ColumnsSettingContent
columns={$columns}
{permissions}
{disabledPermissions}
/>
</Popover> </Popover>

View file

@ -6,11 +6,22 @@
import { helpers } from "@budibase/shared-core" import { helpers } from "@budibase/shared-core"
import { FieldType } from "@budibase/types" import { FieldType } from "@budibase/types"
import { tables } from "stores/builder" import { tables } from "stores/builder"
import { FieldPermissions } from "../../../constants"
export let allowViewReadonlyColumns export let permissions = [FieldPermissions.WRITABLE, FieldPermissions.HIDDEN]
export let disabledPermissions = []
export let columns export let columns
const { datasource, dispatch } = getContext("grid") const { datasource, dispatch } = getContext("grid")
$: permissionsObj = permissions.reduce(
(acc, c) => ({
...acc,
[c]: {
disabled: disabledPermissions.includes(c),
},
}),
{}
)
$: allowRelationshipSchemas = true // TODO $: allowRelationshipSchemas = true // TODO
let relationshipPanelOpen = false let relationshipPanelOpen = false
@ -18,8 +29,8 @@
let relationshipPanelColumns = [] let relationshipPanelColumns = []
const toggleColumn = async (column, permission) => { const toggleColumn = async (column, permission) => {
const visible = permission !== PERMISSION_OPTIONS.HIDDEN const visible = permission !== FieldPermissions.HIDDEN
const readonly = permission === PERMISSION_OPTIONS.READONLY const readonly = permission === FieldPermissions.READONLY
await datasource.actions.addSchemaMutation(column.name, { await datasource.actions.addSchemaMutation(column.name, {
visible, visible,
@ -36,60 +47,63 @@
dispatch(visible ? "show-column" : "hide-column") dispatch(visible ? "show-column" : "hide-column")
} }
const PERMISSION_OPTIONS = {
WRITABLE: "writable",
READONLY: "readonly",
HIDDEN: "hidden",
}
$: displayColumns = columns.map(c => { $: displayColumns = columns.map(c => {
const isRequired = helpers.schema.isRequired(c.schema.constraints) const isRequired = helpers.schema.isRequired(c.schema.constraints)
const requiredTooltip = isRequired && "Required columns must be writable" const requiredTooltip = isRequired && "Required columns must be writable"
const editEnabled = const editEnabled =
!isRequired || !isRequired || columnToPermissionOptions(c) !== FieldPermissions.WRITABLE
columnToPermissionOptions(c) !== PERMISSION_OPTIONS.WRITABLE const options = []
const options = [
{ if (permissionsObj[FieldPermissions.WRITABLE]) {
icon: "Edit",
value: PERMISSION_OPTIONS.WRITABLE,
tooltip: (!editEnabled && requiredTooltip) || "Writable",
disabled: !editEnabled,
},
]
if ($datasource.type === "viewV2") {
options.push({ options.push({
icon: "Visibility", icon: "Edit",
value: PERMISSION_OPTIONS.READONLY, value: FieldPermissions.WRITABLE,
tooltip: allowViewReadonlyColumns tooltip: (!editEnabled && requiredTooltip) || "Writable",
? requiredTooltip || "Read only" disabled:
: "Read only (premium feature)", !editEnabled || permissionsObj[FieldPermissions.WRITABLE].disabled,
disabled: !allowViewReadonlyColumns || isRequired,
}) })
} }
options.push({ if (permissionsObj[FieldPermissions.READONLY]) {
icon: "VisibilityOff", options.push({
value: PERMISSION_OPTIONS.HIDDEN, icon: "Visibility",
disabled: c.primaryDisplay || isRequired, value: FieldPermissions.READONLY,
tooltip: tooltip: !permissionsObj[FieldPermissions.READONLY].disabled
(c.primaryDisplay && "Display column cannot be hidden") || ? requiredTooltip || "Read only"
requiredTooltip || : "Read only (premium feature)",
"Hidden", disabled:
}) permissionsObj[FieldPermissions.READONLY].disabled || isRequired,
})
}
if (permissionsObj[FieldPermissions.HIDDEN]) {
options.push({
icon: "VisibilityOff",
value: FieldPermissions.HIDDEN,
disabled:
c.primaryDisplay ||
isRequired ||
permissionsObj[FieldPermissions.HIDDEN].disabled,
tooltip:
(c.primaryDisplay && "Display column cannot be hidden") ||
requiredTooltip ||
"Hidden",
})
}
return { ...c, options } return { ...c, options }
}) })
function columnToPermissionOptions(column) { function columnToPermissionOptions(column) {
if (column.schema.visible === false) { if (column.schema.visible === false) {
return PERMISSION_OPTIONS.HIDDEN return FieldPermissions.HIDDEN
} }
if (column.schema.readonly) { if (column.schema.readonly) {
return PERMISSION_OPTIONS.READONLY return FieldPermissions.READONLY
} }
return PERMISSION_OPTIONS.WRITABLE return FieldPermissions.WRITABLE
} }
function onRelationshipOpen(column, domElement) { function onRelationshipOpen(column, domElement) {
@ -109,6 +123,7 @@
schema: { schema: {
...column, ...column,
visible: !!isPrimaryDisplay, visible: !!isPrimaryDisplay,
readonly: isPrimaryDisplay || column.readonly,
}, },
} }
}) })
@ -158,8 +173,8 @@
align="right-outside" align="right-outside"
> >
<svelte:self <svelte:self
{allowViewReadonlyColumns}
columns={relationshipPanelColumns} columns={relationshipPanelColumns}
permissions={[FieldPermissions.READONLY, FieldPermissions.HIDDEN]}
/> />
</Popover> </Popover>
{/if} {/if}

View file

@ -161,3 +161,9 @@ export const TypeIconMap = {
export const OptionColours = [...new Array(12).keys()].map(idx => { export const OptionColours = [...new Array(12).keys()].map(idx => {
return `hsla(${((idx + 1) * 222) % 360}, 90%, 75%, 0.3)` return `hsla(${((idx + 1) * 222) % 360}, 90%, 75%, 0.3)`
}) })
export const FieldPermissions = {
WRITABLE: "writable",
READONLY: "readonly",
HIDDEN: "hidden",
}