diff --git a/src/pages/BandoFormsEdit/index.js b/src/pages/BandoFormsEdit/index.js
index 1233076..107483d 100644
--- a/src/pages/BandoFormsEdit/index.js
+++ b/src/pages/BandoFormsEdit/index.js
@@ -4,7 +4,7 @@ import { useNavigate, useParams } from 'react-router-dom';
import { DndProvider } from 'react-dnd';
import { HTML5Backend } from 'react-dnd-html5-backend';
import { klona } from 'klona';
-import { isEmpty } from 'ramda';
+import { isEmpty, pathOr } from 'ramda';
// store
import { storeSet, storeGet, useStore } from '../../store';
@@ -21,6 +21,7 @@ import { Messages } from 'primereact/messages';
// api
import FormsService from '../../service/forms-service';
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
+import BandoService from '../../service/bando-service';
// TODO temp data
//import { elementItems } from '../../tempData';
@@ -243,7 +244,20 @@ const BandoFormsEdit = () => {
storeSet.main.unsetAsyncRequest();
}
+ const getBandoCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ const criteria = pathOr([], ['data', 'criteria'], data);
+ const criteriaOptions = criteria.map(o => ({value: o.id, label: o.value}));
+ storeSet.main.bandoCriteria(criteriaOptions);
+ }
+ }
+
+ const errGetBandoCallback = (data) => {
+ set404FromErrorResponse(data);
+ }
+
useEffect(() => {
+ const bandoId = getBandoId();
const parsedFormId = parseInt(formId)
const bandoFormId = !isNaN(parsedFormId) ? parsedFormId : 0;
@@ -253,12 +267,14 @@ const BandoFormsEdit = () => {
if (bandoFormId) {
storeSet.main.setAsyncRequest();
FormsService.getFormById(bandoFormId, getFormCallback, errGetFormCallbacks);
+ BandoService.getBando(bandoId, getBandoCallback, errGetBandoCallback);
}
return () => {
storeSet.main.formId(0);
storeSet.main.formLabel('');
storeSet.main.formElements([]);
+ storeSet.main.bandoCriteria([]);
}
}, [id, formId]);
diff --git a/src/pages/Dashboard/components/LatestBandiTable/index.js b/src/pages/Dashboard/components/LatestBandiTable/index.js
index 94b45b5..52b646f 100644
--- a/src/pages/Dashboard/components/LatestBandiTable/index.js
+++ b/src/pages/Dashboard/components/LatestBandiTable/index.js
@@ -31,44 +31,12 @@ import { Link } from 'react-router-dom';
const LatestBandiTable = () => {
const [items, setItems] = useState(null);
const [filters, setFilters] = useState(null);
- const [loading, setLoading] = useState(false);
+ const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
const [globalFilterValue, setGlobalFilterValue] = useState('');
const [statuses, setStatuses] = useState([]);
useEffect(() => {
- // TODO
- /*const items = [
- {
- name: 'Bando Innovazione 2024',
- start_date: '2024-08-08T00:00:00+00:00',
- end_date: '2024-08-30T00:00:00+00:00',
- submissions: 24,
- status: 'PUBLISH',
- id: 11
- },
- {
- name: 'Bando Sostenibilità 2024',
- start_date: '2024-07-28T00:00:00+00:00',
- end_date: '2024-08-15T00:00:00+00:00',
- submissions: 35,
- status: 'PUBLISH',
- id: 9
- },
- {
- name: 'Bando A',
- start_date: '2024-06-28T00:00:00+00:00',
- end_date: '2024-06-15T00:00:00+00:00',
- submissions: 2,
- status: 'EXPIRED',
- id: 2
- }
- ]
- setItems(getFormattedBandiData(items));
- setStatuses(uniq(items.map(o => o.status)))
- setLoading(false);
- initFilters();*/
-
- storeSet.main.setAsyncRequest();
+ setLocalAsyncRequest(true);
BandoService.getBandi(getCallback, errGetCallbacks);
}, []);
@@ -79,12 +47,11 @@ const LatestBandiTable = () => {
setStatuses(uniq(data.data.map(o => o.status)))
initFilters();
}
- storeSet.main.unsetAsyncRequest();
+ setLocalAsyncRequest(false);
}
const errGetCallbacks = (data) => {
- console.log('errGetCallbacks', data)
- storeSet.main.unsetAsyncRequest();
+ setLocalAsyncRequest(false);
}
const getFormattedBandiData = (data) => {
@@ -179,13 +146,13 @@ const LatestBandiTable = () => {
return(
-
setFilters(e.filters)}>
-
{
const navigate = useNavigate();
@@ -67,27 +69,52 @@ const Dashboard = () => {
{__('Bandi attivi', 'gepafin')}
- {getStatValue('numberOfActiveCalls', 0)}
+
{__('Utenti registrati', 'gepafin')}
- {getStatValue('numberOfResgisteredUsers', 0)}
+
{__('Domande in pre-istruttoria', 'gepafin')}
- {getStatValue('numberOfSubmittedApplications', 0)}
+
{__('Domande in bozza', 'gepafin')}
- {getStatValue('numberOfDraftApplications', 0)}
+
{__('Aziende', 'gepafin')}
- {getStatValue('numberOfCompany', 0)}
+
{__('Totale finanziamenti attivi', 'gepafin')}
- €{formatToMillions(getStatValue('totalActiveFinancing', 0))}
+
@@ -95,10 +122,17 @@ const Dashboard = () => {
-
{__('Ultimi Bandi Pubblicati', 'gepafin')}
+ {__('Ultimi bandi pubblicati', 'gepafin')}
+
+
+
+
{__('Ultime domande pubblicate', 'gepafin')}
+
+
+
{/*
diff --git a/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js b/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js
index b852369..f48b208 100644
--- a/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js
+++ b/src/pages/DashboardBeneficiario/components/LatestBandiTable/index.js
@@ -1,6 +1,7 @@
import React, { useState, useEffect} from 'react';
import { __ } from '@wordpress/i18n';
import { uniq } from 'ramda';
+import { Link } from 'react-router-dom';
// tools
import getBandoLabel from '../../../../helpers/getBandoLabel';
@@ -25,7 +26,6 @@ import { Button } from 'primereact/button';
import { Calendar } from 'primereact/calendar';
import { Tag } from 'primereact/tag';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
-import { Link } from 'react-router-dom';
const LatestBandiTable = () => {
@@ -43,7 +43,7 @@ const LatestBandiTable = () => {
const getCallback = (data) => {
if (data.status === 'SUCCESS') {
const newItems = data.data.filter(o => o.status === 'PUBLISH');
- setItems(getFormattedBandiData(newItems));
+ setItems(getFormattedData(newItems));
setStatuses(uniq(data.data.map(o => o.status)))
initFilters();
}
@@ -55,7 +55,7 @@ const LatestBandiTable = () => {
storeSet.main.unsetAsyncRequest();
}
- const getFormattedBandiData = (data) => {
+ const getFormattedData = (data) => {
return [...(data || [])].map((d) => {
d.start_date = new Date(d.dates[0]);
d.end_date = new Date(d.dates[1]);
@@ -121,18 +121,10 @@ const LatestBandiTable = () => {
return
options.filterCallback(e.value, options.index)} dateFormat="mm/dd/yy" placeholder="mm/dd/yyyy" mask="99/99/9999" />;
};
- const balanceFilterTemplate = (options) => {
- return options.filterCallback(e.value, options.index)} />;
- };
-
const statusBodyTemplate = (rowData) => {
return ;
};
- const statusFilterTemplate = (options) => {
- return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" showClear />;
- };
-
const statusItemTemplate = (option) => {
return ;
};
@@ -153,7 +145,7 @@ const LatestBandiTable = () => {
header={header}
emptyMessage={__('Nessun dato disponibile', 'gepafin')}
onFilter={(e) => setFilters(e.filters)}>
-
{
- const isAsyncRequest = useStore().main.isAsyncRequest();
+ const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
const [items, setItems] = useState(null);
const [filters, setFilters] = useState(null);
const [globalFilterValue, setGlobalFilterValue] = useState('');
const [statuses, setStatuses] = useState([]);
useEffect(() => {
- storeSet.main.setAsyncRequest();
+ setLocalAsyncRequest(true);
ApplicationService.getApplications(getApplCallback, errGetApplCallback)
}, []);
@@ -45,12 +45,11 @@ const MyLatestSubmissionsTable = () => {
initFilters();
}
}
- storeSet.main.unsetAsyncRequest();
+ setLocalAsyncRequest(false);
}
const errGetApplCallback = (data) => {
- set404FromErrorResponse(data);
- storeSet.main.unsetAsyncRequest();
+ setLocalAsyncRequest(false);
}
const getFormattedBandiData = (data) => {
@@ -164,13 +163,13 @@ const MyLatestSubmissionsTable = () => {
return (
-
setFilters(e.filters)}>
-
{
{__('Domande attive', 'gepafin')}
- {getStatValue('numberOfApplications', 0)}
+
{__('Bandi osservati', 'gepafin')}
- {getStatValue('numberOfCalls', 0)}
+
{__('Documenti da integrare', 'gepafin')}
- {getStatValue('numberOfIntegratedDocuments', 0)}
+
diff --git a/src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js b/src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js
new file mode 100644
index 0000000..413b41c
--- /dev/null
+++ b/src/pages/DashboardInstructor/components/MyEvaluationsTable/index.js
@@ -0,0 +1,189 @@
+import React, { useState, useEffect } from 'react';
+import { __ } from '@wordpress/i18n';
+import { Link } from 'react-router-dom';
+
+// store
+import { useStore } from '../../../../store';
+
+// tools
+//import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse';
+import ProperBandoLabel from '../../../../components/ProperBandoLabel';
+
+// api
+//import ApplicationService from '../../../../service/application-service';
+
+// components
+import { FilterMatchMode, FilterOperator } from 'primereact/api';
+import { DataTable } from 'primereact/datatable';
+import { Column } from 'primereact/column';
+import { InputText } from 'primereact/inputtext';
+import { IconField } from 'primereact/iconfield';
+import { InputIcon } from 'primereact/inputicon';
+import { Button } from 'primereact/button';
+import { Calendar } from 'primereact/calendar';
+
+
+const MyEvaluationsTable = () => {
+ const isAsyncRequest = useStore().main.isAsyncRequest();
+ const [items, setItems] = useState(null);
+ const [filters, setFilters] = useState(null);
+ const [globalFilterValue, setGlobalFilterValue] = useState('');
+
+ useEffect(() => {
+ const demoItems = [
+ {
+ id: 1,
+ callTitle: 'Bando 1',
+ appliedDate: '2024-10-01',
+ callEndDate: '2025-11-25',
+ status: 'AWAITING'
+ },
+ {
+ id: 2,
+ callTitle: 'Bando 2',
+ appliedDate: '2024-08-11',
+ callEndDate: '2027-09-23',
+ status: 'AWAITING'
+ }
+ ];
+ setItems(getFormattedData(demoItems));
+ /*storeSet.main.setAsyncRequest();
+ ApplicationService.getApplications(getApplCallback, errGetApplCallback)*/
+ }, []);
+
+ /*const getApplCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ if (data.data.length) {
+ setItems(getFormattedBandiData(data.data));
+ setStatuses(uniq(items.map(o => o.status)))
+ initFilters();
+ }
+ }
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const errGetApplCallback = (data) => {
+ set404FromErrorResponse(data);
+ storeSet.main.unsetAsyncRequest();
+ }*/
+
+ const getFormattedData = (data) => {
+ return [...(data || [])].map((d) => {
+ d.appliedDate = new Date(d.appliedDate);
+ d.callEndDate = new Date(d.callEndDate);
+
+ return d;
+ });
+ };
+
+ const formatDate = (value) => {
+ return value.toLocaleDateString('it-IT', {
+ day: '2-digit',
+ month: '2-digit',
+ year: 'numeric'
+ });
+ };
+
+ const clearFilter = () => {
+ initFilters();
+ };
+
+ const onGlobalFilterChange = (e) => {
+ const value = e.target.value;
+ let _filters = { ...filters };
+
+ _filters['global'].value = value;
+
+ setFilters(_filters);
+ setGlobalFilterValue(value);
+ };
+
+ const initFilters = () => {
+ setFilters({
+ global: { value: null, matchMode: FilterMatchMode.CONTAINS },
+ callTitle: {
+ operator: FilterOperator.AND,
+ constraints: [{ value: null, matchMode: FilterMatchMode.STARTS_WITH }]
+ },
+ appliedDate: {
+ operator: FilterOperator.AND,
+ constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }]
+ },
+ callEndDate: {
+ operator: FilterOperator.AND,
+ constraints: [{ value: null, matchMode: FilterMatchMode.DATE_IS }]
+ }
+ });
+ setGlobalFilterValue('');
+ };
+
+ const renderHeader = () => {
+ return (
+
+
+ );
+ };
+
+ const dateAppliedBodyTemplate = (rowData) => {
+ return formatDate(rowData.appliedDate);
+ };
+
+ const dateEndBodyTemplate = (rowData) => {
+ return formatDate(rowData.callEndDate);
+ };
+
+ const dateFilterTemplate = (options) => {
+ return options.filterCallback(e.value, options.index)}
+ dateFormat="mm/dd/yy" placeholder="mm/dd/yyyy" mask="99/99/9999"/>;
+ };
+
+ const statusBodyTemplate = (rowData) => {
+ return ;
+ };
+
+ const actionsBodyTemplate = (rowData) => {
+ return
+
+
+ }
+
+ const header = renderHeader();
+
+ return (
+
+ setFilters(e.filters)}>
+
+
+
+
+
+
+
+
+ )
+}
+
+export default MyEvaluationsTable;
\ No newline at end of file
diff --git a/src/pages/DashboardInstructor/index.js b/src/pages/DashboardInstructor/index.js
new file mode 100644
index 0000000..641b24a
--- /dev/null
+++ b/src/pages/DashboardInstructor/index.js
@@ -0,0 +1,76 @@
+import React, { useEffect, useState } from 'react';
+import { __ } from '@wordpress/i18n';
+import { useNavigate } from 'react-router-dom';
+import { head, pathOr } from 'ramda';
+
+// store
+import { useStore } from '../../store';
+
+// api
+//import DashboardService from '../../service/dashboard-service';
+
+// components
+//import LatestBandiTable from './components/LatestBandiTable';
+//import MyLatestSubmissionsTable from './components/MyLatestSubmissionsTable';
+import { Button } from 'primereact/button';
+import MyEvaluationsTable from './components/MyEvaluationsTable';
+
+const DashboardInstructor = () => {
+ const navigate = useNavigate();
+ //const [mainStats, setMainStats] = useState({});
+
+ const goToAllEvaluations = () => {
+ navigate('/valutazioni');
+ }
+
+ return(
+
+
+
{__('Dashboard', 'gepafin')}
+
+
+ {/*
+
+
+
{__('Panoramica di Sistema', 'gepafin')}
+
+
+ {__('Domande attive', 'gepafin')}
+ {getStatValue('numberOfApplications', 0)}
+
+
+ {__('Bandi osservati', 'gepafin')}
+ {getStatValue('numberOfCalls', 0)}
+
+
+ {__('Documenti da integrare', 'gepafin')}
+ {getStatValue('numberOfIntegratedDocuments', 0)}
+
+
+
*/}
+
+
+
+
+
{__('Coda di lavoro', 'gepafin')}
+
+
+
+
+
+
+ {__('Azioni rapide', 'gepafin')}
+
+
+
+
+ )
+}
+
+export default DashboardInstructor;
\ No newline at end of file
diff --git a/src/pages/EvaluationEdit/index.js b/src/pages/EvaluationEdit/index.js
new file mode 100644
index 0000000..b098abd
--- /dev/null
+++ b/src/pages/EvaluationEdit/index.js
@@ -0,0 +1,227 @@
+import React, { useState, useEffect, useRef } from 'react';
+import { __, sprintf } from '@wordpress/i18n';
+import { useNavigate, useParams } from 'react-router-dom';
+import { is, isEmpty, isNil } from 'ramda';
+
+// store
+import { storeSet, useStore } from '../../store';
+
+// tools
+import getNumberWithCurrency from '../../helpers/getNumberWithCurrency';
+//import getDateFromISOstring from '../../helpers/getDateFromISOstring';
+
+// components
+import { Skeleton } from 'primereact/skeleton';
+import { Button } from 'primereact/button';
+import { Messages } from 'primereact/messages';
+import { Tag } from 'primereact/tag';
+
+const EvaluationEdit = () => {
+ const isAsyncRequest = useStore().main.isAsyncRequest();
+ const { id } = useParams();
+ const navigate = useNavigate();
+ const [data, setData] = useState({});
+ const pageMsgs = useRef(null);
+
+ const goToEvaluationsPage = () => {
+ navigate('/valutazioni');
+ }
+
+ /*const getCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ setData(getFormattedBandiData(data.data));
+ }
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const errGetCallback = (data) => {
+ if (pageMsgs.current && data.message) {
+ pageMsgs.current.show([
+ {
+ sticky: true, severity: 'error', summary: '',
+ detail: data.message,
+ closable: true
+ }
+ ]);
+ }
+ set404FromErrorResponse(data);
+ storeSet.main.unsetAsyncRequest();
+ }*/
+
+ /*const getFormattedBandiData = (data) => {
+ data.dates = data.dates.map(v => is(String, v) ? new Date(v) : (v ? v : ''));
+ return data;
+ };*/
+
+ useEffect(() => {
+ const parsed = parseInt(id)
+ const entityId = !isNaN(parsed) ? parsed : 0;
+
+ setData({
+ id: 'DOM_2024_001',
+ callTitle: 'Innovazione 2024',
+ beneficiario: 'Azienda Alpha SRL',
+ createdAt: '2024-08-01',
+ scadenzaAt: '2024-08-05',
+ status: 'In Valutazione',
+ criteria: [
+ { title: 'Innovatività del progetto', score: 25, id: 12 },
+ { title: 'Innovatività del progetto2', score: 35, id: 13 },
+ { title: 'Innovatività del progetto3', score: 15, id: 14 }
+ ],
+ minScore: 60
+ });
+
+ //BandoService.getBando(entityId, getCallback, errGetCallback);
+ }, [id]);
+
+ return (
+
+
+
{__('Valuta domanda', 'gepafin')}
+
+
+
+
+
+
+
+
+
+
+
+ {!isAsyncRequest && !isEmpty(data)
+ ?
+
+
+ {__('ID domanda', 'gepafin')}
+ {data.id}
+
+
+ {__('Bando', 'gepafin')}
+ {data.callTitle}
+
+
+ {__('Beneficiario', 'gepafin')}
+ {data.beneficiario}
+
+
+ {__('Data ricezione', 'gepafin')}
+ {data.createdAt}
+
+
+ {__('Scadenza Valutazione', 'gepafin')}
+ {data.scadenzaAt}
+
+
+ {__('Stato', 'gepafin')}
+ {data.status}
+
+
+
+
+
{__('Punteggi di valutazione', 'gepafin')}
+ {data.criteria
+ ?
+
+
+ | {__('Parametro', 'gepafin')} |
+ {__('Punteggio', 'gepafin')} |
+ {__('Stato', 'gepafin')} |
+
+
+
+ {data.criteria.map(o =>
+ | {o.title} |
+ {o.score} |
+ |
+
)}
+
+ | {__('Punteggio:', 'gepafin')} |
+ {68} |
+ |
+
+
+
+
+ | {sprintf(__('Punteggio minimo per l\'ammissione: %d'), data.minScore)} |
+
+
+
: null}
+
+
+
+
{__('Checklist Valutazione', 'gepafin')}
+
+
+
+
+
+
+
+ {__('Azioni rapide', 'gepafin')}
+
+
+
+
+
+
+
+
+ : <>
+
+
+
+
+
+
+
+
+ >}
+
+ )
+
+}
+
+export default EvaluationEdit;
\ No newline at end of file
diff --git a/src/pages/Evaluations/index.js b/src/pages/Evaluations/index.js
new file mode 100644
index 0000000..f5913b7
--- /dev/null
+++ b/src/pages/Evaluations/index.js
@@ -0,0 +1,23 @@
+import React from 'react';
+import { __ } from '@wordpress/i18n';
+
+// components
+import MyEvaluationsTable from '../DashboardInstructor/components/MyEvaluationsTable';
+
+const Bandi = () => {
+ return(
+
+
+
{__('Domande da valutare', 'gepafin')}
+
+
+
+
+
+
+
+
+ )
+}
+
+export default Bandi;
\ No newline at end of file
diff --git a/src/pages/LoginAdmin/index.js b/src/pages/LoginAdmin/index.js
index 0fb1e3d..0470523 100644
--- a/src/pages/LoginAdmin/index.js
+++ b/src/pages/LoginAdmin/index.js
@@ -114,9 +114,9 @@ const LoginAdmin = () => {
label={__('Accedi', 'gepafin')}
disabled={loading}/>
-
+ link onClick={gotToResetPassword}/>*/}
diff --git a/src/pages/Profile/index.js b/src/pages/Profile/index.js
index 35fbd56..d7b3474 100644
--- a/src/pages/Profile/index.js
+++ b/src/pages/Profile/index.js
@@ -129,88 +129,7 @@ const Profile = () => {