- added new settings for call;

- added duplciate form field functionality to form builder;
- added improvements to form builder;
- fixed issue with saving data in evaluation;
This commit is contained in:
Vitalii Kiiko
2025-02-06 17:25:46 +01:00
15 changed files with 944 additions and 337 deletions

View File

@@ -264,6 +264,31 @@ const DomandaEditPreInstructor = () => {
updateFlagsForSoccorso(newData);
}
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];
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 = {
@@ -286,28 +311,7 @@ const DomandaEditPreInstructor = () => {
errUpdateCallback
);
} else if (data.evaluationVersion === 'V2') {
const formValues = getValues();
const usedFieldsIds = pluck('id', formData);
const newFormValues = Object.keys(formValues)
.filter(v => usedFieldsIds.includes(v))
.reduce((acc, cur) => {
const formField = head(formData.filter(o => o.id === cur));
let fieldVal = formValues[cur];
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 newFormValues = getTransformedSubmitData();
const submitData = {
formFields: newFormValues,
files: klona(data.files),
@@ -360,33 +364,95 @@ const DomandaEditPreInstructor = () => {
}
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) => {
@@ -647,10 +713,104 @@ const DomandaEditPreInstructor = () => {
// 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 <div className="appPageSection__actions">
{['EVALUATION', 'SOCCORSO', 'CLOSE'].includes(data.applicationStatus)
? <Button
type="button"
disabled={!data.id || data.status === 'CLOSE'
|| (data.applicationStatus === 'EVALUATION' && shouldDisableNewSoccorso())
|| evaluationBlockedForUser(data)}
onClick={doNewSoccorso}
outlined
label={<>
{data.applicationStatus === 'EVALUATION'
? __('Richiedi soccorso istruttorio', 'gepafin')
: __('Apri soccorso istruttorio', 'gepafin')}
<i style={{ marginLeft: 7 }}>
<HelpIcon/>
</i>
</>}
/> : null}
{data.id
? <Button
type="button"
disabled={data.status === 'CLOSE' || evaluationBlockedForUser(data)}
onClick={() => doSaveDraft()}
outlined
label={__('Salva bozza valutazione', 'gepafin')}
icon="pi pi-save" iconPos="right"/>
: <Button
type="button"
onClick={() => doSaveDraft()}
label={__('Crea valutazione', 'gepafin')}
icon="pi pi-save" iconPos="right"/>}
{APP_EVALUATION_FLOW_ID === '1' && ['EVALUATION'].includes(data.applicationStatus)
&& APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <Button
type="button"
disabled={!data.id || !allFilesRated || !allChecksChecked
|| !['EVALUATION'].includes(data.applicationStatus) || evaluationBlockedForUser(data)}
onClick={doCheckNDG}
label={__('Controlla NDG', 'gepafin')}
/> : null}
{APP_EVALUATION_FLOW_ID === '1' && APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <Button
type="button"
disabled={!data.id || !['NDG'].includes(data.applicationStatus) || !data.ndg || evaluationBlockedForUser(data)}
onClick={doCreateAppointment}
label={__('Crea l\'appuntamento', 'gepafin')}
/> : null}
<Button
type="button"
disabled={!data.id || !['APPOINTMENT'].includes(data.applicationStatus) || evaluationBlockedForUser(data)}
onClick={doMakeAdmisible}
label={__('Ammissibile formalmente', 'gepafin')}
/>
<Button
type="button"
disabled={true}
onClick={() => {
}}
label={__('Valutazione tecnico-finanziaria positiva', 'gepafin')}
/>
{data.id
? <Button
type="button"
disabled={!isAdmissible
|| ['APPROVED'].includes(data.applicationStatus)
|| evaluationBlockedForUser(data)
|| (APP_EVALUATION_FLOW_ID === '1' && !['ADMISSIBLE'].includes(data.applicationStatus))
}
onClick={initiateApproving}
label={__('Domanda deliberata', 'gepafin')}
icon="pi pi-check" iconPos="right"/> : null}
{data.id
? <Button
type="button"
disabled={APP_EVALUATION_FLOW_ID === '1'
&& (!['EVALUATION', 'ADMISSIBLE', 'APPOINTMENT'].includes(data.applicationStatus)
|| evaluationBlockedForUser(data))}
onClick={initiateRejecting}
label={__('Respingi domanda', 'gepafin')}
icon="pi pi-times" iconPos="right"/> : null}
</div>
}
useEffect(() => {
let updatedFormValues = klona(formValues);
@@ -742,6 +902,14 @@ const DomandaEditPreInstructor = () => {
? <div className="appPage__content">
<ApplicationInfo data={data}/>
<div className="appPageSection__hr">
<span>{__('Azioni rapide', 'gepafin')}</span>
</div>
<div className="appPageSection">
{actionBtns()}
</div>
<ApplicationDownloadFiles id={id}/>
<div className="appPageSection">
@@ -752,7 +920,7 @@ const DomandaEditPreInstructor = () => {
data,
['evaluationDocument']
)}
shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationShouldBeBlocked(data)}
shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)}
sourceId={data.assignedApplicationId}
sourceName="evaluation"/>
</div>
@@ -764,7 +932,7 @@ const DomandaEditPreInstructor = () => {
? <ListOfFiles
files={data.files}
updateFn={updateEvaluationValue}
shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationShouldBeBlocked(data)}
shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationBlockedForUser(data)}
name="files"
ndg={data.ndg}
applicationId={id}/>
@@ -773,7 +941,8 @@ const DomandaEditPreInstructor = () => {
: null}
{data.evaluationVersion === 'V2'
? <form className="appForm" onSubmit={handleSubmit(() => {})}>
? <form className="appForm" onSubmit={handleSubmit(() => {
})}>
{formData.map(o => {
const label = head(o.settings.filter(o => o.name === 'label'));
const text = head(o.settings.filter(o => o.name === 'text'));
@@ -857,7 +1026,7 @@ const DomandaEditPreInstructor = () => {
<div className="appPageSection__checklist">
{data.checklist.map((o, i) => <div key={o.id}>
<Checkbox
disabled={shouldDisableField('checklist') || evaluationShouldBeBlocked(data)}
disabled={shouldDisableField('checklist') || evaluationBlockedForUser(data)}
inputId={`checklist_${o.id}`}
onChange={(e) => updateEvaluationValue(
e.checked,
@@ -873,7 +1042,7 @@ const DomandaEditPreInstructor = () => {
<div>
<Editor
value={data.note}
readOnly={shouldDisableField('note') || evaluationShouldBeBlocked(data)}
readOnly={shouldDisableField('note') || evaluationBlockedForUser(data)}
placeholder={__('Digita qui il messagio', 'gepafin')}
headerTemplate={header}
onTextChange={(e) => updateEvaluationValue(
@@ -890,7 +1059,7 @@ const DomandaEditPreInstructor = () => {
? <ListOfFiles
files={data.files}
updateFn={updateEvaluationValue}
shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationShouldBeBlocked(data)}
shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationBlockedForUser(data)}
name="files"
ndg={data.ndg}
applicationId={id}/>
@@ -906,7 +1075,7 @@ const DomandaEditPreInstructor = () => {
<ListOfFiles
files={data.amendmentDetails}
updateFn={updateEvaluationValue}
shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationShouldBeBlocked(data)}
shouldDisableFieldFn={(name) => shouldDisableField(name) || evaluationBlockedForUser(data)}
name="amendmentDetails"
ndg={data.ndg}
applicationId={id}/>
@@ -930,7 +1099,7 @@ const DomandaEditPreInstructor = () => {
<td>
<div className="p-inputgroup">
<InputNumber
disabled={shouldDisableField('criteria') || evaluationShouldBeBlocked(data)}
disabled={shouldDisableField('criteria') || evaluationBlockedForUser(data)}
placeholder={__('Punteggio', 'gepafin')}
keyfilter="int"
value={o.score}
@@ -953,7 +1122,7 @@ const DomandaEditPreInstructor = () => {
onClick={() => displayCriterionData(o.id)}
aria-label={__('Mostra', 'gepafin')}/> : null}
<Button icon="pi pi-thumbs-up" rounded outlined
disabled={shouldDisableField('criteria') || evaluationShouldBeBlocked(data)}
disabled={shouldDisableField('criteria') || evaluationBlockedForUser(data)}
severity={!isNil(o.valid) && o.valid ? 'success' : 'secondary'}
onClick={() => updateEvaluationValue(
true,
@@ -961,7 +1130,7 @@ const DomandaEditPreInstructor = () => {
)}
aria-label={__('Su', 'gepafin')}/>
<Button icon="pi pi-thumbs-down" rounded outlined
disabled={shouldDisableField('criteria') || evaluationShouldBeBlocked(data)}
disabled={shouldDisableField('criteria') || evaluationBlockedForUser(data)}
severity={!isNil(o.valid) && !o.valid ? 'danger' : 'secondary'}
onClick={() => updateEvaluationValue(
false,
@@ -1000,86 +1169,7 @@ const DomandaEditPreInstructor = () => {
</div>
<div className="appPageSection">
<div className="appPageSection__actions">
{['EVALUATION', 'SOCCORSO', 'CLOSE'].includes(data.applicationStatus)
? <Button
type="button"
disabled={!data.id || data.status === 'CLOSE' || (data.applicationStatus === 'EVALUATION'
&& (!allFilesRated || !atLeastOneChecked)) || evaluationShouldBeBlocked(data)}
onClick={doNewSoccorso}
outlined
label={<>
{data.applicationStatus === 'EVALUATION'
? __('Richiedi soccorso istruttorio', 'gepafin')
: __('Apri soccorso istruttorio', 'gepafin')}
<i style={{ marginLeft: 7 }}>
<HelpIcon/>
</i>
</>}
/> : null}
{data.id
? <Button
type="button"
disabled={data.status === 'CLOSE' || evaluationShouldBeBlocked(data)}
onClick={() => doSaveDraft()}
outlined
label={__('Salva bozza valutazione', 'gepafin')}
icon="pi pi-save" iconPos="right"/>
: <Button
type="button"
onClick={() => doSaveDraft()}
label={__('Crea valutazione', 'gepafin')}
icon="pi pi-save" iconPos="right"/>}
{APP_EVALUATION_FLOW_ID === '1' && ['EVALUATION'].includes(data.applicationStatus)
&& APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <Button
type="button"
disabled={!data.id || !allFilesRated || !allChecksChecked
|| !['EVALUATION'].includes(data.applicationStatus) || evaluationShouldBeBlocked(data)}
onClick={doCheckNDG}
label={__('Controlla NDG', 'gepafin')}
/> : null}
{APP_EVALUATION_FLOW_ID === '1' && APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <Button
type="button"
disabled={!data.id || !['NDG'].includes(data.applicationStatus) || !data.ndg || evaluationShouldBeBlocked(data)}
onClick={doCreateAppointment}
label={__('Crea l\'appuntamento', 'gepafin')}
/> : null}
<Button
type="button"
disabled={!data.id || !['APPOINTMENT'].includes(data.applicationStatus) || evaluationShouldBeBlocked(data)}
onClick={doMakeAdmisible}
label={__('Ammissibile formalmente', 'gepafin')}
/>
<Button
type="button"
disabled={true}
onClick={() => {
}}
label={__('Valutazione tecnico-finanziaria positiva', 'gepafin')}
/>
{data.id
? <Button
type="button"
disabled={!isAdmissible
|| ['APPROVED'].includes(data.applicationStatus)
|| evaluationShouldBeBlocked(data)
|| (APP_EVALUATION_FLOW_ID === '1' && !['ADMISSIBLE'].includes(data.applicationStatus))
}
onClick={initiateApproving}
label={__('Domanda deliberata', 'gepafin')}
icon="pi pi-check" iconPos="right"/> : null}
{data.id
? <Button
type="button"
disabled={APP_EVALUATION_FLOW_ID === '1'
&& (!['EVALUATION', 'ADMISSIBLE', 'APPOINTMENT'].includes(data.applicationStatus)
|| evaluationShouldBeBlocked(data))}
onClick={initiateRejecting}
label={__('Respingi domanda', 'gepafin')}
icon="pi pi-times" iconPos="right"/> : null}
</div>
{actionBtns()}
</div>
<Dialog