diff --git a/.idea/.name b/.idea/.name
deleted file mode 100644
index 8e44cc2..0000000
--- a/.idea/.name
+++ /dev/null
@@ -1 +0,0 @@
-configData.js
\ No newline at end of file
diff --git a/src/assets/scss/components/appPage.scss b/src/assets/scss/components/appPage.scss
index fc1ea38..20ca516 100644
--- a/src/assets/scss/components/appPage.scss
+++ b/src/assets/scss/components/appPage.scss
@@ -320,6 +320,10 @@
a {
color: inherit;
}
+
+ ul li {
+ color: inherit;
+ }
}
@container section_with_border (max-width: 600px) {
diff --git a/src/helpers/getBandoLabel.js b/src/helpers/getBandoLabel.js
index 66f14ec..16cf480 100644
--- a/src/helpers/getBandoLabel.js
+++ b/src/helpers/getBandoLabel.js
@@ -76,6 +76,12 @@ const getBandoLabel = (status) => {
case 'TECHNICAL_EVALUATION_REJECTED':
return __('Respinto Tec-Fin', 'gepafin');
+
+ case 'AWAITING_CONTRACT':
+ return __('Awaiting contract', 'gepafin');
+
+ case 'CONTRACT_SIGNED':
+ return __('Contract signed', 'gepafin');
default:
return '';
diff --git a/src/helpers/getBandoSeverity.js b/src/helpers/getBandoSeverity.js
index 3002c37..38a2d97 100644
--- a/src/helpers/getBandoSeverity.js
+++ b/src/helpers/getBandoSeverity.js
@@ -75,6 +75,12 @@ const getBandoSeverity = (status) => {
case 'TECHNICAL_EVALUATION_REJECTED':
return 'danger';
+ case 'AWAITING_CONTRACT':
+ return 'warning';
+
+ case 'CONTRACT_SIGNED':
+ return 'success';
+
default:
return 'info';
}
diff --git a/src/pages/DashboardBeneficiario/index.js b/src/pages/DashboardBeneficiario/index.js
index b4a887d..aff4f89 100644
--- a/src/pages/DashboardBeneficiario/index.js
+++ b/src/pages/DashboardBeneficiario/index.js
@@ -1,29 +1,49 @@
-import React, { useEffect, useState } from 'react';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
import { __ } from '@wordpress/i18n';
import { Link, useNavigate } from 'react-router-dom';
import { head, isEmpty, pathOr } from 'ramda';
import NumberFlow from '@number-flow/react';
+import { wrap } from 'object-path-immutable';
// store
-import { useStoreValue } from '../../store';
+import { storeGet, storeSet, useStoreValue } from '../../store';
// api
import DashboardService from '../../service/dashboard-service';
+import ApplicationContractService from '../../service/application-contract-service';
+
+// tools
+import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
+import getFormatedFileSizeText from '../../helpers/getFormatedFileSizeText';
// components
import { Button } from 'primereact/button';
import ErrorBoundary from '../../components/ErrorBoundary';
import LatestBandiBeneficiarioTableAsync from './components/LatestBandiBeneficiarioTableAsync';
import MyLatestSubmissionsTableAsync from './components/MyLatestSubmissionsTableAsync';
+import { classNames } from 'primereact/utils';
+import { FileUpload } from 'primereact/fileupload';
+import { defaultMaxFileSize, mimeTypes } from '../../configData';
+import { Dialog } from 'primereact/dialog';
+import { Toast } from 'primereact/toast';
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const DashboardBeneficiario = () => {
+ const isAsyncRequest = useStoreValue('isAsyncRequest');
const navigate = useNavigate();
const [mainStats, setMainStats] = useState({});
+ const [contractsData, setContractsData] = useState([]);
const companies = useStoreValue('companies');
const chosenCompanyId = useStoreValue('chosenCompanyId');
const company = head(companies.filter(o => o.id === chosenCompanyId));
+ const [isVisibleContractForm, setIsVisibleContractForm] = useState(false);
+ const [contractFormData, setContractFormData] = useState({
+ subject: '',
+ text: ''
+ });
+ const contractFormFilesRef = useRef(null);
+ const toast = useRef(null);
const goToAllSubmissions = () => {
navigate('/bandi');
@@ -42,11 +62,112 @@ const DashboardBeneficiario = () => {
const errGetStats = () => {
}
+ const getContracts = (data) => {
+ if (data.status === 'SUCCESS') {
+ setContractsData(data.data);
+ }
+ }
+
+ const errGetContracts = () => {
+ }
+
+ const openSendContractForm = useCallback((id) => {
+ const contract = head(contractsData.filter(o => o.id === id));
+
+ if (contract) {
+ setContractFormData(contract)
+ setIsVisibleContractForm(true);
+ }
+ }, [contractsData]);
+
+ const headerContractDialog = () => {
+ return {__('Invia il contratto', 'gepafin')};
+ }
+
+ const hideContractDialog = () => {
+ setIsVisibleContractForm(false);
+ setContractFormData({
+ subject: '',
+ text: ''
+ });
+ }
+
+ const footerContractDialog = useCallback(() => {
+ let isDisabled = !contractFormData.files || isEmpty(contractFormData.files) || isAsyncRequest;
+
+ return
+
+
+ }, [contractFormData]);
+
+ const updateContractFormData = (value, path) => {
+ const newData = wrap(contractFormData).set(path.split('.'), value).value();
+ setContractFormData(newData);
+ };
+
+ const doSendContract = useCallback(() => {
+ if (contractFormData.files && !isEmpty(contractFormData.files) && !isAsyncRequest) {
+ const formDataToSend = new FormData();
+
+ if (contractFormData.files && contractFormData.files.length > 0) {
+ contractFormData.files.forEach((file) => {
+ formDataToSend.append('beneficiaryContractDocuments', file);
+ });
+ }
+
+ storeSet('setAsyncRequest');
+
+ ApplicationContractService.updateApplicationContract(
+ contractFormData.id,
+ formDataToSend,
+ getUploadApplicationContractCallback,
+ errGetUploadApplicationContractCallback
+ );
+ }
+ }, [contractFormData]);
+
+ const getUploadApplicationContractCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ //setData(getFormattedData(data.data));
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: 'success',
+ summary: '',
+ detail: data.message
+ });
+ }
+ }
+ hideContractDialog();
+ storeSet('unsetAsyncRequest');
+ }
+
+ const errGetUploadApplicationContractCallback = (data) => {
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: data.status === 'SUCCESS' ? 'info' : 'error',
+ summary: '',
+ detail: data.message
+ });
+ }
+ hideContractDialog();
+ set404FromErrorResponse(data);
+ storeSet('unsetAsyncRequest');
+ }
+
useEffect(() => {
const existingCompany = head(companies.filter(o => o.id === chosenCompanyId));
if (existingCompany) {
DashboardService.getBeneficiaryStatsForCompany(existingCompany.id, getStats, errGetStats);
+ const userData = storeGet('userData');
+
+ ApplicationContractService.getContractByUserId(getContracts, errGetContracts, [
+ ['userId', userData.id]
+ ]);
}
}, [companies, chosenCompanyId]);
@@ -57,7 +178,28 @@ const DashboardBeneficiario = () => {
{company ? {company.companyName} : null}
+ {contractsData && !isEmpty(contractsData)
+ ? <>
+
+
+
+
+
+ {__('You must upload contract for applications:', 'gepafin')}
+
+
+
+
+ > : null}
+
+
{__('Panoramica di Sistema', 'gepafin')}
@@ -162,6 +304,88 @@ const DashboardBeneficiario = () => {
label={__('Contatta assistenza', 'gepafin')} icon="pi pi-envelope" iconPos="right"/>*/}
+
+
)
}
diff --git a/src/pages/DashboardBeneficiarioConfidi/index.js b/src/pages/DashboardBeneficiarioConfidi/index.js
index 8a16e11..7b8ae7f 100644
--- a/src/pages/DashboardBeneficiarioConfidi/index.js
+++ b/src/pages/DashboardBeneficiarioConfidi/index.js
@@ -1,29 +1,49 @@
-import React, { useEffect, useState } from 'react';
+import React, { useCallback, useEffect, useRef, useState } from 'react';
import { __ } from '@wordpress/i18n';
import { Link, useNavigate } from 'react-router-dom';
import { head, isEmpty, pathOr } from 'ramda';
import NumberFlow from '@number-flow/react';
+import { wrap } from 'object-path-immutable';
// store
-import { useStoreValue } from '../../store';
+import { storeGet, storeSet, useStoreValue } from '../../store';
// api
import DashboardService from '../../service/dashboard-service';
+import ApplicationContractService from '../../service/application-contract-service';
+
+// tools
+import getFormatedFileSizeText from '../../helpers/getFormatedFileSizeText';
+import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
// components
import { Button } from 'primereact/button';
import ErrorBoundary from '../../components/ErrorBoundary';
import MyLatestSubmissionsTableAsync from '../DashboardBeneficiario/components/MyLatestSubmissionsTableAsync';
import LatestBandiBeneficiarioTableAsync from '../DashboardBeneficiario/components/LatestBandiBeneficiarioTableAsync';
+import { classNames } from 'primereact/utils';
+import { FileUpload } from 'primereact/fileupload';
+import { defaultMaxFileSize, mimeTypes } from '../../configData';
+import { Dialog } from 'primereact/dialog';
+import { Toast } from 'primereact/toast';
const REACT_APP_HUB_ID = process.env.REACT_APP_HUB_ID;
const DashboardBeneficiarioConfidi = () => {
+ const isAsyncRequest = useStoreValue('isAsyncRequest');
const navigate = useNavigate();
const [mainStats, setMainStats] = useState({});
+ const [contractsData, setContractsData] = useState([]);
const companies = useStoreValue('companies');
const chosenCompanyId = useStoreValue('chosenCompanyId');
const company = head(companies.filter(o => o.id === chosenCompanyId));
+ const [isVisibleContractForm, setIsVisibleContractForm] = useState(false);
+ const [contractFormData, setContractFormData] = useState({
+ subject: '',
+ text: ''
+ });
+ const contractFormFilesRef = useRef(null);
+ const toast = useRef(null);
const goToAllSubmissions = () => {
navigate('/bandi');
@@ -42,11 +62,112 @@ const DashboardBeneficiarioConfidi = () => {
const errGetStats = () => {
}
+ const getContracts = (data) => {
+ if (data.status === 'SUCCESS') {
+ setContractsData(data.data);
+ }
+ }
+
+ const errGetContracts = () => {
+ }
+
+ const openSendContractForm = useCallback((id) => {
+ const contract = head(contractsData.filter(o => o.id === id));
+
+ if (contract) {
+ setContractFormData(contract)
+ setIsVisibleContractForm(true);
+ }
+ }, [contractsData]);
+
+ const headerContractDialog = () => {
+ return {__('Invia il contratto', 'gepafin')};
+ }
+
+ const hideContractDialog = () => {
+ setIsVisibleContractForm(false);
+ setContractFormData({
+ subject: '',
+ text: ''
+ });
+ }
+
+ const footerContractDialog = useCallback(() => {
+ let isDisabled = !contractFormData.files || isEmpty(contractFormData.files) || isAsyncRequest;
+
+ return
+
+
+ }, [contractFormData]);
+
+ const updateContractFormData = (value, path) => {
+ const newData = wrap(contractFormData).set(path.split('.'), value).value();
+ setContractFormData(newData);
+ };
+
+ const doSendContract = useCallback(() => {
+ if (contractFormData.files && !isEmpty(contractFormData.files) && !isAsyncRequest) {
+ const formDataToSend = new FormData();
+
+ if (contractFormData.files && contractFormData.files.length > 0) {
+ contractFormData.files.forEach((file) => {
+ formDataToSend.append('beneficiaryContractDocuments', file);
+ });
+ }
+
+ storeSet('setAsyncRequest');
+
+ ApplicationContractService.updateApplicationContract(
+ contractFormData.id,
+ formDataToSend,
+ getUploadApplicationContractCallback,
+ errGetUploadApplicationContractCallback
+ );
+ }
+ }, [contractFormData]);
+
+ const getUploadApplicationContractCallback = (data) => {
+ if (data.status === 'SUCCESS') {
+ //setData(getFormattedData(data.data));
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: 'success',
+ summary: '',
+ detail: data.message
+ });
+ }
+ }
+ hideContractDialog();
+ storeSet('unsetAsyncRequest');
+ }
+
+ const errGetUploadApplicationContractCallback = (data) => {
+ if (toast.current && data.message) {
+ toast.current.show({
+ severity: data.status === 'SUCCESS' ? 'info' : 'error',
+ summary: '',
+ detail: data.message
+ });
+ }
+ hideContractDialog();
+ set404FromErrorResponse(data);
+ storeSet('unsetAsyncRequest');
+ }
+
useEffect(() => {
const existingCompany = head(companies.filter(o => o.id === chosenCompanyId));
if (existingCompany) {
DashboardService.getBeneficiaryStatsForCompany(existingCompany.id, getStats, errGetStats);
+ const userData = storeGet('userData');
+
+ ApplicationContractService.getContractByUserId(getContracts, errGetContracts, [
+ ['userId', userData.id]
+ ]);
}
}, [companies, chosenCompanyId]);
@@ -57,7 +178,28 @@ const DashboardBeneficiarioConfidi = () => {
{company ? {company.companyName} : null}
+ {contractsData && !isEmpty(contractsData)
+ ? <>
+
+
+
+
+
+ {__('You must upload contract for applications:', 'gepafin')}
+
+
+
+
+ > : null}
+
+
{__('Panoramica di Sistema', 'gepafin')}
@@ -102,7 +244,7 @@ const DashboardBeneficiarioConfidi = () => {
{__('Attenzione', 'gepafin')}
{__('Per applicare ai bandi devi Registare un Azienda clicca', 'gepafin')}
- {__('qua', 'gepafin')}
+ {__('qua', 'gepafin')}
@@ -148,8 +290,102 @@ const DashboardBeneficiarioConfidi = () => {
+ {/*