diff --git a/src/registry/inbuilt-components/inbuiltValidators.ts b/src/registry/inbuilt-components/inbuiltValidators.ts index adf93b83..a2784dd6 100644 --- a/src/registry/inbuilt-components/inbuiltValidators.ts +++ b/src/registry/inbuilt-components/inbuiltValidators.ts @@ -1,3 +1,4 @@ +import { conditionalAnsweredValidator } from '../../validators/conditional-answered-validator'; import { type FormFieldValidator } from '../../types'; import { DateValidator } from '../../validators/date-validator'; import { DefaultValueValidator } from '../../validators/default-value-validator'; @@ -25,4 +26,8 @@ export const inbuiltValidators: Array> = [ name: 'js_expression', component: ExpressionValidator, }, + { + name: 'conditionalAnswered', + component: conditionalAnsweredValidator, + }, ]; diff --git a/src/validators/conditional-answered-validator.ts b/src/validators/conditional-answered-validator.ts new file mode 100644 index 00000000..911511e4 --- /dev/null +++ b/src/validators/conditional-answered-validator.ts @@ -0,0 +1,16 @@ +import { type FormFieldValidator, type FormField } from '../types'; + +export const conditionalAnsweredValidator: FormFieldValidator = { + validate: function (field: FormField, value: unknown, config: Record) { + const { referenceQuestionId, referenceQuestionAnswers, values, fields, message } = config; + + const referencedField = fields.find((field) => field.id === referenceQuestionId); + const referencedFieldValue = referencedField.meta?.submission?.newValue?.value || values[referencedField.id]; + + if (!referencedFieldValue || !referenceQuestionAnswers.includes(referencedFieldValue)) { + return [{ resultType: 'error', errCode: 'invalid.valueSelected', message: message }]; + } + + return []; + }, +};