From 6739dd87b1f77c2c458f48dfe3f255572b692e33 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 20 Nov 2024 09:24:15 +0100 Subject: [PATCH 01/12] - issue of saving files for amendement - added form autosaving; --- src/pages/SoccorsoEditPreInstructor/index.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/pages/SoccorsoEditPreInstructor/index.js b/src/pages/SoccorsoEditPreInstructor/index.js index 573a43e..6a3bcc4 100644 --- a/src/pages/SoccorsoEditPreInstructor/index.js +++ b/src/pages/SoccorsoEditPreInstructor/index.js @@ -397,6 +397,8 @@ const SoccorsoEditPreInstructor = () => { AmendmentsService.getSoccorsoById(getCallback, errGetCallback, [['id', soccorsoEntityId]]); }, [amendmentId]); + console.log('formInitialData', formInitialData) + return (
@@ -519,6 +521,7 @@ const SoccorsoEditPreInstructor = () => { disabled={data.status === 'CLOSE'} type="fileupload" setDataFn={setValue} + saveFormCallback={doUpdateAmendment} fieldName={o.fieldId} label={o.label} control={control} From 1510ce4851b441fec34c3848f7dc1c3eba428a0b Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 20 Nov 2024 11:14:22 +0100 Subject: [PATCH 02/12] - implemented API way of deletin company, hid by now, but ready to be shipped; --- src/pages/ProfileCompany/index.js | 30 +++++++++++++++++++++++++++++- src/service/company-service.js | 4 ++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/pages/ProfileCompany/index.js b/src/pages/ProfileCompany/index.js index 1c77ec5..fb25389 100644 --- a/src/pages/ProfileCompany/index.js +++ b/src/pages/ProfileCompany/index.js @@ -5,6 +5,7 @@ import { klona } from 'klona'; import { wrap } from 'object-path-immutable'; import { useForm } from 'react-hook-form'; import emailjs from '@emailjs/browser'; +import { useNavigate } from 'react-router-dom'; // store import { storeSet, useStore, storeGet } from '../../store'; @@ -40,6 +41,7 @@ const ProfileCompany = () => { const [isVisibleRemoveDialog, setIsVisibleRemoveDialog] = useState(false); const { delegaFirstName = '', delegaLastName = '', delegaCodiceFiscale = '' } = delegaData; const toast = useRef(null); + const navigate = useNavigate(); const { control, @@ -268,9 +270,35 @@ const ProfileCompany = () => { }); } }); - } + // TODO delete company functionality by API, ready to be shipped + /*const doRemoveCompanyAPI = () => { + storeSet.main.setAsyncRequest(); + CompanyService.deleteCompany(formInitialData.id, deleteCompanyCallback, errDeleteCompanyCallback) + } + + const deleteCompanyCallback = (data) => { + if (data.status === 'SUCCESS') { + const userData = storeGet.main.userData(); + const newCompanies = companies.filter(o => o.id !== chosenCompanyId); + const newUserData = wrap(userData).set('company', newCompanies).value(); + storeSet.main.companies(newUserData.companies); + storeSet.main.userData(newUserData); + + if (!isEmpty(newCompanies)) { + const newChosenCompanyId = newCompanies[0].id; + storeSet.main.chosenCompanyId(newChosenCompanyId); + } + } + storeSet.main.unsetAsyncRequest(); + } + + const errDeleteCompanyCallback = (data) => { + set404FromErrorResponse(data); + storeSet.main.unsetAsyncRequest(); + }*/ + useEffect(() => { const newFormData = klona(formInitialData); Object.keys(newFormData).map(v => setValue(v, newFormData[v])); diff --git a/src/service/company-service.js b/src/service/company-service.js index 7f96156..e3eeeb8 100644 --- a/src/service/company-service.js +++ b/src/service/company-service.js @@ -35,4 +35,8 @@ export default class CompanyService { static deleteDelega = (id, callback, errCallback) => { NetworkService.delete(`${API_BASE_URL}/company/${id}/delegation`, {}, callback, errCallback); }; + + static deleteCompany = (id, callback, errCallback) => { + NetworkService.delete(`${API_BASE_URL}/company/${id}`, {}, callback, errCallback); + }; } From 7c4b511dac0914505458b7b9c2b16dba0fdd25f7 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 20 Nov 2024 11:26:41 +0100 Subject: [PATCH 03/12] - fixed request data for update ammendment API; --- src/pages/SoccorsoEditPreInstructor/index.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pages/SoccorsoEditPreInstructor/index.js b/src/pages/SoccorsoEditPreInstructor/index.js index 6a3bcc4..3ee425e 100644 --- a/src/pages/SoccorsoEditPreInstructor/index.js +++ b/src/pages/SoccorsoEditPreInstructor/index.js @@ -238,7 +238,7 @@ const SoccorsoEditPreInstructor = () => { }, []); const submitData = { - updatedFormFields: newFormValues, + applicationFormFields: newFormValues, } storeSet.main.setAsyncRequest(); @@ -537,12 +537,12 @@ const SoccorsoEditPreInstructor = () => { }) : null} -
From cf5ff862b71f67f15537a8fd4c31340486132713 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 20 Nov 2024 12:07:09 +0100 Subject: [PATCH 04/12] - saving progress; --- .../components/AppSidebar/index.js | 7 + .../AllBandiPreferredAccordion/index.js | 215 ++++++++++++++++++ src/pages/BandiPreferredBeneficiario/index.js | 43 ++++ src/routes.js | 6 + src/service/preferred-bando-service.js | 4 + 5 files changed, 275 insertions(+) create mode 100644 src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js create mode 100644 src/pages/BandiPreferredBeneficiario/index.js 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/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js new file mode 100644 index 0000000..f1c7495 --- /dev/null +++ b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js @@ -0,0 +1,215 @@ +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'; + + +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="Select One" 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..360090f --- /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 AllBandiPreferredAccordion from './components/AllBandiPreferredAccordion'; + +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/routes.js b/src/routes.js index dfb0234..34a9ba3 100644 --- a/src/routes.js +++ b/src/routes.js @@ -36,6 +36,7 @@ import SoccorsoAddPreInstructor from './pages/SoccorsoAddPreInstructor'; import DomandeBeneficiario from './pages/DomandeBeneficiario'; import DomandaBeneficiario from './pages/DomandaBeneficiario'; import BandoApplicationPreview from './pages/BandoApplicationPreview'; +import BandiPreferredBeneficiario from './pages/BandiPreferredBeneficiario'; const routes = ({ role, chosenCompanyId }) => { @@ -87,6 +88,11 @@ const routes = ({ role, chosenCompanyId }) => { {'ROLE_BENEFICIARY' === role ? : null} {'ROLE_PRE_INSTRUCTOR' === role ? : null} }/> + + {'ROLE_SUPER_ADMIN' === role ? : null} + {'ROLE_BENEFICIARY' === role ? : null} + {'ROLE_PRE_INSTRUCTOR' === role ? : null} + }/> {'ROLE_SUPER_ADMIN' === role ? : null} {'ROLE_BENEFICIARY' === role ? : null} diff --git a/src/service/preferred-bando-service.js b/src/service/preferred-bando-service.js index 95416af..cf34594 100644 --- a/src/service/preferred-bando-service.js +++ b/src/service/preferred-bando-service.js @@ -11,4 +11,8 @@ export default class PreferredBandoService { static deleteFromPreferred = (id, callback, errCallback) => { NetworkService.delete(`${API_BASE_URL}/beneficiaryPreferredCall/${id}`, {}, callback, errCallback); }; + + static getPreferredCalls = (callback, errCallback, queryParams) => { + NetworkService.get(`${API_BASE_URL}/beneficiaryPreferredCall/user`, callback, errCallback, queryParams); + }; } From 7c2feb20c776e579c5edd0685e02f6210f3a4cb1 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Thu, 21 Nov 2024 08:44:22 +0100 Subject: [PATCH 05/12] - added company name to tables with applications; - added form and file inputs to the page of editing/viewing soccorso for beneficiary; --- .../components/BandoEditFormStep2/index.js | 2 +- .../DraftApplicationsTable/index.js | 13 +- .../MyLatestSubmissionsTable/index.js | 18 +- .../PreInstructorDomandeTable/index.js | 9 +- src/pages/DomandaBeneficiario/index.js | 199 +++++++++++++----- src/pages/DomandaEditPreInstructor/index.js | 24 ++- .../components/AllDomandeTable/index.js | 10 +- src/pages/Domande/index.js | 2 +- .../BeneficiarioDomandeTable/index.js | 12 +- src/pages/ProfileCompany/index.js | 4 +- src/pages/SoccorsoEditPreInstructor/index.js | 9 - 11 files changed, 217 insertions(+), 85 deletions(-) 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..6530216 100644 --- a/src/pages/Dashboard/components/DraftApplicationsTable/index.js +++ b/src/pages/Dashboard/components/DraftApplicationsTable/index.js @@ -172,9 +172,15 @@ const DraftApplicationsTable = () => { emptyMessage={__('Nessun dato disponibile', 'gepafin')} onFilter={(e) => setFilters(e.filters)}> - + {/* { style={{ minWidth: '8rem' }} body={dateModifyBodyTemplate} filter filterElement={dateFilterTemplate}/>*/} diff --git a/src/pages/DashboardBeneficiario/components/MyLatestSubmissionsTable/index.js b/src/pages/DashboardBeneficiario/components/MyLatestSubmissionsTable/index.js index ce3f987..d5a4f84 100644 --- a/src/pages/DashboardBeneficiario/components/MyLatestSubmissionsTable/index.js +++ b/src/pages/DashboardBeneficiario/components/MyLatestSubmissionsTable/index.js @@ -177,16 +177,26 @@ const MyLatestSubmissionsTable = () => { header={header} emptyMessage={__('Nessun dato disponibile', 'gepafin')} onFilter={(e) => setFilters(e.filters)}> - + + body={dateEndBodyTemplate} + filter + filterElement={dateFilterTemplate}/> + body={dateModifyBodyTemplate} + filter + filterElement={dateFilterTemplate}/> diff --git a/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js index 5e53e82..78de5dc 100644 --- a/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js +++ b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js @@ -143,10 +143,15 @@ const PreInstructorDomandeTable = () => { emptyMessage={__('Nessun dato disponibile', 'gepafin')} onFilter={(e) => setFilters(e.filters)}> + { const isAsyncRequest = useStore().main.isAsyncRequest(); @@ -40,6 +43,20 @@ const DomandaBeneficiario = () => { 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 +74,16 @@ 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); + CommunicationService.getCommsByAmendmentId(amendmentObj.id, getCommsCallback, errGetCommsCallback); storeSet.main.unsetAsyncRequest(); } else { ApplicationService.getApplication(id, getApplCallback, errGetCallback) @@ -186,6 +211,60 @@ const DomandaBeneficiario = () => { setIsLoadingCommunication(false); } + const onSubmit = () => { + }; + + 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 updateAmendmentCallback = (data) => { + if (data.status === 'SUCCESS') { + if (toast.current) { + toast.current.show({ + severity: 'success', + summary: '', + detail: data.message + }); + } + } + storeSet.main.unsetAsyncRequest(); + } + + const errUpdateAmendmentCallback = (data) => { + if (toast.current && data.message) { + toast.current.show({ + severity: 'error', + summary: '', + detail: data.message + }); + } + set404FromErrorResponse(data); + storeSet.main.unsetAsyncRequest(); + } + return (
@@ -272,59 +351,85 @@ 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) => { + /*const thisField = head(test.updatedFormFields.filter(j => j.fieldId === o.fieldId)); + const value = pathOr({}, ['fieldValue'], thisField); + console.log('value', value, o.fieldId);*/ + return + }) : null} + + {/*
    {data.formFields ? data.formFields.map((o, i) =>
  1. {o.label}
  2. ) : null} -
-
: null} + */} +
: null} {data.id ?
-

{__('Note e spiegazioni', 'gepafin')}

-
- {renderHtmlContent(data.note)} -
-
: null} +

{__('Comunicazioni', 'gepafin')}

+ + + + + + + + + {!isNil(comms) && !isEmpty(comms) + ? comms.map((o, i) => + + + ) + : + + + } + +
{__('Data', 'gepafin')}{__('Comunicazione', 'gepafin')}
+ {getDateFromISOstring(o.commentedDate)} + +

{o.title}

+

{o.comment}

+
--
- {data.id - ?
-

{__('Comunicazioni', 'gepafin')}

- - - - - - - - - {!isNil(comms) && !isEmpty(comms) - ? comms.map((o, i) => - - - ) - : - - - } - -
{__('Data', 'gepafin')}{__('Comunicazione', 'gepafin')}
- {getDateFromISOstring(o.commentedDate)} - -

{o.title}

-

{o.comment}

-
--
- -
: null} diff --git a/src/pages/DomandaEditPreInstructor/index.js b/src/pages/DomandaEditPreInstructor/index.js index 82d1dd3..5ca8898 100644 --- a/src/pages/DomandaEditPreInstructor/index.js +++ b/src/pages/DomandaEditPreInstructor/index.js @@ -102,7 +102,7 @@ const DomandaEditPreInstructor = () => { const updateEvaluationValue = (value, path, maxValue) => { let finalValue = value; - if (maxValue) { + if (maxValue || maxValue === 0) { finalValue = value > maxValue ? maxValue : value; } @@ -258,6 +258,10 @@ const DomandaEditPreInstructor = () => { const errGetAmendmentsCallback = () => { } + const shouldDisableField = (fieldName) => { + return !['EVALUATION'].includes(data.status) || ['ADMISSIBLE'].includes(data.status) && fieldName !== 'criteria' + } + useEffect(() => { const maxScore = pathOr(0, ['minScore'], data); const criteria = pathOr([], ['criteria'], data); @@ -329,9 +333,7 @@ const DomandaEditPreInstructor = () => {

-
- -
+

{__('Punteggi di valutazione', 'gepafin')}

@@ -350,7 +352,7 @@ const DomandaEditPreInstructor = () => {
{ onClick={() => displayCriterionData(o.id)} aria-label={__('Mostra', 'gepafin')}/> : null}
From bf14a133d8bdec95fb7538ce01084be74f21272c Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Thu, 21 Nov 2024 11:34:28 +0100 Subject: [PATCH 06/12] - added translation config; - implemented 'bandi osservati' page; --- .../Bandi/components/AllBandiTable/index.js | 5 +-- .../components/AllBandiAccordion/index.js | 34 ++++++++++++++----- .../AllBandiPreferredAccordion/index.js | 5 +-- src/pages/BandiPreferredBeneficiario/index.js | 4 +-- .../DraftApplicationsTable/index.js | 5 +-- .../components/LatestBandiTable/index.js | 5 +-- .../LatestUsersActivityTable/index.js | 2 +- .../components/LatestBandiTable/index.js | 12 ++++--- .../MyLatestSubmissionsTable/index.js | 5 +-- .../PreInstructorDomandeTable/index.js | 20 +++++++++-- .../components/AllDomandeTable/index.js | 5 +-- .../BeneficiarioDomandeTable/index.js | 5 +-- .../PreInstructorSoccorsiTable/index.js | 22 ++++++++++-- .../Users/components/AllUsersTable/index.js | 3 +- src/translationStringsForComponents.js | 16 +++++++++ 15 files changed, 113 insertions(+), 35 deletions(-) create mode 100644 src/translationStringsForComponents.js 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 index f1c7495..3a8ca31 100644 --- a/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js +++ b/src/pages/BandiPreferredBeneficiario/components/AllBandiPreferredAccordion/index.js @@ -25,6 +25,7 @@ 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 = () => { @@ -90,7 +91,7 @@ const AllBandiPreferredAccordion = () => { }; 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) => { @@ -189,7 +190,7 @@ const AllBandiPreferredAccordion = () => { loading={isAsyncRequest} dataKey="id" filters={filters} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} expandedRows={expandedRows} onRowToggle={(e) => setExpandedRows(e.data)} rowExpansionTemplate={rowExpansionTemplate} diff --git a/src/pages/BandiPreferredBeneficiario/index.js b/src/pages/BandiPreferredBeneficiario/index.js index 360090f..e6e2063 100644 --- a/src/pages/BandiPreferredBeneficiario/index.js +++ b/src/pages/BandiPreferredBeneficiario/index.js @@ -7,7 +7,7 @@ import { isEmpty } from 'ramda'; import { useStore } from '../../store'; // components -import AllBandiPreferredAccordion from './components/AllBandiPreferredAccordion'; +import AllBandiAccordion from '../BandiBeneficiario/components/AllBandiAccordion'; const BandiPreferredBeneficiario = () => { const chosenCompanyId = useStore().main.chosenCompanyId(); @@ -34,7 +34,7 @@ const BandiPreferredBeneficiario = () => { : null}
- +
) diff --git a/src/pages/Dashboard/components/DraftApplicationsTable/index.js b/src/pages/Dashboard/components/DraftApplicationsTable/index.js index 63518ff..e3d9a5c 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,7 +170,7 @@ const DraftApplicationsTable = () => { filters={filters} globalFilterFields={['name', 'status']} header={header} - emptyMessage={__('Nessun dato disponibile', 'gepafin')} + emptyMessage={translationStrings.emptyMessage} onFilter={(e) => setFilters(e.filters)}> { @@ -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,7 +176,7 @@ const MyLatestSubmissionsTable = () => { 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/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js b/src/pages/DashboardPreInstructor/components/PreInstructorDomandeTable/index.js index 5e53e82..ab5fe5a 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
+ } + + const initiateApproving = () => { + setOperationType('approve'); + } + + const initiateRejecting = () => { + setOperationType('approve'); + } + useEffect(() => { const maxScore = pathOr(0, ['minScore'], data); const criteria = pathOr([], ['criteria'], data); @@ -329,7 +370,7 @@ const DomandaEditPreInstructor = () => {

{__('Stato', 'gepafin')} - {getBandoLabel(data.status)} + {getBandoLabel(data.applicationStatus)}

@@ -548,14 +589,14 @@ const DomandaEditPreInstructor = () => { ?