- page benficiary domanda/soccorso;

- fixed fetching data in overview tables for beneficiary/pre instructor;
- fixed styles;
This commit is contained in:
Vitalii Kiiko
2024-11-07 16:19:09 +01:00
parent 8ae4b720e5
commit 5e44b1f268
18 changed files with 1045 additions and 264 deletions

View File

@@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef } from 'react';
import { __, sprintf } from '@wordpress/i18n';
import { useNavigate, useParams } from 'react-router-dom';
import { is, isEmpty, isNil, sum, pathOr } from 'ramda';
import { is, isEmpty, isNil, sum, pathOr, head } from 'ramda';
import { klona } from 'klona';
import { wrap } from 'object-path-immutable';
@@ -26,13 +26,16 @@ import { InputNumber } from 'primereact/inputnumber';
import BlockingOverlay from '../../components/BlockingOverlay';
import { Toast } from 'primereact/toast';
import HelpIcon from '../../icons/HelpIcon';
import { Dialog } from 'primereact/dialog';
const DomandaEditPreInstructor = () => {
const isAsyncRequest = useStore().main.isAsyncRequest();
const { id } = useParams();
const navigate = useNavigate();
const [data, setData] = useState({});
const [message, setMessage] = useState('');
const [isVisibleCriterionData, setIsVisibleCriterionData] = useState(0);
const [criterionDataTitle, setCriterionDataTitle] = useState('');
const [criterionDataContent, setCriterionDataContent] = useState('');
const [isAdmissible, setIsAdmissible] = useState(false);
const toast = useRef(null);
@@ -107,7 +110,7 @@ const DomandaEditPreInstructor = () => {
files: klona(data.files),
note: data.note
}
ApplicationEvaluationService.updateEvaluation(id, formData, updateCallback, errUpdateCallback);
ApplicationEvaluationService.updateEvaluation(data.assignedApplicationId, formData, updateCallback, errUpdateCallback);
}
const updateCallback = (data) => {
@@ -135,6 +138,66 @@ const DomandaEditPreInstructor = () => {
storeSet.main.unsetAsyncRequest();
}
const doApprove = () => {
const formData = {
status: 'APPROVED'
}
ApplicationEvaluationService.updateEvaluation(data.assignedApplicationId, formData, updateStatusCallback, errUpdateStatusCallback);
}
const doReject = () => {
const formData = {
status: 'REJECTED'
}
ApplicationEvaluationService.updateEvaluation(data.assignedApplicationId, formData, updateStatusCallback, errUpdateStatusCallback);
}
const updateStatusCallback = (data) => {
if (data.status === 'SUCCESS') {
if (toast.current) {
toast.current.show({
severity: 'success',
summary: '',
detail: data.message
});
}
}
storeSet.main.unsetAsyncRequest();
}
const errUpdateStatusCallback = (data) => {
if (toast.current && data.message) {
toast.current.show({
severity: 'error',
summary: '',
detail: data.message
});
}
set404FromErrorResponse(data);
storeSet.main.unsetAsyncRequest();
}
const displayCriterionData = (id) => {
const criterion = head(data.criteria.filter(o => o.id === id));
console.log(id, criterion);
setCriterionDataTitle(criterion.label);
const content = <div className="criterionRelatedData">
<h3>{__('I campi correlati')}</h3>
{criterion.criteriaMappedFields.map(o => <div key={o.id} className="criterionRelatedData__item">
<strong>{o.fieldLabel}</strong>
{o.fieldValue}
</div>)}
</div>;
setCriterionDataContent(content);
setIsVisibleCriterionData(id);
}
const hideCriterionData = () => {
setIsVisibleCriterionData(0);
setCriterionDataTitle('');
setCriterionDataContent('');
}
useEffect(() => {
const maxScore = pathOr(0, ['minScore'], data);
const criteria = pathOr([], ['criteria'], data);
@@ -236,7 +299,9 @@ const DomandaEditPreInstructor = () => {
<td>
<div className="appPageSection__iconActions">
{!isEmpty(o.criteriaMappedFields)
? <Button icon="pi pi-eye" rounded outlined severity="info"
? <Button icon="pi pi-eye"
rounded outlined severity="info"
onClick={() => displayCriterionData(o.id)}
aria-label={__('Mostra', 'gepafin')}/> : null}
<Button icon="pi pi-thumbs-up" rounded outlined
severity={!isNil(o.valid) && o.valid ? 'success' : 'secondary'}
@@ -280,8 +345,9 @@ const DomandaEditPreInstructor = () => {
<h2>{__('Checklist Valutazione', 'gepafin')}</h2>
<div className="appPageSection columns">
<div>
<h3>{__('Lista', 'gepafin')}</h3>
<div className="appPageSection__withBorder grey">
<div className="appPageSection__withBorder grey" style={{ marginBottom: '20px' }}>
<div className="appPageSection__checklist">
{data.checklist.map((o, i) => <div key={o.id}>
<Checkbox
@@ -305,7 +371,7 @@ const DomandaEditPreInstructor = () => {
onTextChange={(e) => updateEvaluationValue(
e.htmlValue,
'note'
)}
)}
style={{ height: 80 * 3, width: '100%' }}
/>
</div>
@@ -314,28 +380,58 @@ const DomandaEditPreInstructor = () => {
<h3>{__('Documenti allegati', 'gepafin')}</h3>
<ol className="appPageSection__list">
{data.files.map((o, i) => <li key={o.id}>
<span>{o.label}</span>
<div className="appPageSection__iconActions">
{o.fileDetail.length === 1
? <Button icon="pi pi-eye" rounded
onClick={() => window.open(o.fileDetail[0].filePath, '_blank').focus()}
outlined severity="info"
aria-label={__('Mostra', 'gepafin')}/> : null}
<Button icon="pi pi-thumbs-up" rounded outlined
severity={!isNil(o.valid) && o.valid ? 'success' : 'secondary'}
onClick={() => updateEvaluationValue(
true,
`files.${i}.valid`
)}
aria-label={__('Su', 'gepafin')}/>
<Button icon="pi pi-thumbs-down" rounded outlined
severity={!isNil(o.valid) && !o.valid ? 'danger' : 'secondary'}
onClick={() => updateEvaluationValue(
false,
`files.${i}.valid`
)}
aria-label={__('Giu', 'gepafin')}/>
<div className="appPageSection" style={{
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between'
}}>
<span>{o.label}</span>
<div className="appPageSection__iconActions">
{o.fileDetail.length === 1
? <Button icon="pi pi-eye" rounded
onClick={() => window.open(o.fileDetail[0].filePath, '_blank').focus()}
outlined severity="info"
aria-label={__('Mostra', 'gepafin')}/> : null}
<Button icon="pi pi-thumbs-up" rounded outlined
severity={!isNil(o.valid) && o.valid ? 'success' : 'secondary'}
onClick={() => updateEvaluationValue(
true,
`files.${i}.valid`
)}
aria-label={__('Su', 'gepafin')}/>
<Button icon="pi pi-thumbs-down" rounded outlined
severity={!isNil(o.valid) && !o.valid ? 'danger' : 'secondary'}
onClick={() => updateEvaluationValue(
false,
`files.${i}.valid`
)}
aria-label={__('Giu', 'gepafin')}/>
</div>
</div>
{o.fileDetail.length > 1
? <ul style={{
width: '100%',
paddingLeft: '15px',
display: 'flex',
flexDirection: 'column',
gap: '10px'
}}>
{o.fileDetail.map((k, i) => <li key={k.id} style={{
display: 'flex',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between'
}}>
<span>{k.name}</span>
<div className="appPageSection__iconActions">
<Button icon="pi pi-eye" rounded
onClick={() => window.open(k.filePath, '_blank').focus()}
outlined severity="info"
aria-label={__('Mostra', 'gepafin')}/>
</div>
</li>)}
</ul>
: null}
</li>)}
</ol>
</div>
@@ -370,15 +466,25 @@ const DomandaEditPreInstructor = () => {
<Button
type="button"
disabled={!isAdmissible}
onClick={doApprove}
label={__('Approva Domanda', 'gepafin')}
icon="pi pi-check" iconPos="right"/>
<Button
type="button"
onClick={doReject}
label={__('Respingi Domanda', 'gepafin')}
icon="pi pi-times" iconPos="right"/>
</div>
</div>
<Dialog
header={criterionDataTitle}
visible={isVisibleCriterionData !== 0}
style={{ width: '50vw' }}
onHide={hideCriterionData}>
{criterionDataContent}
</Dialog>
</div>
: <>
<Skeleton width="20%" height="1rem" className="mb-2"></Skeleton>