allow comparing dates in json schema forms and also allow checking nested fields w/ burnettk

This commit is contained in:
jasquat 2023-05-24 10:53:04 -04:00
parent 96d7c32141
commit 6c4a927beb
No known key found for this signature in database
1 changed files with 57 additions and 14 deletions

View File

@ -167,6 +167,7 @@ export default function TaskShow() {
if (disabled) { if (disabled) {
return; return;
} }
return;
const dataToSubmit = formObject?.formData; const dataToSubmit = formObject?.formData;
if (!dataToSubmit) { if (!dataToSubmit) {
@ -270,32 +271,74 @@ export default function TaskShow() {
formData: any, formData: any,
errors: any errors: any
) => { ) => {
if ('properties' in jsonSchema) { // if the jsonSchema has an items attribute then assume the element itself
Object.keys(jsonSchema.properties).forEach((propertyKey: string) => { // doesn't have a custom validation but it's children could so use that
const propertyMetadata = jsonSchema.properties[propertyKey]; const jsonSchemaToUse =
'items' in jsonSchema ? jsonSchema.items : jsonSchema;
if ('properties' in jsonSchemaToUse) {
Object.keys(jsonSchemaToUse.properties).forEach((propertyKey: string) => {
const propertyMetadata = jsonSchemaToUse.properties[propertyKey];
if ( if (
typeof propertyMetadata === 'object' && typeof propertyMetadata === 'object' &&
'minimumDate' in propertyMetadata && 'minimumDate' in propertyMetadata
propertyMetadata.minimumDate === 'today'
) { ) {
const dateToday = new Date();
const dateValue = formData[propertyKey]; const dateValue = formData[propertyKey];
if (dateValue) { if (dateValue) {
const dateValueObject = new Date(dateValue); const dateValueObject = new Date(dateValue);
const dateValueString = dateValueObject.toISOString().split('T')[0]; const dateValueString = dateValueObject.toISOString().split('T')[0];
const dateTodayString = dateToday.toISOString().split('T')[0]; if (propertyMetadata.minimumDate === 'today') {
if (dateTodayString > dateValueString) { const dateToday = new Date();
errors[propertyKey].addError('must be today or after'); const dateTodayString = dateToday.toISOString().split('T')[0];
if (dateTodayString > dateValueString) {
errors[propertyKey].addError('must be today or after');
}
} else if (propertyMetadata.minimumDate.startsWith('field:')) {
const fieldIdentifierToCompareWith = propertyMetadata.minimumDate
.split(':')
.slice(1)
.join(':');
if (fieldIdentifierToCompareWith in formData) {
const dateToCompareWith =
formData[fieldIdentifierToCompareWith];
const dateObjectToCompareWith = new Date(dateToCompareWith);
const dateStringToCompareWith = dateObjectToCompareWith
.toISOString()
.split('T')[0];
if (dateToCompareWith) {
if (dateStringToCompareWith > dateValueString) {
errors[propertyKey].addError(
`this field must be equal to greater than '${fieldIdentifierToCompareWith}'`
);
}
} else {
errors[propertyKey].addError(
`this field was supposed to be compared against '${fieldIdentifierToCompareWith}' but that field did not have a value`
);
}
} else {
errors[propertyKey].addError(
`this field was supposed to be compared against '${fieldIdentifierToCompareWith}' but that field cannot be found`
);
}
} }
} }
} }
// recurse through all nested properties as well // recurse through all nested properties as well
getFieldsWithDateValidations( let formDataToSend = formData[propertyKey];
propertyMetadata, if (formDataToSend) {
formData[propertyKey], if (formDataToSend.constructor.name !== 'Array') {
errors[propertyKey] formDataToSend = [formDataToSend];
); }
formDataToSend.forEach((item: any, index: number) => {
let errorsToSend = errors[propertyKey];
if (index in errorsToSend) {
errorsToSend = errorsToSend[index];
}
getFieldsWithDateValidations(propertyMetadata, item, errorsToSend);
});
}
}); });
} }
return errors; return errors;