- added amendemnt page for beneficiary;

- fixed styles in all tables;
- fixed displaying requested files list;
- fixed page of creating a new amendment;
This commit is contained in:
Vitalii Kiiko
2024-11-08 16:08:08 +01:00
parent 5e44b1f268
commit 2797a58661
13 changed files with 129 additions and 97 deletions

View File

@@ -207,6 +207,7 @@
display: flex;
flex-direction: column;
padding: 0;
width: 100%;
> li {
padding: 15px;
@@ -378,4 +379,12 @@
&[disabled] {
background-color: var(--message-info-background);
}
}
@media (max-width: 700px) {
.appPageSection {
&.columns {
grid-template-columns: 1fr;
}
}
}

View File

@@ -143,15 +143,15 @@ const AllBandiTable = () => {
onFilter={(e) => setFilters(e.filters)}>
<Column field="name" header={__('Nome Bando', 'gepafin')}
filter filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column header={__('Data Pubblicazione', 'gepafin')} filterField="start_date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateStartBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column header={__('Data Scadenza', 'gepafin')} filterField="end_date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateEndBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')} filterMenuStyle={{ width: '14rem' }}
style={{ width: '120px' }} body={statusBodyTemplate} filter
style={{ minWidth: '7rem' }} body={statusBodyTemplate} filter
filterElement={statusFilterTemplate}/>
<Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/>

View File

@@ -153,15 +153,15 @@ const LatestBandiTable = () => {
emptyMessage={__('Nessun dato disponibile', 'gepafin')}
onFilter={(e) => setFilters(e.filters)}>
<Column field="name" header={__('Nome Bando', 'gepafin')} filter filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column header={__('Data Pubblicazione', 'gepafin')} filterField="start_date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateStartBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column header={__('Data Scadenza', 'gepafin')} filterField="end_date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateEndBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')}
style={{ width: '120px' }} body={statusBodyTemplate} />
style={{ minWidth: '7rem' }} body={statusBodyTemplate} />
<Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/>
</DataTable>

View File

@@ -110,10 +110,10 @@ const LatestUsersActivityTable = () => {
emptyMessage={__('Nessun dato disponibile', 'gepafin')}
onFilter={(e) => setFilters(e.filters)}>
<Column header={__('Timestamp', 'gepafin')} filterField="date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="email" header={__('Utente', 'gepafin')} filter filterPlaceholder="Search by email"
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column field="action" header={__('Azione', 'gepafin')}/>
<Column field="dettails" header={__('Dettagli', 'gepafin')}/>
</DataTable>

View File

@@ -151,15 +151,15 @@ const LatestBandiTable = () => {
emptyMessage={__('Nessun dato disponibile', 'gepafin')}
onFilter={(e) => setFilters(e.filters)}>
<Column field="name" header={__('Nome Bando', 'gepafin')} filter filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column header={__('Data Pubblicazione', 'gepafin')} filterField="start_date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateStartBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column header={__('Data Scadenza', 'gepafin')} filterField="end_date" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateEndBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')}
style={{ width: '120px' }} body={statusBodyTemplate} />
style={{ minWidth: '7rem' }} body={statusBodyTemplate} />
<Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/>
</DataTable>

View File

@@ -174,19 +174,20 @@ const MyLatestSubmissionsTable = () => {
emptyMessage={__('Nessun dato disponibile', 'gepafin')}
onFilter={(e) => setFilters(e.filters)}>
<Column field="callTitle" header={__('Bando', 'gepafin')} filter filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column header={__('Scadenza', 'gepafin')} filterField="callEndDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateEndBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column header={__('Ultima modifica', 'gepafin')} filterField="modifiedDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateModifyBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')} filterMenuStyle={{ width: '14rem' }}
style={{ width: '120px' }} body={statusBodyTemplate} filter
style={{ minWidth: '7rem' }} body={statusBodyTemplate} filter
filterElement={statusFilterTemplate}/>
<Column header={__('Progressi', 'gepafin')}
style={{ minWidth: '10rem' }} field="progress" body={progressBodyTemplate}/>
<Column header={__('Azioni', 'gepafin')}
style={{ minWidth: '10rem' }}
body={actionsBodyTemplate}/>
</DataTable>
</div>

View File

@@ -144,18 +144,18 @@ const PreInstructorDomandeTable = () => {
onFilter={(e) => setFilters(e.filters)}>
<Column field="applicationId" header={__('ID domanda', 'gepafin')}
filter filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '6rem' }}/>
<Column field="callName" header={__('Bando', 'gepafin')}
filter filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '12rem' }}/>
<Column header={__('Data Ricezione', 'gepafin')} filterField="submissionDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}/>
<Column header={__('Data ricezione', 'gepafin')} filterField="submissionDate" dataType="date"
style={{ minWidth: '8rem' }}
body={dateAppliedBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column header={__('Scadenza', 'gepafin')} filterField="callEndDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateEndBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')}
style={{ width: '120px' }} body={statusBodyTemplate} />
style={{ minWidth: '7rem' }} body={statusBodyTemplate} />
<Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/>
</DataTable>

View File

@@ -41,26 +41,8 @@ const DomandaBeneficiario = () => {
const [isVisibleNewCommDialog, setIsVisibleNewCommDialog] = useState(false);
const [newCommData, setNewCommData] = useState({});
const [isLoadingCommunication, setIsLoadingCommunication] = useState(false);
const [isVisibleExtendTimeDialog, setIsVisibleExtendTimeDialog] = useState(false);
const [extendedTime, setExtendedTime] = useState(3);
const [isLoadingExtendingTime, setIsLoadingExtendingTime] = useState(false);
const [isLoadingReminding, setIsLoadingReminding] = useState(false);
const [isVisibleEmailDialog, setIsVisibleEmailDialog] = useState(false);
const toast = useRef(null);
const [formInitialData, setFormInitialData] = useState({});
const {
control,
handleSubmit,
formState: { errors, isValid },
setValue,
register,
trigger,
getValues,
clearErrors
} = useForm({
defaultValues: useMemo(() => {
return formInitialData;
}, [formInitialData]), mode: 'onChange'
});
const goToArchivePage = () => {
navigate(`/domande`);
@@ -68,10 +50,12 @@ const DomandaBeneficiario = () => {
const getCallback = (data) => {
if (data.status === 'SUCCESS') {
setData(getFormattedData(data.data));
//CommunicationService.getCommsByAmendmentId(data.data.id, getCommsCallback, errGetCommsCallback);
if (data.data.length) {
setData(getFormattedData(data.data[0]));
CommunicationService.getCommsByAmendmentId(data.data[0].id, getCommsCallback, errGetCommsCallback);
}
}
//storeSet.main.unsetAsyncRequest();
storeSet.main.unsetAsyncRequest();
}
const errGetCallback = (data) => {
@@ -181,8 +165,7 @@ const DomandaBeneficiario = () => {
const createCommunication = () => {
setIsLoadingCommunication(true);
const amendmentId = 0
CommunicationService.createCommunication(amendmentId, newCommData, createCommunicationCallback, errCreateCommunicationCallback);
CommunicationService.createCommunication(data.id, newCommData, createCommunicationCallback, errCreateCommunicationCallback);
}
const createCommunicationCallback = (data) => {
@@ -272,24 +255,21 @@ const DomandaBeneficiario = () => {
<div className="appPageSection">
<h2>{__('Dettagli Richiesta', 'gepafin')}</h2>
<div className="appPageSection columns">
<div>
<h3>{__('Documenti Richiesti', 'gepafin')}</h3>
<ol className="appPageSection__list">
{data.formFields
? data.formFields.map((o, i) => <li key={o.fieldId} style={{ flexDirection: 'row' }}>
<span>{o.label}</span>
</li>) : null}
</ol>
</div>
<div>
<h3>{__('Note e spiegazioni', 'gepafin')}</h3>
<div className="appPageSection__withBorder grey ql-editor"
style={{ minHeight: '200px' }}>
{renderHtmlContent(data.note)}
</div>
</div>
<h3>{__('Documenti Richiesti', 'gepafin')}</h3>
<ol className="appPageSection__list">
{data.formFields
? data.formFields.map((o, i) => <li key={o.fieldId}
style={{ flexDirection: 'row' }}>
<span>{o.label}</span>
</li>) : null}
</ol>
</div>
<div className="appPageSection">
<h3>{__('Note e spiegazioni', 'gepafin')}</h3>
<div className="appPageSection__withBorder grey ql-editor"
style={{ minHeight: '200px' }}>
{renderHtmlContent(data.note)}
</div>
</div>
@@ -340,11 +320,13 @@ const DomandaBeneficiario = () => {
<Button
type="button"
disabled={isAsyncRequest}
onClick={() => setIsVisibleEmailDialog(true)}
label={__('Invia documenti via PEC', 'gepafin')}
icon="pi pi-envelope" iconPos="right"/>
<Button
type="button"
outlined
onClick={goToArchivePage}
disabled={isAsyncRequest}
label={__('Chiudi', 'gepafin')}
icon="pi pi-times" iconPos="right"/>
@@ -383,6 +365,16 @@ const DomandaBeneficiario = () => {
onChange={(e) => updateNewCommData(e.target.value, 'comment')}/>
</div>
</Dialog>
<Dialog
header={__('Invia documenti via PEC', 'gepafin')}
visible={isVisibleEmailDialog}
style={{ width: '50vw' }}
onHide={() => {if (!isVisibleEmailDialog) return; setIsVisibleEmailDialog(false); }}>
<p className="m-0">
{data.callEmail}
</p>
</Dialog>
</div>
)

View File

@@ -10,6 +10,7 @@ import { storeSet, useStore } from '../../store';
// api
import ApplicationEvaluationService from '../../service/application-evaluation-service';
import AmendmentsService from '../../service/amendments-service';
// tools
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
@@ -37,6 +38,7 @@ const DomandaEditPreInstructor = () => {
const [criterionDataTitle, setCriterionDataTitle] = useState('');
const [criterionDataContent, setCriterionDataContent] = useState('');
const [isAdmissible, setIsAdmissible] = useState(false);
const [connectedSoccorsoId, setConnectedSoccorsoId] = useState(0);
const toast = useRef(null);
const goToEvaluationsPage = () => {
@@ -44,7 +46,12 @@ const DomandaEditPreInstructor = () => {
}
const doNewSoccorso = () => {
navigate(`/domande/${id}/aggiungi-soccorso/${data.id}`);
if (connectedSoccorsoId !== 0) {
navigate(`/domande/${id}/soccorso/${connectedSoccorsoId}`);
} else {
navigate(`/domande/${id}/aggiungi-soccorso/`);
}
}
const getCallback = (data) => {
@@ -198,6 +205,17 @@ const DomandaEditPreInstructor = () => {
setCriterionDataContent('');
}
const getAmendmentsCallback = (data) => {
if (data.status === 'SUCCESS') {
if (data.data.length) {
setConnectedSoccorsoId(data.data[0].id);
}
}
}
const errGetAmendmentsCallback = () => {
}
useEffect(() => {
const maxScore = pathOr(0, ['minScore'], data);
const criteria = pathOr([], ['criteria'], data);
@@ -210,9 +228,13 @@ const DomandaEditPreInstructor = () => {
const parsed = parseInt(id)
const entityId = !isNaN(parsed) ? parsed : 0;
storeSet.main.setAsyncRequest();
ApplicationEvaluationService.getEvaluationByApplId(getCallback, errGetCallback, [
['applicationId', entityId]
]);
AmendmentsService.getSoccorsoByApplId(entityId, getAmendmentsCallback, errGetAmendmentsCallback, [
['statuses', 'AWAITING']
]);
}, [id]);
return (
@@ -448,6 +470,7 @@ const DomandaEditPreInstructor = () => {
<div className="appPageSection__actions">
<Button
type="button"
disabled={!data.id}
onClick={doNewSoccorso}
outlined
label={<>
@@ -457,23 +480,31 @@ const DomandaEditPreInstructor = () => {
</i>
</>}
/>
<Button
type="button"
onClick={doSaveDraft}
outlined
label={__('Salva Bozza Valutazione', 'gepafin')}
icon="pi pi-save" iconPos="right"/>
<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"/>
{data.id
? <Button
type="button"
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"/>}
{data.id
? <Button
type="button"
disabled={!isAdmissible}
onClick={doApprove}
label={__('Approva Domanda', 'gepafin')}
icon="pi pi-check" iconPos="right"/> : null}
{data.id
? <Button
type="button"
onClick={doReject}
label={__('Respingi Domanda', 'gepafin')}
icon="pi pi-times" iconPos="right"/> : null}
</div>
</div>

View File

@@ -171,18 +171,18 @@ const BeneficiarioDomandeTable = () => {
onFilter={(e) => setFilters(e.filters)}>
<Column field="id" header={__('ID domanda', 'gepafin')} filter
filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '6rem' }}/>
<Column field="callTitle" header={__('Titolo bando', 'gepafin')} filter
filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column header={__('Data di invio', 'gepafin')} filterField="submissionDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateSubmissionBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')} filterMenuStyle={{ width: '14rem' }}
style={{ width: '120px' }} body={statusBodyTemplate} filter
style={{ minWidth: '7rem' }} body={statusBodyTemplate} filter
filterElement={statusFilterTemplate}/>
<Column header={__('Esito', 'gepafin')}
style={{ minWidth: '10rem' }} field="progress" body={progressBodyTemplate}/>
style={{ minWidth: '7rem' }} field="progress" body={progressBodyTemplate}/>
<Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/>
</DataTable>

View File

@@ -54,8 +54,7 @@ const SoccorsoEditPreInstructor = () => {
setValue,
register,
trigger,
getValues,
clearErrors
getValues
} = useForm({
defaultValues: useMemo(() => {
return formInitialData;

View File

@@ -147,23 +147,23 @@ const PreInstructorSoccorsiTable = ({ openDialogFn }) => {
onFilter={(e) => setFilters(e.filters)}>
<Column field="applicationId" header={__('ID domanda', 'gepafin')}
filter filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '6rem' }}/>
<Column field="callName" header={__('Bando', 'gepafin')}
filter filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column field="beneficiaryName" header={__('Beneficiario', 'gepafin')}
filter filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '12rem' }}/>
style={{ minWidth: '8rem' }}/>
<Column header={__('Data Richiesta', 'gepafin')}
filterField="startDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateStartBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column header={__('Scadenza', 'gepafin')}
filterField="expirationDate" dataType="date"
style={{ minWidth: '10rem' }}
style={{ minWidth: '8rem' }}
body={dateExpirationBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')}
style={{ width: '120px' }} body={statusBodyTemplate} />
style={{ minWidth: '7rem' }} body={statusBodyTemplate} />
<Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/>
</DataTable>

View File

@@ -96,7 +96,7 @@ const routes = ({ role, chosenCompanyId }) => {
{'ROLE_BENEFICIARY' === role ? <DomandaBeneficiario/> : null}
{'ROLE_PRE_INSTRUCTOR' === role ? <DomandaEditPreInstructor/> : null}
</DefaultLayout>}/>
<Route path="/domande/:id/aggiungi-soccorso/:evaluationId" element={<DefaultLayout>
<Route path="/domande/:id/aggiungi-soccorso" element={<DefaultLayout>
{'ROLE_SUPER_ADMIN' === role ? <PageNotFound/> : null}
{'ROLE_BENEFICIARY' === role ? <PageNotFound/> : null}
{'ROLE_PRE_INSTRUCTOR' === role ? <SoccorsoAddPreInstructor/> : null}