From 9b55ba8b13cbe18e29818dc1731182e11a9710b4 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 26 Jan 2022 18:50:13 +0000 Subject: [PATCH] Fixing #4192 - allowing switching between JSON and multi-select types, as well as not switching multi-select to JSON when fetching SQL tables. --- .../DataTable/modals/CreateEditColumn.svelte | 7 ++++++ .../builder/src/constants/backend/index.js | 13 ++++++---- .../server/src/api/controllers/table/utils.js | 25 +++++++++++++++++-- packages/server/src/constants/index.js | 13 ++++++---- packages/server/src/integrations/utils.ts | 1 + 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 752f291019..d8958b2361 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -22,8 +22,10 @@ RelationshipTypes, ALLOWABLE_STRING_OPTIONS, ALLOWABLE_NUMBER_OPTIONS, + ALLOWABLE_JSON_OPTIONS, ALLOWABLE_STRING_TYPES, ALLOWABLE_NUMBER_TYPES, + ALLOWABLE_JSON_TYPES, SWITCHABLE_TYPES, } from "constants/backend" import { getAutoColumnInformation, buildAutoColumn } from "builderStore/utils" @@ -236,6 +238,11 @@ ALLOWABLE_NUMBER_TYPES.indexOf(field.type) !== -1 ) { return ALLOWABLE_NUMBER_OPTIONS + } else if ( + originalName && + ALLOWABLE_JSON_TYPES.indexOf(field.type) !== -1 + ) { + return ALLOWABLE_JSON_OPTIONS } else if (!external) { return [ ...Object.values(fieldDefinitions), diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js index c5fb294f80..ddff3b1f13 100644 --- a/packages/builder/src/constants/backend/index.js +++ b/packages/builder/src/constants/backend/index.js @@ -148,20 +148,23 @@ export const RelationshipTypes = { } export const ALLOWABLE_STRING_OPTIONS = [FIELDS.STRING, FIELDS.OPTIONS] - export const ALLOWABLE_STRING_TYPES = ALLOWABLE_STRING_OPTIONS.map( opt => opt.type ) export const ALLOWABLE_NUMBER_OPTIONS = [FIELDS.NUMBER, FIELDS.BOOLEAN] - export const ALLOWABLE_NUMBER_TYPES = ALLOWABLE_NUMBER_OPTIONS.map( opt => opt.type ) -export const SWITCHABLE_TYPES = ALLOWABLE_NUMBER_TYPES.concat( - ALLOWABLE_STRING_TYPES -) +export const ALLOWABLE_JSON_OPTIONS = [FIELDS.JSON, FIELDS.ARRAY] +export const ALLOWABLE_JSON_TYPES = ALLOWABLE_JSON_OPTIONS.map(opt => opt.type) + +export const SWITCHABLE_TYPES = [ + ...ALLOWABLE_STRING_TYPES, + ...ALLOWABLE_NUMBER_TYPES, + ...ALLOWABLE_JSON_TYPES, +] export const IntegrationTypes = { POSTGRES: "POSTGRES", diff --git a/packages/server/src/api/controllers/table/utils.js b/packages/server/src/api/controllers/table/utils.js index e4086e8071..754b0af5b3 100644 --- a/packages/server/src/api/controllers/table/utils.js +++ b/packages/server/src/api/controllers/table/utils.js @@ -8,7 +8,11 @@ const { const { isEqual } = require("lodash/fp") const { AutoFieldSubTypes, FieldTypes } = require("../../../constants") const { inputProcessing } = require("../../../utilities/rowProcessor") -const { USERS_TABLE_SCHEMA, SwitchableTypes } = require("../../../constants") +const { + USERS_TABLE_SCHEMA, + SwitchableTypes, + CanSwitchTypes, +} = require("../../../constants") const { isExternalTable, breakExternalTableId, @@ -340,6 +344,23 @@ exports.foreignKeyStructure = (keyName, meta = null) => { return structure } +exports.areSwitchableTypes = (type1, type2) => { + if ( + SwitchableTypes.indexOf(type1) === -1 && + SwitchableTypes.indexOf(type2) === -1 + ) { + return false + } + for (let option of CanSwitchTypes) { + const index1 = option.indexOf(type1), + index2 = option.indexOf(type2) + if (index1 !== -1 && index2 !== -1 && index1 !== index2) { + return true + } + } + return false +} + exports.hasTypeChanged = (table, oldTable) => { if (!oldTable) { return false @@ -350,7 +371,7 @@ exports.hasTypeChanged = (table, oldTable) => { continue } const newType = table.schema[key].type - if (oldType !== newType && SwitchableTypes.indexOf(oldType) === -1) { + if (oldType !== newType && !exports.areSwitchableTypes(oldType, newType)) { return true } } diff --git a/packages/server/src/constants/index.js b/packages/server/src/constants/index.js index b63b71d2c2..9743ddfab3 100644 --- a/packages/server/src/constants/index.js +++ b/packages/server/src/constants/index.js @@ -45,13 +45,16 @@ exports.FieldTypes = { INTERNAL: "internal", } -exports.SwitchableTypes = [ - exports.FieldTypes.STRING, - exports.FieldTypes.OPTIONS, - exports.FieldTypes.NUMBER, - exports.FieldTypes.BOOLEAN, +exports.CanSwitchTypes = [ + [exports.FieldTypes.JSON, exports.FieldTypes.ARRAY], + [exports.FieldTypes.STRING, exports.FieldTypes.OPTIONS], + [exports.FieldTypes.BOOLEAN, exports.FieldTypes.NUMBER], ] +exports.SwitchableTypes = exports.CanSwitchTypes.reduce((prev, current) => + prev ? prev.concat(current) : current +) + exports.RelationshipTypes = { ONE_TO_MANY: "one-to-many", MANY_TO_ONE: "many-to-one", diff --git a/packages/server/src/integrations/utils.ts b/packages/server/src/integrations/utils.ts index b1e42a51b3..b243e5e8ba 100644 --- a/packages/server/src/integrations/utils.ts +++ b/packages/server/src/integrations/utils.ts @@ -157,6 +157,7 @@ function copyExistingPropsOver( if ( existingTableSchema[key].type === FieldTypes.LINK || existingTableSchema[key].type === FieldTypes.OPTIONS || + existingTableSchema[key].type === FieldTypes.ARRAY || ((!table.schema[key] || table.schema[key].type === FieldTypes.NUMBER) && existingTableSchema[key].type === FieldTypes.BOOLEAN) ) {