From 68cc6716e9f8e19b373d5fa6efd9ff4a035c78a6 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Mon, 17 Nov 2025 13:03:30 +0100 Subject: [PATCH 1/2] - removed condition for maxScore to be greater than 0; - fixed logic of closing amendment in status AWAITING; --- src/pages/DomandaEditInstructorManager/index.js | 4 ++-- src/pages/DomandaEditPreInstructor/index.js | 4 ++-- src/pages/SoccorsoEditBeneficiario/index.js | 2 +- src/pages/SoccorsoEditInstructorManager/index.js | 14 +++++++++++--- src/pages/SoccorsoEditPreInstructor/index.js | 14 +++++++++++--- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/pages/DomandaEditInstructorManager/index.js b/src/pages/DomandaEditInstructorManager/index.js index 6f27ef3..28e4f10 100644 --- a/src/pages/DomandaEditInstructorManager/index.js +++ b/src/pages/DomandaEditInstructorManager/index.js @@ -1228,9 +1228,9 @@ const DomandaEditInstructorManager = () => { useEffect(() => { const maxScore = pathOr(0, ['minScore'], data); const criteria = pathOr([], ['criteria'], data); - const scoreSum = sum(criteria.map(o => o.score)); + const scoreSum = pathOr(0, [], sum(criteria.map(o => o.score))); - setIsAdmissible(scoreSum !== 0 && scoreSum >= maxScore); + setIsAdmissible(scoreSum >= maxScore); }, [data]); useEffect(() => { diff --git a/src/pages/DomandaEditPreInstructor/index.js b/src/pages/DomandaEditPreInstructor/index.js index 23cf7e2..210d34b 100644 --- a/src/pages/DomandaEditPreInstructor/index.js +++ b/src/pages/DomandaEditPreInstructor/index.js @@ -1228,9 +1228,9 @@ const DomandaEditPreInstructor = () => { useEffect(() => { const maxScore = pathOr(0, ['minScore'], data); const criteria = pathOr([], ['criteria'], data); - const scoreSum = sum(criteria.map(o => o.score)); + const scoreSum = pathOr(0, [], sum(criteria.map(o => o.score))); - setIsAdmissible(scoreSum !== 0 && scoreSum >= maxScore); + setIsAdmissible(scoreSum >= maxScore); }, [data]); useEffect(() => { diff --git a/src/pages/SoccorsoEditBeneficiario/index.js b/src/pages/SoccorsoEditBeneficiario/index.js index 3b894cc..db61208 100644 --- a/src/pages/SoccorsoEditBeneficiario/index.js +++ b/src/pages/SoccorsoEditBeneficiario/index.js @@ -62,7 +62,7 @@ console.log('data', data.amendmentType) const entityId = !isNaN(parsedId) ? parsedId : 0; AmendmentsService.getSoccorsoByApplId(entityId, getCallback, errGetCallback, [ - ['statuses', 'AWAITING,RESPONSE_RECEIVED'] + ['statuses', 'AWAITING, RESPONSE_RECEIVED'] ]); }, [id]); diff --git a/src/pages/SoccorsoEditInstructorManager/index.js b/src/pages/SoccorsoEditInstructorManager/index.js index 56647cb..042418f 100644 --- a/src/pages/SoccorsoEditInstructorManager/index.js +++ b/src/pages/SoccorsoEditInstructorManager/index.js @@ -232,9 +232,17 @@ const SoccorsoEditInstructorManager = () => { } - const doCloseAmendment = () => { - doUpdateAmendment(true); - } + const doCloseAmendment = useCallback(() => { + if (data.status === 'AWAITING') { + const submitData = { + internalNote + } + storeSet('setAsyncRequest'); + AmendmentsService.closeSoccorso(amendmentId, submitData, closeAmendmentCallback, errCloseAmendmentCallback); + } else { + doUpdateAmendment(true); + } + }, [data]); const closeAmendmentCallback = (data) => { if (data.status === 'SUCCESS') { diff --git a/src/pages/SoccorsoEditPreInstructor/index.js b/src/pages/SoccorsoEditPreInstructor/index.js index 345752c..702e2b6 100644 --- a/src/pages/SoccorsoEditPreInstructor/index.js +++ b/src/pages/SoccorsoEditPreInstructor/index.js @@ -232,9 +232,17 @@ const SoccorsoEditPreInstructor = () => { } - const doCloseAmendment = () => { - doUpdateAmendment(true); - } + const doCloseAmendment = useCallback(() => { + if (data.status === 'AWAITING') { + const submitData = { + internalNote + } + storeSet('setAsyncRequest'); + AmendmentsService.closeSoccorso(amendmentId, submitData, closeAmendmentCallback, errCloseAmendmentCallback); + } else { + doUpdateAmendment(true); + } + }, [data]); const closeAmendmentCallback = (data) => { if (data.status === 'SUCCESS') { From 9121a4fd9ffe2f07360fdde6b6b2017ff0edcc62 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 19 Nov 2025 13:31:27 +0100 Subject: [PATCH 2/2] - company files for evaluation functionality; --- .../FormField/components/FileSelect/index.js | 83 +++-- .../DomandaEditInstructorManager/index.js | 6 +- .../components/EvaluationExtraFiles/index.js | 300 ++++++++++++++++++ .../components/RepeaterFields/index.js | 149 --------- src/pages/DomandaEditPreInstructor/index.js | 6 +- src/service/application-service.js | 4 + src/service/company-service.js | 4 + 7 files changed, 365 insertions(+), 187 deletions(-) create mode 100644 src/pages/DomandaEditPreInstructor/components/EvaluationExtraFiles/index.js delete mode 100644 src/pages/DomandaEditPreInstructor/components/RepeaterFields/index.js diff --git a/src/components/FormField/components/FileSelect/index.js b/src/components/FormField/components/FileSelect/index.js index 089b625..7c0a151 100644 --- a/src/components/FormField/components/FileSelect/index.js +++ b/src/components/FormField/components/FileSelect/index.js @@ -1,7 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; import { classNames } from 'primereact/utils'; import { __ } from '@wordpress/i18n'; -import { isEmpty, pathOr, pluck } from 'ramda'; +import { isEmpty, isNil, pathOr, pluck } from 'ramda'; // service import FileUploadService from '../../../../service/file-upload-service'; @@ -27,7 +27,8 @@ const FileSelect = ({ sourceId = 0, source = 'DOCUMENT', documentCategories = [], - saveFormCallback + saveFormCallback, + attachFilesCallback, }) => { //const [stateFieldData, setStateFieldData] = useState([]); const stateFieldData = useRef([]); @@ -52,6 +53,16 @@ const FileSelect = ({ setAddNewMode(false); }, [selectedUnconfirmed]); + const attachSelectedFilesCallback = useCallback(() => { + const existingIds = pluck('id', stateFieldData.current); + const selectedToBeAdded = selectedUnconfirmed.filter(o => !existingIds.includes(o.id)); + setSelectedUnconfirmed([]); + + // eslint-disable-next-line array-callback-return + selectedToBeAdded.map(o => attachFilesCallback(o)); + setAddNewMode(false); + }, [selectedUnconfirmed]); + const doGoBackToListOfFiles = () => { setSelectedUnconfirmed([]); setAddNewMode(false); @@ -100,7 +111,8 @@ const FileSelect = ({ defaultFocus: 'reject', acceptClassName: 'p-button-danger', accept: () => removeAttached(id), - reject: () => {} + reject: () => { + } }); }; @@ -116,19 +128,19 @@ const FileSelect = ({ ? o : documentCategories.includes(o.category.id)) .reduce((acc, cur) => { - const catName = pathOr('', ['category', 'categoryName'], cur); - const catLabel = pathOr('', ['category', 'description'], cur); + const catName = pathOr('', ['category', 'categoryName'], cur); + const catLabel = pathOr('', ['category', 'description'], cur); - if (!acc[catName]) { - acc[catName] = { - code: catName, - label: catLabel, - items: [] - }; - } - acc[catName].items.push(cur) - return acc; - }, {}); + if (!acc[catName]) { + acc[catName] = { + code: catName, + label: catLabel, + items: [] + }; + } + acc[catName].items.push(cur) + return acc; + }, {}); setOptionsTransformed(Object.values(optionsDefault)); } @@ -137,13 +149,14 @@ const FileSelect = ({ useEffect(() => { stateFieldData.current = defaultValue; }, [defaultValue]); - //console.log([...stateFieldData.current]) + return ( <> - + {!isNil(label) + ? : null}
{addNewMode ?
@@ -160,7 +173,7 @@ const FileSelect = ({ ?
- )} + {!isEmpty(stateFieldData.current) + ? [...stateFieldData.current].map(o =>
  • + {o.name} + {isNil(attachFilesCallback) + ?
    +
    : null} +
  • ) :
  • {__('Nessun file selezionato', 'gepafin')}
  • }
    + }, [companyDocsSelected]); + + const doImportCompanyDocs = useCallback(() => { + if (!isEmpty(companyDocsSelected)) { + const ids = pluck('id', companyDocsSelected); + ApplicationService.setApplicationDocuments(applicationId, setDocsCallback, errSetDocsCallback, [ + ['companyDocumentIds', ids] + ]) + } + }, [companyDocsSelected]); + + const setDocsCallback = (resp) => { + if (resp.status === 'SUCCESS') { + if (toast.current && resp.message) { + toast.current.show({ + severity: 'success', + summary: '', + detail: resp.message + }); + } + } + setIsVisibleCompanyDocsDialog(false); + setCompanyDocsSelected([]); + storeSet('unsetAsyncRequest'); + + setTimeout(() => { + window.location.reload(); + }, 2500); + } + + const errSetDocsCallback = (resp) => { + if (toast.current && resp.message) { + toast.current.show({ + severity: resp.status === 'SUCCESS' ? 'info' : 'error', + summary: '', + detail: resp.message + }); + } + setIsVisibleCompanyDocsDialog(false); + setCompanyDocsSelected([]); + set404FromErrorResponse(resp); + storeSet('unsetAsyncRequest'); + } + + const getDocsCallback = (resp) => { + if (resp.status === 'SUCCESS') { + setCompanyDocs(resp.data); + } + } + + const errGetDocsCallback = (resp) => { + if (toast.current && resp.message) { + toast.current.show({ + severity: resp.status === 'SUCCESS' ? 'info' : 'error', + summary: '', + detail: resp.message + }); + } + set404FromErrorResponse(resp); + } + + useEffect(() => { + CompanyService.getCompanyDocuments(companyId, getDocsCallback, errGetDocsCallback, [ + ['documentType', 'COMPANY_DOCUMENT'] + ]) + }, [companyId]); + + return ( + <> +
    +
    + {watchFields + ? watchFields.map((o, index) =>
    +
    + setNewChosen(o.fieldId)}>{o.nameValue} +
    +
    + + +
    +
    + ) : null} +
    +
    +
    +
    + + +
    + {/**/} + {}} + key={companyDocsSelected} + defaultValue={companyDocsSelected} + options={companyDocs} + sourceId="0" + source="DOCUMENT" + documentCategories={[]} + attachFilesCallback={(o) => { + setCompanyDocsSelected(prev => { + const newSelected = [...prev]; + if (!newSelected.find(s => s.id === o.id)) { + newSelected.push(o); + } + return newSelected; + }) + }} + /> +
    +
    + + ) +} + +export default EvaluationExtraFiles; \ No newline at end of file diff --git a/src/pages/DomandaEditPreInstructor/components/RepeaterFields/index.js b/src/pages/DomandaEditPreInstructor/components/RepeaterFields/index.js deleted file mode 100644 index c791052..0000000 --- a/src/pages/DomandaEditPreInstructor/components/RepeaterFields/index.js +++ /dev/null @@ -1,149 +0,0 @@ -import React, { useMemo, useState, useCallback } from 'react'; -import { useForm, useFieldArray } from 'react-hook-form'; -import { isEmpty, head } from 'ramda'; -import { __ } from '@wordpress/i18n'; -import { klona } from 'klona'; - -// tools -import uniqid from '../../../../helpers/uniqid'; - -// components -import FormField from '../../../../components/FormField'; -import { Button } from 'primereact/button'; - -const RepeaterFields = ({ - sourceId, - sourceName, - updateFn = () => { - }, - updateCallbackFn = () => { - }, - defaultValue = [], - shouldDisable = false - }) => { - const [chosen, setChosen] = useState(''); - const { - control, - handleSubmit, - formState: { errors }, - setValue, - register, - trigger, - getValues, - watch - } = useForm({ - defaultValues: useMemo(() => { - return { - items: defaultValue || [] - }; - }, [defaultValue]), mode: 'onChange' - }); - const { fields, append, remove } = useFieldArray({ - control, - name: 'items' - }); - - const watchFields = watch('items'); - - const onSubmit = () => { - } - - const doUpdateAfterFileUploaded = () => { - const formData = getValues(); - updateFn(formData.items); - updateCallbackFn(formData.items); - } - - const addNew = () => { - const uid = uniqid('f'); - const newItem = { - fieldId: uid, - nameValue: '', - fileValue: [] - } - append(newItem); - setChosen(newItem.fieldId); - trigger(); - }; - - const setNewChosen = useCallback((id) => { - const chosenObj = head(fields.filter(o => id === o.fieldId)); - if (chosenObj) { - setChosen(chosen === id ? '' : id); - } - }, [fields, chosen]); - - const removeItem = useCallback((index) => { - const chosenObj = klona(fields[index]); - remove(index); - if (chosen === chosenObj.fieldId) { - setChosen(''); - } - const formData = getValues(); - updateFn(formData.items); - updateCallbackFn(formData.items); - }, [fields, chosen]); - - return ( -
    -
    - {watchFields - ? watchFields.map((o, index) =>
    -
    - setNewChosen(o.fieldId)}>{o.nameValue} -
    -
    - - -
    -
    - ) : null} -
    -
    - ) -} - -export default RepeaterFields; \ No newline at end of file diff --git a/src/pages/DomandaEditPreInstructor/index.js b/src/pages/DomandaEditPreInstructor/index.js index 210d34b..db8c533 100644 --- a/src/pages/DomandaEditPreInstructor/index.js +++ b/src/pages/DomandaEditPreInstructor/index.js @@ -50,7 +50,7 @@ import { InputTextarea } from 'primereact/inputtextarea'; import { InputText } from 'primereact/inputtext'; import { Dropdown } from 'primereact/dropdown'; import ListOfFiles from './components/ListOfFiles'; -import RepeaterFields from './components/RepeaterFields'; +import EvaluationExtraFiles from './components/EvaluationExtraFiles'; import ApplicationInfo from './components/ApplicationInfo'; import ApplicationDownloadFiles from './components/ApplicationDownloadFiles'; import FormField from '../../components/FormField'; @@ -1288,7 +1288,7 @@ const DomandaEditPreInstructor = () => {

    {__('Documenti aggiuntivi', 'gepafin')}

    - updateEvaluationValue( data, @@ -1305,6 +1305,8 @@ const DomandaEditPreInstructor = () => { })} shouldDisable={['APPROVED', 'REJECTED'].includes(data.applicationStatus) || evaluationBlockedForUser(data)} sourceId={data.id} + applicationId={data.applicationId} + companyId={data.companyId} sourceName="evaluation"/>
    diff --git a/src/service/application-service.js b/src/service/application-service.js index a6e1ea2..4b7c523 100644 --- a/src/service/application-service.js +++ b/src/service/application-service.js @@ -71,4 +71,8 @@ export default class ApplicationService { static downloadRanking = (callId, callback, errCallback)=> { NetworkService.getBlob(`${API_BASE_URL}/application/call/${callId}/ranking-csv`, callback, errCallback); } + + static setApplicationDocuments = (id, callback, errCallback, queryParams) => { + NetworkService.get(`${API_BASE_URL}/application/${id}/companyDocuments`, callback, errCallback, queryParams); + }; } diff --git a/src/service/company-service.js b/src/service/company-service.js index 1246a91..b6365ff 100644 --- a/src/service/company-service.js +++ b/src/service/company-service.js @@ -39,4 +39,8 @@ export default class CompanyService { static deleteCompany = (id, callback, errCallback) => { NetworkService.delete(`${API_BASE_URL}/company/user/${id}`, {}, callback, errCallback); }; + + static getCompanyDocuments = (id, callback, errCallback, queryParams) => { + NetworkService.get(`${API_BASE_URL}/companyDocument/company/${id}`, callback, errCallback, queryParams); + }; }