Merge branch 'develop' into feature/documents-page

This commit is contained in:
Vitalii Kiiko
2025-02-21 16:34:11 +01:00
14 changed files with 139 additions and 55 deletions

View File

@@ -203,7 +203,14 @@ const NotificationsSidebar = () => {
} }
const connectWebSocket = () => { const connectWebSocket = () => {
socket.current = new SockJS(socketUrl); socket.current = new SockJS(socketUrl, null, {
transports: [
'websocket',
'xhr-streaming',
'xhr-polling'
]
}
);
stomp.current = Stomp.over(socket.current); stomp.current = Stomp.over(socket.current);
stomp.current.configure({ stomp.current.configure({

View File

@@ -95,6 +95,8 @@ const TopBarProfileMenu = ({ menuLeftRef }) => {
detail: __('L\'azienda è stata cambiata') detail: __('L\'azienda è stata cambiata')
}); });
} }
navigate('/')
} }
} }

View File

@@ -100,11 +100,7 @@ const BandoApplication = () => {
const formValues = watch(); const formValues = watch();
const onValidate = () => { const onValidate = () => {
const applId = getApplicationId(); saveDraft('VALIDATE');
storeSet.main.setAsyncRequest();
formMsgs.current.clear();
ApplicationService.validateApplication(applId, {}, validateApplicationCallback, errValidateApplicationCallback);
}; };
const onSubmit = () => { const onSubmit = () => {
@@ -263,13 +259,24 @@ const BandoApplication = () => {
}); });
} }
if (!isEmpty(saveAndMove) && is(String, saveAndMove)) { if (!isEmpty(saveAndMove) && is(String, saveAndMove)) {
storeSet.main.setAsyncRequest(); if (['NEXT','PREVIOUS'].includes(saveAndMove)) {
ApplicationService.getApplicationForm(data.data.id, getApplFormCallback, errGetApplFormCallbacks, [ storeSet.main.setAsyncRequest();
['formId', formId], ApplicationService.getApplicationForm(data.data.id, getApplFormCallback, errGetApplFormCallbacks, [
['action', saveAndMove] ['formId', formId],
]); ['companyId', chosenCompanyId],
['action', saveAndMove]
]);
} else if (['VALIDATE'].includes(saveAndMove)) {
const applId = getApplicationId();
storeSet.main.setAsyncRequest();
formMsgs.current.clear();
ApplicationService.validateApplication(applId, {}, validateApplicationCallback, errValidateApplicationCallback);
}
} else { } else {
ApplicationService.getApplicationForm(data.data.id, getStatusCheckCallback, errGetStatusCheckCallbacks); ApplicationService.getApplicationForm(data.data.id, getStatusCheckCallback, errGetStatusCheckCallbacks, [
['companyId', chosenCompanyId]
]);
} }
} }
} }
@@ -576,7 +583,9 @@ const BandoApplication = () => {
if (applId) { if (applId) {
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks); ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks, [
['companyId', chosenCompanyId]
]);
} }
} }
@@ -608,7 +617,9 @@ const BandoApplication = () => {
if (applId) { if (applId) {
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
setIsRequestForApplData(true); setIsRequestForApplData(true);
ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks); ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks, [
['companyId', chosenCompanyId]
]);
} }
}, [id, chosenCompanyId]); }, [id, chosenCompanyId]);

View File

@@ -50,6 +50,8 @@ const BandoApplicationPreview = () => {
const [totalSteps, setTotalSteps] = useState(0); const [totalSteps, setTotalSteps] = useState(0);
const [applicationStatus, setApplicationStatus] = useState(''); const [applicationStatus, setApplicationStatus] = useState('');
const [activeStep, setActiveStep] = useState(1); const [activeStep, setActiveStep] = useState(1);
const chosenCompanyId = useStore().main.chosenCompanyId();
const role = useStore().main.getRole();
const isAsyncRequest = useStore().main.isAsyncRequest(); const isAsyncRequest = useStore().main.isAsyncRequest();
const toast = useRef(null); const toast = useRef(null);
const formMsgs = useRef(null); const formMsgs = useRef(null);
@@ -130,18 +132,34 @@ const BandoApplicationPreview = () => {
const goBackward = () => { const goBackward = () => {
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
ApplicationService.getApplicationForm(id, getApplFormCallback, errGetApplFormCallbacks, [ const queryParams = 'ROLE_BENEFICIARY' === role
['formId', formId], ? [
['action', 'PREVIOUS'] ['formId', formId],
]); ['companyId', chosenCompanyId],
['action', 'PREVIOUS']
]
: [
['formId', formId],
['action', 'PREVIOUS']
];
ApplicationService.getApplicationForm(id, getApplFormCallback, errGetApplFormCallbacks, queryParams);
} }
const goForward = () => { const goForward = () => {
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
ApplicationService.getApplicationForm(id, getApplFormCallback, errGetApplFormCallbacks, [ const queryParams = 'ROLE_BENEFICIARY' === role
['formId', formId], ? [
['action', 'NEXT'] ['formId', formId],
]); ['companyId', chosenCompanyId],
['action', 'NEXT']
]
: [
['formId', formId],
['action', 'NEXT']
];
ApplicationService.getApplicationForm(id, getApplFormCallback, errGetApplFormCallbacks, queryParams);
} }
const getApplFormCallback = (data) => { const getApplFormCallback = (data) => {
@@ -310,7 +328,12 @@ const BandoApplicationPreview = () => {
if (applId) { if (applId) {
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks); const queryParams = 'ROLE_BENEFICIARY' === role
? [
['companyId', chosenCompanyId]
]
: [];
ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks, queryParams);
} }
}, [id]); }, [id]);

View File

@@ -201,7 +201,7 @@ const BandoEditFormStep1 = forwardRef(function ({ initialData, setInitialData, g
![ ![
'descriptionShort', 'descriptionLong', 'documentationRequested', 'threshold', 'descriptionShort', 'descriptionLong', 'documentationRequested', 'threshold',
'aimedTo', 'criteria', 'docs', 'checklist', 'faq', 'amount', 'amountMin', 'amountMax', 'aimedTo', 'criteria', 'docs', 'checklist', 'faq', 'amount', 'amountMin', 'amountMax',
'email', 'phoneNumber', 'checkList', 'images', 'numberOfCheck', 'productId' 'email', 'phoneNumber', 'checkList', 'images', 'numberOfCheck', 'appointmentTemplateId'
].includes(fieldName) ].includes(fieldName)
} }
@@ -497,12 +497,12 @@ const BandoEditFormStep1 = forwardRef(function ({ initialData, setInitialData, g
{APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE' {APP_HUB_ID !== 't7jh5wfg9QXylNaTZkPoE'
? <FormField ? <FormField
type="numberinput" type="numberinput"
disabled={shouldDisableField('productId')} disabled={shouldDisableField('appointmentTemplateId')}
fieldName="productId" fieldName="appointmentTemplateId"
label={__('Prodotto ID dentro Odessa', 'gepafin')} label={__('Template ID dentro Odessa', 'gepafin')}
control={control} control={control}
errors={errors} errors={errors}
defaultValue={values['productId']} defaultValue={values['appointmentTemplateId']}
config={{ config={{
required: __('È obbligatorio', 'gepafin'), required: __('È obbligatorio', 'gepafin'),
}} }}

View File

@@ -9,7 +9,9 @@ const BuilderElementProperLabel = ({ id, defaultLabel }) => {
const elements = useStore().main.formElements(); const elements = useStore().main.formElements();
const element = head(elements.filter(o => o.id === id)); const element = head(elements.filter(o => o.id === id));
const [label, setLabel] = useState(''); const [label, setLabel] = useState('');
const isRequired = pathOr(false, ['validators', 'isRequired'], element) const isRequired = pathOr(false, ['validators', 'isRequired'], element);
const customValidation = pathOr(false, ['validators', 'custom'], element);
let maybeNonEmptyTables = customValidation === 'nonEmptyTables';
useEffect(() => { useEffect(() => {
const label = head(element.settings.filter(o => o.name === 'label')); const label = head(element.settings.filter(o => o.name === 'label'));
@@ -26,7 +28,7 @@ const BuilderElementProperLabel = ({ id, defaultLabel }) => {
return <div className="label"> return <div className="label">
{renderHtmlContent(label)} {renderHtmlContent(label)}
{isRequired ? <span className="appForm__field--required">*</span> : null} {isRequired || maybeNonEmptyTables ? <span className="appForm__field--required">*</span> : null}
</div> </div>
} }

View File

@@ -340,8 +340,6 @@ const BandoViewBeneficiario = () => {
} }
}, [data]); }, [data]);
console.log('applicationObj', applicationObj)
return ( return (
<div className="appPage"> <div className="appPage">
{!isAsyncRequest && !isEmpty(data) {!isAsyncRequest && !isEmpty(data)

View File

@@ -102,7 +102,8 @@ const InstructorManagerMieDomandeTable = ({ userId = null, statuses = [] }) => {
evaluationEndDate: { evaluationEndDate: {
operator: FilterOperator.AND, operator: FilterOperator.AND,
constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }] constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }]
} },
status: { operator: FilterOperator.OR, constraints: [{ value: null, matchMode: FilterMatchMode.EQUALS }] }
}); });
}; };

View File

@@ -102,7 +102,8 @@ const PreInstructorDomandeTable = ({ userId = null, statuses = [] }) => {
evaluationEndDate: { evaluationEndDate: {
operator: FilterOperator.AND, operator: FilterOperator.AND,
constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }] constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }]
} },
status: { operator: FilterOperator.OR, constraints: [{ value: null, matchMode: FilterMatchMode.EQUALS }] }
}); });
}; };

View File

@@ -157,8 +157,8 @@ const DomandaEditInstructorManager = () => {
if (formFieldsChecklist.length >= minChecks) { if (formFieldsChecklist.length >= minChecks) {
const valuesTotal = formFieldsChecklist.map(v => formValues[v]); const valuesTotal = formFieldsChecklist.map(v => formValues[v]);
const valuesFirst = valuesTotal.toSpliced(minChecks); const valuesFirst = valuesTotal.toSpliced(minChecks);
setAtLeastOneChecked(valuesTotal.filter(v => v === true).length === valuesTotal.length); setAtLeastOneChecked(valuesFirst.filter(v => Boolean(v) === true).length === valuesFirst.length);
setAllChecksChecked(valuesFirst.filter(v => v === true).length === valuesFirst.length) setAllChecksChecked(valuesTotal.filter(v => Boolean(v) === true).length === valuesTotal.length);
} }
} }
}, [formValues]); }, [formValues]);
@@ -695,11 +695,11 @@ const DomandaEditInstructorManager = () => {
} }
} }
AppointmentService.createAppointment(id, submitData, getAppointemntCallback, errGetAppointemntCallback); AppointmentService.createAppointment(id, submitData, getAppointmentCallback, errGetAppointemntCallback);
} }
} }
const getAppointemntCallback = (data) => { const getAppointmentCallback = (data) => {
if (data.status === 'SUCCESS') { if (data.status === 'SUCCESS') {
if (toast.current && data.message) { if (toast.current && data.message) {
toast.current.show({ toast.current.show({
@@ -708,6 +708,12 @@ const DomandaEditInstructorManager = () => {
detail: data.message detail: data.message
}); });
} }
if (data.data.appointmentId) {
setData({
...data,
appointmentId: data.data.appointmentId
});
}
} }
setIsVisibleAppointmentDialog(false); setIsVisibleAppointmentDialog(false);
storeSet.main.unsetAsyncRequest(); storeSet.main.unsetAsyncRequest();
@@ -939,7 +945,7 @@ const DomandaEditInstructorManager = () => {
['evaluationDocument'] ['evaluationDocument']
)} )}
shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)} shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)}
sourceId={data.assignedApplicationId} sourceId={data.id}
sourceName="evaluation"/> sourceName="evaluation"/>
</div> </div>

View File

@@ -72,6 +72,7 @@ const DomandaEditPreInstructor = () => {
const [isVisibleCompleteDialog, setIsVisibleCompleteDialog] = useState(false); const [isVisibleCompleteDialog, setIsVisibleCompleteDialog] = useState(false);
const [operationType, setOperationType] = useState(''); const [operationType, setOperationType] = useState('');
const [motivation, setMotivation] = useState(''); const [motivation, setMotivation] = useState('');
const [amountAccepted, setAmountAccepted] = useState(0);
const [isVisibleAppointmentDialog, setIsVisibleAppointmentDialog] = useState(false); const [isVisibleAppointmentDialog, setIsVisibleAppointmentDialog] = useState(false);
const [allFilesRated, setAllFilesRated] = useState(false); const [allFilesRated, setAllFilesRated] = useState(false);
const [atLeastOneChecked, setAtLeastOneChecked] = useState(false); const [atLeastOneChecked, setAtLeastOneChecked] = useState(false);
@@ -157,8 +158,8 @@ const DomandaEditPreInstructor = () => {
if (formFieldsChecklist.length >= minChecks) { if (formFieldsChecklist.length >= minChecks) {
const valuesTotal = formFieldsChecklist.map(v => formValues[v]); const valuesTotal = formFieldsChecklist.map(v => formValues[v]);
const valuesFirst = valuesTotal.toSpliced(minChecks); const valuesFirst = valuesTotal.toSpliced(minChecks);
setAtLeastOneChecked(valuesTotal.filter(v => v === true).length === valuesTotal.length); setAtLeastOneChecked(valuesFirst.filter(v => Boolean(v) === true).length === valuesFirst.length);
setAllChecksChecked(valuesFirst.filter(v => v === true).length === valuesFirst.length) setAllChecksChecked(valuesTotal.filter(v => Boolean(v) === true).length === valuesTotal.length);
} }
} }
}, [formValues]); }, [formValues]);
@@ -388,7 +389,8 @@ const DomandaEditPreInstructor = () => {
checklist: klona(data.checklist), checklist: klona(data.checklist),
files: klona(data.files), files: klona(data.files),
note: data.note, note: data.note,
motivation motivation,
amountAccepted
} }
setLoading(true); setLoading(true);
@@ -695,11 +697,11 @@ const DomandaEditPreInstructor = () => {
} }
} }
AppointmentService.createAppointment(id, submitData, getAppointemntCallback, errGetAppointemntCallback); AppointmentService.createAppointment(id, submitData, getAppointmentCallback, errGetAppointemntCallback);
} }
} }
const getAppointemntCallback = (data) => { const getAppointmentCallback = (data) => {
if (data.status === 'SUCCESS') { if (data.status === 'SUCCESS') {
if (toast.current && data.message) { if (toast.current && data.message) {
toast.current.show({ toast.current.show({
@@ -708,6 +710,12 @@ const DomandaEditPreInstructor = () => {
detail: data.message detail: data.message
}); });
} }
if (data.data.appointmentId) {
setData({
...data,
appointmentId: data.data.appointmentId
});
}
} }
setIsVisibleAppointmentDialog(false); setIsVisibleAppointmentDialog(false);
storeSet.main.unsetAsyncRequest(); storeSet.main.unsetAsyncRequest();
@@ -810,7 +818,7 @@ const DomandaEditPreInstructor = () => {
? <Button ? <Button
type="button" type="button"
disabled={!isAdmissible disabled={!isAdmissible
|| ['APPROVED'].includes(data.applicationStatus) || ['APPROVED','REJECTED'].includes(data.applicationStatus)
|| evaluationBlockedForUser(data) || evaluationBlockedForUser(data)
|| (APP_EVALUATION_FLOW_ID === '1' && !['ADMISSIBLE'].includes(data.applicationStatus)) || (APP_EVALUATION_FLOW_ID === '1' && !['ADMISSIBLE'].includes(data.applicationStatus))
} }
@@ -820,9 +828,11 @@ const DomandaEditPreInstructor = () => {
{data.id {data.id
? <Button ? <Button
type="button" type="button"
disabled={APP_EVALUATION_FLOW_ID === '1' disabled={['APPROVED','REJECTED'].includes(data.applicationStatus)
|| APP_EVALUATION_FLOW_ID === '1'
&& (!['EVALUATION', 'ADMISSIBLE', 'APPOINTMENT'].includes(data.applicationStatus) && (!['EVALUATION', 'ADMISSIBLE', 'APPOINTMENT'].includes(data.applicationStatus)
|| evaluationBlockedForUser(data))} || evaluationBlockedForUser(data))
}
onClick={initiateRejecting} onClick={initiateRejecting}
label={__('Respingi domanda', 'gepafin')} label={__('Respingi domanda', 'gepafin')}
icon="pi pi-times" iconPos="right"/> : null} icon="pi pi-times" iconPos="right"/> : null}
@@ -940,7 +950,7 @@ const DomandaEditPreInstructor = () => {
['evaluationDocument'] ['evaluationDocument']
)} )}
shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)} shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)}
sourceId={data.assignedApplicationId} sourceId={data.id}
sourceName="evaluation"/> sourceName="evaluation"/>
</div> </div>
@@ -1206,6 +1216,17 @@ const DomandaEditPreInstructor = () => {
footer={footerCompleteDialog} footer={footerCompleteDialog}
style={{ maxWidth: '600px', width: '100%' }} style={{ maxWidth: '600px', width: '100%' }}
onHide={hideCompleteDialog}> onHide={hideCompleteDialog}>
<div className="appForm__field">
<label
className={classNames({ 'p-error': isEmpty(amountAccepted) || amountAccepted === 0 })}>
{__('Importo approvato', 'gepafin')}
</label>
<InputNumber
value={amountAccepted}
keyfilter="int"
invalid={isEmpty(amountAccepted) || amountAccepted === 0}
onChange={(e) => setAmountAccepted(e.value)}/>
</div>
<div className="appForm__field"> <div className="appForm__field">
<label>{__('Motivazione', 'gepafin')}</label> <label>{__('Motivazione', 'gepafin')}</label>
<Editor <Editor

View File

@@ -177,8 +177,10 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
filter sortable filter sortable
filterPlaceholder={__('Cerca il nome', 'gepafin')} filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '8rem' }}/> style={{ minWidth: '8rem' }}/>
<Column field="status" header={__('Stato', 'gepafin')} <Column field="status"
style={{ minWidth: '8rem' }} body={statusBodyTemplate} header={__('Stato', 'gepafin')}
style={{ minWidth: '8rem' }}
body={statusBodyTemplate}
filter filter
filterElement={statusFilterTemplate}/> filterElement={statusFilterTemplate}/>
<Column header={__('Azioni', 'gepafin')} <Column header={__('Azioni', 'gepafin')}

View File

@@ -156,6 +156,13 @@ const Login = () => {
<span>{__('Entra con SPID / CIE', 'gepafin')}</span> <span>{__('Entra con SPID / CIE', 'gepafin')}</span>
</button> </button>
{/*<div className="appPage__spacer"></div>
<div className="appPageSection__message warning">
<i className="pi pi-exclamation-triangle"></i>
<span>{__('Gentili clienti abbiamo riscontrato dei problemi di autenticazione allo Spid per alcuni provider, in caso di impossibilità di accesso si prega di provare ad accedere con la carta di identità elettronica. Stiamo cercando di risolvere al più presto tutti i problemi.', 'gepafin')}</span>
</div>*/}
<div className="appPage__spacer"></div> <div className="appPage__spacer"></div>
<p><a href={origin} onClick={openCacheFaq}>{__('Hai problemi di accesso con SPID?', 'gepafin')}</a></p> <p><a href={origin} onClick={openCacheFaq}>{__('Hai problemi di accesso con SPID?', 'gepafin')}</a></p>

View File

@@ -94,8 +94,8 @@ const PreInstructorSoccorsiTable = ({ userId = null }) => {
evaluationEndDate: { evaluationEndDate: {
operator: FilterOperator.AND, operator: FilterOperator.AND,
constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }] constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }]
} },
}); status: { operator: FilterOperator.OR, constraints: [{ value: null, matchMode: FilterMatchMode.EQUALS }] }, });
}; };
const renderHeader = () => { const renderHeader = () => {
@@ -165,8 +165,11 @@ const PreInstructorSoccorsiTable = ({ userId = null }) => {
filterField="evaluationEndDate" dataType="date" filterField="evaluationEndDate" dataType="date"
style={{ minWidth: '8rem' }} style={{ minWidth: '8rem' }}
body={dateExpirationBodyTemplate} filter filterElement={dateFilterTemplate}/> body={dateExpirationBodyTemplate} filter filterElement={dateFilterTemplate}/>
<Column field="status" header={__('Stato', 'gepafin')} <Column field="status"
style={{ minWidth: '7rem' }} body={statusBodyTemplate} filter header={__('Stato', 'gepafin')}
style={{ minWidth: '7rem' }}
body={statusBodyTemplate}
filter
filterElement={statusFilterTemplate} /> filterElement={statusFilterTemplate} />
<Column header={__('Azioni', 'gepafin')} <Column header={__('Azioni', 'gepafin')}
body={actionsBodyTemplate}/> body={actionsBodyTemplate}/>