diff --git a/packages/server/src/api/controllers/row/utils.js b/packages/server/src/api/controllers/row/utils.js index f7a4b13304..83c97ceb78 100644 --- a/packages/server/src/api/controllers/row/utils.js +++ b/packages/server/src/api/controllers/row/utils.js @@ -50,10 +50,10 @@ exports.validate = async ({ appId, tableId, row, table }) => { const errors = {} for (let fieldName of Object.keys(table.schema)) { const constraints = cloneDeep(table.schema[fieldName].constraints) + const type = table.schema[fieldName].type // special case for options, need to always allow unselected (null) if ( - table.schema[fieldName].type === - (FieldTypes.OPTIONS || FieldTypes.ARRAY) && + (type === FieldTypes.OPTIONS || type === FieldTypes.ARRAY) && constraints.inclusion ) { constraints.inclusion.push(null) @@ -61,17 +61,13 @@ exports.validate = async ({ appId, tableId, row, table }) => { let res // Validate.js doesn't seem to handle array - if ( - table.schema[fieldName].type === FieldTypes.ARRAY && - row[fieldName] && - row[fieldName].length - ) { + if (type === FieldTypes.ARRAY && row[fieldName] && row[fieldName].length) { row[fieldName].map(val => { if (!constraints.inclusion.includes(val)) { errors[fieldName] = "Field not in list" } }) - } else if (table.schema[fieldName].type === FieldTypes.FORMULA) { + } else if (type === FieldTypes.FORMULA) { res = validateJs.single( processStringSync(table.schema[fieldName].formula, row), constraints diff --git a/packages/server/src/utilities/rowProcessor/index.js b/packages/server/src/utilities/rowProcessor/index.js index ea63c23f7d..860063f173 100644 --- a/packages/server/src/utilities/rowProcessor/index.js +++ b/packages/server/src/utilities/rowProcessor/index.js @@ -81,6 +81,18 @@ const TYPE_TRANSFORM_MAP = { [FieldTypes.AUTO]: { parse: () => undefined, }, + [FieldTypes.JSON]: { + parse: input => { + try { + if (input === "") { + return undefined + } + return JSON.parse(input) + } catch (err) { + return input + } + }, + }, } /**