- added download application pdf button for submitted applications;

- fixed adding files for call;
This commit is contained in:
Vitalii Kiiko
2024-10-12 13:49:40 +02:00
parent 68f2d756ce
commit 6bfe2f9728
14 changed files with 400 additions and 264 deletions

View File

@@ -33,15 +33,12 @@ const AddCompany = () => {
handleSubmit,
formState: { errors },
setValue,
getValues,
watch
} = useForm({
defaultValues: {},
mode: 'onChange'
});
const values = getValues();
const emptyValues = Object.values(values).filter(v => isEmpty(v) || isNil(v)).length;
const isPiva = watch('vatNumber')
const isPiva = watch('vatNumber');
const setEmptyValues = () => {
const formData = {
@@ -75,7 +72,6 @@ const AddCompany = () => {
} else {
newCompanies = [...companies, company];
storeSet.main.chosenCompanyId(company.id);
console.log('set company 1', company.id)
}
storeSet.main.companies(newCompanies);
@@ -210,7 +206,7 @@ const AddCompany = () => {
config={{
required: __('È obbligatorio', 'gepafin'),
validate: {
isEmailPEC
isEmailPEC: isEmailPEC
}
}}
/>
@@ -225,7 +221,7 @@ const AddCompany = () => {
config={{
required: __('È obbligatorio', 'gepafin'),
validate: {
isEmail
isEmail: isEmail
}
}}
/>
@@ -291,7 +287,7 @@ const AddCompany = () => {
config={{
required: __('È obbligatorio', 'gepafin'),
validate: {
isEmail
isEmail: isEmail
}
}}
/>
@@ -321,7 +317,7 @@ const AddCompany = () => {
<div className="appPageSection__actions">
<Button
form="companyForm"
disabled={isAsyncRequest || emptyValues}
disabled={isAsyncRequest}
label={__('Salva modifiche', 'gepafin')}
icon="pi pi-check" iconPos="right"/>
</div>

View File

@@ -34,6 +34,7 @@ import { Messages } from 'primereact/messages';
import ApplicationSteps from './ApplicationSteps';
import BlockingOverlay from '../../components/BlockingOverlay';
import { Dialog } from 'primereact/dialog';
//import FileuploadApplicationSignedPdf from '../../components/FileuploadApplicationSignedPdf';
const BandoApplication = () => {
const { id } = useParams();
@@ -46,6 +47,8 @@ const BandoApplication = () => {
const [visibleConfirmation, setVisibleConfirmation] = useState(false);
const [applicationStatus, setApplicationStatus] = useState('');
const [activeStep, setActiveStep] = useState(1);
// TODO
//const [signedPdfFile, setSignedPdfFile] = useState([]);
const isAsyncRequest = useStore().main.isAsyncRequest();
const toast = useRef(null);
const formMsgs = useRef(null);
@@ -337,6 +340,30 @@ const BandoApplication = () => {
iconPos="right"/>
</div>
const onDownloadApplicationPdf = () => {
const applId = getApplicationId();
storeSet.main.setAsyncRequest();
ApplicationService.downloadApplicationPdf(applId, {}, getPdfCallback, errPdfCallback);
}
const getPdfCallback = (data) => {
const applId = getApplicationId();
const pdfFile = new Blob([data], { type: 'application/octet-stream' })
const url = window.URL.createObjectURL(pdfFile);
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', `application-${applId}.pdf`);
document.body.appendChild(link);
link.click();
link.remove();
storeSet.main.unsetAsyncRequest();
}
const errPdfCallback = (data) => {
set404FromErrorResponse(data);
}
useEffect(() => {
if (formInitialData) {
reset();
@@ -366,7 +393,9 @@ const BandoApplication = () => {
<div className="appPage__spacer"></div>
<ApplicationSteps totalSteps={totalSteps} activeStepIndex={activeStepIndex}/>
{'SUBMIT' !== applicationStatus
? <ApplicationSteps totalSteps={totalSteps} activeStepIndex={activeStepIndex}/>
: null}
<div className="appPage__spacer"></div>
@@ -375,7 +404,10 @@ const BandoApplication = () => {
<Dialog header={__('Conferma', 'gepafin')}
visible={visibleConfirmation}
style={{ width: '50vw' }}
onHide={() => {if (!visibleConfirmation) return; setVisibleConfirmation(false); }}>
onHide={() => {
if (!visibleConfirmation) return;
setVisibleConfirmation(false);
}}>
<p>
{__('Grazie, la tua domanda è stata inviata correttamente. Entro 24 ore riceverai una pec con data, ora e numero di protocollo.', 'gepafin')}
</p>
@@ -384,227 +416,123 @@ const BandoApplication = () => {
<div className="appPage__content">
<BlockingOverlay shouldDisplay={isAsyncRequest}/>
<form className="appForm" onSubmit={handleSubmit(onSubmit)}>
<div className="appPageSection">
{actionBtns}
</div>
{'SUBMIT' !== applicationStatus
? <div className="appPageSection">
{actionBtns}
</div> : null}
{formData.map(o => {
const label = head(o.settings.filter(o => o.name === 'label'));
const text = head(o.settings.filter(o => o.name === 'text'));
const placeholder = head(o.settings.filter(o => o.name === 'placeholder'));
const options = head(o.settings.filter(o => o.name === 'options'));
const tableColumns = head(o.settings.filter(o => o.name === 'table_columns'));
const step = head(o.settings.filter(o => o.name === 'step'));
const mime = head(o.settings.filter(o => o.name === 'mime'));
let mimeValue = '';
{'SUBMIT' !== applicationStatus
? formData.map(o => {
const label = head(o.settings.filter(o => o.name === 'label'));
const text = head(o.settings.filter(o => o.name === 'text'));
const placeholder = head(o.settings.filter(o => o.name === 'placeholder'));
const options = head(o.settings.filter(o => o.name === 'options'));
const tableColumns = head(o.settings.filter(o => o.name === 'table_columns'));
const step = head(o.settings.filter(o => o.name === 'step'));
const mime = head(o.settings.filter(o => o.name === 'mime'));
let mimeValue = '';
if (mime) {
mimeValue = mime.value.map(o => o.code ? o.code : o.ext);
}
const validations = Object.keys(o.validators).reduce((acc, cur) => {
if (o.validators[cur]) {
if (['min', 'max', 'minLength', 'maxLength', 'maxSize'].includes(cur)) {
acc[cur] = parseInt(o.validators[cur]);
} else if ('pattern' === cur) {
acc[cur] = new RegExp(o.validators[cur]);
} else if ('isRequired' === cur) {
//acc[cur] = o.validators[cur];
acc['required'] = true;
} else if ('custom' === cur && validationFns[o.validators[cur]]) {
if (!acc.validate) {
acc.validate = {};
}
acc.validate[o.validators[cur]] = validationFns[o.validators[cur]];
}
if (mime) {
mimeValue = mime.value.map(o => o.code ? o.code : o.ext);
}
return acc;
}, {});
//console.log('validations', validations, o.name)
const validations = Object.keys(o.validators).reduce((acc, cur) => {
if (o.validators[cur]) {
if (['min', 'max', 'minLength', 'maxLength', 'maxSize'].includes(cur)) {
acc[cur] = parseInt(o.validators[cur]);
} else if ('pattern' === cur) {
acc[cur] = new RegExp(o.validators[cur]);
} else if ('isRequired' === cur) {
//acc[cur] = o.validators[cur];
acc['required'] = true;
} else if ('custom' === cur && validationFns[o.validators[cur]]) {
if (!acc.validate) {
acc.validate = {};
}
acc.validate[o.validators[cur]] = validationFns[o.validators[cur]];
}
}
return ['paragraph'].includes(o.name) && text
? <div className="appForm__content" key={o.id}>{renderHtmlContent(text.value)}</div>
: <FormField
key={o.id}
type={o.name}
fieldName={o.id}
label={label ? label.value : ''}
placeholder={placeholder ? placeholder.value : ''}
control={control}
register={register}
errors={errors}
defaultValue={values[o.id] ? values[o.id] : ''}
maxFractionDigits={step ? step.value : 0}
accept={mimeValue}
config={validations}
options={options ? options.value : []}
setDataFn={setValue}
saveFormCallback={saveDraft}
sourceId={getApplicationId()}
useGrouping={false}
tableColumns={tableColumns ? tableColumns.value : {}}
/>
})}
return acc;
}, {});
//console.log('validations', validations, o.name)
return ['paragraph'].includes(o.name) && text
? <div className="appForm__content" key={o.id}>{renderHtmlContent(text.value)}</div>
: <FormField
key={o.id}
type={o.name}
fieldName={o.id}
label={label ? label.value : ''}
placeholder={placeholder ? placeholder.value : ''}
control={control}
register={register}
errors={errors}
defaultValue={values[o.id] ? values[o.id] : ''}
maxFractionDigits={step ? step.value : 0}
accept={mimeValue}
config={validations}
options={options ? options.value : []}
setDataFn={setValue}
saveFormCallback={saveDraft}
sourceId={getApplicationId()}
useGrouping={false}
tableColumns={tableColumns ? tableColumns.value : {}}
/>
})
: null}
{'SUBMIT' === applicationStatus
? <div className="appPageSection">
<div className="appForm__field">
<label>
{__('Scarica documento della domanda nel formato PDF', 'gepafin')}
</label>
</div>
<Button
type="button"
disabled={'SUBMIT' !== applicationStatus}
onClick={onDownloadApplicationPdf}
label={__('Scarica PDF', 'gepafin')}
icon="pi pi-download"
iconPos="right"/>
</div> : null}
{/*{'SUBMIT' === applicationStatus
? <div className="appPageSection">
<div className="appForm__field">
<label htmlFor="signedPdfFile">
{__('Carica documento della domanda firmato', 'gepafin')}
<span className="appForm__field--required">*</span>
(.p7m)
</label>
<FileuploadApplicationSignedPdf
setDataFn={setSignedPdfFile}
fieldName="signedPdfFile"
defaultValue={signedPdfFile}
accept={['.p7m,application/pkcs7-mime,application/x-pkcs7-mime']}
chooseLabel={__('Aggiungi documento', 'gepafin')}
multiple={false}
doctype="document"
applicationId={id}
/>
</div>
</div>
: null}*/}
<div className="appPage__spacer"></div>
<div className="appPageSection__hr">
<span>{__('Azioni rapide', 'gepafin')}</span>
</div>
{'SUBMIT' !== applicationStatus
? <div className="appPageSection__hr">
<span>{__('Azioni rapide', 'gepafin')}</span>
</div> : null}
<div className="appPageSection">
{actionBtns}
</div>
{'SUBMIT' !== applicationStatus
? <div className="appPageSection">
{actionBtns}
</div> : null}
</form>
</div>
{/*{!isAsyncRequest
? <div className="appPage__content">
<form className="appForm" ref={formRef} onSubmit={handleSubmit(onSubmit)}>
<div className="appPageSection">
<div className="appPageSection__actions">
{activeStep > 1 && activeStep <= totalSteps
? <Button
type="button"
disabled={'SUBMIT' === applicationStatus}
onClick={goBackward}
label={__('Vai indietro', 'gepafin')}
icon="pi pi-arrow-left"
iconPos="left"/> : null}
<Button
type="button"
disabled={isAsyncRequest || 'SUBMIT' === applicationStatus}
onClick={saveDraft}
outlined
label={__('Salva bozza', 'gepafin')} icon="pi pi-save" iconPos="right"/>
{activeStep < totalSteps
//&& activeStep === completedSteps
? <Button
type="button"
disabled={'SUBMIT' === applicationStatus}
onClick={goForward}
label={__('Vai avanti', 'gepafin')}
icon="pi pi-arrow-right"
iconPos="right"/> : null}
<Button
disabled={completedSteps === 0 || completedSteps !== totalSteps || 'SUBMIT' === applicationStatus}
label={__('Invia', 'gepafin')}
icon="pi pi-check"
iconPos="right"/>
</div>
</div>
{formInitialData
? formData.map(o => {
const label = head(o.settings.filter(o => o.name === 'label'));
const text = head(o.settings.filter(o => o.name === 'text'));
const placeholder = head(o.settings.filter(o => o.name === 'placeholder'));
const options = head(o.settings.filter(o => o.name === 'options'));
const tableColumns = head(o.settings.filter(o => o.name === 'table_columns'));
const step = head(o.settings.filter(o => o.name === 'step'));
const mime = head(o.settings.filter(o => o.name === 'mime'));
let mimeValue = '';
if (mime) {
mimeValue = mime.value.map(o => o.code ? o.code : o.ext);
}
const validations = Object.keys(o.validators).reduce((acc, cur) => {
if (o.validators[cur]) {
if (['min', 'max', 'minLength', 'maxLength', 'maxSize'].includes(cur)) {
acc[cur] = parseInt(o.validators[cur]);
} else if ('pattern' === cur) {
acc[cur] = new RegExp(o.validators[cur]);
} else if ('isRequired' === cur) {
//acc[cur] = o.validators[cur];
acc['required'] = true;
} else if ('custom' === cur && validationFns[o.validators[cur]]) {
if (!acc.validate) {
acc.validate = {};
}
acc.validate[o.validators[cur]] = validationFns[o.validators[cur]];
}
}
return acc;
}, {});
//console.log('validations', validations, o.name)
return ['paragraph'].includes(o.name) && text
? <div className="appForm__content" key={o.id}>{renderHtmlContent(text.value)}</div>
: <FormField
key={o.id}
type={o.name}
fieldName={o.id}
label={label ? label.value : ''}
placeholder={placeholder ? placeholder.value : ''}
control={control}
register={register}
errors={errors}
defaultValue={values[o.id] ? values[o.id] : ''}
maxFractionDigits={step ? step.value : 0}
accept={mimeValue}
config={validations}
options={options ? options.value : []}
setDataFn={setValue}
saveFormCallback={saveDraft}
sourceId={getApplicationId()}
useGrouping={false}
tableColumns={tableColumns ? tableColumns.value : {}}
/>
}) : null}
<div className="appPage__spacer"></div>
<div className="appPageSection__hr">
<span>{__('Azioni rapide', 'gepafin')}</span>
</div>
<div className="appPageSection">
<div className="appPageSection__actions">
{activeStep > 1 && activeStep <= totalSteps
? <Button
type="button"
disabled={'SUBMIT' === applicationStatus}
onClick={goBackward}
label={__('Vai indietro', 'gepafin')}
icon="pi pi-arrow-left"
iconPos="left"/> : null}
<Button
type="button"
disabled={isAsyncRequest || 'SUBMIT' === applicationStatus}
onClick={saveDraft}
outlined
label={__('Salva bozza', 'gepafin')} icon="pi pi-save" iconPos="right"/>
{activeStep < totalSteps
//&& activeStep === completedSteps
? <Button
type="button"
disabled={'SUBMIT' === applicationStatus}
onClick={goForward}
label={__('Vai avanti', 'gepafin')}
icon="pi pi-arrow-right"
iconPos="right"/> : null}
<Button
disabled={completedSteps === 0 || completedSteps !== totalSteps || 'SUBMIT' === applicationStatus}
label={__('Invia', 'gepafin')}
icon="pi pi-check"
iconPos="right"/>
</div>
</div>
</form>
</div>
: <>
<Skeleton width="20%" height="1rem" className="mb-2"></Skeleton>
<Skeleton width="100%" height="2rem" className="mb-8"></Skeleton>
<Skeleton width="20%" height="1rem" className="mb-2"></Skeleton>
<Skeleton width="100%" height="4rem" className="mb-8"></Skeleton>
<Skeleton width="20%" height="1rem" className="mb-2"></Skeleton>
<Skeleton width="100%" height="2rem" className="mb-8"></Skeleton>
<Skeleton width="20%" height="1rem" className="mb-2"></Skeleton>
<Skeleton width="100%" height="4rem"></Skeleton>
</>}*/}
</div>
)

View File

@@ -109,6 +109,7 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st
});
const newFormData = {...formInitialData, ...data.data};
setFormInitialData(newFormData);
storeSet.main.formInitialData(newFormData);
}
}
@@ -264,6 +265,7 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st
register={register}
sourceId={values.id}
source="call"
multiple={false}
/>
<FormFieldRepeater

View File

@@ -87,9 +87,9 @@ const BandoViewBeneficiario = () => {
storeSet.main.unsetAsyncRequest();
}
const saveToFavourites = () => {
/*const saveToFavourites = () => {
}
}*/
const submitNewQuestion = () => {
if (newQuestion && chosenCompanyId && 0 !== chosenCompanyId) {

View File

@@ -151,11 +151,13 @@ const MyLatestSubmissionsTable = () => {
};
const actionsBodyTemplate = (rowData) => {
return 'DRAFT' === rowData.status
? <Link to={`/imieibandi/${rowData.id}`}>
<Button severity="info" label={__('Modifica', 'gepafin')} icon="pi pi-pencil" size="small"
return <Link to={`/imieibandi/${rowData.id}`}>
{'DRAFT' === rowData.status
? <Button severity="info" label={__('Modifica', 'gepafin')} icon="pi pi-pencil" size="small"
iconPos="right"/>
</Link> : null
: <Button severity="info" label={__('View', 'gepafin')} icon="pi pi-eye" size="small"
iconPos="right"/>}
</Link>
}
const header = renderHeader();