- saving progress;

This commit is contained in:
Vitalii Kiiko
2025-03-03 08:29:01 +01:00
parent 186291b52b
commit cb8b78dac3
4 changed files with 116 additions and 104 deletions

View File

@@ -1,121 +1,91 @@
import React, { useCallback, useEffect, useState } from 'react'; import React, { useCallback, useEffect, useRef, useState } from 'react';
import { classNames } from 'primereact/utils'; import { classNames } from 'primereact/utils';
import { __ } from '@wordpress/i18n';
import { isEmpty, pluck } from 'ramda';
// components // components
import { ListBox } from 'primereact/listbox'; import { ListBox } from 'primereact/listbox';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import { __ } from '@wordpress/i18n'; import CompanyDocumentsService from '../../../../service/company-documents-service';
const FileSelect = ({ const FileSelect = ({
fieldName, fieldName,
label, label,
setDataFn,
register, register,
errors, errors,
defaultValue, defaultValue,
config = {}, config = {},
infoText = null, infoText = null,
disabled = false, disabled = false,
options = [] options = [],
sourceId = 0,
source = 'DOCUMENT',
saveFormCallback
}) => { }) => {
const [stateFieldData, setStateFieldData] = useState([]); //const [stateFieldData, setStateFieldData] = useState([]);
const [selectedUnconfirmed, setSelectedUnconfirmed] = useState(null); const stateFieldData = useRef([]);
const cities = [ const [selectedUnconfirmed, setSelectedUnconfirmed] = useState([]);
{ const [optionsTransformed, setOptionsTransformed] = useState([]);
label: 'Company files', const [loading, setLoading] = useState(false);
code: 'company-files',
items: [
{
'id': 589,
'name': 'pdf-3-test.pdf',
'filePath': 'https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/staging/call/%2Fapplication/%2Fpdf-1-test_8432561.pdf',
'type': 'DOCUMENT',
'source': 'APPLICATION',
'sourceId': 0,
'createdDate': '2025-02-21T15:33:52.767089176',
'updatedDate': '2025-02-21T15:33:52.767109885',
'documentAttachmentId': null
},
{
'id': 569,
'name': 'pdf-2-test.pdf',
'filePath': 'https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/staging/call/%2Fapplication/%2Fpdf-1-test_8432561.pdf',
'type': 'DOCUMENT',
'source': 'APPLICATION',
'sourceId': 0,
'createdDate': '2025-02-21T15:33:52.767089176',
'updatedDate': '2025-02-21T15:33:52.767109885',
'documentAttachmentId': null
},
{
'id': 519,
'name': 'pdf-1-test.pdf',
'filePath': 'https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/staging/call/%2Fapplication/%2Fpdf-1-test_8432561.pdf',
'type': 'DOCUMENT',
'source': 'APPLICATION',
'sourceId': 0,
'createdDate': '2025-02-21T15:33:52.767089176',
'updatedDate': '2025-02-21T15:33:52.767109885',
'documentAttachmentId': null
}
]
},
{
label: 'Personal files',
code: 'personal-files',
items: [
{
'id': 179,
'name': 'pdf-13-test.pdf',
'filePath': 'https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/staging/call/%2Fapplication/%2Fpdf-1-test_8432561.pdf',
'type': 'DOCUMENT',
'source': 'APPLICATION',
'sourceId': 0,
'createdDate': '2025-02-21T15:33:52.767089176',
'updatedDate': '2025-02-21T15:33:52.767109885',
'documentAttachmentId': null
},
{
'id': 169,
'name': 'pdf-12-test.pdf',
'filePath': 'https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/staging/call/%2Fapplication/%2Fpdf-1-test_8432561.pdf',
'type': 'DOCUMENT',
'source': 'APPLICATION',
'sourceId': 0,
'createdDate': '2025-02-21T15:33:52.767089176',
'updatedDate': '2025-02-21T15:33:52.767109885',
'documentAttachmentId': null
},
{
'id': 129,
'name': 'pdf-11-test.pdf',
'filePath': 'https://mementoresources.s3.eu-west-1.amazonaws.com/gepafin/staging/call/%2Fapplication/%2Fpdf-1-test_8432561.pdf',
'type': 'DOCUMENT',
'source': 'APPLICATION',
'sourceId': 0,
'createdDate': '2025-02-21T15:33:52.767089176',
'updatedDate': '2025-02-21T15:33:52.767109885',
'documentAttachmentId': null
}
]
}
];
const attachSelectedFiles = useCallback(() => { const attachSelectedFiles = useCallback(() => {
setStateFieldData([...stateFieldData, ...selectedUnconfirmed]); const existingIds = pluck('id', stateFieldData.current);
const selectedToBeAdded = selectedUnconfirmed.filter(o => !existingIds.includes(o.id));
setSelectedUnconfirmed([]); setSelectedUnconfirmed([]);
}, [selectedUnconfirmed, stateFieldData])
setLoading(true);
selectedToBeAdded.map(o => {
CompanyDocumentsService.attachCompanyDocumentToAppl(o.id, callback, errCallback, [
['applicationId', sourceId],
['documentType', source]
])
});
}, [selectedUnconfirmed]);
const callback = (resp) => {
if (resp.status === 'SUCCESS') {
stateFieldData.current = [...stateFieldData.current, resp.data];
setDataFn(fieldName, stateFieldData.current, { shouldValidate: true });
saveFormCallback();
}
setLoading(false);
}
const errCallback = () => {
setLoading(false);
}
useEffect(() => { useEffect(() => {
console.log('selectedUnconfirmed', selectedUnconfirmed) console.log('selectedUnconfirmed', selectedUnconfirmed)
}, [selectedUnconfirmed]); }, [selectedUnconfirmed]);
useEffect(() => { useEffect(() => {
setStateFieldData(defaultValue); stateFieldData.current = defaultValue;
register(fieldName, config) register(fieldName, config)
}, []); }, []);
useEffect(() => { useEffect(() => {
setStateFieldData(defaultValue); if (!isEmpty(options)) {
const optionsDefault = [
{
label: __('Documenti dell\'Azienda', 'gepafin'),
code: 'COMPANY_DOCUMENT',
items: options.filter(o => o.type === 'COMPANY_DOCUMENT')
},
{
label: __('Documenti del Rappresentante Legale', 'gepafin'),
code: 'PERSONAL_DOCUMENT',
items: options.filter(o => o.type === 'PERSONAL_DOCUMENT')
}
];
setOptionsTransformed(optionsDefault);
}
}, [options]);
useEffect(() => {
console.log('defaultValue', defaultValue);
stateFieldData.current = defaultValue;
}, [defaultValue]); }, [defaultValue]);
return ( return (
@@ -129,7 +99,7 @@ const FileSelect = ({
<ListBox multiple <ListBox multiple
value={selectedUnconfirmed} value={selectedUnconfirmed}
onChange={(e) => setSelectedUnconfirmed(e.value)} onChange={(e) => setSelectedUnconfirmed(e.value)}
options={cities} options={optionsTransformed}
optionLabel="name" optionLabel="name"
optionGroupLabel="label" optionGroupLabel="label"
optionGroupChildren="items" optionGroupChildren="items"
@@ -137,6 +107,7 @@ const FileSelect = ({
listStyle={{ maxHeight: '130px' }}/> listStyle={{ maxHeight: '130px' }}/>
<Button <Button
severity="success" severity="success"
disabled={loading}
onClick={attachSelectedFiles} onClick={attachSelectedFiles}
label={__('Conferma i file scelti', 'gepafin')} label={__('Conferma i file scelti', 'gepafin')}
icon="pi pi-arrow-right" size="small" iconPos="right"/> icon="pi pi-arrow-right" size="small" iconPos="right"/>
@@ -144,7 +115,7 @@ const FileSelect = ({
<div className="fileselectInner__selectedFiles"> <div className="fileselectInner__selectedFiles">
<p>{__('Selezionati')}</p> <p>{__('Selezionati')}</p>
<ul> <ul>
{[...stateFieldData].map(o => <li key={o.id}> {[...stateFieldData.current].map(o => <li key={o.id}>
{o.name} {o.name}
</li>)} </li>)}
</ul> </ul>

View File

@@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef, useMemo } from 'react'; import React, { useState, useEffect, useRef, useMemo, useCallback } from 'react';
import { __, sprintf } from '@wordpress/i18n'; import { __, sprintf } from '@wordpress/i18n';
import { useParams } from 'react-router-dom'; import { useParams } from 'react-router-dom';
import { head, is, pluck, isEmpty, pathOr, isNil } from 'ramda'; import { head, is, pluck, isEmpty, pathOr, isNil, uniq, uniqBy } from 'ramda';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import 'quill/dist/quill.core.css'; import 'quill/dist/quill.core.css';
import { wrap } from 'object-path-immutable'; import { wrap } from 'object-path-immutable';
@@ -47,6 +47,7 @@ import FileuploadApplicationSignedPdf from '../../components/FileuploadApplicati
import { defaultMaxFileSize } from '../../configData'; import { defaultMaxFileSize } from '../../configData';
import parseCommaDecimal from '../../helpers/parseCommaDecimal'; import parseCommaDecimal from '../../helpers/parseCommaDecimal';
import CompanyDocumentsService from '../../service/company-documents-service';
const BandoApplication = () => { const BandoApplication = () => {
const chosenCompanyId = useStore().main.chosenCompanyId(); const chosenCompanyId = useStore().main.chosenCompanyId();
@@ -62,6 +63,8 @@ const BandoApplication = () => {
const [applicationStatus, setApplicationStatus] = useState(''); const [applicationStatus, setApplicationStatus] = useState('');
const [activeStep, setActiveStep] = useState(1); const [activeStep, setActiveStep] = useState(1);
const [signedPdfFile, setSignedPdfFile] = useState([]); const [signedPdfFile, setSignedPdfFile] = useState([]);
const [companyDocs, setCompanyDocs] = useState([]);
const [personalDocs, setPersonalDocs] = useState([]);
const [isRequestForApplData, setIsRequestForApplData] = useState(false); const [isRequestForApplData, setIsRequestForApplData] = useState(false);
const isAsyncRequest = useStore().main.isAsyncRequest(); const isAsyncRequest = useStore().main.isAsyncRequest();
const previousStatus = useRef(''); const previousStatus = useRef('');
@@ -217,7 +220,7 @@ const BandoApplication = () => {
} }
fieldVal = isEmpty(fieldVal) ? null : fieldVal; fieldVal = isEmpty(fieldVal) ? null : fieldVal;
if (formField && formField.name === 'fileupload') { if (formField && ['fileupload', 'fileselect'].includes(formField.name)) {
fieldVal = is(Array, fieldVal) ? fieldVal.map(o => o.id).join(',') : null; fieldVal = is(Array, fieldVal) ? fieldVal.map(o => o.id).join(',') : null;
} }
acc.push({ acc.push({
@@ -540,6 +543,27 @@ const BandoApplication = () => {
? ['.p7m', '.pdf'] ? ['.p7m', '.pdf']
: ['.p7m']; : ['.p7m'];
const getDocsCallback = (resp, type) => {
if (resp.status === 'SUCCESS') {
if (type === 'PERSONAL_DOCUMENT') {
setPersonalDocs(uniqBy((o) => o.id, getFormattedDocsData(resp.data)));
} else {
setCompanyDocs(uniqBy((o) => o.id, getFormattedDocsData(resp.data)));
}
}
}
const errDocsGetCallbacks = () => {
}
const getFormattedDocsData = (data) => {
return data.map((d) => {
d.callEndDate = is(String, d.callEndDate) ? new Date(d.callEndDate) : (d.callEndDate ? d.callEndDate : '');
return d;
});
};
useEffect(() => { useEffect(() => {
let updatedFormValues = klona(formValues); let updatedFormValues = klona(formValues);
let context = {}; let context = {};
@@ -628,6 +652,12 @@ const BandoApplication = () => {
ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks, [ ApplicationService.getApplicationForm(applId, getApplFormCallback, errGetApplFormCallbacks, [
['companyId', chosenCompanyId] ['companyId', chosenCompanyId]
]); ]);
CompanyDocumentsService.getCompanyDocuments(chosenCompanyId, (resp) => getDocsCallback(resp, 'COMPANY_DOCUMENT'), errDocsGetCallbacks, [
['documentType', 'COMPANY_DOCUMENT']
]);
CompanyDocumentsService.getCompanyDocuments(chosenCompanyId, (resp) => getDocsCallback(resp, 'PERSONAL_DOCUMENT'), errDocsGetCallbacks, [
['documentType', 'PERSONAL_DOCUMENT']
]);
} }
}, [id, chosenCompanyId]); }, [id, chosenCompanyId]);
@@ -684,7 +714,9 @@ const BandoApplication = () => {
const label = head(o.settings.filter(o => o.name === 'label')); const label = head(o.settings.filter(o => o.name === 'label'));
const text = head(o.settings.filter(o => o.name === 'text')); const text = head(o.settings.filter(o => o.name === 'text'));
const placeholder = head(o.settings.filter(o => o.name === 'placeholder')); const placeholder = head(o.settings.filter(o => o.name === 'placeholder'));
const options = head(o.settings.filter(o => o.name === 'options')); const options = ['fileselect'].includes(o.name)
? {value: [...companyDocs, ...personalDocs]}
: head(o.settings.filter(o => o.name === 'options'));
let tableColumns = head(o.settings.filter(o => o.name === 'table_columns')); let tableColumns = head(o.settings.filter(o => o.name === 'table_columns'));
if (!tableColumns) { if (!tableColumns) {
tableColumns = head(o.settings.filter(o => o.name === 'criteria_table_columns')); tableColumns = head(o.settings.filter(o => o.name === 'criteria_table_columns'));
@@ -718,9 +750,9 @@ const BandoApplication = () => {
return acc; return acc;
}, {}); }, {});
/*if (o.name === 'table') { if (o.name === 'fileselect') {
console.log('value:', values[o.id] ? values[o.id] : '') console.log('options::', options)
}*/ }
return ['paragraph'].includes(o.name) && text return ['paragraph'].includes(o.name) && text
? <div key={o.id}> ? <div key={o.id}>

View File

@@ -2,7 +2,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'
import { useDrag, useDrop } from 'react-dnd' import { useDrag, useDrop } from 'react-dnd'
import { ItemTypes } from '../ItemTypes'; import { ItemTypes } from '../ItemTypes';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { head, isEmpty } from 'ramda'; import { head, isEmpty, pathOr } from 'ramda';
import { klona } from 'klona'; import { klona } from 'klona';
// store // store
@@ -22,6 +22,7 @@ const BuilderElement = ({ id, name, label, index, bandoStatus }) => {
const ref = useRef(null); const ref = useRef(null);
const elements = useStore().main.formElements(); const elements = useStore().main.formElements();
const element = head(elements.filter(o => o.id === id)); const element = head(elements.filter(o => o.id === id));
const elementSettings = pathOr([], ['settings'], element);
const [isVariable, setIsVariable] = useState('secondary'); const [isVariable, setIsVariable] = useState('secondary');
const [isFormula, setIsFormula] = useState('secondary'); const [isFormula, setIsFormula] = useState('secondary');
const [variableName, setVariableName] = useState('secondary'); const [variableName, setVariableName] = useState('secondary');
@@ -134,10 +135,10 @@ const BuilderElement = ({ id, name, label, index, bandoStatus }) => {
drag(drop(ref)); drag(drop(ref));
useEffect(() => { useEffect(() => {
const variable = head(element.settings.filter(o => o.name === 'variable')); const variable = head(elementSettings.filter(o => o.name === 'variable'));
const formula = head(element.settings.filter(o => o.name === 'formula')); const formula = head(elementSettings.filter(o => o.name === 'formula'));
const isRequestedAmount = head(element.settings.filter(o => o.name === 'isRequestedAmount')); const isRequestedAmount = head(elementSettings.filter(o => o.name === 'isRequestedAmount'));
const isDelegation = head(element.settings.filter(o => o.name === 'isDelegation')); const isDelegation = head(elementSettings.filter(o => o.name === 'isDelegation'));
if (variable && !isEmpty(variable.value)) { if (variable && !isEmpty(variable.value)) {
setIsVariable('warning'); setIsVariable('warning');
@@ -151,12 +152,16 @@ const BuilderElement = ({ id, name, label, index, bandoStatus }) => {
if (isRequestedAmount && !isEmpty(isRequestedAmount.value) && isRequestedAmount.value) { if (isRequestedAmount && !isEmpty(isRequestedAmount.value) && isRequestedAmount.value) {
setIsRequestedAmount('tertiary'); setIsRequestedAmount('tertiary');
} else {
setIsRequestedAmount(false);
} }
if (isDelegation && !isEmpty(isDelegation.value) && isDelegation.value) { if (isDelegation && !isEmpty(isDelegation.value) && isDelegation.value) {
setIsDelegation('tertiary'); setIsDelegation('tertiary');
} else {
setIsDelegation(false);
} }
}, [elements]); }, [elementSettings]);
return ( return (
draggingElementId === id draggingElementId === id

View File

@@ -12,6 +12,10 @@ export default class CompanyDocumentsService {
NetworkService.postMultiPart(`${API_BASE_URL}/companyDocument/company/${id}/upload`, body, callback, errCallback, queryParams); NetworkService.postMultiPart(`${API_BASE_URL}/companyDocument/company/${id}/upload`, body, callback, errCallback, queryParams);
}; };
static attachCompanyDocumentToAppl = (id, callback, errCallback, queryParams) => {
NetworkService.put(`${API_BASE_URL}/companyDocument/${id}/document/upload`, {}, callback, errCallback, queryParams);
};
static deleteCompanyDocument = (id, callback, errCallback) => { static deleteCompanyDocument = (id, callback, errCallback) => {
NetworkService.delete(`${API_BASE_URL}/companyDocument`, {}, callback, errCallback, [ NetworkService.delete(`${API_BASE_URL}/companyDocument`, {}, callback, errCallback, [
['id', id] ['id', id]