import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react'; import { __ } from '@wordpress/i18n'; import { useNavigate, useParams } from 'react-router-dom'; import { is, isEmpty, isNil, pathOr } from 'ramda'; import { wrap } from 'object-path-immutable'; import { klona } from 'klona'; import { useForm } from 'react-hook-form'; // store import { storeSet, useStoreValue } from '../../store'; // api import AmendmentsService from '../../service/amendments-service'; // tools import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; import getBandoLabel from '../../helpers/getBandoLabel'; import getDateFromISOstring from '../../helpers/getDateFromISOstring'; import getEmailTemplateForSoccorso from '../../helpers/getStrippedHtmlBodyTags'; // components import { Button } from 'primereact/button'; import BlockingOverlay from '../../components/BlockingOverlay'; import { Toast } from 'primereact/toast'; import { classNames } from 'primereact/utils'; import { Dialog } from 'primereact/dialog'; import FormField from '../../components/FormField'; import { Editor } from 'primereact/editor'; import { InputNumber } from 'primereact/inputnumber'; import SoccorsoComunications from '../SoccorsoEditPreInstructor/components/SoccorsoComunications'; import SoccorsoResendEmails from '../SoccorsoEditPreInstructor/components/SoccorsoResendEmails'; import { amendmentRequestedDocs } from '../../configData'; const SoccorsoEditInstructorManager = () => { const isAsyncRequest = useStoreValue('isAsyncRequest'); const { id, amendmentId } = useParams(); const navigate = useNavigate(); const [data, setData] = useState({}); const [isVisibleCloseAmendDialog, setIsVisibleCloseAmendDialog] = useState(false); const [isVisibleExtendTimeDialog, setIsVisibleExtendTimeDialog] = useState(false); const [extendedTime, setExtendedTime] = useState(3); const [isLoadingExtendingTime, setIsLoadingExtendingTime] = useState(false); const [isLoadingReminding, setIsLoadingReminding] = useState(false); const [internalNote, setInternalNote] = useState(''); const toast = useRef(null); const [formInitialData, setFormInitialData] = useState({}); const emailSendResponse = pathOr([], ['emailSendResponse'], data); const { control, handleSubmit, formState: { errors }, setValue, register, trigger, getValues } = useForm({ defaultValues: useMemo(() => { return formInitialData; }, [formInitialData]), mode: 'onChange' }); const goToEvaluationPage = () => { navigate(`/mie-domande/${id}`); } const getCallback = (data) => { if (data.status === 'SUCCESS') { setData(getFormattedData(data.data)); let formDataInitial = data.data.applicationFormFields.reduce((acc, cur) => { if (cur.fieldValue) { acc[cur.fieldId] = cur.fieldValue; } return acc; }, {}); formDataInitial = { ...formDataInitial, amendmentDocuments: data.data.amendmentDocuments } setFormInitialData(formDataInitial); } storeSet('unsetAsyncRequest'); } const errGetCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } set404FromErrorResponse(data); storeSet('unsetAsyncRequest'); } const getFormattedData = (data) => { data.startDate = is(String, data.startDate) ? new Date(data.startDate) : (data.startDate ? data.startDate : ''); data.expirationDate = is(String, data.expirationDate) ? new Date(data.expirationDate) : (data.expirationDate ? data.expirationDate : ''); return data; }; const renderHeader = () => { return ( ); }; const header = renderHeader(); const updateNewAmendmentData = (value, path) => { const newData = wrap(data).set(path, value).value(); setData(newData); } const onSubmit = () => { }; const doUpdateAmendment = (doClose = false) => { trigger(); let formValues = klona(getValues()); const newFormValues = Object.keys(formValues) .filter(v => v !== 'amendmentDocuments') .reduce((acc, cur) => { let fieldVal = formValues[cur]; fieldVal = isEmpty(fieldVal) ? null : fieldVal; fieldVal = is(Array, fieldVal) ? fieldVal.map(o => o.id).join(',') : null; acc.push({ 'fieldId': cur, 'fieldValue': fieldVal }); return acc; }, []); const newAmendDocs = formValues.amendmentDocuments ? formValues.amendmentDocuments.map(o => o.id).join(',') : ''; const submitData = { applicationFormFields: newFormValues, amendmentDocuments: newAmendDocs, amendmentNotes: data.amendmentNotes } storeSet('setAsyncRequest'); AmendmentsService.updateSoccorso( amendmentId, submitData, (resp) => updateAmendmentCallback(resp, doClose), errUpdateAmendmentCallback ); } const updateAmendmentCallback = (data, doClose = false) => { if (data.status === 'SUCCESS') { setData(getFormattedData(data.data)); if (doClose) { const submitData = { internalNote } storeSet('setAsyncRequest'); AmendmentsService.closeSoccorso(amendmentId, submitData, closeAmendmentCallback, errCloseAmendmentCallback); } else { if (toast.current) { toast.current.show({ severity: 'success', summary: '', detail: data.message }); } let formDataInitial = data.data.applicationFormFields.reduce((acc, cur) => { if (cur.fieldValue) { acc[cur.fieldId] = cur.fieldValue; } return acc; }, formInitialData); formDataInitial = { ...formDataInitial, amendmentDocuments: data.data.amendmentDocuments } setFormInitialData(formDataInitial); } } storeSet('unsetAsyncRequest'); } const errUpdateAmendmentCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } set404FromErrorResponse(data); storeSet('unsetAsyncRequest'); } const openCloseAmendmentDialog = () => { setIsVisibleCloseAmendDialog(true); } const headerCloseAmendDialog = () => { return {__('Chiudi Soccorso Istruttorio', 'gepafin')} } const hideCloseAmendDialog = () => { setIsVisibleCloseAmendDialog(false); } const footerCloseAmendDialog = () => { return
} const doCloseAmendment = () => { doUpdateAmendment(true); } const closeAmendmentCallback = (data) => { if (data.status === 'SUCCESS') { if (toast.current) { toast.current.show({ severity: 'success', summary: '', detail: data.message }); } if (data.data.status) { updateNewAmendmentData(data.data.status, ['status']); setIsVisibleCloseAmendDialog(false); } } storeSet('unsetAsyncRequest'); } const errCloseAmendmentCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } set404FromErrorResponse(data); storeSet('unsetAsyncRequest'); } const headerExtendRespDialog = () => { return {__('Estendi scadenza', 'gepafin')} } const hideExtendRespDialog = () => { setIsVisibleExtendTimeDialog(false); } const footerExtendRespDialog = () => { return
} const openExtendResponseTimeDialog = () => { setIsVisibleExtendTimeDialog(true); setExtendedTime(3); } const doExtendTimeResponse = () => { setIsLoadingExtendingTime(true); AmendmentsService.extendSoccorso(amendmentId, extendedTime, extendCallback, errExtendCallback); } const extendCallback = (data) => { if (data.status === 'SUCCESS') { if (toast.current) { toast.current.show({ severity: 'success', summary: '', detail: data.message }); } setIsVisibleExtendTimeDialog(false); } setIsLoadingExtendingTime(false); } const errExtendCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } set404FromErrorResponse(data); setIsLoadingExtendingTime(false); } const sendReminder = () => { setIsLoadingReminding(true); AmendmentsService.sendReminderForSoccorso(amendmentId, reminderCallback, errReminderCallback) } const reminderCallback = (data) => { if (data.status === 'SUCCESS') { if (toast.current) { toast.current.show({ severity: 'success', summary: '', detail: data.message }); } } setIsLoadingReminding(false); } const errReminderCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } set404FromErrorResponse(data); setIsLoadingReminding(false); } const updateEmailSendResponses = useCallback((newEmailData) => { const newData = wrap(data).set(['emailSendResponse'], newEmailData).value(); setData(newData); }, [data]); useEffect(() => { if (formInitialData) { Object.keys(formInitialData).map(k => setValue(k, formInitialData[k])); trigger(); } }, [formInitialData]); useEffect(() => { const parsedSoccorsoId = parseInt(amendmentId); const soccorsoEntityId = !isNaN(parsedSoccorsoId) ? parsedSoccorsoId : 0; AmendmentsService.getSoccorsoById(getCallback, errGetCallback, [['id', soccorsoEntityId]]); }, [amendmentId]); return (

{__('Soccorso Istruttorio - Dettagli', 'gepafin')}

{__('ID domanda', 'gepafin')} {data.applicationId}

{__('Bando', 'gepafin')} {data.callName}

{__('Referente Aziendale', 'gepafin')} {data.beneficiaryName}

{__('Inizio', 'gepafin')} {getDateFromISOstring(data.startDate)}

{__('Scadenza', 'gepafin')} {getDateFromISOstring(data.expirationDate)}

{__('Stato', 'gepafin')} {getBandoLabel(data.status)}

{__('Dettagli richiesta', 'gepafin')}

{__('Note e spiegazioni', 'gepafin')}

{getEmailTemplateForSoccorso(data.emailTemplate, data.note)}
{data.amendmentInitialDocument && is(Array, data.amendmentInitialDocument) ?

{__('Documenti da PEC', 'gepafin')}

    {data.amendmentInitialDocument.map((o, i) =>
  1. {o.name}
  2. )}
: null} {(data.formFields && !isEmpty(data.formFields)) || (data.amendmentType === 'SPECIAL' && !isNil(data.amendmentDocumentType) && amendmentRequestedDocs[data.amendmentDocumentType]) ?

{__('Documenti richiesti', 'gepafin')}

    {data.formFields && !isEmpty(data.formFields) ? data.formFields.map((o, i) =>
  1. {o.label}
  2. ) : null} {amendmentRequestedDocs[data.amendmentDocumentType].map((v) =>
  3. {v}
  4. )}
: null}

{__('Comunicazioni', 'gepafin')}

{data.formFields && !isEmpty(data.formFields) ?

{__('Documenti Ricevuti', 'gepafin')}

{data.formFields.map((o, i) => { return })}
: null}

{__('Documenti aggiuntivi', 'gepafin')}

{__('Notes', 'gepafin')}

updateNewAmendmentData( e.htmlValue, 'amendmentNotes' )} style={{ height: 80 * 3, width: '100%' }} />
{__('Azioni', 'gepafin')}
setExtendedTime(e.value)}/>
setInternalNote(e.htmlValue)} style={{ height: 80 * 3, width: '100%' }} />
) } export default SoccorsoEditInstructorManager;