Update validation for array type
This commit is contained in:
parent
f7ebf7f8a4
commit
4fa36727e4
|
@ -34,7 +34,7 @@
|
|||
{:else if type === "boolean"}
|
||||
<Toggle text={label} bind:value data-cy="{meta.name}-input" />
|
||||
{:else if type === "array"}
|
||||
<Multiselect bind:value {label} options={meta.constraints.inclusion.flat()} />
|
||||
<Multiselect bind:value {label} options={meta.constraints.inclusion} />
|
||||
{:else if type === "link"}
|
||||
<LinkedRowSelector bind:linkedRows={value} schema={meta} />
|
||||
{:else if type === "longform"}
|
||||
|
|
|
@ -29,7 +29,6 @@
|
|||
|
||||
const AUTO_TYPE = "auto"
|
||||
const FORMULA_TYPE = FIELDS.FORMULA.type
|
||||
const ARRAY_TYPE = FIELDS.ARRAY.type
|
||||
const LINK_TYPE = FIELDS.LINK.type
|
||||
let fieldDefinitions = cloneDeep(FIELDS)
|
||||
const { hide } = getContext(Context.Modal)
|
||||
|
@ -82,12 +81,6 @@
|
|||
if (field.type === AUTO_TYPE) {
|
||||
field = buildAutoColumn($tables.draft.name, field.name, field.subtype)
|
||||
}
|
||||
if (field.type === ARRAY_TYPE) {
|
||||
let arr = field.constraints.inclusion
|
||||
let newArr = []
|
||||
newArr.push(arr)
|
||||
field.constraints.inclusion = newArr
|
||||
}
|
||||
tables.saveField({
|
||||
originalName,
|
||||
field,
|
||||
|
@ -272,7 +265,7 @@
|
|||
{:else if field.type === "array"}
|
||||
<ValuesList
|
||||
label="Options (one per line)"
|
||||
bind:values={field.constraints.inclusion[0]}
|
||||
bind:values={field.constraints.inclusion}
|
||||
/>
|
||||
{:else if field.type === "datetime"}
|
||||
<DatePicker
|
||||
|
|
|
@ -83,10 +83,7 @@
|
|||
|
||||
const getFieldOptions = field => {
|
||||
const schema = schemaFields.find(x => x.name === field)
|
||||
const opt =
|
||||
schema.type == "array"
|
||||
? schema?.constraints?.inclusion[0]
|
||||
: schema?.constraints?.inclusion || []
|
||||
const opt = schema?.constraints?.inclusion || []
|
||||
|
||||
return opt
|
||||
}
|
||||
|
@ -136,7 +133,7 @@
|
|||
/>
|
||||
{:else if ["string", "longform", "number"].includes(filter.type)}
|
||||
<Input disabled={filter.noValue} bind:value={filter.value} />
|
||||
{:else if filter.type === "options" || filter.type === "array"}
|
||||
{:else if filter.type === "options"}
|
||||
<Combobox
|
||||
disabled={filter.noValue}
|
||||
options={getFieldOptions(filter.field)}
|
||||
|
|
|
@ -58,20 +58,12 @@
|
|||
label: "Must not match regex",
|
||||
value: "notRegex",
|
||||
},
|
||||
ContainsRowID: {
|
||||
label: "Must contain row ID",
|
||||
value: "contains",
|
||||
},
|
||||
NotContainsRowID: {
|
||||
label: "Must not contain row ID",
|
||||
value: "notContains",
|
||||
},
|
||||
Contains: {
|
||||
label: "Must contain one of",
|
||||
label: "Must contain one",
|
||||
value: "contains",
|
||||
},
|
||||
NotContains: {
|
||||
label: "Must not contain one of",
|
||||
label: "Must not contain ",
|
||||
value: "notContains",
|
||||
},
|
||||
}
|
||||
|
@ -291,7 +283,7 @@
|
|||
disabled={rule.constraint === "required"}
|
||||
on:change={e => (rule.value = e.detail)}
|
||||
/>
|
||||
{:else if ["maxLength", "minLength", "regex", "notRegex", "containsRowID", "notContainsRowID"].includes(rule.constraint)}
|
||||
{:else if ["maxLength", "minLength", "regex", "notRegex"].includes(rule.constraint)}
|
||||
<!-- Certain constraints always need string values-->
|
||||
<Input
|
||||
bind:value={rule.value}
|
||||
|
@ -309,7 +301,7 @@
|
|||
<Multiselect
|
||||
disabled={rule.constraint === "required"}
|
||||
options={dataSourceSchema.schema[field].constraints
|
||||
.inclusion[0]}
|
||||
.inclusion}
|
||||
getOptionLabel={x => x}
|
||||
getOptionValue={x => x}
|
||||
on:change={e => (rule.value = e.detail)}
|
||||
|
|
|
@ -27,7 +27,7 @@ export const FIELDS = {
|
|||
},
|
||||
},
|
||||
ARRAY: {
|
||||
name: "List",
|
||||
name: "Multi-select",
|
||||
type: "array",
|
||||
constraints: {
|
||||
type: "array",
|
||||
|
|
|
@ -69,7 +69,7 @@ exports.validate = async ({ appId, tableId, row, table }) => {
|
|||
// Validate.js doesn't seem to handle array of array very well
|
||||
if (table.schema[fieldName].type === FieldTypes.ARRAY) {
|
||||
row[fieldName].map(val => {
|
||||
if (constraints.inclusion.includes(val)) {
|
||||
if (!constraints.inclusion.includes(val)) {
|
||||
errors[fieldName] = "Field not in list"
|
||||
}
|
||||
})
|
||||
|
|
|
@ -9,9 +9,6 @@ export const getOptions = (
|
|||
const isArray = fieldSchema?.type === "array"
|
||||
// Take options from schema
|
||||
if (optionsSource == null || optionsSource === "schema") {
|
||||
if (isArray) {
|
||||
return fieldSchema?.constraints?.inclusion[0] ?? []
|
||||
}
|
||||
return fieldSchema?.constraints?.inclusion ?? []
|
||||
}
|
||||
|
||||
|
|
|
@ -64,9 +64,8 @@ export const createValidatorFromConstraints = (
|
|||
|
||||
// Inclusion constraint
|
||||
if (
|
||||
!schemaConstraints.type == "array"
|
||||
? exists(schemaConstraints.inclusion)
|
||||
: false
|
||||
exists(schemaConstraints.inclusion) &&
|
||||
schemaConstraints.type !== "array"
|
||||
) {
|
||||
const options = schemaConstraints.inclusion || []
|
||||
rules.push({
|
||||
|
@ -77,13 +76,11 @@ export const createValidatorFromConstraints = (
|
|||
})
|
||||
}
|
||||
|
||||
// Handle the array type but link also returns as an array, so handle via the inclusion check
|
||||
if (
|
||||
schemaConstraints.type == "array" && schemaConstraints.inclusion
|
||||
? exists(schemaConstraints.inclusion[0])
|
||||
: false
|
||||
schemaConstraints.type === "array" &&
|
||||
exists(schemaConstraints.inclusion)
|
||||
) {
|
||||
const options = schemaConstraints.inclusion[0] || []
|
||||
const options = schemaConstraints.inclusion || []
|
||||
rules.push({
|
||||
type: "array",
|
||||
constraint: "inclusion",
|
||||
|
@ -297,26 +294,18 @@ const notRegexHandler = (value, rule) => {
|
|||
}
|
||||
|
||||
// Evaluates a contains constraint
|
||||
const containsRowIDHandler = (value, rule) => {
|
||||
const containsHandler = (value, rule) => {
|
||||
if (rule.type == "array") {
|
||||
const expectedValue = parseType(rule.value, "array")
|
||||
return value && value.some(val => expectedValue.includes(val))
|
||||
}
|
||||
const expectedValue = parseType(rule.value, "string")
|
||||
return value && value.includes(expectedValue)
|
||||
}
|
||||
|
||||
// Evaluates a not contains constraint
|
||||
const notContainsRowIDHandler = (value, rule) => {
|
||||
return !containsHandler(value, rule)
|
||||
}
|
||||
|
||||
// Evaluates a contains constraint
|
||||
const containsHandler = (value, rule) => {
|
||||
const ruleValue = parseType(rule.value, "array")
|
||||
return value && value.some(val => ruleValue.includes(val))
|
||||
}
|
||||
|
||||
// Evaluates a not contains constraint
|
||||
const notContainsHandler = (value, rule) => {
|
||||
const ruleValue = parseType(rule.value, "array")
|
||||
return value && !value.some(val => ruleValue.includes(val))
|
||||
return !containsHandler(value, rule)
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -333,8 +322,6 @@ const handlerMap = {
|
|||
notEqual: notEqualHandler,
|
||||
regex: regexHandler,
|
||||
notRegex: notRegexHandler,
|
||||
containsRowID: containsRowIDHandler,
|
||||
notContainsRowID: notContainsRowIDHandler,
|
||||
contains: containsHandler,
|
||||
notContains: notContainsHandler,
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue