diff --git a/.env b/.env index 9ef0c84..ef5dcea 100644 --- a/.env +++ b/.env @@ -4,4 +4,5 @@ REACT_APP_API_ADDRESS=https://api-dev-gepafin.memento.credit REACT_APP_LOGO_FILENAME=gepafin-logo.svg REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs -REACT_APP_EVALUATION_FLOW_ID=1 \ No newline at end of file +REACT_APP_EVALUATION_FLOW_ID=1 +REACT_APP_LOCAL_DEVELOPMENT=1 \ No newline at end of file diff --git a/package.json b/package.json index 145700c..3331909 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "@date-fns/tz": "1.2.0", "@emailjs/browser": "4.4.1", "@emotion/styled": "11.13.5", - "@number-flow/react": "0.4.1", + "@number-flow/react": "0.4.2", "@sentry/browser": "^8.41.0", "@tanstack/react-table": "^8.20.5", "@wordpress/i18n": "5.13.0", diff --git a/src/assets/scss/components/appPage.scss b/src/assets/scss/components/appPage.scss index 8f40ad9..da0721a 100644 --- a/src/assets/scss/components/appPage.scss +++ b/src/assets/scss/components/appPage.scss @@ -342,6 +342,10 @@ .appPageSection__row { display: flex; gap: 1rem; + + &.autoFlow { + flex-wrap: wrap; + } } .appPageSection__pMeta { diff --git a/src/assets/scss/components/misc.scss b/src/assets/scss/components/misc.scss index ca53588..b809ae8 100644 --- a/src/assets/scss/components/misc.scss +++ b/src/assets/scss/components/misc.scss @@ -12,6 +12,10 @@ .p-button:not(.p-button-outlined, .p-button-secondary, .p-confirm-popup-reject, .p-button-link, .p-column-filter-add-button, .p-column-filter-remove-button) span { color: var(--menuitem-active-color); } +.p-button.p-button-success.p-button-icon-only[disabled], +.p-button.p-button-danger.p-button-icon-only[disabled] { + filter: unset; +} .p-column-filter-remove-button { span { margin: 0 5px; diff --git a/src/components/ErrorBoundary/index.js b/src/components/ErrorBoundary/index.js new file mode 100644 index 0000000..6521776 --- /dev/null +++ b/src/components/ErrorBoundary/index.js @@ -0,0 +1,31 @@ +import React, { Component } from 'react'; +import logMsgWithSentry from '../../helpers/logMsgWithSentry'; + +class ErrorBoundary extends Component { + constructor(props) { + super(props); + + this.state = { + builderError: false + }; + } + + static getDerivedStateFromError(error) { + try { + logMsgWithSentry('', 0, {}, error); + } catch (err) { + console.log(err); + } + return { builderError: true }; + } + + render() { + if (this.state.builderError) { + return
- {__('ID domanda', 'gepafin')} - {data.applicationId} -
-- {__('Bando', 'gepafin')} - {data.callName} -
-- {__('Beneficiario', 'gepafin')} - {data.beneficiaryName} -
-- {__('Inizio', 'gepafin')} - {getDateFromISOstring(data.startDate)} -
-- {__('Scadenza', 'gepafin')} - {getDateFromISOstring(data.expirationDate)} -
-- {__('Stato', 'gepafin')} - {getBandoLabel(data.status)} -
-+ {__('ID domanda', 'gepafin')} + {data.applicationId} +
++ {__('Bando', 'gepafin')} + {data.callName} +
++ {__('Beneficiario', 'gepafin')} + {data.beneficiaryName} +
++ {__('Azienda', 'gepafin')} + +
++ {__('Inizio', 'gepafin')} + {getDateFromISOstring(data.startDate)} +
++ {__('Scadenza', 'gepafin')} + {getDateFromISOstring(data.expirationDate)} +
++ {__('Stato', 'gepafin')} + {getBandoLabel(data.status)} +
+- {__('ID domanda', 'gepafin')} + {__('ID domanda', 'gepafin')} {dataAppl.id}
@@ -289,6 +293,7 @@ const DomandaBeneficiario = () => {
errors={errors}
defaultValue={formInitialData[o.fieldId] ? formInitialData[o.fieldId] : []}
accept={[]}
+ source="AMENDMENT"
sourceId={data.applicationId}
multiple={true}
/>
diff --git a/src/pages/DomandaEditPreInstructor/components/ArchiveDocument/index.js b/src/pages/DomandaEditPreInstructor/components/ArchiveDocument/index.js
index e0124e5..936e2bc 100644
--- a/src/pages/DomandaEditPreInstructor/components/ArchiveDocument/index.js
+++ b/src/pages/DomandaEditPreInstructor/components/ArchiveDocument/index.js
@@ -1,4 +1,4 @@
-import React, { useEffect, useState } from 'react';
+import React, { useEffect, useRef, useState } from 'react';
import { __ } from '@wordpress/i18n';
import { isEmpty } from 'ramda';
import { wrap } from 'object-path-immutable';
@@ -9,24 +9,37 @@ import { Dialog } from 'primereact/dialog';
import { InputTextarea } from 'primereact/inputtextarea';
import { Dropdown } from 'primereact/dropdown';
import { classNames } from 'primereact/utils';
+import { InputSwitch } from 'primereact/inputswitch';
+import { InputText } from 'primereact/inputtext';
-const ArchiveDocument = ({ ndg = '', fileId = 0 }) => {
+import { classificationType, protocolType } from '../../../../configData';
+import AppointmentService from '../../../../service/appointment-service';
+import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse';
+import { storeSet } from '../../../../store';
+import { Toast } from 'primereact/toast';
+
+const ArchiveDocument = ({ applicationId, ndg = '', fileId = 0 }) => {
const [loading, setLoading] = useState(false);
const [isVisibleDialog, setIsVisibleDialog] = useState(false);
const [modalData, setModalData] = useState({});
+ const [types, setTypes] = useState([]);
const [categories, setCategories] = useState([]);
+ const toast = useRef(null);
const openArchivationModal = () => {
setIsVisibleDialog(true);
setModalData({
- description: '',
- categoryId: 0,
+ descrizione: '',
+ idTipoProtocollo: 0,
+ idClassificazione: 0,
+ flagDaFirmare: false,
+ email: '',
fileId
});
}
const headerDialog = () => {
- return {__('Archive document', 'gepafin')};
+ return {__('Archiviazione del documento', 'gepafin')};
}
const hideDialog = () => {
@@ -50,57 +63,141 @@ const ArchiveDocument = ({ ndg = '', fileId = 0 }) => {
}
const submitData = () => {
- console.log('submitData', modalData);
- //setLoading(true);
+ if (
+ modalData.idTipoProtocollo !== 0 && modalData.idClassificazione !== 0
+ && !isEmpty(modalData.descrizione) && !isEmpty(modalData.email)
+ ) {
+ setLoading(true);
+ const submitData = {
+ 'input': {
+ 'idTipoProtocollo': modalData.idTipoProtocollo,
+ 'idClassificazione': modalData.idClassificazione,
+ 'flagDaFirmare': modalData.flagDaFirmare,
+ 'descrizione': modalData.descrizione,
+ 'attributes': {
+ 'ndg': ndg,
+ 'email': modalData.email
+ }
+ }
+ }
+
+ AppointmentService.archiveDocument(applicationId, fileId, submitData, submitCallback, errSubmitCallback)
+ }
+ }
+
+ const submitCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ console.log(data.data);
+ }
+ setLoading(false);
+ }
+
+ const errSubmitCallback = (data) => {
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: 'error',
+ summary: '',
+ detail: data.message
+ });
+ }
+ set404FromErrorResponse(data);
+ setLoading(false);
}
useEffect(() => {
- setCategories([
- {value: 1, label: 'Type 1'},
- {value: 2, label: 'Type 2'},
- ])
+ const newModalData = {
+ ...modalData,
+ idClassificazione: 0
+ };
+ setModalData(newModalData);
+ setCategories(classificationType
+ .filter(o => o.idTipoprotocollo === modalData.idTipoProtocollo)
+ .map(o => ({ value: o.idClassificazione, label: o.name })));
+ }, [modalData.idTipoProtocollo])
+
+ useEffect(() => {
+ setTypes(protocolType.map(o => ({ value: o.id, label: o.name })));
}, []);
- return (
- <>
- {!isEmpty(ndg)
- ?
- : null}
-
- >
+ return (!isEmpty(ndg)
+ ? <>
+
+ {files.map((o, i) =>
+ )
+}
+
+export default ListOfFiles;
diff --git a/src/pages/DomandaEditPreInstructor/index.js b/src/pages/DomandaEditPreInstructor/index.js
index c5ef10f..0995089 100644
--- a/src/pages/DomandaEditPreInstructor/index.js
+++ b/src/pages/DomandaEditPreInstructor/index.js
@@ -32,6 +32,11 @@ import ArchiveDocument from './components/ArchiveDocument';
import { classNames } from 'primereact/utils';
import { InputTextarea } from 'primereact/inputtextarea';
import { InputText } from 'primereact/inputtext';
+import DownloadApplicationArchive from './components/DownloadApplicationArchive';
+import DownloadCompanyDelegation from './components/DownloadCompanyDelegation';
+import DownloadSignedApplication from './components/DownloadSignedApplication';
+import AppointmentService from '../../service/appointment-service';
+import ListOfFiles from './components/ListOfFiles';
const APP_EVALUATION_FLOW_ID = process.env.REACT_APP_EVALUATION_FLOW_ID;
@@ -51,6 +56,9 @@ const DomandaEditPreInstructor = () => {
const [operationType, setOperationType] = useState('');
const [motivation, setMotivation] = useState('');
const [isVisibleAppointmentDialog, setIsVisibleAppointmentDialog] = useState(false);
+ const [allFilesRated, setAllFilesRated] = useState(false);
+ const [atLeastOneChecked, setAtLeastOneChecked] = useState(false);
+ const [allChecksChecked, setAllChecksChecked] = useState(false);
const [appointmentData, setAppointmentData] = useState({
title: '',
text: '',
@@ -62,6 +70,22 @@ const DomandaEditPreInstructor = () => {
navigate('/domande');
}
+ const updateFlagsForSoccorso = (data) => {
+ if (data.files) {
+ const nonRatedFiles = data.files
+ .map(el => el.valid)
+ .filter(v => isNil(v));
+ setAllFilesRated(nonRatedFiles.length === 0);
+ }
+ if (data.checklist) {
+ const checkedChecklistItems = data.checklist
+ .map(el => el.valid)
+ .filter(v => v);
+ setAtLeastOneChecked(checkedChecklistItems.length > 0);
+ setAllChecksChecked(checkedChecklistItems.length === data.checklist.length)
+ }
+ }
+
const doNewSoccorso = () => {
if (connectedSoccorsoId !== 0) {
doSaveDraft(`/domande/${id}/soccorso/${connectedSoccorsoId}`)
@@ -74,6 +98,7 @@ const DomandaEditPreInstructor = () => {
if (data.status === 'SUCCESS') {
setData(getFormattedData(data.data));
setMotivation(data.data.motivation);
+ updateFlagsForSoccorso(data.data);
}
storeSet.main.unsetAsyncRequest();
}
@@ -116,15 +141,16 @@ const DomandaEditPreInstructor = () => {
const header = renderHeader();
- const updateEvaluationValue = (value, path, maxValue) => {
+ const updateEvaluationValue = (value, path, maxValue = null) => {
let finalValue = value;
if (maxValue || maxValue === 0) {
finalValue = value > maxValue ? maxValue : value;
}
- const newData = wrap(data).set(path.split('.'), finalValue).value();
+ const newData = wrap(data).set(path, finalValue).value();
setData(newData);
+ updateFlagsForSoccorso(newData);
}
const doSaveDraft = (doRedirect = '') => {
@@ -134,6 +160,7 @@ const DomandaEditPreInstructor = () => {
files: klona(data.files),
note: data.note
}
+
ApplicationEvaluationService.updateEvaluation(
data.assignedApplicationId,
formData,
@@ -241,9 +268,11 @@ const DomandaEditPreInstructor = () => {
switch (item.fieldName) {
case 'fileupload' :
content =
+ {o.fileDetail.map((k) =>
+ : null}
+
- {item.fieldValue.map(o =>
;
break;
case 'table' :
@@ -255,9 +284,11 @@ const DomandaEditPreInstructor = () => {
- {item.fieldValue.map((o, i) =>
- {Object.values(o).map(v => )}
+ {item.fieldValue
+ ? item.fieldValue.map((o, i) => {v} )}
-
+ {Object.values(o).map(v => )
+ : null}
;
break;
@@ -336,7 +367,30 @@ const DomandaEditPreInstructor = () => {
}
const doCheckNDG = () => {
- // TODO
+ storeSet.main.setAsyncRequest();
+ doSaveDraft();
+ setTimeout(() => {
+ AppointmentService.getNdg(id, getNdgCallback, errGetNdgCallback);
+ }, 100);
+ }
+
+ const getNdgCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ console.log('data', data.data);
+ }
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const errGetNdgCallback = (data) => {
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: 'error',
+ summary: '',
+ detail: data.message
+ });
+ }
+ set404FromErrorResponse(data);
+ storeSet.main.unsetAsyncRequest();
}
const doCreateAppointment = () => {
@@ -376,7 +430,7 @@ const DomandaEditPreInstructor = () => {
const doCreateAppointmentRequest = () => {
if (
!isEmpty(appointmentData.title) && !isEmpty(appointmentData.text) && !isEmpty(appointmentData.amount)
- && !isEmpty(appointmentData.duration) && appointmentData.duration !== 0 && appointmentData.amount !== 0
+ && !isEmpty(appointmentData.duration) && appointmentData.duration !== 0 && appointmentData.amount !== 0
) {
console.log(appointmentData);
//setLoading(true);
@@ -436,6 +490,18 @@ const DomandaEditPreInstructor = () => {
{__('ID domanda', 'gepafin')}
{data.applicationId}
{v} )}
+
+ {__('Protocollo', 'gepafin')} + {data.protocolNumber} +
++ {__('NDG', 'gepafin')} + {data.ndg} +
++ {__('Appuntamento', 'gepafin')} + {data.appointmentId} +
{__('Bando', 'gepafin')} {data.callName} @@ -444,13 +510,21 @@ const DomandaEditPreInstructor = () => { {__('Beneficiario', 'gepafin')} {data.beneficiary}
++ {__('Azienda', 'gepafin')} + {data.companyName} +
{__('Data ricezione', 'gepafin')} {getDateFromISOstring(data.submissionDate)}
++ {__('Data assegnazione', 'gepafin')} + {getDateFromISOstring(data.assignedAt)} +
{__('Scadenza Valutazione', 'gepafin')} - {getDateFromISOstring(data.callEndDate)} + {getDateFromISOstring(data.evaluationEndDate)}
{__('Stato', 'gepafin')} @@ -458,7 +532,64 @@ const DomandaEditPreInstructor = () => {