diff --git a/src/pages/BandoFormsEdit/index.js b/src/pages/BandoFormsEdit/index.js
index bf85ac9..fb8fe06 100644
--- a/src/pages/BandoFormsEdit/index.js
+++ b/src/pages/BandoFormsEdit/index.js
@@ -24,7 +24,7 @@ import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
import BandoService from '../../service/bando-service';
// TODO temp data
-import { elementItems } from '../../tempData';
+//import { elementItems } from '../../tempData';
const BandoFormsEdit = () => {
const { id, formId } = useParams();
@@ -215,8 +215,8 @@ const BandoFormsEdit = () => {
const getElementItemsCallback = (data) => {
if (data.status === 'SUCCESS') {
- storeSet.main.elementItems(elementItems.sort((a, b) => a.sortOrder - b.sortOrder));
- //storeSet.main.elementItems(data.data.sort((a, b) => a.sortOrder - b.sortOrder));
+ //storeSet.main.elementItems(elementItems.sort((a, b) => a.sortOrder - b.sortOrder));
+ storeSet.main.elementItems(data.data.sort((a, b) => a.sortOrder - b.sortOrder));
}
storeSet.main.unsetAsyncRequest();
}
@@ -317,7 +317,7 @@ const BandoFormsEdit = () => {
-
+
diff --git a/src/pages/DomandaEditInstructorManager/index.js b/src/pages/DomandaEditInstructorManager/index.js
index 0c0b095..f9d4409 100644
--- a/src/pages/DomandaEditInstructorManager/index.js
+++ b/src/pages/DomandaEditInstructorManager/index.js
@@ -1,7 +1,7 @@
-import React, { useState, useEffect, useRef, useCallback } from 'react';
+import React, { useState, useEffect, useRef, useCallback, useMemo } from 'react';
import { __, sprintf } from '@wordpress/i18n';
import { useNavigate, useParams } from 'react-router-dom';
-import { is, isEmpty, isNil, sum, pathOr, head } from 'ramda';
+import { is, isEmpty, isNil, sum, pathOr, head, pluck } from 'ramda';
import { klona } from 'klona';
import { wrap } from 'object-path-immutable';
@@ -39,6 +39,25 @@ import RepeaterFields from '../DomandaEditPreInstructor/components/RepeaterField
import getDateTimeFromISOstring from '../../helpers/getDateTimeFromISOstring';
import ApplicationInfo from '../DomandaEditPreInstructor/components/ApplicationInfo';
import ApplicationDownloadFiles from '../DomandaEditPreInstructor/components/ApplicationDownloadFiles';
+import { useForm } from 'react-hook-form';
+import {
+ isCAP,
+ isCodiceFiscale,
+ isEmail,
+ isEmailPEC,
+ isIBAN,
+ isMarcaDaBollo,
+ isPIVA,
+ isUrl, maxChecks, minChecks, nonEmptyTables
+} from '../../helpers/validators';
+import formatDateString from '../../helpers/formatDateString';
+import getTokens from '../../helpers/getTokens';
+import parseCommaDecimal from '../../helpers/parseCommaDecimal';
+import renderWithDataVars from '../../helpers/renderWithDataVars';
+import { evaluate } from 'mathjs';
+import equal from 'fast-deep-equal';
+import renderHtmlContent from '../../helpers/renderHtmlContent';
+import FormField from '../../components/FormField';
const APP_EVALUATION_FLOW_ID = process.env.REACT_APP_EVALUATION_FLOW_ID;
const APP_HUB_ID = process.env.REACT_APP_HUB_ID;
@@ -68,6 +87,40 @@ const DomandaEditInstructorManager = () => {
duration: 0,
amount: 0
});
+ const [formData, setFormData] = useState([]);
+ const [formId, setFormId] = useState(0);
+ const [formInitialData, setFormInitialData] = useState(null);
+ const {
+ control,
+ handleSubmit,
+ formState: { errors },
+ setValue,
+ trigger,
+ register,
+ getValues,
+ watch,
+ reset
+ } = useForm({
+ defaultValues: useMemo(() => {
+ return formInitialData ? formInitialData : {}
+ }, [formInitialData]),
+ mode: 'onChange'
+ });
+ const validationFns = {
+ isPIVA,
+ isCodiceFiscale,
+ isCAP,
+ isIBAN,
+ isEmail,
+ isEmailPEC,
+ isUrl,
+ isMarcaDaBollo,
+ minChecks,
+ maxChecks,
+ nonEmptyTables
+ }
+ const values = getValues();
+ const formValues = watch();
const goToEvaluationsPage = () => {
navigate('/mie-domande');
@@ -109,6 +162,35 @@ const DomandaEditInstructorManager = () => {
}
}
+ const getVersion = (resp) => {
+ if (resp.status === 'SUCCESS') {
+ if (resp.data.evaluationVersion === 'V1') {
+ storeSet.main.setAsyncRequest();
+ ApplicationEvaluationService.getEvaluationByApplId(getCallback, errGetCallback, [
+ ['applicationId', resp.data.applicationId]
+ ]);
+ } else if (resp.data.evaluationVersion === 'V2') {
+ storeSet.main.setAsyncRequest();
+ ApplicationEvaluationService.getEvaluationV2ByApplId(getCallback, errGetCallback, [
+ ['applicationId', resp.data.applicationId]
+ ]);
+ }
+ }
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const errGetVersion = (resp) => {
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: 'error',
+ summary: '',
+ detail: resp.message
+ });
+ }
+ set404FromErrorResponse(resp);
+ storeSet.main.unsetAsyncRequest();
+ }
+
const getCallback = (data) => {
if (data.status === 'SUCCESS') {
setData(getFormattedData(data.data));
@@ -168,26 +250,74 @@ const DomandaEditInstructorManager = () => {
updateFlagsForSoccorso(newData);
}
- const doSaveDraft = useCallback((doRedirect = '') => {
- const formData = {
- criteria: klona(data.criteria),
- checklist: klona(data.checklist),
- files: klona(data.files),
- evaluationDocument: klona(data.evaluationDocument.map(o => ({
- ...o,
- fileValue: o.fileValue[0] ? o.fileValue[0].id : ''
- })
- )),
- amendmentDetails: klona(data.amendmentDetails),
- note: data.note
- }
+ const getTransformedSubmitData = () => {
+ const formValues = getValues();
+ const usedFieldsIds = pluck('id', formData);
+ return Object.keys(formValues)
+ .filter(v => usedFieldsIds.includes(v))
+ .reduce((acc, cur) => {
+ const formField = head(formData.filter(o => o.id === cur));
+ let fieldVal = formValues[cur];
- ApplicationEvaluationService.updateEvaluation(
- data.assignedApplicationId,
- formData,
- (data) => updateCallback(data, doRedirect),
- errUpdateCallback
- );
+ if (formValues[cur] && formValues[cur].toISOString) {
+ fieldVal = formatDateString(formValues[cur]);
+ }
+
+ fieldVal = isEmpty(fieldVal) ? null : fieldVal;
+ if (formField && formField.name === 'fileupload') {
+ fieldVal = is(Array, fieldVal) ? fieldVal.map(o => o.id).join(',') : null;
+ }
+ acc.push({
+ 'fieldId': cur,
+ 'fieldValue': fieldVal
+ });
+ return acc;
+ }, []);
+ }
+
+ const doSaveDraft = useCallback((doRedirect = '') => {
+ if (data.evaluationVersion === 'V1') {
+ const submitData = {
+ criteria: klona(data.criteria),
+ checklist: klona(data.checklist),
+ files: klona(data.files),
+ evaluationDocument: klona(data.evaluationDocument.map(o => ({
+ ...o,
+ fileValue: o.fileValue[0] ? o.fileValue[0].id : ''
+ })
+ )),
+ amendmentDetails: klona(data.amendmentDetails),
+ note: data.note
+ };
+
+ ApplicationEvaluationService.updateEvaluation(
+ data.assignedApplicationId,
+ submitData,
+ (data) => updateCallback(data, doRedirect),
+ errUpdateCallback
+ );
+ } else if (data.evaluationVersion === 'V2') {
+ const newFormValues = getTransformedSubmitData();
+ const submitData = {
+ formFields: newFormValues,
+ files: klona(data.files),
+ evaluationDocument: klona(data.evaluationDocument.map(o => ({
+ ...o,
+ fileValue: o.fileValue[0] ? o.fileValue[0].id : ''
+ })
+ )),
+ amendmentDetails: klona(data.amendmentDetails),
+ note: data.note
+ }
+
+ ApplicationEvaluationService.updateEvaluationV2(
+ data.assignedApplicationId,
+ formId,
+ submitData,
+ (data) => updateCallback(data, doRedirect),
+ errUpdateCallback
+ );
+ }
}, [data]);
const updateCallback = (data, doRedirect = '') => {
@@ -220,33 +350,95 @@ const DomandaEditInstructorManager = () => {
}
const doApprove = () => {
- const formData = {
- applicationStatus: 'APPROVED',
- criteria: klona(data.criteria),
- checklist: klona(data.checklist),
- files: klona(data.files),
- note: data.note,
- motivation
- }
+ if (data.evaluationVersion === 'V1') {
+ const submitData = {
+ applicationStatus: 'APPROVED',
+ criteria: klona(data.criteria),
+ checklist: klona(data.checklist),
+ files: klona(data.files),
+ note: data.note,
+ motivation
+ }
- setLoading(true);
- setIsVisibleCompleteDialog(false);
- ApplicationEvaluationService.updateEvaluation(data.assignedApplicationId, formData, updateStatusCallback, errUpdateStatusCallback);
+ setLoading(true);
+ setIsVisibleCompleteDialog(false);
+ ApplicationEvaluationService.updateEvaluation(
+ data.assignedApplicationId,
+ submitData,
+ updateStatusCallback,
+ errUpdateStatusCallback
+ );
+ } else if (data.evaluationVersion === 'V2') {
+ const newFormValues = getTransformedSubmitData();
+ const submitData = {
+ formFields: newFormValues,
+ files: klona(data.files),
+ evaluationDocument: klona(data.evaluationDocument.map(o => ({
+ ...o,
+ fileValue: o.fileValue[0] ? o.fileValue[0].id : ''
+ })
+ )),
+ amendmentDetails: klona(data.amendmentDetails),
+ note: data.note,
+ motivation
+ }
+
+ setLoading(true);
+ setIsVisibleCompleteDialog(false);
+ ApplicationEvaluationService.updateEvaluationV2(
+ data.assignedApplicationId,
+ formId,
+ submitData,
+ updateStatusCallback,
+ errUpdateStatusCallback
+ );
+ }
}
const doReject = () => {
- const formData = {
- applicationStatus: 'REJECTED',
- criteria: klona(data.criteria),
- checklist: klona(data.checklist),
- files: klona(data.files),
- note: data.note,
- motivation
- }
+ if (data.evaluationVersion === 'V1') {
+ const submitData = {
+ applicationStatus: 'REJECTED',
+ criteria: klona(data.criteria),
+ checklist: klona(data.checklist),
+ files: klona(data.files),
+ note: data.note,
+ motivation
+ }
- setLoading(true);
- setIsVisibleCompleteDialog(false);
- ApplicationEvaluationService.updateEvaluation(data.assignedApplicationId, formData, updateStatusCallback, errUpdateStatusCallback);
+ setLoading(true);
+ setIsVisibleCompleteDialog(false);
+ ApplicationEvaluationService.updateEvaluation(
+ data.assignedApplicationId,
+ submitData,
+ updateStatusCallback,
+ errUpdateStatusCallback
+ );
+ } else if (data.evaluationVersion === 'V2') {
+ const newFormValues = getTransformedSubmitData();
+ const submitData = {
+ formFields: newFormValues,
+ files: klona(data.files),
+ evaluationDocument: klona(data.evaluationDocument.map(o => ({
+ ...o,
+ fileValue: o.fileValue[0] ? o.fileValue[0].id : ''
+ })
+ )),
+ amendmentDetails: klona(data.amendmentDetails),
+ note: data.note,
+ motivation
+ }
+
+ setLoading(true);
+ setIsVisibleCompleteDialog(false);
+ ApplicationEvaluationService.updateEvaluationV2(
+ data.assignedApplicationId,
+ formId,
+ submitData,
+ updateStatusCallback,
+ errUpdateStatusCallback
+ );
+ }
}
const updateStatusCallback = (data) => {
@@ -433,7 +625,7 @@ const DomandaEditInstructorManager = () => {
setIsVisibleAppointmentDialog(true);
}
- const setValue = (name, value) => {
+ const setFieldValue = (name, value) => {
const newData = wrap(appointmentData).set(name, value).value();
setAppointmentData(newData);
}
@@ -507,11 +699,151 @@ const DomandaEditInstructorManager = () => {
// TODO
}
- const evaluationShouldBeBlocked = (data = {}) => {
+ const evaluationBlockedForUser = (data = {}) => {
const userData = storeGet.main.userData();
return isAsyncRequest || userData.id !== data.assignedUserId;
}
+ const shouldDisableNewSoccorso = () => {
+ if (data.evaluationVersion === 'V1') {
+ return !allFilesRated || !atLeastOneChecked;
+ } else if (data.evaluationVersion === 'V2') {
+ return !allFilesRated || !atLeastOneChecked;
+ } else {
+ return true;
+ }
+ }
+
+ const actionBtns = () => {
+ return
+ {['EVALUATION', 'SOCCORSO', 'CLOSE'].includes(data.applicationStatus)
+ ?
+ }
+
+ useEffect(() => {
+ let updatedFormValues = klona(formValues);
+ let context = {};
+
+ // eslint-disable-next-line array-callback-return
+ formData.map((o) => {
+ const variable = head(o.settings.filter(o => o.name === 'variable'));
+ const formula = head(o.settings.filter(o => o.name === 'formula'));
+
+ if (formula && !isEmpty(formula.value)) {
+ context = getTokens(formula.value)
+ .filter(v => !['false', 'null', 'true'].includes(v))
+ .reduce((acc, cur) => {
+ acc[cur] = isNil(context[cur]) ? 0 : parseCommaDecimal(context[cur]);
+ return acc;
+ }, context);
+
+ const mathFormula = renderWithDataVars(formula.value, context);
+ try {
+ updatedFormValues[o.id] = evaluate(mathFormula);
+ } catch (e) {
+ console.log('Error in math formula: "', mathFormula, '"', e.message);
+ updatedFormValues[o.id] = 0;
+ }
+ }
+
+ if (variable && !isEmpty(variable.value)) {
+ context[variable.value[0]] = 'criteria_table' === o.name
+ ? pathOr(0, [o.id, 'total'], updatedFormValues)
+ : pathOr(0, [o.id], updatedFormValues);
+ }
+ });
+
+ if (!isEmpty(updatedFormValues) && !equal(updatedFormValues, formValues)) {
+ reset(updatedFormValues);
+ }
+ }, [formValues]);
+
+ useEffect(() => {
+ if (formInitialData) {
+ //reset();
+ Object.keys(formInitialData).map(k => setValue(k, formInitialData[k]));
+ trigger();
+ }
+ }, [formInitialData]);
+
useEffect(() => {
const maxScore = pathOr(0, ['minScore'], data);
const criteria = pathOr([], ['criteria'], data);
@@ -525,9 +857,7 @@ const DomandaEditInstructorManager = () => {
const entityId = !isNaN(parsed) ? parsed : 0;
storeSet.main.setAsyncRequest();
- ApplicationEvaluationService.getEvaluationByApplId(getCallback, errGetCallback, [
- ['applicationId', entityId]
- ]);
+ ApplicationEvaluationService.getEvaluationVersionByApplId(entityId, getVersion, errGetVersion);
AmendmentsService.getSoccorsoByApplId(entityId, getAmendmentsCallback, errGetAmendmentsCallback, [
['statuses', 'AWAITING']
]);
@@ -557,6 +887,14 @@ const DomandaEditInstructorManager = () => {
?
+
+ {__('Azioni rapide', 'gepafin')}
+
+
+
+ {actionBtns()}
+
+
@@ -567,7 +905,7 @@ const DomandaEditInstructorManager = () => {
data,
['evaluationDocument']
)}
- shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationShouldBeBlocked(data)}
+ shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)}
sourceId={data.assignedApplicationId}
sourceName="evaluation"/>
@@ -579,7 +917,7 @@ const DomandaEditInstructorManager = () => {
? shouldDisableField(name) || evaluationShouldBeBlocked(data)}
+ shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationBlockedForUser(data)}
name="files"
ndg={data.ndg}
applicationId={id}/>
@@ -587,6 +925,82 @@ const DomandaEditInstructorManager = () => {
: null}
+ {data.evaluationVersion === 'V2'
+ ?
+ : null}
+
{data.evaluationVersion === 'V1'
?
{__('Checklist Valutazione', 'gepafin')}
@@ -597,7 +1011,7 @@ const DomandaEditInstructorManager = () => {
{data.checklist.map((o, i) =>
updateEvaluationValue(
e.checked,
@@ -613,7 +1027,7 @@ const DomandaEditInstructorManager = () => {
updateEvaluationValue(
@@ -630,7 +1044,7 @@ const DomandaEditInstructorManager = () => {
? shouldDisableField(name) || evaluationShouldBeBlocked(data)}
+ shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationBlockedForUser(data)}
name="files"
ndg={data.ndg}
applicationId={id}/>
@@ -646,7 +1060,7 @@ const DomandaEditInstructorManager = () => {
shouldDisableField(name) || evaluationShouldBeBlocked(data)}
+ shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationBlockedForUser(data)}
name="amendmentDetails"
ndg={data.ndg}
applicationId={id}/>
@@ -670,7 +1084,7 @@ const DomandaEditInstructorManager = () => {
|
{
onClick={() => displayCriterionData(o.id)}
aria-label={__('Mostra', 'gepafin')}/> : null}
updateEvaluationValue(
true,
@@ -701,7 +1115,7 @@ const DomandaEditInstructorManager = () => {
)}
aria-label={__('Su', 'gepafin')}/>
updateEvaluationValue(
false,
@@ -740,86 +1154,7 @@ const DomandaEditInstructorManager = () => {
-
- {['EVALUATION', 'SOCCORSO', 'CLOSE'].includes(data.applicationStatus)
- ?
- {data.applicationStatus === 'EVALUATION'
- ? __('Richiedi soccorso istruttorio', 'gepafin')
- : __('Apri soccorso istruttorio', 'gepafin')}
-
-
-
- >}
- /> : null}
- {data.id
- ? doSaveDraft()}
- outlined
- label={__('Salva bozza valutazione', 'gepafin')}
- icon="pi pi-save" iconPos="right"/>
- : doSaveDraft()}
- label={__('Crea valutazione', 'gepafin')}
- icon="pi pi-save" iconPos="right"/>}
- {APP_EVALUATION_FLOW_ID === '1' && ['EVALUATION'].includes(data.applicationStatus)
- && APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
- ? : null}
- {APP_EVALUATION_FLOW_ID === '1' && APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
- ? : null}
-
- {
- }}
- label={__('Valutazione tecnico-finanziaria positiva', 'gepafin')}
- />
- {data.id
- ? : null}
- {data.id
- ? : null}
-
+ {actionBtns()}
|