+ {!isEmpty(data.amendmentDetails)
+ ?
{__('Punteggi di valutazione', 'gepafin')}
{data.criteria
@@ -608,7 +698,7 @@ const DomandaEditPreInstructor = () => {
{
onClick={() => displayCriterionData(o.id)}
aria-label={__('Mostra', 'gepafin')}/> : null}
@@ -840,4 +962,4 @@ const DomandaEditPreInstructor = () => {
}
-export default DomandaEditPreInstructor;
\ No newline at end of file
+export default DomandaEditPreInstructor;
diff --git a/src/pages/Domande/components/AllDomandeTable/index.js b/src/pages/Domande/components/AllDomandeTable/index.js
index f4696c1..6159a66 100644
--- a/src/pages/Domande/components/AllDomandeTable/index.js
+++ b/src/pages/Domande/components/AllDomandeTable/index.js
@@ -1,11 +1,18 @@
import React, { useState, useEffect } from 'react';
import { __ } from '@wordpress/i18n';
import { is, uniq } from 'ramda';
-import { Link } from 'react-router-dom';
+import { Link, useLocation } from 'react-router-dom';
// api
import ApplicationService from '../../../../service/application-service';
+// tools
+import getBandoLabel from '../../../../helpers/getBandoLabel';
+import getBandoSeverity from '../../../../helpers/getBandoSeverity';
+
+// translation
+import translationStrings from '../../../../translationStringsForComponents';
+
// components
import { FilterMatchMode, FilterOperator } from 'primereact/api';
import { DataTable } from 'primereact/datatable';
@@ -13,14 +20,16 @@ import { Column } from 'primereact/column';
import { Button } from 'primereact/button';
import { Calendar } from 'primereact/calendar';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
-import translationStrings from '../../../../translationStringsForComponents';
+import { Dropdown } from 'primereact/dropdown';
+import { Tag } from 'primereact/tag';
const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
const [items, setItems] = useState(null);
const [filters, setFilters] = useState(null);
const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
- const [, setStatuses] = useState([]);
+ const [statuses, setStatuses] = useState([]);
+ const location = useLocation();
useEffect(() => {
setLocalAsyncRequest(true);
@@ -81,7 +90,8 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
callEndDate: {
operator: FilterOperator.AND,
constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }]
- }
+ },
+ status: { operator: FilterOperator.OR, constraints: [{ value: null, matchMode: FilterMatchMode.EQUALS }] },
});
};
@@ -98,9 +108,12 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
return formatDate(rowData.submissionDate);
};
- /*const dateEndBodyTemplate = (rowData) => {
- return formatDate(rowData.callEndDate);
- };*/
+ const statusFilterTemplate = (options) => {
+ return options.filterCallback(e.value, options.index)}
+ itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"
+ showClear/>;
+ };
const dateFilterTemplate = (options) => {
return options.filterCallback(e.value, options.index)}
@@ -111,17 +124,22 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
return ;
};
+ const statusItemTemplate = (option) => {
+ return ;
+ };
+
const actionsBodyTemplate = (rowData) => {
return
- {openDialogFn
+ {openDialogFn && ['SUBMIT', 'EVALUATION', 'SOCCORSO'].includes(rowData.status)
? openDialogFn(rowData.id)}
label={__('Assegnare', 'gepafin')}
icon="pi pi-pencil" size="small" iconPos="right"/>
- :
-
- }
-
+ : location.pathname !== '/domande'
+ ?
+
+ : null}
+
@@ -147,7 +165,7 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
filter sortable
filterPlaceholder={__('Cerca', 'gepafin')}
style={{ minWidth: '10rem' }}/>
-
@@ -155,12 +173,14 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
filterField="submissionDate" dataType="date"
style={{ minWidth: '8rem' }}
body={dateAppliedBodyTemplate} filter filterElement={dateFilterTemplate}/>
- {/**/}
+
+ style={{ minWidth: '8rem' }} body={statusBodyTemplate}
+ filter
+ filterElement={statusFilterTemplate}/>
@@ -168,4 +188,4 @@ const AllDomandeTable = ({ openDialogFn, updaterString = '' }) => {
)
}
-export default AllDomandeTable;
\ No newline at end of file
+export default AllDomandeTable;
diff --git a/src/pages/Domande/index.js b/src/pages/Domande/index.js
index 6cd2bcc..0512a71 100644
--- a/src/pages/Domande/index.js
+++ b/src/pages/Domande/index.js
@@ -24,7 +24,7 @@ import DraftApplicationsTable from '../Dashboard/components/DraftApplicationsTab
const Domande = () => {
const [loading, setLoading] = useState(false);
const [isVisibleEditDialog, setIsVisibleEditDialog] = useState(false);
- const [roleId, setRoleId] = useState(0);
+ const [roleIds, setRoleIds] = useState([]);
const [users, setUsers] = useState([]);
const [chosenUser, setChosenUser] = useState(0);
const [chosenApplication, setChosenApplication] = useState(0);
@@ -34,10 +34,8 @@ const Domande = () => {
const getRolesCallback = (data) => {
if (data.status === 'SUCCESS') {
const roles = data.data
- .filter(o => ['ROLE_PRE_INSTRUCTOR'].includes(o.roleType));
- if (roles.length) {
- setRoleId(roles[0].id);
- }
+ .filter(o => ['ROLE_PRE_INSTRUCTOR', 'ROLE_INSTRUCTOR_MANAGER'].includes(o.roleType));
+ setRoleIds(roles.map(o => o.id));
}
setLoading(false);
}
@@ -65,7 +63,7 @@ const Domande = () => {
}
const headerEditDialog = () => {
- return {__('Assign application', 'gepafin')}
+ return {__('Assegni la domanda', 'gepafin')}
}
const hideEditDialog = () => {
@@ -126,11 +124,11 @@ const Domande = () => {
}
useEffect(() => {
- if (roleId !== 0) {
+ if (roleIds.length > 0) {
setLoading(true);
- UserService.getUsers(getUsersCallback, errGetUsersCallback, [['roleId', roleId]])
+ UserService.getUsers(getUsersCallback, errGetUsersCallback, [['roleIds', roleIds]])
}
- }, [roleId]);
+ }, [roleIds]);
useEffect(() => {
if (isVisibleEditDialog) {
diff --git a/src/pages/DomandeBeneficiario/components/BeneficiarioDomandeTable/index.js b/src/pages/DomandeBeneficiario/components/BeneficiarioDomandeTable/index.js
index 4b405db..a0eed2c 100644
--- a/src/pages/DomandeBeneficiario/components/BeneficiarioDomandeTable/index.js
+++ b/src/pages/DomandeBeneficiario/components/BeneficiarioDomandeTable/index.js
@@ -33,7 +33,7 @@ const BeneficiarioDomandeTable = () => {
const [statuses, setStatuses] = useState([]);
useEffect(() => {
- if (!isEmpty(chosenCompanyId) && chosenCompanyId !== 0) {
+ if (!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && !localAsyncRequest) {
setLocalAsyncRequest(true);
ApplicationService.getApplications(getApplCallback, errGetApplCallback, [
['companyId', chosenCompanyId],
@@ -126,7 +126,8 @@ const BeneficiarioDomandeTable = () => {
const statusFilterTemplate = (options) => {
return options.filterCallback(e.value, options.index)}
- itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"
+ itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel}
+ className="p-column-filter"
showClear/>;
};
@@ -139,11 +140,17 @@ const BeneficiarioDomandeTable = () => {
};
const actionsBodyTemplate = (rowData) => {
- return rowData.status === 'SOCCORSO'
- ?
-
+ {rowData.status === 'SOCCORSO'
+ ?
+
+ : null}
+
+
- : null;
+
+ >
}
const header = renderHeader();
@@ -165,7 +172,7 @@ const BeneficiarioDomandeTable = () => {
filter sortable
filterPlaceholder={__('Cerca il nome', 'gepafin')}
style={{ minWidth: '8rem' }}/>
-
@@ -184,4 +191,4 @@ const BeneficiarioDomandeTable = () => {
)
}
-export default BeneficiarioDomandeTable;
\ No newline at end of file
+export default BeneficiarioDomandeTable;
diff --git a/src/pages/DomandeBeneficiario/index.js b/src/pages/DomandeBeneficiario/index.js
index 06b202f..f820b21 100644
--- a/src/pages/DomandeBeneficiario/index.js
+++ b/src/pages/DomandeBeneficiario/index.js
@@ -1,14 +1,23 @@
import React from 'react';
import { __ } from '@wordpress/i18n';
+import { head } from 'ramda';
+
+// store
+import { useStore } from '../../store';
// components
import BeneficiarioDomandeTable from './components/BeneficiarioDomandeTable';
const DomandePreInstructor = () => {
+ const chosenCompanyId = useStore().main.chosenCompanyId();
+ const companies = useStore().main.companies();
+ const company = head(companies.filter(o => o.id === chosenCompanyId));
+
return(
{__('Archivio domande', 'gepafin')}
+ {company ? {company.companyName} : null}
diff --git a/src/pages/DomandeInstructorManager/index.js b/src/pages/DomandeInstructorManager/index.js
new file mode 100644
index 0000000..b593398
--- /dev/null
+++ b/src/pages/DomandeInstructorManager/index.js
@@ -0,0 +1,184 @@
+import React, { useEffect, useRef, useState } from 'react';
+import { __ } from '@wordpress/i18n';
+import { isEmpty } from 'ramda';
+
+// store
+import { storeSet } from '../../store';
+
+// tools
+import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
+import uniqid from '../../helpers/uniqid';
+
+// api
+import AssignedApplicationService from '../../service/assigned-application-service';
+import UserService from '../../service/user-service';
+
+// components
+import PreInstructorDomandeTable from '../DashboardPreInstructor/components/PreInstructorDomandeTable';
+import AllDomandeTable from '../Domande/components/AllDomandeTable';
+import { classNames } from 'primereact/utils';
+import { Dropdown } from 'primereact/dropdown';
+import { Dialog } from 'primereact/dialog';
+import { Button } from 'primereact/button';
+
+const DomandeInstructorManager = () => {
+ const [loading, setLoading] = useState(false);
+ const [isVisibleEditDialog, setIsVisibleEditDialog] = useState(false);
+ const [roleIds, setRoleIds] = useState(0);
+ const [users, setUsers] = useState([]);
+ const [chosenUser, setChosenUser] = useState(0);
+ const [chosenApplication, setChosenApplication] = useState(0);
+ const [updaterString, setUpdaterString] = useState('');
+ const toast = useRef(null);
+
+ const getRolesCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ const roles = data.data
+ .filter(o => ['ROLE_PRE_INSTRUCTOR', 'ROLE_INSTRUCTOR_MANAGER'].includes(o.roleType));
+ setRoleIds(roles.map(o => o.id));
+ }
+ setLoading(false);
+ }
+
+ const errGetRolesCallback = (data) => {
+ set404FromErrorResponse(data);
+ setLoading(false);
+ }
+
+ const getUsersCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ const users = data.data
+ .map(o => ({
+ name: `${o.firstName} ${o.lastName} (${o.email})`,
+ value: o.id
+ }));
+ setUsers(users);
+ }
+ setLoading(false);
+ }
+
+ const errGetUsersCallback = (data) => {
+ set404FromErrorResponse(data);
+ setLoading(false);
+ }
+
+ const headerEditDialog = () => {
+ return {__('Assegni la domanda', 'gepafin')}
+ }
+
+ const hideEditDialog = () => {
+ setIsVisibleEditDialog(false);
+ setChosenUser(0);
+ setChosenApplication(0);
+ }
+
+ const footerEditDialog = () => {
+ return
+
+
+
+ }
+
+ const openAssignDialog = (applId) => {
+ setChosenApplication(applId)
+ setIsVisibleEditDialog(true);
+ }
+
+ const saveEditDialog = () => {
+ if (chosenUser !== 0 && chosenApplication !== 0) {
+ storeSet.main.setAsyncRequest();
+ AssignedApplicationService.assignApplication(chosenApplication, assignApplCallback, errAssignApplCallback, [
+ ['userId', chosenUser]
+ ]);
+ hideEditDialog();
+ }
+ }
+
+ const assignApplCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ if (toast.current) {
+ toast.current.show({
+ severity: 'success',
+ summary: '',
+ detail: data.message
+ });
+ }
+ setUpdaterString(uniqid());
+ }
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const errAssignApplCallback = (data) => {
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: 'error',
+ summary: '',
+ detail: data.message
+ });
+ }
+ set404FromErrorResponse(data);
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ useEffect(() => {
+ if (roleIds.length > 0) {
+ setLoading(true);
+ UserService.getUsers(getUsersCallback, errGetUsersCallback, [['roleIds', roleIds]])
+ }
+ }, [roleIds]);
+
+ useEffect(() => {
+ if (isVisibleEditDialog) {
+ setLoading(true);
+ UserService.getRoles(getRolesCallback, errGetRolesCallback)
+ }
+ }, [isVisibleEditDialog]);
+
+ return(
+
+
+ {__('Domande da valutare', 'gepafin')}
+
+
+
+
+
+
+
+
+
+ {__('Domande pubblicate', 'gepafin')}
+
+
+
+
+
+ )
+}
+
+export default DomandeInstructorManager;
\ No newline at end of file
diff --git a/src/pages/DomandePreInstructor/index.js b/src/pages/DomandePreInstructor/index.js
index d5e5fd2..1a24b3d 100644
--- a/src/pages/DomandePreInstructor/index.js
+++ b/src/pages/DomandePreInstructor/index.js
@@ -8,7 +8,7 @@ const DomandePreInstructor = () => {
return(
- {__('Archivio domande', 'gepafin')}
+ {__('Domande da valutare', 'gepafin')}
diff --git a/src/pages/SoccorsoAddPreInstructor/index.js b/src/pages/SoccorsoAddPreInstructor/index.js
index a74bcbe..dca2bfe 100644
--- a/src/pages/SoccorsoAddPreInstructor/index.js
+++ b/src/pages/SoccorsoAddPreInstructor/index.js
@@ -185,7 +185,7 @@ const SoccorsoAddPreInstructor = () => {
{data.callName}
- {__('Beneficiario', 'gepafin')}
+ {__('Referente Aziendale', 'gepafin')}
{data.beneficiaryName}
@@ -193,7 +193,7 @@ const SoccorsoAddPreInstructor = () => {
- {__('Note', 'gepafin')}
+ {__('Pec/Email', 'gepafin')}
{
{
}
-export default SoccorsoAddPreInstructor;
\ No newline at end of file
+export default SoccorsoAddPreInstructor;
diff --git a/src/pages/DomandaBeneficiario/index.js b/src/pages/SoccorsoEditBeneficiario/index.js
similarity index 59%
rename from src/pages/DomandaBeneficiario/index.js
rename to src/pages/SoccorsoEditBeneficiario/index.js
index 081b39c..4862266 100644
--- a/src/pages/DomandaBeneficiario/index.js
+++ b/src/pages/SoccorsoEditBeneficiario/index.js
@@ -4,6 +4,7 @@ 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';
@@ -16,7 +17,6 @@ import ApplicationService from '../../service/application-service';
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
import getBandoLabel from '../../helpers/getBandoLabel';
import getDateFromISOstring from '../../helpers/getDateFromISOstring';
-import renderHtmlContent from '../../helpers/renderHtmlContent';
// components
import { Button } from 'primereact/button';
@@ -25,8 +25,10 @@ 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 DomandaBeneficiario = () => {
+const SoccorsoEditBeneficiario = () => {
const isAsyncRequest = useStore().main.isAsyncRequest();
const { id } = useParams();
const navigate = useNavigate();
@@ -67,12 +69,16 @@ const DomandaBeneficiario = () => {
if (data.data.length) {
const amendmentObj = data.data[0];
setData(getFormattedData(amendmentObj));
- const formDataInitial = amendmentObj.applicationFormFields.reduce((acc, cur) => {
+ 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 {
@@ -101,7 +107,7 @@ const DomandaBeneficiario = () => {
}
const getFormattedData = (data) => {
- data.submissionDate = is(String, data.submissionDate) ? new Date(data.submissionDate) : (data.submissionDate ? data.submissionDate : '');
+ 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;
@@ -110,10 +116,11 @@ const DomandaBeneficiario = () => {
const onSubmit = () => {
};
- const doUpdateAmendment = () => {
+ 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];
@@ -126,32 +133,59 @@ const DomandaBeneficiario = () => {
});
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, updateAmendmentCallback, errUpdateAmendmentCallback);
+
+ AmendmentsService.updateSoccorso(
+ amendmentId,
+ submitData,
+ (resp) => updateAmendmentCallback(resp, doClose),
+ errUpdateAmendmentCallback
+ );
}
- const updateAmendmentCallback = (data) => {
+ const doUpdateAmendmentAndCompleteTask = () => {
+ doUpdateAmendment(true);
+ }
+
+ const updateAmendmentCallback = (data, doClose = false) => {
if (data.status === 'SUCCESS') {
- if (toast.current) {
- toast.current.show({
- severity: 'success',
- summary: '',
- detail: data.message
- });
- }
- const newFormDataInitial = data.data.applicationFormFields.reduce((acc, cur) => {
- if (cur.fieldValue) {
- acc[cur.fieldId] = cur.fieldValue;
+ 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
+ });
}
- return acc;
- }, formInitialData);
- setFormInitialData(newFormDataInitial);
+ 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();
}
@@ -168,6 +202,31 @@ const DomandaBeneficiario = () => {
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();
@@ -182,7 +241,7 @@ const DomandaBeneficiario = () => {
{data.id
?
{sprintf(__('Soccorso Istruttorio: richiesta integrazione documenti per domanda #%s', 'gepafin'), id)}
- : null}
+ : null}
{dataAppl.id
?
{sprintf(__('Dettagli: domanda #%s', 'gepafin'), dataAppl.id)}
@@ -216,11 +275,11 @@ const DomandaBeneficiario = () => {
{data.callName}
- {__('Beneficiario', 'gepafin')}
+ {__('Referente Aziendale', 'gepafin')}
{data.beneficiaryName}
- {__('Azienda', 'gepafin')}
+ {__('Azienda Beneficiaria', 'gepafin')}
@@ -239,7 +298,7 @@ const DomandaBeneficiario = () => {
{dataAppl.id
?
- {__('ID domanda', 'gepafin')}
+ {__('ID domanda', 'gepafin')}
{dataAppl.id}
@@ -247,7 +306,7 @@ const DomandaBeneficiario = () => {
{dataAppl.callTitle}
- {__('Azienda', 'gepafin')}
+ {__('Azienda Beneficiaria', 'gepafin')}
{dataAppl.companyName}
@@ -268,10 +327,13 @@ const DomandaBeneficiario = () => {
?
{__('Dettagli Richiesta', 'gepafin')}
{__('Note e spiegazioni', 'gepafin')}
-
- {renderHtmlContent(data.note)}
-
+ {getEmailTemplateForSoccorso(data.emailTemplate, data.note)}
+ : null}
+
+ {data.id
+ ?
+ {__('Comunicazioni', 'gepafin')}
+
: null}
{data.id
@@ -282,7 +344,7 @@ const DomandaBeneficiario = () => {
? data.formFields.map((o, i) => {
return {
defaultValue={formInitialData[o.fieldId] ? formInitialData[o.fieldId] : []}
accept={[]}
source="AMENDMENT"
- sourceId={data.applicationId}
+ sourceId={data.id}
multiple={true}
/>
}) : null}
- {/*
- {data.formFields
- ? data.formFields.map((o, i) => -
- {o.label}
-
) : null}
- */}
+
+ {data.formFields
+ ? data.formFields.map((o, i) => -
+ {o.label}
+
) : null}
+
: null}
{data.id
?
- {__('Comunicazioni', 'gepafin')}
-
- : null}
+ {__('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}
+
+ {__('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
? setIsVisibleEmailDialog(true)}
- label={__('Invia documenti via PEC', 'gepafin')}
- icon="pi pi-envelope" iconPos="right"/> : null}
+ type="button"
+ disabled={isAsyncRequest || data.status !== 'AWAITING'}
+ onClick={doUpdateAmendmentAndCompleteTask}
+ label={__('Invia documenti', 'gepafin')}
+ icon="pi pi-save" iconPos="right"/> : null}
+ {data.id
+ ? doUpdateAmendment()}
+ label={__('Salva bozza', 'gepafin')}
+ icon="pi pi-save" iconPos="right"/> : null}
+ label={__('Indietro', 'gepafin')}
+ icon="pi pi-arrow-left" iconPos="left"/>
+
+
)
}
-export default SoccorsoEditPreInstructor;
\ No newline at end of file
+export default SoccorsoEditPreInstructor;
diff --git a/src/pages/SoccorsoIstruttorioPreInstructor/components/PreInstructorSoccorsiTable/index.js b/src/pages/SoccorsoIstruttorioPreInstructor/components/PreInstructorSoccorsiTable/index.js
index e509e43..87cba6b 100644
--- a/src/pages/SoccorsoIstruttorioPreInstructor/components/PreInstructorSoccorsiTable/index.js
+++ b/src/pages/SoccorsoIstruttorioPreInstructor/components/PreInstructorSoccorsiTable/index.js
@@ -78,7 +78,7 @@ const PreInstructorSoccorsiTable = ({ openDialogFn }) => {
operator: FilterOperator.AND,
constraints: [{ value: null, matchMode: FilterMatchMode.STARTS_WITH }]
},
- beneficiaryName: {
+ companyName: {
operator: FilterOperator.AND,
constraints: [{ value: null, matchMode: FilterMatchMode.STARTS_WITH }]
},
@@ -149,7 +149,7 @@ const PreInstructorSoccorsiTable = ({ openDialogFn }) => {
-
{
)
}
-export default PreInstructorSoccorsiTable;
\ No newline at end of file
+export default PreInstructorSoccorsiTable;
diff --git a/src/pages/UserActivity/index.js b/src/pages/UserActivity/index.js
new file mode 100644
index 0000000..8e93f5e
--- /dev/null
+++ b/src/pages/UserActivity/index.js
@@ -0,0 +1,192 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { __ } from '@wordpress/i18n';
+import { isEmpty, pathOr } from 'ramda';
+import { useNavigate, useParams } from 'react-router-dom';
+import NumberFlow from '@number-flow/react';
+
+// service
+import UserService from '../../service/user-service';
+
+// tools
+import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
+import getDateFromISOstring from '../../helpers/getDateFromISOstring';
+
+// components
+import { Button } from 'primereact/button';
+import { Toast } from 'primereact/toast';
+import { Dropdown } from 'primereact/dropdown';
+
+
+const UserActivity = () => {
+ const [loading, setLoading] = useState(false);
+ const toast = useRef(null);
+ const navigate = useNavigate();
+ const { id } = useParams();
+ const [user, setUser] = useState({});
+ const [roles, setRoles] = useState([]);
+ const [chosenRole, setChosenRole] = useState(0);
+
+ const goBack = () => {
+ navigate(`/utenti`);
+ }
+
+ const getUserCallback = (resp) => {
+ if (resp.status === 'SUCCESS') {
+ setUser(resp.data)
+ setChosenRole(resp.data.role?.id);
+ }
+ setLoading(false);
+ }
+
+ const errGetUserCallback = (resp) => {
+ set404FromErrorResponse(resp);
+ setLoading(false);
+ }
+
+ const getRolesCallback = (resp) => {
+ if (resp.status === 'SUCCESS') {
+ setRoles(resp.data)
+ }
+ setLoading(false);
+ }
+
+ const errGetRolesCallback = (resp) => {
+ set404FromErrorResponse(resp);
+ setLoading(false);
+ }
+
+ const getStatValue = (key, fallback = 0) => {
+ return pathOr(fallback, [key], {});
+ }
+
+ const handleRoleUpdate = () => {
+ if (user.role?.id !== chosenRole) {
+ setLoading(true);
+ UserService.updateUser(user.id, {roleId: chosenRole}, updateRoleCallback, errUpdateRoleCallback)
+ }
+ }
+
+ const updateRoleCallback = (resp) => {
+ if (resp.status === 'SUCCESS') {
+ setUser(resp.data)
+ }
+ setLoading(false);
+ }
+
+ const errUpdateRoleCallback = (resp) => {
+ set404FromErrorResponse(resp);
+ setLoading(false);
+ }
+
+ useEffect(() => {
+ if (id && !isEmpty(id)) {
+ setLoading(true);
+ UserService.getUser(id, getUserCallback, errGetUserCallback);
+ UserService.getRoles(getRolesCallback, errGetRolesCallback);
+ }
+ }, [id])
+
+ return (
+
+
+ {__('Controllo attività utenti', 'gepafin')}
+
+
+
+
+
+
+
+
+
+ {__('Nome utente', 'gepafin')}
+ {`${user.firstName} ${user.lastName}`}
+
+
+ {__('Email', 'gepafin')}
+ {user.email}
+
+
+ {__('Ruolo', 'gepafin')}
+ {user.role?.roleName}
+
+
+ {__('Data registrazione', 'gepafin')}
+ {getDateFromISOstring(user.createdDate)}
+
+
+ {__('Ultimo accesso', 'gepafin')}
+ {getDateFromISOstring(user.lastLogin)}
+
+
+ {__('Stato account', 'gepafin')}
+ {user.status}
+
+
+
+ {['ROLE_PRE_INSTRUCTOR', 'ROLE_INSTRUCTOR_MANAGER'].includes(user.role?.roleType)
+ ? <>
+
+
+
+ {__('Cambia ruolo', 'gepafin')}
+
+ setChosenRole(e.value)}
+ options={roles.filter(o => [3, 5].includes(o.id)).map(o => ({ label: o.roleName, value: o.id }))}
+ optionLabel="label"
+ placeholder={__('Seleziona ruolo', 'gepafin')}/>
+
+
+
+ > : null}
+
+
+
+ {/*
+ {__('Statistiche attività', 'gepafin')}
+
+
+ {__('Login totali', 'gepafin')}
+ {}
+
+
+ {__('Bandi gestiti', 'gepafin')}
+ {}
+
+
+ {__('Domande processate', 'gepafin')}
+ {}
+
+
+ */}
+
+ )
+}
+
+export default UserActivity;
diff --git a/src/pages/Users/components/AllUsersTable/index.js b/src/pages/Users/components/AllUsersTable/index.js
index 932be58..6476cb5 100644
--- a/src/pages/Users/components/AllUsersTable/index.js
+++ b/src/pages/Users/components/AllUsersTable/index.js
@@ -24,6 +24,7 @@ import { Calendar } from 'primereact/calendar';
import { Tag } from 'primereact/tag';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
import translationStrings from '../../../../translationStringsForComponents';
+import { Link } from 'react-router-dom';
const AllUsersTable = () => {
const users = useStore().main.users();
@@ -53,7 +54,7 @@ const AllUsersTable = () => {
const getFormattedData = (data) => {
return data
- .filter(o => ['ROLE_SUPER_ADMIN', 'ROLE_PRE_INSTRUCTOR'].includes(o.role.roleType));
+ .filter(o => ['ROLE_SUPER_ADMIN', 'ROLE_PRE_INSTRUCTOR', 'ROLE_INSTRUCTOR_MANAGER'].includes(o.role.roleType));
};
const clearFilter = () => {
@@ -125,12 +126,16 @@ const AllUsersTable = () => {
return ;
};
- /*const actionsBodyTemplate = (rowData) => {
- /!*return
-
- *!/
- return null;
- }*/
+ const actionsBodyTemplate = (rowData) => {
+ return
+
+
+ }
const header = renderHeader();
@@ -149,22 +154,22 @@ const AllUsersTable = () => {
filter sortable
field="email"
filterPlaceholder={__('Cerca per email', 'gepafin')}
- style={{ minWidth: '12rem' }}/>
+ style={{ minWidth: '10rem' }}/>
+ style={{ minWidth: '8rem' }}/>
- {/**/}
+
)
}
-export default AllUsersTable;
\ No newline at end of file
+export default AllUsersTable;
diff --git a/src/pages/Users/index.js b/src/pages/Users/index.js
index d22285d..a34b17f 100644
--- a/src/pages/Users/index.js
+++ b/src/pages/Users/index.js
@@ -121,7 +121,7 @@ const Users = () => {
const getRolesCallback = (data) => {
if (data.status === 'SUCCESS') {
const roles = data.data
- .filter(o => ['ROLE_SUPER_ADMIN', 'ROLE_PRE_INSTRUCTOR'].includes(o.roleType))
+ .filter(o => ['ROLE_SUPER_ADMIN', 'ROLE_PRE_INSTRUCTOR', 'ROLE_INSTRUCTOR_MANAGER'].includes(o.roleType))
.map(o => ({
name: o.roleName,
value: o.id
diff --git a/src/routes.js b/src/routes.js
index 34a9ba3..d524bf5 100644
--- a/src/routes.js
+++ b/src/routes.js
@@ -34,9 +34,12 @@ import SoccorsoIstruttorioPreInstructor from './pages/SoccorsoIstruttorioPreInst
import SoccorsoEditPreInstructor from './pages/SoccorsoEditPreInstructor';
import SoccorsoAddPreInstructor from './pages/SoccorsoAddPreInstructor';
import DomandeBeneficiario from './pages/DomandeBeneficiario';
-import DomandaBeneficiario from './pages/DomandaBeneficiario';
+import SoccorsoEditBeneficiario from './pages/SoccorsoEditBeneficiario';
import BandoApplicationPreview from './pages/BandoApplicationPreview';
import BandiPreferredBeneficiario from './pages/BandiPreferredBeneficiario';
+import DomandeInstructorManager from './pages/DomandeInstructorManager';
+import DomandaEditInstructorManager from './pages/DomandaEditInstructorManager';
+import UserActivity from './pages/UserActivity';
const routes = ({ role, chosenCompanyId }) => {
@@ -47,106 +50,139 @@ const routes = ({ role, chosenCompanyId }) => {
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
- {'ROLE_BENEFICIARY' === role ? : null}
+ {'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
+ }/>
+
+ {'ROLE_SUPER_ADMIN' === role ? : null}
+ {'ROLE_BENEFICIARY' === role ? : null}
+ {'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role && chosenCompanyId > 0 ? : }
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
{'ROLE_SUPER_ADMIN' === role ? : null}
{'ROLE_BENEFICIARY' === role ? : null}
{'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
+ }/>
+
+ {'ROLE_SUPER_ADMIN' === role ? : null}
+ {'ROLE_BENEFICIARY' === role ? : null}
+ {'ROLE_PRE_INSTRUCTOR' === role ? : null}
+ {'ROLE_INSTRUCTOR_MANAGER' === role ? : null}
}/>
}/>
diff --git a/src/service/amendments-service.js b/src/service/amendments-service.js
index 51fdbbc..f7afcc1 100644
--- a/src/service/amendments-service.js
+++ b/src/service/amendments-service.js
@@ -28,6 +28,10 @@ export default class AmendmentsService {
NetworkService.put(`${API_BASE_URL}/amendments/${id}`, body, callback, errCallback, queryParams);
};
+ static updateStatusSoccorso = (id, callback, errCallback, queryParams) => {
+ NetworkService.put(`${API_BASE_URL}/amendments/${id}/status`, {}, callback, errCallback, queryParams);
+ };
+
static extendSoccorso = (id, days, callback, errCallback, queryParams) => {
NetworkService.put(`${API_BASE_URL}/amendments/${id}/extendExpiration`, {}, callback, errCallback, [
['extendedDays', days]
diff --git a/src/service/application-service.js b/src/service/application-service.js
index d68b1bf..ae59a84 100644
--- a/src/service/application-service.js
+++ b/src/service/application-service.js
@@ -48,6 +48,10 @@ export default class ApplicationService {
NetworkService.delete(`${API_BASE_URL}/application/${id}/signedDocument`, {}, callback, errCallback);
};
+ static deleteApplication = (id, callback, errCallback) => {
+ NetworkService.delete(`${API_BASE_URL}/application/${id}`, {}, callback, errCallback);
+ };
+
static downloadCompleteZip = (id, callback, errCallback, queryParams) => {
NetworkService.getBlob(`${API_BASE_URL}/application/${id}/documents/zip`, callback, errCallback, queryParams);
};
diff --git a/src/service/appointment-service.js b/src/service/appointment-service.js
index 0bf12bd..1d2741d 100644
--- a/src/service/appointment-service.js
+++ b/src/service/appointment-service.js
@@ -4,11 +4,15 @@ const API_BASE_URL = process.env.REACT_APP_API_EXECUTION_ADDRESS;
export default class AppointmentService {
- static getNdg = (id, callback, errCallback, queryParams) => {
- NetworkService.get(`${API_BASE_URL}/appointment/application/${id}/check-ndg`, callback, errCallback, queryParams);
+ static getNdg = (applicationId, callback, errCallback, queryParams) => {
+ NetworkService.get(`${API_BASE_URL}/appointment/application/${applicationId}/check-ndg`, callback, errCallback, queryParams);
};
static archiveDocument = (applicationId, documentId, body, callback, errCallback, queryParams) => {
- NetworkService.post(`${API_BASE_URL}/appointment/application/${applicationId}/document/${documentId}`, {}, callback, errCallback, queryParams);
+ NetworkService.post(`${API_BASE_URL}/appointment/document/${documentId}`, body, callback, errCallback, queryParams);
+ };
+
+ static createAppointment = (applicationId, body, callback, errCallback, queryParams) => {
+ NetworkService.post(`${API_BASE_URL}/appointment/application/${applicationId}`, body, callback, errCallback, queryParams);
};
}
diff --git a/src/service/network-service.js b/src/service/network-service.js
index 431fce5..5e7d5cc 100644
--- a/src/service/network-service.js
+++ b/src/service/network-service.js
@@ -30,8 +30,9 @@ export class NetworkService {
}
}
- if (url.charAt(url.length) === '&')
+ if (url.charAt(url.length) === '&') {
url = url.substring(0, url.length - 1);
+ }
}
fetch(url, {
diff --git a/src/service/notification-service.js b/src/service/notification-service.js
new file mode 100644
index 0000000..c3457b2
--- /dev/null
+++ b/src/service/notification-service.js
@@ -0,0 +1,22 @@
+import { NetworkService } from './network-service';
+
+const API_BASE_URL = process.env.REACT_APP_API_EXECUTION_ADDRESS;
+
+export default class NotificationService {
+
+ static getNotifications = (id, callback, errCallback, queryParams) => {
+ NetworkService.get(`${API_BASE_URL}/notification/user/${id}`, callback, errCallback, queryParams);
+ };
+
+ static notificationMakeRead = (id, callback, errCallback) => {
+ NetworkService.put(`${API_BASE_URL}/notification/${id}`, {}, callback, errCallback, [
+ ['status', 'READ']
+ ]);
+ };
+
+ static notificationMakeUnread = (id, callback, errCallback) => {
+ NetworkService.put(`${API_BASE_URL}/notification/${id}`, {}, callback, errCallback, [
+ ['status', 'UNREAD']
+ ]);
+ };
+}
diff --git a/src/service/user-service.js b/src/service/user-service.js
index 8bf6f43..e98fd89 100644
--- a/src/service/user-service.js
+++ b/src/service/user-service.js
@@ -8,6 +8,10 @@ export default class UserService {
NetworkService.get(`${API_BASE_URL}/user`, callback, errCallback, queryParams);
};
+ static getUser = (id, callback, errCallback, queryParams) => {
+ NetworkService.get(`${API_BASE_URL}/user/${id}`, callback, errCallback, queryParams);
+ };
+
static updateUser = (id, body, callback, errCallback) => {
NetworkService.put(`${API_BASE_URL}/user/${id}`, body, callback, errCallback);
};
diff --git a/src/tempData.js b/src/tempData.js
index d13fe4e..6c8c231 100644
--- a/src/tempData.js
+++ b/src/tempData.js
@@ -88,6 +88,10 @@ export const elementItems = [
{
name: "step",
value: 0
+ },
+ {
+ name: "isRequestedAmount",
+ value: false
}
],
validators: {
|