diff --git a/.env b/.env
index 0b1a428..9ef0c84 100644
--- a/.env
+++ b/.env
@@ -3,4 +3,5 @@ REACT_APP_API_EXECUTION_ADDRESS=https://api-dev-gepafin.memento.credit/v1
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
\ No newline at end of file
+REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs
+REACT_APP_EVALUATION_FLOW_ID=1
\ No newline at end of file
diff --git a/environments/dev/dev.env b/environments/dev/dev.env
index 0b1a428..9ef0c84 100644
--- a/environments/dev/dev.env
+++ b/environments/dev/dev.env
@@ -3,4 +3,5 @@ REACT_APP_API_EXECUTION_ADDRESS=https://api-dev-gepafin.memento.credit/v1
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
\ No newline at end of file
+REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs
+REACT_APP_EVALUATION_FLOW_ID=1
\ No newline at end of file
diff --git a/environments/prod/prod.env b/environments/prod/prod.env
index 6e25d7d..1755a33 100644
--- a/environments/prod/prod.env
+++ b/environments/prod/prod.env
@@ -3,4 +3,5 @@ REACT_APP_API_EXECUTION_ADDRESS=https://bandi-api.gepafin.it/v1
REACT_APP_API_ADDRESS=https://bandi-api.gepafin.it
REACT_APP_LOGO_FILENAME=gepafin-logo.svg
REACT_APP_FAVICON_FILENAME=gepafin-favicon.ico
-REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs
\ No newline at end of file
+REACT_APP_HUB_ID=p4lk3bcx1RStqTaIVVbXs
+REACT_APP_EVALUATION_FLOW_ID=1
\ No newline at end of file
diff --git a/src/assets/scss/components/appPage.scss b/src/assets/scss/components/appPage.scss
index 4a1771b..1d913b1 100644
--- a/src/assets/scss/components/appPage.scss
+++ b/src/assets/scss/components/appPage.scss
@@ -208,10 +208,18 @@
column-count: 2;
column-width: 4em;
display: block;
- padding-bottom: 0;
+ /*padding-bottom: 0;*/
.appPageSection__pMeta {
margin-bottom: 1em;
+
+ span:nth-of-type(1) {
+ max-width: 30%;
+ }
+ span:nth-of-type(2) {
+ max-width: 60%;
+ text-align: right;
+ }
}
}
}
@@ -221,22 +229,31 @@
flex-direction: column;
padding: 0;
width: 100%;
+ list-style: inside;
+}
- > li {
- padding: 15px;
- border-bottom: 1px solid var(--button-secondary-borderColor);
- display: flex;
- justify-content: space-between;
- align-items: center;
- flex-direction: column;
- gap: 1rem;
-
- &.row {
- flex-direction: row;
- }
+.appPageSection__listItem {
+ padding: 15px;
+ border-bottom: 1px solid var(--button-secondary-borderColor);
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ flex-direction: column;
+ gap: 1rem;
+
+ &.row {
+ flex-direction: row;
}
}
+.appPageSection__listItemRow {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ gap: 16px;
+ width: 100%;
+}
+
.appPageSection__checklist {
display: flex;
flex-direction: column;
diff --git a/src/assets/scss/components/myTable.scss b/src/assets/scss/components/myTable.scss
index bbfbb2a..67b3b41 100644
--- a/src/assets/scss/components/myTable.scss
+++ b/src/assets/scss/components/myTable.scss
@@ -23,6 +23,9 @@
border-width: 0 0 1px 0;
padding: 1rem 1rem;
}
+ tr.outgoing {
+ background-color: #DAF0C3B2;
+ }
}
.myTfoot {
diff --git a/src/components/FormField/components/Datepicker/index.js b/src/components/FormField/components/Datepicker/index.js
index b33c13c..f4164c5 100644
--- a/src/components/FormField/components/Datepicker/index.js
+++ b/src/components/FormField/components/Datepicker/index.js
@@ -1,7 +1,7 @@
import React from 'react';
import { classNames } from 'primereact/utils';
import { Controller } from 'react-hook-form';
-import { is } from 'ramda';
+import { is, isEmpty } from 'ramda';
import { Calendar } from 'primereact/calendar';
@@ -30,7 +30,7 @@ const Datepicker = ({
rules={config}
render={({ field, fieldState }) => ( field.onChange(e.value)}
dateFormat="dd/mm/yy"
hourFormat="24"
diff --git a/src/components/FormField/components/Fileupload/index.js b/src/components/FormField/components/Fileupload/index.js
index fe06a2e..70d716d 100644
--- a/src/components/FormField/components/Fileupload/index.js
+++ b/src/components/FormField/components/Fileupload/index.js
@@ -100,8 +100,8 @@ const Fileupload = ({
if (file.id) {
FileUploadService.deleteFile(
{},
- (data) => dCallback(data, file.id),
- dErrorCallback,
+ (data) => deleteCallback(data, file.id),
+ deleteErrorCallback,
[['id', file.id]]
);
} else {
@@ -111,7 +111,7 @@ const Fileupload = ({
}
}
- const dCallback = (data, id) => {
+ const deleteCallback = (data, id) => {
if (data.status === 'SUCCESS') {
setStateFieldData(prevState => {
const newFiles = prevState.filter(o => o.id !== id);
@@ -122,7 +122,7 @@ const Fileupload = ({
}
}
- const dErrorCallback = (err) => {
+ const deleteErrorCallback = (err) => {
console.log('err', err);
}
diff --git a/src/layouts/DefaultLayout/components/AppSidebar/index.js b/src/layouts/DefaultLayout/components/AppSidebar/index.js
index 5155f78..37aa0eb 100644
--- a/src/layouts/DefaultLayout/components/AppSidebar/index.js
+++ b/src/layouts/DefaultLayout/components/AppSidebar/index.js
@@ -41,6 +41,13 @@ const AppSidebar = () => {
id: 4,
enable: intersection(permissions, ['VIEW_CALLS']).length
},
+ {
+ label: __('Bandi osservati', 'gepafin'),
+ icon: 'pi pi-star',
+ href: '/bandi-osservati',
+ id: 13,
+ enable: intersection(permissions, ['VIEW_CALLS']).length
+ },
{
label: __('Gestione domande', 'gepafin'),
icon: 'pi pi-file',
diff --git a/src/pages/Bandi/components/AllBandiTable/index.js b/src/pages/Bandi/components/AllBandiTable/index.js
index 8276815..236098e 100644
--- a/src/pages/Bandi/components/AllBandiTable/index.js
+++ b/src/pages/Bandi/components/AllBandiTable/index.js
@@ -23,6 +23,7 @@ import { Calendar } from 'primereact/calendar';
import { Tag } from 'primereact/tag';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
import { Link } from 'react-router-dom';
+import translationStrings from '../../../../translationStringsForComponents';
const AllBandiTable = () => {
@@ -115,7 +116,7 @@ const AllBandiTable = () => {
};
const statusFilterTemplate = (options) => {
- return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" showClear />;
+ return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear />;
};
const statusItemTemplate = (option) => {
@@ -136,7 +137,7 @@ const AllBandiTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
onFilter={(e) => setFilters(e.filters)}>
{
+const AllBandiAccordion = ({ showOnlyPreferred = false }) => {
const chosenCompanyId = useStore().main.chosenCompanyId();
const isAsyncRequest = useStore().main.isAsyncRequest();
const [items, setItems] = useState(null);
@@ -40,7 +42,8 @@ const AllBandiAccordion = () => {
useEffect(() => {
storeSet.main.setAsyncRequest();
BandoService.getBandi(getCallback, errGetCallbacks, [
- ['companyId', chosenCompanyId]
+ ['companyId', chosenCompanyId],
+ ['onlyPreferredCall', showOnlyPreferred]
]);
}, [chosenCompanyId]);
@@ -81,7 +84,19 @@ const AllBandiAccordion = () => {
}
const amountBodyTemplate = (rowData) => {
- return getNumberWithCurrency(rowData.amount);
+ return {
+ let newExpandedRows;
+ if (isNil(expandedRows) || isNil(expandedRows[rowData.id])) {
+ newExpandedRows = isNil(expandedRows)
+ ? wrap({}).set([rowData.id], true).value()
+ : wrap(expandedRows).set([rowData.id], true).value();
+ } else {
+ newExpandedRows = wrap(expandedRows).del([rowData.id]).value();
+ }
+ setExpandedRows(newExpandedRows);
+ }}>{getNumberWithCurrency(rowData.amount)};
};
const statusBodyTemplate = (rowData) => {
@@ -89,11 +104,14 @@ const AllBandiAccordion = () => {
};
const statusFilterTemplate = (options) => {
- return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter" showClear />;
+ return options.filterCallback(e.value, options.index)}
+ itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"
+ showClear/>;
};
const statusItemTemplate = (option) => {
- return ;
+ return ;
};
const addToFavourites = (id, preferredId) => {
@@ -188,7 +206,7 @@ const AllBandiAccordion = () => {
loading={isAsyncRequest}
dataKey="id"
filters={filters}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
expandedRows={expandedRows}
onRowToggle={(e) => setExpandedRows(e.data)}
rowExpansionTemplate={rowExpansionTemplate}
@@ -198,7 +216,7 @@ const AllBandiAccordion = () => {
body={nameBodyTemplate}
style={{ minWidth: '12rem' }}/>
+ style={{ minWidth: '10rem' }} body={amountBodyTemplate}/>
diff --git a/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js
new file mode 100644
index 0000000..3a8ca31
--- /dev/null
+++ b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js
@@ -0,0 +1,216 @@
+import React, { useState, useEffect} from 'react';
+import { __ } from '@wordpress/i18n';
+import { is, uniq, isNil, isEmpty } from 'ramda';
+import { wrap } from 'object-path-immutable';
+import { useNavigate } from 'react-router-dom';
+
+// store
+import { storeGet, storeSet, useStore } from '../../../../store';
+
+// tools
+import getBandoSeverity from '../../../../helpers/getBandoSeverity';
+import getBandoLabel from '../../../../helpers/getBandoLabel';
+import getDateFromISOstring from '../../../../helpers/getDateFromISOstring';
+import set404FromErrorResponse from '../../../../helpers/set404FromErrorResponse';
+import getNumberWithCurrency from '../../../../helpers/getNumberWithCurrency';
+import renderHtmlContent from '../../../../helpers/renderHtmlContent';
+
+// api
+import PreferredBandoService from '../../../../service/preferred-bando-service';
+
+// components
+import { DataTable } from 'primereact/datatable';
+import { Column } from 'primereact/column';
+import { Dropdown } from 'primereact/dropdown';
+import { Tag } from 'primereact/tag';
+import ProperBandoLabel from '../../../../components/ProperBandoLabel';
+import { Button } from 'primereact/button';
+import translationStrings from '../../../../translationStringsForComponents';
+
+
+const AllBandiPreferredAccordion = () => {
+ const chosenCompanyId = useStore().main.chosenCompanyId();
+ const isAsyncRequest = useStore().main.isAsyncRequest();
+ const [items, setItems] = useState(null);
+ const [filters, setFilters] = useState(null);
+ const [expandedRows, setExpandedRows] = useState(null);
+ const [statuses, setStatuses] = useState([]);
+ const navigate = useNavigate();
+
+ useEffect(() => {
+ storeSet.main.setAsyncRequest();
+ const userData = storeGet.main.userData();
+ PreferredBandoService.getPreferredCalls(getCallback, errGetCallbacks, [
+ ['companyId', chosenCompanyId],
+ ['userId', userData.id]
+ ]);
+ }, [chosenCompanyId]);
+
+ const getCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ setItems(getFormattedBandiData(data.data));
+ setStatuses(uniq(data.data.map(o => o.status)))
+ }
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const errGetCallbacks = (data) => {
+ set404FromErrorResponse(data);
+ storeSet.main.unsetAsyncRequest();
+ }
+
+ const getFormattedBandiData = (data) => {
+ return data.map((d) => {
+ d.dates = d.dates.map(v => is(String, v) ? new Date(v) : (v ? v : ''));
+ return d;
+ });
+ };
+
+ const nameBodyTemplate = (rowData) => {
+ return {
+ let newExpandedRows;
+ if (isNil(expandedRows) || isNil(expandedRows[rowData.id])) {
+ newExpandedRows = isNil(expandedRows)
+ ? wrap({}).set([rowData.id], true).value()
+ : wrap(expandedRows).set([rowData.id], true).value();
+ } else {
+ newExpandedRows = wrap(expandedRows).del([rowData.id]).value();
+ }
+ setExpandedRows(newExpandedRows);
+ }}>{rowData.name}
+ }
+
+ const amountBodyTemplate = (rowData) => {
+ return getNumberWithCurrency(rowData.amount);
+ };
+
+ const statusBodyTemplate = (rowData) => {
+ return ;
+ };
+
+ const statusFilterTemplate = (options) => {
+ return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear />;
+ };
+
+ const statusItemTemplate = (option) => {
+ return ;
+ };
+
+ const addToFavourites = (id, preferredId) => {
+ const companyId = storeGet.main.chosenCompanyId()
+ const data = {
+ companyId,
+ callId: id
+ }
+ if (preferredId && preferredId !== 0) {
+ PreferredBandoService.deleteFromPreferred(preferredId, (data) => removeFavCallback(data, id), errToggleFavCallback);
+ } else {
+ PreferredBandoService.addToPreferred(data, addFavCallback, errToggleFavCallback);
+ }
+ }
+
+ const removeFavCallback = (data, id) => {
+ if (data.status === 'SUCCESS') {
+ const newItems = items.map((o) => {
+ if (o.id === id) {
+ return {
+ ...o,
+ preferredCallId: null
+ }
+ } else {
+ return o;
+ }
+ });
+ setItems(newItems)
+ }
+ }
+ const addFavCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ const newItems = items.map((o) => {
+ if (o.id === data.data.callId) {
+ return {
+ ...o,
+ preferredCallId: data.data.id
+ }
+ } else {
+ return o;
+ }
+ });
+ setItems(newItems)
+ }
+ }
+
+ const errToggleFavCallback = (data) => {
+ set404FromErrorResponse(data);
+ }
+
+ const goToBandoPage = (id) => {
+ navigate(`/bandi/${id}`)
+ }
+
+ const actionsBodyTemplate = (rowData) => {
+ return
+
+
+ }
+
+ const rowExpansionTemplate = (data) => {
+ return (
+
+ {renderHtmlContent(data.descriptionShort)}
+
{__('Scadenza', 'gepafin')}: {getDateFromISOstring(data.dates[1])}
+ {!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && !data.confidi
+ ?
: null}
+ {!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && data.confidi
+ ?
: null}
+
+ );
+ };
+
+ const allowExpansion = (rowData) => {
+ return true;
+ };
+
+ return(
+
+ setExpandedRows(e.data)}
+ rowExpansionTemplate={rowExpansionTemplate}
+ onFilter={(e) => setFilters(e.filters)}>
+
+
+
+
+ {!isEmpty(chosenCompanyId) && chosenCompanyId !== 0
+ ? : null}
+
+
+ )
+}
+
+export default AllBandiPreferredAccordion;
\ No newline at end of file
diff --git a/src/pages/BandiPreferredBeneficiario/index.js b/src/pages/BandiPreferredBeneficiario/index.js
new file mode 100644
index 0000000..e6e2063
--- /dev/null
+++ b/src/pages/BandiPreferredBeneficiario/index.js
@@ -0,0 +1,43 @@
+import React from 'react';
+import { __ } from '@wordpress/i18n';
+import { Link } from 'react-router-dom';
+import { isEmpty } from 'ramda';
+
+// store
+import { useStore } from '../../store';
+
+// components
+import AllBandiAccordion from '../BandiBeneficiario/components/AllBandiAccordion';
+
+const BandiPreferredBeneficiario = () => {
+ const chosenCompanyId = useStore().main.chosenCompanyId();
+
+ return (
+
+
+
{__('Bandi osservati', 'gepafin')}
+
+
+
+
+ {isEmpty(chosenCompanyId) || chosenCompanyId === 0
+ ? <>
+
+
+ {__('Attenzione', 'gepafin')}
+
+ {__('Per applicare ai bandi devi Registare un Azienda clicca', 'gepafin')}
+ {__('qua', 'gepafin')}
+
+
+
+ > : null}
+
+
+
+ )
+}
+
+export default BandiPreferredBeneficiario;
\ No newline at end of file
diff --git a/src/pages/BandoEdit/components/BandoEditFormStep2/index.js b/src/pages/BandoEdit/components/BandoEditFormStep2/index.js
index 8ce097e..d8483b2 100644
--- a/src/pages/BandoEdit/components/BandoEditFormStep2/index.js
+++ b/src/pages/BandoEdit/components/BandoEditFormStep2/index.js
@@ -284,7 +284,7 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, setInitialData, g
options={checklistOptions}
errors={errors}
register={register}
- label={<>{__('Checklist valutazione Pre-Istruttoria', 'gepafin')}*
+ label={<>{__('Checklist valutazione Istruttoria', 'gepafin')}*
{__('(almeno 1 elemento)', 'gepafin')}>}
config={{
validate: {
diff --git a/src/pages/Dashboard/components/DraftApplicationsTable/index.js b/src/pages/Dashboard/components/DraftApplicationsTable/index.js
index 63518ff..a356d68 100644
--- a/src/pages/Dashboard/components/DraftApplicationsTable/index.js
+++ b/src/pages/Dashboard/components/DraftApplicationsTable/index.js
@@ -26,6 +26,7 @@ import { Button } from 'primereact/button';
import { Tag } from 'primereact/tag';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
import { Link } from 'react-router-dom';
+import translationStrings from '../../../../translationStringsForComponents';
const DraftApplicationsTable = () => {
const chosenCompanyId = useStore().main.chosenCompanyId();
@@ -142,7 +143,7 @@ const DraftApplicationsTable = () => {
const statusFilterTemplate = (options) => {
return options.filterCallback(e.value, options.index)}
- itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter"
+ itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"
showClear/>;
};
@@ -169,12 +170,18 @@ const DraftApplicationsTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
onFilter={(e) => setFilters(e.filters)}>
-
+
{/* {
style={{ minWidth: '8rem' }}
body={dateModifyBodyTemplate} filter filterElement={dateFilterTemplate}/>*/}
diff --git a/src/pages/Dashboard/components/LatestBandiTable/index.js b/src/pages/Dashboard/components/LatestBandiTable/index.js
index b1b1b36..94f32da 100644
--- a/src/pages/Dashboard/components/LatestBandiTable/index.js
+++ b/src/pages/Dashboard/components/LatestBandiTable/index.js
@@ -16,6 +16,7 @@ import { Button } from 'primereact/button';
import { Calendar } from 'primereact/calendar';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
import { Link } from 'react-router-dom';
+import translationStrings from '../../../../translationStringsForComponents';
const LatestBandiTable = () => {
@@ -23,7 +24,7 @@ const LatestBandiTable = () => {
const [filters, setFilters] = useState(null);
const [localAsyncRequest, setLocalAsyncRequest] = useState(false);
const [globalFilterValue, setGlobalFilterValue] = useState('');
- const [statuses, setStatuses] = useState([]);
+ const [, setStatuses] = useState([]);
useEffect(() => {
setLocalAsyncRequest(true);
@@ -128,7 +129,7 @@ const LatestBandiTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
onFilter={(e) => setFilters(e.filters)}>
diff --git a/src/pages/Dashboard/components/LatestUsersActivityTable/index.js b/src/pages/Dashboard/components/LatestUsersActivityTable/index.js
index 3473117..1c015c1 100644
--- a/src/pages/Dashboard/components/LatestUsersActivityTable/index.js
+++ b/src/pages/Dashboard/components/LatestUsersActivityTable/index.js
@@ -107,7 +107,7 @@ const LatestUsersActivityTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}{__('Nessun dato disponibile', 'gepafin')}
onFilter={(e) => setFilters(e.filters)}>
{
@@ -29,7 +33,7 @@ const LatestBandiTable = () => {
const [filters, setFilters] = useState(null);
const [loading, setLoading] = useState(false);
const [globalFilterValue, setGlobalFilterValue] = useState('');
- const [statuses, setStatuses] = useState([]);
+ const [, setStatuses] = useState([]);
useEffect(() => {
setLoading(true);
@@ -209,7 +213,7 @@ const LatestBandiTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
onFilter={(e) => setFilters(e.filters)}>
{
const chosenCompanyId = useStore().main.chosenCompanyId();
@@ -145,7 +146,7 @@ const MyLatestSubmissionsTable = () => {
const statusFilterTemplate = (options) => {
return options.filterCallback(e.value, options.index)}
- itemTemplate={statusItemTemplate} placeholder="Select One" className="p-column-filter"
+ itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter"
showClear/>;
};
@@ -175,18 +176,28 @@ const MyLatestSubmissionsTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
onFilter={(e) => setFilters(e.filters)}>
-
+
+ body={dateEndBodyTemplate}
+ filter
+ filterElement={dateFilterTemplate}/>
+ body={dateModifyBodyTemplate}
+ filter
+ filterElement={dateFilterTemplate}/>
diff --git a/src/pages/DashboardBeneficiario/index.js b/src/pages/DashboardBeneficiario/index.js
index 6503111..66ac510 100644
--- a/src/pages/DashboardBeneficiario/index.js
+++ b/src/pages/DashboardBeneficiario/index.js
@@ -1,5 +1,5 @@
import React, { useEffect, useState } from 'react';
-import { __, sprintf } from '@wordpress/i18n';
+import { __ } from '@wordpress/i18n';
import { Link, useNavigate } from 'react-router-dom';
import { head, isEmpty, pathOr } from 'ramda';
import NumberFlow from '@number-flow/react';
diff --git a/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js
index 5e53e82..0a8b59a 100644
--- a/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js
+++ b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js
@@ -9,6 +9,10 @@ import { useStore } from '../../../../store';
// api
import AssignedApplicationService from '../../../../service/assigned-application-service';
+// tools
+import getBandoLabel from '../../../../helpers/getBandoLabel';
+import getBandoSeverity from '../../../../helpers/getBandoSeverity';
+
// components
import { FilterMatchMode, FilterOperator } from 'primereact/api';
import { DataTable } from 'primereact/datatable';
@@ -19,7 +23,10 @@ import { InputIcon } from 'primereact/inputicon';
import { Button } from 'primereact/button';
import { Calendar } from 'primereact/calendar';
import ProperBandoLabel from '../../../../components/ProperBandoLabel';
+import { Dropdown } from 'primereact/dropdown';
+import { Tag } from 'primereact/tag';
+import translationStrings from '../../../../translationStringsForComponents';
const PreInstructorDomandeTable = () => {
const userData = useStore().main.userData();
@@ -126,6 +133,14 @@ const PreInstructorDomandeTable = () => {
return ;
};
+ const statusFilterTemplate = (options) => {
+ return options.filterCallback(e.value, options.index)} itemTemplate={statusItemTemplate} placeholder={translationStrings.selectOneLabel} className="p-column-filter" showClear />;
+ };
+
+ const statusItemTemplate = (option) => {
+ return ;
+ };
+
const actionsBodyTemplate = (rowData) => {
return
@@ -140,13 +155,18 @@ const PreInstructorDomandeTable = () => {
filters={filters}
globalFilterFields={['name', 'status']}
header={header}
- emptyMessage={__('Nessun dato disponibile', 'gepafin')}
+ emptyMessage={translationStrings.emptyMessage}
onFilter={(e) => setFilters(e.filters)}>
+
{
style={{ minWidth: '8rem' }}
body={dateEndBodyTemplate} filter filterElement={dateFilterTemplate}/>
+ style={{ minWidth: '7rem' }} body={statusBodyTemplate} filter
+ filterElement={statusFilterTemplate} />
diff --git a/src/pages/DomandaBeneficiario/index.js b/src/pages/DomandaBeneficiario/index.js
index 7c618e2..3ba58ae 100644
--- a/src/pages/DomandaBeneficiario/index.js
+++ b/src/pages/DomandaBeneficiario/index.js
@@ -1,32 +1,30 @@
-import React, { useState, useEffect, useRef } from 'react';
+import React, { useState, useEffect, useRef, useMemo } from 'react';
import { __, sprintf } from '@wordpress/i18n';
import { useNavigate, useParams } from 'react-router-dom';
-import { is, isEmpty, isNil } from 'ramda';
-import { wrap } from 'object-path-immutable';
+import { is, isEmpty } from 'ramda';
+import { useForm } from 'react-hook-form';
+import { klona } from 'klona';
// store
import { storeSet, useStore } from '../../store';
// api
import AmendmentsService from '../../service/amendments-service';
-import CommunicationService from '../../service/communication-service';
+import ApplicationService from '../../service/application-service';
// tools
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
import getBandoLabel from '../../helpers/getBandoLabel';
import getDateFromISOstring from '../../helpers/getDateFromISOstring';
import renderHtmlContent from '../../helpers/renderHtmlContent';
-import uniqid from '../../helpers/uniqid';
// components
import { Button } from 'primereact/button';
import BlockingOverlay from '../../components/BlockingOverlay';
import { Toast } from 'primereact/toast';
-import { classNames } from 'primereact/utils';
import { Dialog } from 'primereact/dialog';
-import { InputText } from 'primereact/inputtext';
-import { InputTextarea } from 'primereact/inputtextarea';
-import ApplicationService from '../../service/application-service';
+import FormField from '../../components/FormField';
+import SoccorsoComunications from '../SoccorsoEditPreInstructor/components/SoccorsoComunications';
const DomandaBeneficiario = () => {
const isAsyncRequest = useStore().main.isAsyncRequest();
@@ -34,12 +32,22 @@ const DomandaBeneficiario = () => {
const navigate = useNavigate();
const [data, setData] = useState({});
const [dataAppl, setDataAppl] = useState({});
- const [comms, setComms] = useState([]);
- const [isVisibleNewCommDialog, setIsVisibleNewCommDialog] = useState(false);
- const [newCommData, setNewCommData] = useState({});
- const [isLoadingCommunication, setIsLoadingCommunication] = useState(false);
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`);
@@ -57,8 +65,15 @@ const DomandaBeneficiario = () => {
const getCallback = (data) => {
if (data.status === 'SUCCESS') {
if (data.data.length) {
- setData(getFormattedData(data.data[0]));
- CommunicationService.getCommsByAmendmentId(data.data[0].id, getCommsCallback, errGetCommsCallback);
+ const amendmentObj = data.data[0];
+ setData(getFormattedData(amendmentObj));
+ const formDataInitial = amendmentObj.applicationFormFields.reduce((acc, cur) => {
+ if (cur.fieldValue) {
+ acc[cur.fieldId] = cur.fieldValue;
+ }
+ return acc;
+ }, {});
+ setFormInitialData(formDataInitial);
storeSet.main.unsetAsyncRequest();
} else {
ApplicationService.getApplication(id, getApplCallback, errGetCallback)
@@ -85,25 +100,6 @@ const DomandaBeneficiario = () => {
storeSet.main.unsetAsyncRequest();
}
- const getCommsCallback = (data) => {
- if (data.status === 'SUCCESS') {
- setComms(data.data.commentsList.map(o => getFormattedCommsData(o)));
- }
- storeSet.main.unsetAsyncRequest();
- }
-
- const errGetCommsCallback = (data) => {
- if (toast.current && data.message) {
- toast.current.show({
- severity: 'error',
- summary: '',
- detail: data.message
- });
- }
- set404FromErrorResponse(data);
- storeSet.main.unsetAsyncRequest();
- }
-
const getFormattedData = (data) => {
data.submissionDate = is(String, data.submissionDate) ? new Date(data.submissionDate) : (data.submissionDate ? data.submissionDate : '');
data.startDate = is(String, data.startDate) ? new Date(data.startDate) : (data.startDate ? data.startDate : '');
@@ -111,55 +107,36 @@ const DomandaBeneficiario = () => {
return data;
};
- const getFormattedCommsData = (data) => {
- data.id = isNil(data.id) ? uniqid('id') : data.id;
- data.commentedDate = is(String, data.commentedDate) ? new Date(data.commentedDate) : (data.commentedDate ? data.commentedDate : '');
- data.createdDate = is(String, data.createdDate) ? new Date(data.createdDate) : (data.createdDate ? data.createdDate : '');
- data.updatedDate = is(String, data.updatedDate) ? new Date(data.updatedDate) : (data.updatedDate ? data.updatedDate : '');
- return data;
+ const onSubmit = () => {
};
- const headerNewComDialog = () => {
- return {__('Aggiungi comunicazione', 'gepafin')}
+ const doUpdateAmendment = () => {
+ trigger();
+ let formValues = klona(getValues());
+ const newFormValues = Object.keys(formValues)
+ .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 submitData = {
+ applicationFormFields: newFormValues,
+ }
+ const amendmentId = data.id;
+
+ storeSet.main.setAsyncRequest();
+ AmendmentsService.updateSoccorso(amendmentId, submitData, updateAmendmentCallback, errUpdateAmendmentCallback);
}
- const hideNewComDialog = () => {
- setIsVisibleNewCommDialog(false);
- setNewCommData({
- title: '',
- comment: ''
- });
- }
-
- const footerNewComDialog = () => {
- return
-
-
- }
-
- const openNewCommDialog = () => {
- setIsVisibleNewCommDialog(true);
- setNewCommData({
- title: '',
- comment: ''
- });
- }
-
- const updateNewCommData = (value, path) => {
- const newData = wrap(newCommData).set(path.split('.'), value).value();
- setNewCommData(newData);
- }
-
- const createCommunication = () => {
- setIsLoadingCommunication(true);
- CommunicationService.createCommunication(data.id, newCommData, createCommunicationCallback, errCreateCommunicationCallback);
- }
-
- const createCommunicationCallback = (data) => {
+ const updateAmendmentCallback = (data) => {
if (data.status === 'SUCCESS') {
if (toast.current) {
toast.current.show({
@@ -168,13 +145,18 @@ const DomandaBeneficiario = () => {
detail: data.message
});
}
- setComms([...comms, getFormattedCommsData(data.data)])
- setIsVisibleNewCommDialog(false);
+ const newFormDataInitial = data.data.applicationFormFields.reduce((acc, cur) => {
+ if (cur.fieldValue) {
+ acc[cur.fieldId] = cur.fieldValue;
+ }
+ return acc;
+ }, formInitialData);
+ setFormInitialData(newFormDataInitial);
}
- setIsLoadingCommunication(false);
+ storeSet.main.unsetAsyncRequest();
}
- const errCreateCommunicationCallback = (data) => {
+ const errUpdateAmendmentCallback = (data) => {
if (toast.current && data.message) {
toast.current.show({
severity: 'error',
@@ -182,10 +164,18 @@ const DomandaBeneficiario = () => {
detail: data.message
});
}
- set404FromErrorResponse(data);
- setIsLoadingCommunication(false);
+ //set404FromErrorResponse(data);
+ storeSet.main.unsetAsyncRequest();
}
+ useEffect(() => {
+ if (formInitialData) {
+ //reset();
+ Object.keys(formInitialData).map(k => setValue(k, formInitialData[k]));
+ trigger();
+ }
+ }, [formInitialData]);
+
return (
@@ -272,61 +262,51 @@ const DomandaBeneficiario = () => {
{data.id
?
-
{__('Dettagli Richiesta', 'gepafin')}
-
{__('Documenti Richiesti', 'gepafin')}
-
+ {__('Dettagli Richiesta', 'gepafin')}
+ {__('Note e spiegazioni', 'gepafin')}
+
+ {renderHtmlContent(data.note)}
+
+
: null}
+
+ {data.id
+ ?
+
{__('Documenti Richiesti', 'gepafin')}
+
+ {/*
{data.formFields
? data.formFields.map((o, i) => -
{o.label}
) : null}
-
-
: null}
+ */}
+
: null}
{data.id
?
-
{__('Note e spiegazioni', 'gepafin')}
-
- {renderHtmlContent(data.note)}
-
-
: null}
-
- {data.id
- ?
-
{__('Comunicazioni', 'gepafin')}
-
-
-
- | {__('Data', 'gepafin')} |
- {__('Comunicazione', 'gepafin')} |
-
-
-
- {!isNil(comms) && !isEmpty(comms)
- ? comms.map((o, i) =>
- |
- {getDateFromISOstring(o.commentedDate)}
- |
-
- {o.title}
- {o.comment}
- |
-
)
- :
- | - |
- - |
-
}
-
-
-
-
+
{__('Comunicazioni', 'gepafin')}
+
: null}
{data.id
@@ -354,40 +334,8 @@ const DomandaBeneficiario = () => {
icon="pi pi-times" iconPos="right"/>
-
-
-
-
{__('Stato', 'gepafin')}
- {getBandoLabel(data.status)}
+ {getBandoLabel(data.applicationStatus)}
-
-
-
+
{__('Punteggi di valutazione', 'gepafin')}
@@ -350,7 +420,7 @@ const DomandaEditPreInstructor = () => {
{
onClick={() => displayCriterionData(o.id)}
aria-label={__('Mostra', 'gepafin')}/> : null}
|