| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | import _ from 'lodash'; import mingo from 'mingo'; const getFieldsObject = (section, sectionName, fieldType, fieldName) => { switch (fieldType) { case 'scoreCalculation': return { ...section, sectionName }; case 'condition': return { dependant: sectionName, condition: section.condition }; case 'validate': return { ...section, sectionName: sectionName, fieldName: fieldName }; case 'sub-condition': return { ...section, sectionName: sectionName, dependant: fieldName }; default: return; } }; /** * WIP: Need to refactor this function * Function to fetch all conditional sections, fields, validations and score calculation fields * @param persistedFormUiSchema - Original full schema */ export const fetchConditionalAndScoreCalculatingFields = (persistedFormUiSchema) => { const sectionsWithHiddenField = []; const conditionalSections = []; const conditionalFields = []; const validationRulePerField = []; // Traverse through each section to get conditional fields _.mapKeys(persistedFormUiSchema, (section, sectionName) => { // If section contains scoreCalculation function if (section.hasOwnProperty('scoreCalculation')) { sectionsWithHiddenField.push( getFieldsObject(section, sectionName, 'scoreCalculation') ); } if (section.hasOwnProperty('condition')) { conditionalSections.push(getFieldsObject(section, sectionName, 'condition')); } else { _.mapKeys(section, (field, fieldName) => { // If field contains condition(mingo criteria) property if (field.hasOwnProperty('condition')) { conditionalFields.push( getFieldsObject(field, sectionName, 'sub-condition', fieldName) ); } if (field.hasOwnProperty('validate')) { validationRulePerField.push( getFieldsObject(field, sectionName, 'validate', fieldName) ); } }); } }); return { sectionsWithHiddenField, conditionalSections, conditionalFields, validationRulePerField }; }; export const checkAndUpdateConditionalSections = (formUISchema, formData, sectionList, originalSectionList) => { if (formUISchema) { _.mapKeys(formUISchema, (section, sectionName) => { if (section.hasOwnProperty('condition')) { const query = new mingo.Query(section.condition); const shouldBeVisible = query.test(formData); if (shouldBeVisible) { const indexOfConditionalSection = _.findIndex(sectionList, (sectionInDropdown) => { return sectionInDropdown === sectionName; }); if (!(indexOfConditionalSection > -1)) { _.forEach(originalSectionList, (originalSection) => { if (originalSection === sectionName) { sectionList.push(originalSection); } }); } } else { _.remove(sectionList, (sectionInDropdown) => { return sectionInDropdown === sectionName; }); } } }); } return sectionList; }; export const computeCompletionStatus = (formSchema, formUiSchema, formData) => { let totalQuestionsInForm = 0; let totalQuestionsAnsweredInForm = 0; let totalQuestionsInSection = 0; let totalQuestionsAnsweredInSection = 0; const clonedFormData = _.cloneDeep(formData); _.mapKeys(formUiSchema, (section, sectionName) => { totalQuestionsInSection = 0; totalQuestionsAnsweredInSection = 0; if ((sectionName.indexOf('score') === -1) && (sectionName.indexOf('ui:order') === -1)) { _.mapKeys(section, (field, fieldName) => { if (((fieldName.indexOf('score') === -1) && (fieldName.indexOf('ui:order') === -1)) && field['ui:widget'] !== 'hidden') { totalQuestionsInSection += 1; if (clonedFormData[sectionName] && (clonedFormData[sectionName][fieldName] || clonedFormData[sectionName][fieldName] === 0)) { totalQuestionsAnsweredInForm++; totalQuestionsAnsweredInSection++; } } }); } if (clonedFormData[sectionName]) { clonedFormData[sectionName]['totalQuestionsInSection'] = totalQuestionsInSection; clonedFormData[sectionName]['totalQuestionsAnsweredInSection'] = totalQuestionsAnsweredInSection; } totalQuestionsInForm += totalQuestionsInSection; }); clonedFormData['totalQuestionsInForm'] = totalQuestionsInForm; clonedFormData['totalQuestionsAnsweredInForm'] = totalQuestionsAnsweredInForm; return clonedFormData; }; |