From aaaf1732954fdd3dee5ade7a255bed4b88c02d50 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Wed, 17 Jul 2024 11:02:47 +0100 Subject: [PATCH 1/3] Initial UI. --- .../DataTable/modals/CreateEditColumn.svelte | 45 +++++++++++++++++-- .../types/src/documents/app/table/schema.ts | 1 - 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index a9ea90242a..6f657f57d6 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -133,7 +133,9 @@ } $: initialiseField(field, savingColumn) $: checkConstraints(editableColumn) - $: required = !!editableColumn?.constraints?.presence || primaryDisplay + $: required = hasDefault + ? false + : !!editableColumn?.constraints?.presence || primaryDisplay $: uneditable = $tables.selected?._id === TableNames.USERS && UNEDITABLE_USER_FIELDS.includes(editableColumn.name) @@ -165,11 +167,19 @@ editableColumn?.type !== AUTO_TYPE && editableColumn?.type !== JSON_TYPE && !editableColumn.autocolumn + $: canHaveDefault = + editableColumn?.type === FieldType.NUMBER || + editableColumn?.type === FieldType.JSON || + editableColumn?.type === FieldType.DATETIME || + editableColumn?.type === FieldType.LONGFORM || + editableColumn?.type === FieldType.STRING $: canBeRequired = editableColumn?.type !== LINK_TYPE && !uneditable && editableColumn?.type !== AUTO_TYPE && !editableColumn.autocolumn + $: hasDefault = + editableColumn?.default != null && editableColumn?.default !== "" $: externalTable = table.sourceType === DB_TYPE_EXTERNAL // in the case of internal tables the sourceId will just be undefined $: tableOptions = $tables.list.filter( @@ -349,12 +359,15 @@ } } - function onChangeRequired(e) { - const req = e.detail + function setRequired(req) { editableColumn.constraints.presence = req ? { allowEmpty: false } : false required = req } + function onChangeRequired(e) { + setRequired(e.detail) + } + function openJsonSchemaEditor() { jsonSchemaModal.show() } @@ -748,13 +761,37 @@ {/if} {/if} + + {#if canHaveDefault} +
+ { + editableColumn = { + ...editableColumn, + default: e.detail, + } + + if (e.detail) { + setRequired(false) + } + }} + bindings={getBindings({ table })} + allowJS + context={rowGoldenSample} + /> +
+ {/if}
diff --git a/packages/types/src/documents/app/table/schema.ts b/packages/types/src/documents/app/table/schema.ts index 7b89b610be..6078f73d1d 100644 --- a/packages/types/src/documents/app/table/schema.ts +++ b/packages/types/src/documents/app/table/schema.ts @@ -114,7 +114,6 @@ export interface FormulaFieldMetadata extends BaseFieldSchema { type: FieldType.FORMULA formula: string formulaType?: FormulaType - default?: string } export interface BBReferenceFieldMetadata From 1b556f29fe07ea6413ed82377aed98b5e6469743 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Fri, 9 Aug 2024 14:00:16 +0100 Subject: [PATCH 2/3] Rebase on posthog-feature-flags --- .../backend/DataTable/modals/CreateEditColumn.svelte | 12 +++++++----- packages/builder/src/helpers/featureFlags.js | 1 + packages/worker/src/index.ts | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 6f657f57d6..06c47f94af 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -44,6 +44,7 @@ import { RowUtils } from "@budibase/frontend-core" import ServerBindingPanel from "components/common/bindings/ServerBindingPanel.svelte" import OptionsEditor from "./OptionsEditor.svelte" + import { isEnabled, TENANT_FEATURE_FLAGS } from "helpers/featureFlags" const AUTO_TYPE = FieldType.AUTO const FORMULA_TYPE = FieldType.FORMULA @@ -168,11 +169,12 @@ editableColumn?.type !== JSON_TYPE && !editableColumn.autocolumn $: canHaveDefault = - editableColumn?.type === FieldType.NUMBER || - editableColumn?.type === FieldType.JSON || - editableColumn?.type === FieldType.DATETIME || - editableColumn?.type === FieldType.LONGFORM || - editableColumn?.type === FieldType.STRING + isEnabled(TENANT_FEATURE_FLAGS.DEFAULT_VALUES) && + (editableColumn?.type === FieldType.NUMBER || + editableColumn?.type === FieldType.JSON || + editableColumn?.type === FieldType.DATETIME || + editableColumn?.type === FieldType.LONGFORM || + editableColumn?.type === FieldType.STRING) $: canBeRequired = editableColumn?.type !== LINK_TYPE && !uneditable && diff --git a/packages/builder/src/helpers/featureFlags.js b/packages/builder/src/helpers/featureFlags.js index fe30fb9980..824e3c3f3e 100644 --- a/packages/builder/src/helpers/featureFlags.js +++ b/packages/builder/src/helpers/featureFlags.js @@ -6,6 +6,7 @@ export const TENANT_FEATURE_FLAGS = { USER_GROUPS: "USER_GROUPS", ONBOARDING_TOUR: "ONBOARDING_TOUR", GOOGLE_SHEETS: "GOOGLE_SHEETS", + DEFAULT_VALUES: "DEFAULT_VALUES", } export const isEnabled = featureFlag => { diff --git a/packages/worker/src/index.ts b/packages/worker/src/index.ts index d59d8d96ef..79e6f4493d 100644 --- a/packages/worker/src/index.ts +++ b/packages/worker/src/index.ts @@ -96,11 +96,11 @@ export default server.listen(parseInt(env.PORT || "4002"), async () => { console.log(startupLog) await initPro() await redis.clients.init() + features.init() cache.docWritethrough.init() // configure events to use the pro audit log write // can't integrate directly into backend-core due to cyclic issues await events.processors.init(proSdk.auditLogs.write) - features.init() }) process.on("uncaughtException", err => { From 700356a1ef204b8771d10ca73589b140d47e0e26 Mon Sep 17 00:00:00 2001 From: Sam Rose Date: Mon, 12 Aug 2024 11:08:58 +0100 Subject: [PATCH 3/3] Factor out default value check to shared-core. --- .../DataTable/modals/CreateEditColumn.svelte | 13 +++------ packages/shared-core/src/table.ts | 29 +++++++++++++++++++ 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 06c47f94af..98243c6e2f 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -19,6 +19,8 @@ helpers, PROTECTED_INTERNAL_COLUMNS, PROTECTED_EXTERNAL_COLUMNS, + canBeDisplayColumn, + canHaveDefaultColumn, } from "@budibase/shared-core" import { createEventDispatcher, getContext, onMount } from "svelte" import { cloneDeep } from "lodash/fp" @@ -164,17 +166,10 @@ : availableAutoColumns // used to select what different options can be displayed for column type $: canBeDisplay = - editableColumn?.type !== LINK_TYPE && - editableColumn?.type !== AUTO_TYPE && - editableColumn?.type !== JSON_TYPE && - !editableColumn.autocolumn + canBeDisplayColumn(editableColumn.type) && !editableColumn.autocolumn $: canHaveDefault = isEnabled(TENANT_FEATURE_FLAGS.DEFAULT_VALUES) && - (editableColumn?.type === FieldType.NUMBER || - editableColumn?.type === FieldType.JSON || - editableColumn?.type === FieldType.DATETIME || - editableColumn?.type === FieldType.LONGFORM || - editableColumn?.type === FieldType.STRING) + canHaveDefaultColumn(editableColumn.type) $: canBeRequired = editableColumn?.type !== LINK_TYPE && !uneditable && diff --git a/packages/shared-core/src/table.ts b/packages/shared-core/src/table.ts index 9e7626cb1c..8a8069ce4d 100644 --- a/packages/shared-core/src/table.ts +++ b/packages/shared-core/src/table.ts @@ -11,6 +11,7 @@ const allowDisplayColumnByType: Record = { [FieldType.AUTO]: true, [FieldType.INTERNAL]: true, [FieldType.BARCODEQR]: true, + [FieldType.BIGINT]: true, [FieldType.BOOLEAN]: false, [FieldType.ARRAY]: false, @@ -35,6 +36,30 @@ const allowSortColumnByType: Record = { [FieldType.BIGINT]: true, [FieldType.BOOLEAN]: true, [FieldType.JSON]: true, + + [FieldType.FORMULA]: false, + [FieldType.ATTACHMENTS]: false, + [FieldType.ATTACHMENT_SINGLE]: false, + [FieldType.SIGNATURE_SINGLE]: false, + [FieldType.ARRAY]: false, + [FieldType.LINK]: false, + [FieldType.BB_REFERENCE]: false, + [FieldType.BB_REFERENCE_SINGLE]: false, +} + +const allowDefaultColumnByType: Record = { + [FieldType.NUMBER]: true, + [FieldType.JSON]: true, + [FieldType.DATETIME]: true, + [FieldType.LONGFORM]: true, + [FieldType.STRING]: true, + + [FieldType.OPTIONS]: false, + [FieldType.AUTO]: false, + [FieldType.INTERNAL]: false, + [FieldType.BARCODEQR]: false, + [FieldType.BIGINT]: false, + [FieldType.BOOLEAN]: false, [FieldType.FORMULA]: false, [FieldType.ATTACHMENTS]: false, [FieldType.ATTACHMENT_SINGLE]: false, @@ -53,6 +78,10 @@ export function canBeSortColumn(type: FieldType): boolean { return !!allowSortColumnByType[type] } +export function canHaveDefaultColumn(type: FieldType): boolean { + return !!allowDefaultColumnByType[type] +} + export function findDuplicateInternalColumns(table: Table): string[] { // maintains the case of keys const casedKeys = Object.keys(table.schema)