import React, { useState, useEffect, useRef, useMemo } from 'react'; import { __, sprintf } from '@wordpress/i18n'; import { useNavigate, useParams } from 'react-router-dom'; import { is, isEmpty } from 'ramda'; import { useForm } from 'react-hook-form'; import { klona } from 'klona'; import { wrap } from 'object-path-immutable'; // store import { storeSet, useStore } from '../../store'; // api import AmendmentsService from '../../service/amendments-service'; import ApplicationService from '../../service/application-service'; // tools import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; import getBandoLabel from '../../helpers/getBandoLabel'; import getDateFromISOstring from '../../helpers/getDateFromISOstring'; // components import { Button } from 'primereact/button'; import BlockingOverlay from '../../components/BlockingOverlay'; import { Toast } from 'primereact/toast'; import { Dialog } from 'primereact/dialog'; import FormField from '../../components/FormField'; import SoccorsoComunications from '../SoccorsoEditPreInstructor/components/SoccorsoComunications'; import { Editor } from 'primereact/editor'; import getEmailTemplateForSoccorso from '../../helpers/getStrippedHtmlBodyTags'; const SoccorsoEditBeneficiario = () => { const isAsyncRequest = useStore().main.isAsyncRequest(); const { id } = useParams(); const navigate = useNavigate(); const [data, setData] = useState({}); const [dataAppl, setDataAppl] = useState({}); const [isVisibleEmailDialog, setIsVisibleEmailDialog] = useState(false); const toast = useRef(null); const [formInitialData, setFormInitialData] = useState({}); const { control, handleSubmit, formState: { errors }, setValue, register, trigger, getValues } = useForm({ defaultValues: useMemo(() => { return formInitialData; }, [formInitialData]), mode: 'onChange' }); const goToArchivePage = () => { navigate(`/domande`); } useEffect(() => { const parsedId = parseInt(id); const entityId = !isNaN(parsedId) ? parsedId : 0; AmendmentsService.getSoccorsoByApplId(entityId, getCallback, errGetCallback, [ ['statuses', 'AWAITING'] ]); }, [id]); const getCallback = (data) => { if (data.status === 'SUCCESS') { if (data.data.length) { const amendmentObj = data.data[0]; setData(getFormattedData(amendmentObj)); let formDataInitial = amendmentObj.applicationFormFields.reduce((acc, cur) => { if (cur.fieldValue) { acc[cur.fieldId] = cur.fieldValue; } return acc; }, {}); formDataInitial = { ...formDataInitial, amendmentDocuments: amendmentObj.amendmentDocuments } setFormInitialData(formDataInitial); storeSet.main.unsetAsyncRequest(); } else { ApplicationService.getApplication(id, getApplCallback, errGetCallback) } } } const errGetCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } set404FromErrorResponse(data); storeSet.main.unsetAsyncRequest(); } const getApplCallback = (data) => { if (data.status === 'SUCCESS') { setDataAppl(getFormattedData(data.data)); } storeSet.main.unsetAsyncRequest(); } const getFormattedData = (data) => { data.evaluationEndDate = is(String, data.evaluationEndDate) ? new Date(data.evaluationEndDate) : (data.evaluationEndDate ? data.evaluationEndDate : ''); 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 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 } const amendmentId = data.id; storeSet.main.setAsyncRequest(); AmendmentsService.updateSoccorso( amendmentId, submitData, (resp) => updateAmendmentCallback(resp, doClose), errUpdateAmendmentCallback ); } const doUpdateAmendmentAndCompleteTask = () => { doUpdateAmendment(true); } const updateAmendmentCallback = (data, doClose = false) => { if (data.status === 'SUCCESS') { setData(getFormattedData(data.data)); if (doClose) { AmendmentsService.updateStatusSoccorso(data.data.id, updateAmendmentCallback, errUpdateAmendmentCallback, [ ['status', 'RESPONSE_RECEIVED'] ]); } 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; }, {}); formDataInitial = { ...formDataInitial, amendmentDocuments: data.data.amendmentDocuments } setFormInitialData(formDataInitial); } } storeSet.main.unsetAsyncRequest(); } const errUpdateAmendmentCallback = (data) => { if (toast.current && data.message) { toast.current.show({ severity: 'error', summary: '', detail: data.message }); } //set404FromErrorResponse(data); storeSet.main.unsetAsyncRequest(); } const updateNewAmendmentData = (value, path) => { const newData = wrap(data).set(path, value).value(); setData(newData); } const renderHeader = () => { return ( ); }; const header = renderHeader(); useEffect(() => { if (formInitialData) { //reset(); Object.keys(formInitialData).map(k => setValue(k, formInitialData[k])); trigger(); } }, [formInitialData]); return (
{data.id ?

{sprintf(__('Soccorso Istruttorio: richiesta integrazione documenti per domanda #%s', 'gepafin'), id)}

: null} {dataAppl.id ?

{sprintf(__('Dettagli: domanda #%s', 'gepafin'), dataAppl.id)}

: null}
{data.id ?

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

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

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

{__('Azienda Beneficiaria', 'gepafin')}

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

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

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

: null} {dataAppl.id ?

{__('ID domanda', 'gepafin')} {dataAppl.id}

{__('Bando', 'gepafin')} {dataAppl.callTitle}

{__('Azienda Beneficiaria', 'gepafin')} {dataAppl.companyName}

{__('Inviato', 'gepafin')} {getDateFromISOstring(dataAppl.submissionDate)}

{__('Protocolo', 'gepafin')} {dataAppl.protocolNumber}

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

: null} {data.id ?

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

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

{getEmailTemplateForSoccorso(data.emailTemplate, data.note)}
: null} {data.id ?

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

: null} {data.id ?

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

{data.formFields ? data.formFields.map((o, i) => { return }) : null}
    {data.formFields ? data.formFields.map((o, i) =>
  1. {o.label}
  2. ) : null}
: null} {data.id ?

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

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

updateNewAmendmentData( e.htmlValue, 'amendmentNotes' )} style={{ height: 80 * 3, width: '100%' }} />
: null} {data.id ?
{__('Attenzione', 'gepafin')} {__('Inviare la documentazione richiesta completa delle integrazioni esclusivamente via PEC. In caso contarrio l’integrazione non può essere ritenuta valida.', 'gepafin')}
: null}
{data.id ?
{ if (!isVisibleEmailDialog) return; setIsVisibleEmailDialog(false); }}>

{data.callEmail}

) } export default SoccorsoEditBeneficiario;