Merge branch 'master' into develop
This commit is contained in:
10
src/helpers/isDateTimeInPast.js
Normal file
10
src/helpers/isDateTimeInPast.js
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
const isDateTimeInPast = (dateStr, timeStr) => {
|
||||||
|
const [hours, minutes, seconds = 0] = timeStr.split(':').map(Number);
|
||||||
|
const dateTime = new Date(dateStr);
|
||||||
|
dateTime.setHours(hours, minutes, seconds);
|
||||||
|
const now = new Date();
|
||||||
|
|
||||||
|
return dateTime < now;
|
||||||
|
}
|
||||||
|
|
||||||
|
export default isDateTimeInPast;
|
||||||
@@ -1,13 +1,9 @@
|
|||||||
import React, { useRef } from 'react';
|
import React, { useRef } from 'react';
|
||||||
import { __ } from '@wordpress/i18n';
|
|
||||||
|
|
||||||
// components
|
// components
|
||||||
import { Toolbar } from 'primereact/toolbar';
|
import { Toolbar } from 'primereact/toolbar';
|
||||||
import { Link } from 'react-router-dom';
|
import { Link } from 'react-router-dom';
|
||||||
import LogoIcon from '../../../../icons/LogoIcon';
|
import LogoIcon from '../../../../icons/LogoIcon';
|
||||||
import { IconField } from 'primereact/iconfield';
|
|
||||||
import { InputIcon } from 'primereact/inputicon';
|
|
||||||
import { InputText } from 'primereact/inputtext';
|
|
||||||
import { Button } from 'primereact/button';
|
import { Button } from 'primereact/button';
|
||||||
import TopBarProfileMenu from '../../../../components/TopBarProfileMenu';
|
import TopBarProfileMenu from '../../../../components/TopBarProfileMenu';
|
||||||
import NotificationsSidebar from '../../../../components/NotificationsSidebar';
|
import NotificationsSidebar from '../../../../components/NotificationsSidebar';
|
||||||
@@ -20,12 +16,12 @@ const AppTopbar = () => {
|
|||||||
</Link>;
|
</Link>;
|
||||||
|
|
||||||
const endContent = <div className="topBar__endContent">
|
const endContent = <div className="topBar__endContent">
|
||||||
<IconField iconPosition="right">
|
{/*<IconField iconPosition="right">
|
||||||
<InputIcon className="pi pi-search"> </InputIcon>
|
<InputIcon className="pi pi-search"> </InputIcon>
|
||||||
<InputText v-model="value1" placeholder={__('Cerca', 'gepafin')} disabled={true}/>
|
<InputText v-model="value1" placeholder={__('Cerca', 'gepafin')} disabled={true}/>
|
||||||
</IconField>
|
</IconField>*/}
|
||||||
<NotificationsSidebar/>
|
<NotificationsSidebar/>
|
||||||
<i className="pi pi-envelope topBar__icon"></i>
|
{/*<i className="pi pi-envelope topBar__icon"></i>*/}
|
||||||
{/*<i className="pi pi-envelope p-overlay-badge topBar__icon">
|
{/*<i className="pi pi-envelope p-overlay-badge topBar__icon">
|
||||||
<Badge severity="danger"></Badge>
|
<Badge severity="danger"></Badge>
|
||||||
</i>*/}
|
</i>*/}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import { Button } from 'primereact/button';
|
|||||||
|
|
||||||
// i18n
|
// i18n
|
||||||
import translationStrings from '../../../../translationStringsForComponents';
|
import translationStrings from '../../../../translationStringsForComponents';
|
||||||
|
import isDateTimeInPast from '../../../../helpers/isDateTimeInPast';
|
||||||
|
|
||||||
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
|
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
|
||||||
|
|
||||||
@@ -180,17 +181,20 @@ const AllBandiAccordion = ({ showOnlyPreferred = false }) => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const rowExpansionTemplate = (data) => {
|
const rowExpansionTemplate = (data) => {
|
||||||
|
const isCallExpired = isDateTimeInPast(data.dates[1], data.endTime);
|
||||||
return (
|
return (
|
||||||
<div className="p-3">
|
<div className="p-3">
|
||||||
{renderHtmlContent(data.descriptionShort)}
|
{renderHtmlContent(data.descriptionShort)}
|
||||||
<p>{__('Scadenza', 'gepafin')}: {getDateFromISOstring(data.dates[1])}</p>
|
<p>{__('Scadenza', 'gepafin')}: {getDateFromISOstring(data.dates[1])}</p>
|
||||||
{!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && (!data.confidi
|
{!isCallExpired && !isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && (!data.confidi
|
||||||
|| (data.confidi && data.id === 6 && REACT_APP_HUB_ID === 'p4lk3bcx1RStqTaIVVbXs'))
|
|| (data.confidi && data.id === 6 && REACT_APP_HUB_ID === 'p4lk3bcx1RStqTaIVVbXs'))
|
||||||
? <Button onClick={() => goToBandoPage(data.id)} severity="info">
|
? <Button onClick={() => goToBandoPage(data.id)} severity="info">
|
||||||
{__('Partecipa', 'gepafin')}
|
{__('Partecipa', 'gepafin')}
|
||||||
</Button> : null}
|
</Button> : null}
|
||||||
{!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && data.confidi
|
{isCallExpired
|
||||||
&& (data.id !== 6 || (data.id === 6 && REACT_APP_HUB_ID !== 'p4lk3bcx1RStqTaIVVbXs'))
|
? <p>{__('È scaduto', 'gepafin')}</p> : null}
|
||||||
|
{isCallExpired || (!isEmpty(chosenCompanyId) && chosenCompanyId !== 0 && data.confidi
|
||||||
|
&& (data.id !== 6 || (data.id === 6 && REACT_APP_HUB_ID !== 'p4lk3bcx1RStqTaIVVbXs')))
|
||||||
? <Button onClick={() => goToBandoPage(data.id)} severity="info">
|
? <Button onClick={() => goToBandoPage(data.id)} severity="info">
|
||||||
{__('Mostra', 'gepafin')}
|
{__('Mostra', 'gepafin')}
|
||||||
</Button> : null}
|
</Button> : null}
|
||||||
|
|||||||
@@ -40,10 +40,12 @@ import FileuploadApplicationSignedPdf from '../../components/FileuploadApplicati
|
|||||||
|
|
||||||
import { defaultMaxFileSize } from '../../configData';
|
import { defaultMaxFileSize } from '../../configData';
|
||||||
import formatDateString from '../../helpers/formatDateString';
|
import formatDateString from '../../helpers/formatDateString';
|
||||||
|
import isDateTimeInPast from '../../helpers/isDateTimeInPast';
|
||||||
|
|
||||||
const BandoApplication = () => {
|
const BandoApplication = () => {
|
||||||
const chosenCompanyId = useStore().main.chosenCompanyId();
|
const chosenCompanyId = useStore().main.chosenCompanyId();
|
||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
|
const [isExpired, setIsExpired] = useState(false);
|
||||||
const [formData, setFormData] = useState([]);
|
const [formData, setFormData] = useState([]);
|
||||||
const [formInitialData, setFormInitialData] = useState(null);
|
const [formInitialData, setFormInitialData] = useState(null);
|
||||||
const [bandoTitle, setBandoTitle] = useState('');
|
const [bandoTitle, setBandoTitle] = useState('');
|
||||||
@@ -297,6 +299,8 @@ const BandoApplication = () => {
|
|||||||
//setCompletedSteps(data.data.completedSteps);
|
//setCompletedSteps(data.data.completedSteps);
|
||||||
setApplicationStatus(data.data.applicationStatus)
|
setApplicationStatus(data.data.applicationStatus)
|
||||||
setActiveStep(data.data.currentStep);
|
setActiveStep(data.data.currentStep);
|
||||||
|
const isCallExpired = isDateTimeInPast(data.data.callEndDate, data.data.callEndTime);
|
||||||
|
setIsExpired(isCallExpired);
|
||||||
|
|
||||||
const chosenCompanyId = data.data.companyId;
|
const chosenCompanyId = data.data.companyId;
|
||||||
const companies = storeGet.main.companies();
|
const companies = storeGet.main.companies();
|
||||||
@@ -396,27 +400,27 @@ const BandoApplication = () => {
|
|||||||
{activeStep > 1 && activeStep <= totalSteps
|
{activeStep > 1 && activeStep <= totalSteps
|
||||||
? <Button
|
? <Button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={'SUBMIT' === applicationStatus}
|
disabled={'SUBMIT' === applicationStatus || isExpired}
|
||||||
onClick={goBackward}
|
onClick={goBackward}
|
||||||
label={__('Vai indietro', 'gepafin')}
|
label={__('Vai indietro', 'gepafin')}
|
||||||
icon="pi pi-arrow-left"
|
icon="pi pi-arrow-left"
|
||||||
iconPos="left"/> : null}
|
iconPos="left"/> : null}
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={isAsyncRequest || 'SUBMIT' === applicationStatus}
|
disabled={isAsyncRequest || 'SUBMIT' === applicationStatus || isExpired}
|
||||||
onClick={saveDraft}
|
onClick={saveDraft}
|
||||||
outlined
|
outlined
|
||||||
label={__('Salva bozza', 'gepafin')} icon="pi pi-save" iconPos="right"/>
|
label={__('Salva bozza', 'gepafin')} icon="pi pi-save" iconPos="right"/>
|
||||||
{activeStep < totalSteps
|
{activeStep < totalSteps
|
||||||
? <Button
|
? <Button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={'SUBMIT' === applicationStatus}
|
disabled={'SUBMIT' === applicationStatus || isExpired}
|
||||||
onClick={goForward}
|
onClick={goForward}
|
||||||
label={__('Vai avanti', 'gepafin')}
|
label={__('Vai avanti', 'gepafin')}
|
||||||
icon="pi pi-arrow-right"
|
icon="pi pi-arrow-right"
|
||||||
iconPos="right"/> : null}
|
iconPos="right"/> : null}
|
||||||
<Button
|
<Button
|
||||||
disabled={'SUBMIT' === applicationStatus}
|
disabled={'SUBMIT' === applicationStatus || isExpired}
|
||||||
label={__('Convalidare', 'gepafin')}
|
label={__('Convalidare', 'gepafin')}
|
||||||
icon="pi pi-check"
|
icon="pi pi-check"
|
||||||
iconPos="right"/>
|
iconPos="right"/>
|
||||||
@@ -570,6 +574,12 @@ const BandoApplication = () => {
|
|||||||
<div className="appPage__content">
|
<div className="appPage__content">
|
||||||
<BlockingOverlay shouldDisplay={isAsyncRequest}/>
|
<BlockingOverlay shouldDisplay={isAsyncRequest}/>
|
||||||
<form className="appForm" onSubmit={handleSubmit(onValidate)}>
|
<form className="appForm" onSubmit={handleSubmit(onValidate)}>
|
||||||
|
{isExpired
|
||||||
|
? <div className="appPageSection__preview">
|
||||||
|
{__('Il bando è scaduto!', 'gepafin')}
|
||||||
|
</div>
|
||||||
|
: null}
|
||||||
|
|
||||||
{'DRAFT' === applicationStatus
|
{'DRAFT' === applicationStatus
|
||||||
? <div className="appPageSection">
|
? <div className="appPageSection">
|
||||||
{actionBtns}
|
{actionBtns}
|
||||||
@@ -645,6 +655,7 @@ const BandoApplication = () => {
|
|||||||
? <div className="appPageSection">
|
? <div className="appPageSection">
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
|
disabled={isExpired}
|
||||||
outlined
|
outlined
|
||||||
onClick={doChangeToDraft}
|
onClick={doChangeToDraft}
|
||||||
label={__('Ripristina draft', 'gepafin')}
|
label={__('Ripristina draft', 'gepafin')}
|
||||||
@@ -660,7 +671,7 @@ const BandoApplication = () => {
|
|||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={'SUBMIT' === applicationStatus}
|
disabled={'SUBMIT' === applicationStatus || isExpired}
|
||||||
onClick={onDownloadApplicationPdf}
|
onClick={onDownloadApplicationPdf}
|
||||||
label={__('Scarica PDF', 'gepafin')}
|
label={__('Scarica PDF', 'gepafin')}
|
||||||
icon="pi pi-download"
|
icon="pi pi-download"
|
||||||
@@ -678,7 +689,7 @@ const BandoApplication = () => {
|
|||||||
<FileuploadApplicationSignedPdf
|
<FileuploadApplicationSignedPdf
|
||||||
setDataFn={handleSetSignedDocumentFromFileupload}
|
setDataFn={handleSetSignedDocumentFromFileupload}
|
||||||
fieldName="signedPdfFile"
|
fieldName="signedPdfFile"
|
||||||
disabled={!isEmpty(signedPdfFile) || 'AWAITING' !== applicationStatus}
|
disabled={!isEmpty(signedPdfFile) || 'AWAITING' !== applicationStatus || isExpired}
|
||||||
defaultValue={is(Array, signedPdfFile) ? signedPdfFile : []}
|
defaultValue={is(Array, signedPdfFile) ? signedPdfFile : []}
|
||||||
accept={signedDocMime}
|
accept={signedDocMime}
|
||||||
chooseLabel={__('Aggiungi documento', 'gepafin')}
|
chooseLabel={__('Aggiungi documento', 'gepafin')}
|
||||||
@@ -694,7 +705,7 @@ const BandoApplication = () => {
|
|||||||
? <div className="appPageSection">
|
? <div className="appPageSection">
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={'READY' !== applicationStatus}
|
disabled={'READY' !== applicationStatus || isExpired}
|
||||||
onClick={onSubmit}
|
onClick={onSubmit}
|
||||||
label={__('Invia', 'gepafin')}
|
label={__('Invia', 'gepafin')}
|
||||||
icon="pi pi-check"
|
icon="pi pi-check"
|
||||||
@@ -708,6 +719,11 @@ const BandoApplication = () => {
|
|||||||
<span>{__('Azioni rapide', 'gepafin')}</span>
|
<span>{__('Azioni rapide', 'gepafin')}</span>
|
||||||
</div> : null}
|
</div> : null}
|
||||||
|
|
||||||
|
{isExpired
|
||||||
|
? <div className="appPageSection__preview">
|
||||||
|
{__('Il bando è scaduto!', 'gepafin')}
|
||||||
|
</div> : null}
|
||||||
|
|
||||||
{'DRAFT' === applicationStatus
|
{'DRAFT' === applicationStatus
|
||||||
? <div className="appPageSection">
|
? <div className="appPageSection">
|
||||||
{actionBtns}
|
{actionBtns}
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import { Toast } from 'primereact/toast';
|
|||||||
import { Editor } from 'primereact/editor';
|
import { Editor } from 'primereact/editor';
|
||||||
import { Dialog } from 'primereact/dialog';
|
import { Dialog } from 'primereact/dialog';
|
||||||
import PreferredBandoService from '../../service/preferred-bando-service';
|
import PreferredBandoService from '../../service/preferred-bando-service';
|
||||||
|
import isDateTimeInPast from '../../helpers/isDateTimeInPast';
|
||||||
|
|
||||||
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
|
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ const BandoViewBeneficiario = () => {
|
|||||||
const { id } = useParams();
|
const { id } = useParams();
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const [data, setData] = useState({});
|
const [data, setData] = useState({});
|
||||||
|
const [isExpired, setIsExpired] = useState(false);
|
||||||
const [newQuestion, setNewQuestion] = useState('');
|
const [newQuestion, setNewQuestion] = useState('');
|
||||||
const [applicationObj, setApplicationObj] = useState(true);
|
const [applicationObj, setApplicationObj] = useState(true);
|
||||||
const [isVisibleConfidiPopup, setIsVisibleConfidiPopup] = useState(false);
|
const [isVisibleConfidiPopup, setIsVisibleConfidiPopup] = useState(false);
|
||||||
@@ -327,6 +329,13 @@ const BandoViewBeneficiario = () => {
|
|||||||
}
|
}
|
||||||
}, [id, chosenCompanyId]);
|
}, [id, chosenCompanyId]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (data.dates) {
|
||||||
|
const isCallExpired = isDateTimeInPast(data.dates[1], data.endTime);
|
||||||
|
setIsExpired(isCallExpired);
|
||||||
|
}
|
||||||
|
}, [data]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="appPage">
|
<div className="appPage">
|
||||||
{!isAsyncRequest && !isEmpty(data)
|
{!isAsyncRequest && !isEmpty(data)
|
||||||
@@ -472,6 +481,7 @@ const BandoViewBeneficiario = () => {
|
|||||||
</div>
|
</div>
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
|
disabled={isExpired}
|
||||||
onClick={submitNewQuestion}
|
onClick={submitNewQuestion}
|
||||||
label={__('Salva', 'gepafin')}/>
|
label={__('Salva', 'gepafin')}/>
|
||||||
</div>}
|
</div>}
|
||||||
@@ -506,18 +516,20 @@ const BandoViewBeneficiario = () => {
|
|||||||
icon="pi pi-download" iconPos="right"/>*/}
|
icon="pi pi-download" iconPos="right"/>*/}
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
|
disabled={isExpired}
|
||||||
outlined
|
outlined
|
||||||
onClick={scaricaModulistica}
|
onClick={scaricaModulistica}
|
||||||
label={__('Scarica Bando Completo e Modulistica', 'gepafin')}
|
label={__('Scarica Bando Completo e Modulistica', 'gepafin')}
|
||||||
icon="pi pi-download" iconPos="right"/>
|
icon="pi pi-download" iconPos="right"/>
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
disabled={isAsyncRequest || chosenCompanyId === 0}
|
disabled={isExpired || isAsyncRequest || chosenCompanyId === 0}
|
||||||
onClick={submitApplication}
|
onClick={submitApplication}
|
||||||
label={submitBtnLabel()}
|
label={submitBtnLabel()}
|
||||||
icon={submitBtnIcon()} iconPos="right"/>
|
icon={submitBtnIcon()} iconPos="right"/>
|
||||||
<Button
|
<Button
|
||||||
type="button"
|
type="button"
|
||||||
|
disabled={isExpired}
|
||||||
outlined={isNil(data.preferredCallId)}
|
outlined={isNil(data.preferredCallId)}
|
||||||
rounded
|
rounded
|
||||||
onClick={addToFavourites}
|
onClick={addToFavourites}
|
||||||
|
|||||||
Reference in New Issue
Block a user