- added evaluation related 'resend emails' buttons;

This commit is contained in:
Vitalii Kiiko
2025-05-13 17:16:45 +02:00
parent 25ec77151a
commit 44a914f343
4 changed files with 110 additions and 30 deletions

View File

@@ -26,6 +26,7 @@ import { Calendar } from 'primereact/calendar';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import { Link, useNavigate } from 'react-router-dom'; import { Link, useNavigate } from 'react-router-dom';
import getQueryParamsForPaginatedEndpoint from '../../../../helpers/getQueryParamsForPaginatedEndpoint'; import getQueryParamsForPaginatedEndpoint from '../../../../helpers/getQueryParamsForPaginatedEndpoint';
import SoccorsoResendEmails from '../../../SoccorsoEditPreInstructor/components/SoccorsoResendEmails';
const APP_HUB_ID = process.env.REACT_APP_HUB_ID; const APP_HUB_ID = process.env.REACT_APP_HUB_ID;
@@ -73,7 +74,8 @@ const MieDomandeTableInstructorManagerAsync = ({ userId = null, statuses = [] })
const getCallback = (resp) => { const getCallback = (resp) => {
if (resp.status === 'SUCCESS') { if (resp.status === 'SUCCESS') {
const { body, totalRecords, const {
body, totalRecords,
//currentPage, totalPages, pageSize //currentPage, totalPages, pageSize
} = resp.data; } = resp.data;
setTotalRecordsNum(totalRecords); setTotalRecordsNum(totalRecords);
@@ -114,7 +116,8 @@ const MieDomandeTableInstructorManagerAsync = ({ userId = null, statuses = [] })
} }
setLazyState({ ...lazyState, filters, first: 0 }); setLazyState({ ...lazyState, filters, first: 0 });
}} }}
itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"/>; itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel}
className="p-column-filter"/>;
}; };
const dateFilterTemplate = (options) => { const dateFilterTemplate = (options) => {
@@ -130,22 +133,43 @@ const MieDomandeTableInstructorManagerAsync = ({ userId = null, statuses = [] })
return getFormattedDateString(rowData.evaluationEndDate); return getFormattedDateString(rowData.evaluationEndDate);
}; };
const updateRowData = useCallback((id, updateResponse) => {
const newItems = items.map((o) => {
if (o.id === id) {
o.emailSendResponse = updateResponse;
}
return o;
})
setItems(newItems);
}, [items]);
const actionsBodyTemplate = (rowData) => { const actionsBodyTemplate = (rowData) => {
if (rowData.status === 'AWAITING') { if (rowData.status === 'AWAITING') {
return <Button return <div className="appPageSection__tableActions lessGap">
<Button
severity="info" severity="info"
onClick={() => handleInitiateEvaluation(rowData.id)} onClick={() => handleInitiateEvaluation(rowData.id)}
label={__('Valuta', 'gepafin')} label={__('Valuta', 'gepafin')}
icon="pi pi-eye" icon="pi pi-eye"
size="small" size="small"
iconPos="right"/> iconPos="right"/>
<SoccorsoResendEmails
emailsData={rowData.emailSendResponse}
setDataEmailsSoccorso={(updateResponse) => updateRowData(rowData.id, updateResponse)}/>
</div>
} else { } else {
const label = ['OPEN', 'SOCCORSO'].includes(rowData.status) && userData.id === rowData.userId const label = ['OPEN', 'SOCCORSO'].includes(rowData.status) && userData.id === rowData.userId
? __('Valuta', 'gepafin') ? __('Valuta', 'gepafin')
: __('Mostra', 'gepafin'); : __('Mostra', 'gepafin');
return <Link to={`/mie-domande/${rowData.applicationId}`}> return <div className="appPageSection__tableActions lessGap">
<Link
to={`/mie-domande/${rowData.applicationId}`}>
<Button severity="info" label={label} icon="pi pi-eye" size="small" iconPos="right"/> <Button severity="info" label={label} icon="pi pi-eye" size="small" iconPos="right"/>
</Link> </Link>
<SoccorsoResendEmails
emailsData={rowData.emailSendResponse}
setDataEmailsSoccorso={(updateResponse) => updateRowData(rowData.id, updateResponse)}/>
</div>
} }
} }
@@ -192,7 +216,8 @@ const MieDomandeTableInstructorManagerAsync = ({ userId = null, statuses = [] })
const renderHeader = () => { const renderHeader = () => {
return ( return (
<div className="flex justify-content-between"> <div className="flex justify-content-between">
<Button type="button" icon="pi pi-filter-slash" label={__('Pulisci', 'gepafin')} outlined onClick={clearFilter} /> <Button type="button" icon="pi pi-filter-slash" label={__('Pulisci', 'gepafin')} outlined
onClick={clearFilter}/>
</div> </div>
); );
}; };
@@ -268,7 +293,7 @@ const MieDomandeTableInstructorManagerAsync = ({ userId = null, statuses = [] })
style={{ minWidth: '7rem' }} body={statusBodyTemplate} style={{ minWidth: '7rem' }} body={statusBodyTemplate}
filter filter
filterMatchModeOptions={translationStrings.statusFilterOptions} filterMatchModeOptions={translationStrings.statusFilterOptions}
filterElement={statusFilterTemplate} /> filterElement={statusFilterTemplate}/>
<Column header={__('Azioni', 'gepafin')} <Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/> body={actionsBodyTemplate}/>
</DataTable> </DataTable>

View File

@@ -26,6 +26,7 @@ import { Calendar } from 'primereact/calendar';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import { Link, useNavigate } from 'react-router-dom'; import { Link, useNavigate } from 'react-router-dom';
import getQueryParamsForPaginatedEndpoint from '../../../../helpers/getQueryParamsForPaginatedEndpoint'; import getQueryParamsForPaginatedEndpoint from '../../../../helpers/getQueryParamsForPaginatedEndpoint';
import SoccorsoResendEmails from '../../../SoccorsoEditPreInstructor/components/SoccorsoResendEmails';
const APP_HUB_ID = process.env.REACT_APP_HUB_ID; const APP_HUB_ID = process.env.REACT_APP_HUB_ID;
@@ -73,7 +74,8 @@ const DomandeTablePreInstructorAsync = ({ userId = null, statuses = [] }) => {
const getCallback = (resp) => { const getCallback = (resp) => {
if (resp.status === 'SUCCESS') { if (resp.status === 'SUCCESS') {
const { body, totalRecords, const {
body, totalRecords,
//currentPage, totalPages, pageSize //currentPage, totalPages, pageSize
} = resp.data; } = resp.data;
setTotalRecordsNum(totalRecords); setTotalRecordsNum(totalRecords);
@@ -114,7 +116,8 @@ const DomandeTablePreInstructorAsync = ({ userId = null, statuses = [] }) => {
} }
setLazyState({ ...lazyState, filters, first: 0 }); setLazyState({ ...lazyState, filters, first: 0 });
}} }}
itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"/>; itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel}
className="p-column-filter"/>;
}; };
const dateFilterTemplate = (options) => { const dateFilterTemplate = (options) => {
@@ -130,16 +133,30 @@ const DomandeTablePreInstructorAsync = ({ userId = null, statuses = [] }) => {
return getFormattedDateString(rowData.evaluationEndDate); return getFormattedDateString(rowData.evaluationEndDate);
}; };
const updateRowData = useCallback((id, updateResponse) => {
const newItems = items.map((o) => {
if (o.id === id) {
o.emailSendResponse = updateResponse;
}
return o;
})
setItems(newItems);
}, [items]);
const actionsBodyTemplate = (rowData) => { const actionsBodyTemplate = (rowData) => {
console.log('status', rowData.status)
if (rowData.status === 'AWAITING') { if (rowData.status === 'AWAITING') {
return <Button return <div className="appPageSection__tableActions lessGap">
<Button
severity="info" severity="info"
onClick={() => handleInitiateEvaluation(rowData.id)} onClick={() => handleInitiateEvaluation(rowData.id)}
label={__('Valuta', 'gepafin')} label={__('Valuta', 'gepafin')}
icon="pi pi-eye" icon="pi pi-eye"
size="small" size="small"
iconPos="right"/> iconPos="right"/>
<SoccorsoResendEmails
emailsData={rowData.emailSendResponse}
setDataEmailsSoccorso={(updateResponse) => updateRowData(rowData.id, updateResponse)}/>
</div>
} else { } else {
const label = ['OPEN', 'SOCCORSO'].includes(rowData.status) && userData.id === rowData.userId const label = ['OPEN', 'SOCCORSO'].includes(rowData.status) && userData.id === rowData.userId
? __('Valuta', 'gepafin') ? __('Valuta', 'gepafin')
@@ -151,13 +168,16 @@ const DomandeTablePreInstructorAsync = ({ userId = null, statuses = [] }) => {
</Link> </Link>
{rowData.applicationStatus === 'REJECTED' && ( {rowData.applicationStatus === 'REJECTED' && (
<Button <Button
severity='success' severity="success"
label={__('Riammetti', 'gepafin')} label={__('Riammetti', 'gepafin')}
icon='pi pi-arrow-circle-up' icon="pi pi-arrow-circle-up"
size="small" size="small"
iconPos="right" iconPos="right"
/> />
)} )}
<SoccorsoResendEmails
emailsData={rowData.emailSendResponse}
setDataEmailsSoccorso={(updateResponse) => updateRowData(rowData.id, updateResponse)}/>
</div> </div>
) )
} }
@@ -206,7 +226,8 @@ const DomandeTablePreInstructorAsync = ({ userId = null, statuses = [] }) => {
const renderHeader = () => { const renderHeader = () => {
return ( return (
<div className="flex justify-content-between"> <div className="flex justify-content-between">
<Button type="button" icon="pi pi-filter-slash" label={__('Pulisci', 'gepafin')} outlined onClick={clearFilter} /> <Button type="button" icon="pi pi-filter-slash" label={__('Pulisci', 'gepafin')} outlined
onClick={clearFilter}/>
</div> </div>
); );
}; };
@@ -282,7 +303,7 @@ const DomandeTablePreInstructorAsync = ({ userId = null, statuses = [] }) => {
style={{ minWidth: '7rem' }} body={statusBodyTemplate} style={{ minWidth: '7rem' }} body={statusBodyTemplate}
filter filter
filterMatchModeOptions={translationStrings.statusFilterOptions} filterMatchModeOptions={translationStrings.statusFilterOptions}
filterElement={statusFilterTemplate} /> filterElement={statusFilterTemplate}/>
<Column header={__('Azioni', 'gepafin')} <Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/> body={actionsBodyTemplate}/>
</DataTable> </DataTable>

View File

@@ -52,6 +52,7 @@ import RepeaterFields from '../DomandaEditPreInstructor/components/RepeaterField
import ApplicationInfo from '../DomandaEditPreInstructor/components/ApplicationInfo'; import ApplicationInfo from '../DomandaEditPreInstructor/components/ApplicationInfo';
import ApplicationDownloadFiles from '../DomandaEditPreInstructor/components/ApplicationDownloadFiles'; import ApplicationDownloadFiles from '../DomandaEditPreInstructor/components/ApplicationDownloadFiles';
import FormField from '../../components/FormField'; import FormField from '../../components/FormField';
import SoccorsoResendEmails from '../SoccorsoEditPreInstructor/components/SoccorsoResendEmails';
const APP_EVALUATION_FLOW_ID = process.env.REACT_APP_EVALUATION_FLOW_ID; const APP_EVALUATION_FLOW_ID = process.env.REACT_APP_EVALUATION_FLOW_ID;
const APP_HUB_ID = process.env.REACT_APP_HUB_ID; const APP_HUB_ID = process.env.REACT_APP_HUB_ID;
@@ -85,6 +86,7 @@ const DomandaEditInstructorManager = () => {
const [formData, setFormData] = useState([]); const [formData, setFormData] = useState([]);
const [formId, setFormId] = useState(0); const [formId, setFormId] = useState(0);
const [formInitialData, setFormInitialData] = useState(null); const [formInitialData, setFormInitialData] = useState(null);
const emailSendResponse = pathOr([], ['emailSendResponse'], data);
const { const {
control, control,
handleSubmit, handleSubmit,
@@ -873,6 +875,11 @@ const DomandaEditInstructorManager = () => {
</div> </div>
} }
const updateEmailSendResponses = useCallback((newEmailData) => {
const newData = wrap(data).set(['emailSendResponse'], newEmailData).value();
setData(newData);
}, [data]);
useEffect(() => { useEffect(() => {
let updatedFormValues = klona(formValues); let updatedFormValues = klona(formValues);
let context = {}; let context = {};
@@ -970,6 +977,11 @@ const DomandaEditInstructorManager = () => {
<div className="appPageSection"> <div className="appPageSection">
{actionBtns()} {actionBtns()}
<div className="appPageSection__actions">
<SoccorsoResendEmails
emailsData={emailSendResponse}
setDataEmailsSoccorso={updateEmailSendResponses}/>
</div>
</div> </div>
<ApplicationDownloadFiles id={id}/> <ApplicationDownloadFiles id={id}/>
@@ -1241,6 +1253,11 @@ const DomandaEditInstructorManager = () => {
<div className="appPageSection"> <div className="appPageSection">
{actionBtns()} {actionBtns()}
<div className="appPageSection__actions">
<SoccorsoResendEmails
emailsData={emailSendResponse}
setDataEmailsSoccorso={updateEmailSendResponses}/>
</div>
</div> </div>
<Dialog <Dialog

View File

@@ -53,6 +53,7 @@ import RepeaterFields from './components/RepeaterFields';
import ApplicationInfo from './components/ApplicationInfo'; import ApplicationInfo from './components/ApplicationInfo';
import ApplicationDownloadFiles from './components/ApplicationDownloadFiles'; import ApplicationDownloadFiles from './components/ApplicationDownloadFiles';
import FormField from '../../components/FormField'; import FormField from '../../components/FormField';
import SoccorsoResendEmails from '../SoccorsoEditPreInstructor/components/SoccorsoResendEmails';
const APP_EVALUATION_FLOW_ID = process.env.REACT_APP_EVALUATION_FLOW_ID; const APP_EVALUATION_FLOW_ID = process.env.REACT_APP_EVALUATION_FLOW_ID;
const APP_HUB_ID = process.env.REACT_APP_HUB_ID; const APP_HUB_ID = process.env.REACT_APP_HUB_ID;
@@ -86,6 +87,7 @@ const DomandaEditPreInstructor = () => {
const [formData, setFormData] = useState([]); const [formData, setFormData] = useState([]);
const [formId, setFormId] = useState(0); const [formId, setFormId] = useState(0);
const [formInitialData, setFormInitialData] = useState(null); const [formInitialData, setFormInitialData] = useState(null);
const emailSendResponse = pathOr([], ['emailSendResponse'], data);
const { const {
control, control,
handleSubmit, handleSubmit,
@@ -874,6 +876,11 @@ const DomandaEditPreInstructor = () => {
</div> </div>
} }
const updateEmailSendResponses = useCallback((newEmailData) => {
const newData = wrap(data).set(['emailSendResponse'], newEmailData).value();
setData(newData);
}, [data]);
useEffect(() => { useEffect(() => {
let updatedFormValues = klona(formValues); let updatedFormValues = klona(formValues);
let context = {}; let context = {};
@@ -972,6 +979,11 @@ const DomandaEditPreInstructor = () => {
<div className="appPageSection"> <div className="appPageSection">
{actionBtns()} {actionBtns()}
<div className="appPageSection__actions">
<SoccorsoResendEmails
emailsData={emailSendResponse}
setDataEmailsSoccorso={updateEmailSendResponses}/>
</div>
</div> </div>
<ApplicationDownloadFiles id={id}/> <ApplicationDownloadFiles id={id}/>
@@ -1243,6 +1255,11 @@ const DomandaEditPreInstructor = () => {
<div className="appPageSection"> <div className="appPageSection">
{actionBtns()} {actionBtns()}
<div className="appPageSection__actions">
<SoccorsoResendEmails
emailsData={emailSendResponse}
setDataEmailsSoccorso={updateEmailSendResponses}/>
</div>
</div> </div>
<Dialog <Dialog