diff --git a/lerna.json b/lerna.json index 1cd2802044..3e4e2c7b93 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.9.185-alpha.19", + "version": "0.9.185-alpha.20", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/packages/auth/package.json b/packages/auth/package.json index 3d43666fb7..abc9c01250 100644 --- a/packages/auth/package.json +++ b/packages/auth/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/auth", - "version": "0.9.185-alpha.19", + "version": "0.9.185-alpha.20", "description": "Authentication middlewares for budibase builder and apps", "main": "src/index.js", "author": "Budibase", diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 9373420039..f4f3b0b510 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -1,7 +1,7 @@ { "name": "@budibase/bbui", "description": "A UI solution used in the different Budibase projects.", - "version": "0.9.185-alpha.19", + "version": "0.9.185-alpha.20", "license": "AGPL-3.0", "svelte": "src/index.js", "module": "dist/bbui.es.js", diff --git a/packages/builder/package.json b/packages/builder/package.json index 7491f77e96..7893de66ba 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "0.9.185-alpha.19", + "version": "0.9.185-alpha.20", "license": "AGPL-3.0", "private": true, "scripts": { @@ -65,10 +65,10 @@ } }, "dependencies": { - "@budibase/bbui": "^0.9.185-alpha.19", - "@budibase/client": "^0.9.185-alpha.19", + "@budibase/bbui": "^0.9.185-alpha.20", + "@budibase/client": "^0.9.185-alpha.20", "@budibase/colorpicker": "1.1.2", - "@budibase/string-templates": "^0.9.185-alpha.19", + "@budibase/string-templates": "^0.9.185-alpha.20", "@sentry/browser": "5.19.1", "@spectrum-css/page": "^3.0.1", "@spectrum-css/vars": "^3.0.1", diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 5117444b67..b5ad086990 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -10,6 +10,7 @@ ModalContent, Context, Modal, + notifications, } from "@budibase/bbui" import { createEventDispatcher } from "svelte" import { cloneDeep } from "lodash/fp" @@ -26,7 +27,6 @@ SWITCHABLE_TYPES, } from "constants/backend" import { getAutoColumnInformation, buildAutoColumn } from "builderStore/utils" - import { notifications } from "@budibase/bbui" import ValuesList from "components/common/ValuesList.svelte" import ConfirmDialog from "components/common/ConfirmDialog.svelte" import { truncate } from "lodash" @@ -76,13 +76,8 @@ $: invalid = !field.name || (field.type === LINK_TYPE && !field.tableId) || - Object.keys($tables.draft?.schema ?? {}).some( - key => key !== originalName && key === field.name - ) || - columnNameInvalid - $: columnNameInvalid = PROHIBITED_COLUMN_NAMES.some( - name => field.name === name - ) + Object.keys(errors).length !== 0 + $: errors = checkErrors(field) // used to select what different options can be displayed for column type $: canBeSearched = @@ -111,13 +106,17 @@ if (field.type === AUTO_TYPE) { field = buildAutoColumn($tables.draft.name, field.name, field.subtype) } - await tables.saveField({ - originalName, - field, - primaryDisplay, - indexes, - }) - dispatch("updatecolumns") + try { + await tables.saveField({ + originalName, + field, + primaryDisplay, + indexes, + }) + dispatch("updatecolumns") + } catch (err) { + notifications.error(err) + } } function deleteColumn() { @@ -267,6 +266,31 @@ fieldToCheck.constraints.numericality = {} } } + + function checkErrors(fieldInfo) { + function inUse(tbl, column, ogName = null) { + return Object.keys(tbl?.schema || {}).some( + key => key !== ogName && key === column + ) + } + const newError = {} + if (PROHIBITED_COLUMN_NAMES.some(name => fieldInfo.name === name)) { + newError.name = `${PROHIBITED_COLUMN_NAMES.join( + ", " + )} are not allowed as column names` + } else if (inUse($tables.draft, fieldInfo.name, originalName)) { + newError.name = `Column name already in use.` + } + if (fieldInfo.fieldName && fieldInfo.tableId) { + const relatedTable = $tables.list.find( + tbl => tbl._id === fieldInfo.tableId + ) + if (inUse(relatedTable, fieldInfo.fieldName)) { + newError.relatedName = `Column name already in use in table ${relatedTable.name}` + } + } + return newError + } ($touched.primary = true)} + bind:error={errors.primary} + bind:value={fromPrimary} + /> + {/if} {/if} - {:else if fromRelationship?.relationshipType && toTable} + {:else if isManyToOne && toTable}