- added buttons of 'resend emails' to single amendment page;

- added the same bttons to amendments table;
This commit is contained in:
Vitalii Kiiko
2025-05-13 10:10:57 +02:00
parent d92c0f45a3
commit 8e28f4355b
6 changed files with 139 additions and 7 deletions

View File

@@ -413,6 +413,10 @@
flex-wrap: wrap; flex-wrap: wrap;
} }
.appPageSection__actions:empty {
display: none;
}
.appPageSection__tableActions { .appPageSection__tableActions {
display: flex; display: flex;
gap: 10px; gap: 10px;

View File

@@ -263,3 +263,8 @@ export const classificationType = [
'idTipoprotocollo': 3 'idTipoprotocollo': 3
} }
]; ];
export const resendEmailLabelsByType = {
APPLICATION_AMENDMENT_REQUESTED: 'Invia email (nuovo soccorso)',
APPLICATION_AMENDMENT_REMINDER: 'Invia email (sollecito)'
}

View File

@@ -0,0 +1,81 @@
import React, { useRef, useState } from 'react';
import { pathOr } from 'ramda';
// tools
import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse';
// api
import EmailService from '../../../../service/email-service';
import { Toast } from 'primereact/toast';
import { Button } from 'primereact/button';
import { resendEmailLabelsByType } from '../../../../configData';
const SoccorsoResendEmails = ({ emailsData = [], setDataEmailsSoccorso }) => {
const [isResendingRequest, setIsResendingRequest] = useState(false);
const toast = useRef(null);
const filtered = emailsData.filter(o => !o.isEmailSend);
const resendEmail = (data) => {
setIsResendingRequest(true);
EmailService.emailResend(
data.userActionId,
(resp) => resendingCallback(resp, data.userActionId),
errResendingCallback
);
}
const resendingCallback = (resp, id) => {
if (resp.status === 'SUCCESS') {
if (toast.current && resp.message) {
toast.current.show({
severity: 'success',
summary: '',
detail: resp.message
});
}
setTimeout(() => {
if (setDataEmailsSoccorso) {
const newEmailSendResponse = emailsData.map((o) => {
if (o.userActionId === id) {
o.isEmailSend = true;
}
return o;
});
setDataEmailsSoccorso(newEmailSendResponse);
}
setIsResendingRequest(false);
}, 1500);
}
}
const errResendingCallback = (resp) => {
if (toast.current && resp.message) {
toast.current.show({
severity: 'error',
summary: '',
detail: resp.message
});
}
set404FromErrorResponse(resp);
setIsResendingRequest(false);
}
return(
filtered.length > 0 ? <>
<Toast ref={toast}/>
{filtered
.map(o => <Button
severity="warning"
type="button"
disabled={isResendingRequest}
onClick={() => resendEmail(o)}
label={pathOr('Re-inivia email', ['emailScenario'], resendEmailLabelsByType)}
icon="pi pi-send" iconPos="right"/>)}
</> : null
)
}
export default SoccorsoResendEmails;

View File

@@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef, useMemo } from 'react'; import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { useNavigate, useParams } from 'react-router-dom'; import { useNavigate, useParams } from 'react-router-dom';
import { is, isEmpty } from 'ramda'; import { is, isEmpty, isNil, pathOr } from 'ramda';
import { wrap } from 'object-path-immutable'; import { wrap } from 'object-path-immutable';
import { klona } from 'klona'; import { klona } from 'klona';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
@@ -28,6 +28,7 @@ import FormField from '../../components/FormField';
import { Editor } from 'primereact/editor'; import { Editor } from 'primereact/editor';
import { InputNumber } from 'primereact/inputnumber'; import { InputNumber } from 'primereact/inputnumber';
import SoccorsoComunications from './components/SoccorsoComunications'; import SoccorsoComunications from './components/SoccorsoComunications';
import SoccorsoResendEmails from './components/SoccorsoResendEmails';
const SoccorsoEditPreInstructor = () => { const SoccorsoEditPreInstructor = () => {
@@ -43,6 +44,7 @@ const SoccorsoEditPreInstructor = () => {
const [internalNote, setInternalNote] = useState(''); const [internalNote, setInternalNote] = useState('');
const toast = useRef(null); const toast = useRef(null);
const [formInitialData, setFormInitialData] = useState({}); const [formInitialData, setFormInitialData] = useState({});
const emailSendResponse = pathOr([], ['emailSendResponse'], data);
const { const {
control, control,
handleSubmit, handleSubmit,
@@ -346,6 +348,11 @@ const SoccorsoEditPreInstructor = () => {
setIsLoadingReminding(false); setIsLoadingReminding(false);
} }
const updateEmailSendResponses = useCallback((newEmailData) => {
const newData = wrap(data).set(['emailSendResponse'], newEmailData).value();
setData(newData);
}, [data]);
useEffect(() => { useEffect(() => {
if (formInitialData) { if (formInitialData) {
Object.keys(formInitialData).map(k => setValue(k, formInitialData[k])); Object.keys(formInitialData).map(k => setValue(k, formInitialData[k]));
@@ -506,7 +513,8 @@ const SoccorsoEditPreInstructor = () => {
<Button <Button
type="button" type="button"
onClick={sendReminder} onClick={sendReminder}
disabled={isLoadingReminding || ['CLOSE', 'EXPIRED'].includes(data.status)} disabled={isLoadingReminding || ['CLOSE', 'EXPIRED'].includes(data.status)
|| (!isNil(emailSendResponse) && !isEmpty(emailSendResponse))}
outlined outlined
label={__('Invia Sollecito', 'gepafin')} label={__('Invia Sollecito', 'gepafin')}
icon="pi pi-send" icon="pi pi-send"
@@ -532,6 +540,11 @@ const SoccorsoEditPreInstructor = () => {
label={__('Chiudi Soccorso Istruttorio', 'gepafin')} label={__('Chiudi Soccorso Istruttorio', 'gepafin')}
icon="pi pi-times" iconPos="right"/> icon="pi pi-times" iconPos="right"/>
</div> </div>
<div className="appPageSection__actions">
<SoccorsoResendEmails
emailsData={emailSendResponse}
setDataEmailsSoccorso={updateEmailSendResponses}/>
</div>
</div> </div>
</div> </div>

View File

@@ -22,6 +22,7 @@ import ProperBandoLabel from '../../../../components/ProperBandoLabel';
import { Dropdown } from 'primereact/dropdown'; import { Dropdown } from 'primereact/dropdown';
import { Tag } from 'primereact/tag'; import { Tag } from 'primereact/tag';
import { Calendar } from 'primereact/calendar'; import { Calendar } from 'primereact/calendar';
import SoccorsoResendEmails from '../../../SoccorsoEditPreInstructor/components/SoccorsoResendEmails';
const SoccorsiPreInstructorTableAsync = ({ userId = null }) => { const SoccorsiPreInstructorTableAsync = ({ userId = null }) => {
const [localAsyncRequest, setLocalAsyncRequest] = useState(false); const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
@@ -94,10 +95,25 @@ const SoccorsiPreInstructorTableAsync = ({ userId = null }) => {
}); });
}; };
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) => {
return <Link to={`/domande/${rowData.applicationId}/soccorso/${rowData.id}`}> return <div className="appPageSection__tableActions lessGap">
<Link to={`/domande/${rowData.applicationId}/soccorso/${rowData.id}`}>
<Button severity="info" label={__('Dettagli', 'gepafin')} size="small"/> <Button severity="info" label={__('Dettagli', 'gepafin')} size="small"/>
</Link> </Link>
<SoccorsoResendEmails
emailsData={rowData.emailSendResponse}
setDataEmailsSoccorso={(updateResponse) => updateRowData(rowData.id, updateResponse)}/>
</div>
} }
const statusBodyTemplate = (rowData) => { const statusBodyTemplate = (rowData) => {

View File

@@ -0,0 +1,13 @@
import { NetworkService } from './network-service';
const API_BASE_URL = process.env.REACT_APP_API_EXECUTION_ADDRESS;
export default class EmailService {
static emailResend = (id, callback, errCallback) => {
NetworkService.post(`${API_BASE_URL}/email/resend`, {}, callback, errCallback, [
['userActionId', id]
]);
};
}