136 lines
5.3 KiB
JavaScript
136 lines
5.3 KiB
JavaScript
import React, { useState, useEffect } from 'react';
|
|
import { __ } from '@wordpress/i18n';
|
|
import { useNavigate, useParams } from 'react-router-dom';
|
|
import { klona } from 'klona';
|
|
import { head } from 'ramda';
|
|
import { useForm } from 'react-hook-form';
|
|
|
|
// store
|
|
import { storeSet, useStore } from '../../store';
|
|
|
|
// api
|
|
import FormsService from '../../service/forms-service';
|
|
|
|
// components
|
|
import { Skeleton } from 'primereact/skeleton';
|
|
import { Button } from 'primereact/button';
|
|
import FormField from '../../components/FormField';
|
|
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
|
|
|
|
const BandoFormsPreview = () => {
|
|
const { id, formId } = useParams();
|
|
const navigate = useNavigate();
|
|
const [formData, setFormData] = useState([]);
|
|
const [formName, setFormName] = useState('');
|
|
const isAsyncRequest = useStore().main.isAsyncRequest();
|
|
const {
|
|
control,
|
|
handleSubmit,
|
|
formState: { errors },
|
|
getValues,
|
|
} = useForm({ defaultValues: {}, mode: 'onChange' });
|
|
const values = getValues();
|
|
|
|
const onSubmit = () => {}
|
|
|
|
const closePreview = () => {
|
|
const parsedId = parseInt(id)
|
|
const bandoId = !isNaN(parsedId) ? parsedId : 0;
|
|
const parsedFormId = parseInt(formId)
|
|
const bandoFormId = !isNaN(parsedFormId) ? parsedFormId : 0;
|
|
navigate(`/tenders/${bandoId}/forms/${bandoFormId}`);
|
|
}
|
|
|
|
const getFormCallback = (data) => {
|
|
if (data.status === 'SUCCESS') {
|
|
setFormName(data.data.label);
|
|
const elements = klona(data.data.content);
|
|
setFormData(elements);
|
|
}
|
|
storeSet.main.unsetAsyncRequest();
|
|
}
|
|
|
|
const errGetFormCallbacks = (data) => {
|
|
set404FromErrorResponse(data);
|
|
storeSet.main.unsetAsyncRequest();
|
|
}
|
|
|
|
useEffect(() => {
|
|
const parsedFormId = parseInt(formId)
|
|
const bandoFormId = !isNaN(parsedFormId) ? parsedFormId : 0;
|
|
|
|
if (bandoFormId) {
|
|
storeSet.main.setAsyncRequest();
|
|
FormsService.getFormById(bandoFormId, getFormCallback, errGetFormCallbacks);
|
|
}
|
|
}, [id, formId]);
|
|
|
|
return (
|
|
<div className="appPage">
|
|
{!isAsyncRequest
|
|
? <div className="appPage__pageHeader">
|
|
<h1>{formName}</h1>
|
|
</div>
|
|
: <>
|
|
<Skeleton width="20%" height="1rem" className="mb-2"></Skeleton>
|
|
<Skeleton width="100%" height="2rem" className="mb-8"></Skeleton>
|
|
</>}
|
|
|
|
<div className="appPage__spacer"></div>
|
|
|
|
{!isAsyncRequest
|
|
? <div className="appPage__content">
|
|
<div className="appPageSection__preview">
|
|
<Button
|
|
type="button"
|
|
outlined
|
|
onClick={closePreview}
|
|
label={__('Chiudi Anteprima', 'gepafin')}
|
|
icon="pi pi-arrow-left" iconPos="left"/>
|
|
</div>
|
|
|
|
<form className="appForm" onSubmit={handleSubmit(onSubmit)}>
|
|
{formData.map(o => {
|
|
const label = head(o.settings.filter(o => o.name === 'label'));
|
|
const placeholder = head(o.settings.filter(o => o.name === 'placeholder'));
|
|
const options = head(o.settings.filter(o => o.name === 'options'));
|
|
return <FormField
|
|
key={o.id}
|
|
type={o.name}
|
|
fieldName={`field_${o.id}`}
|
|
label={label ? label.value : ''}
|
|
placeholder={placeholder ? placeholder.value : ''}
|
|
control={control}
|
|
errors={errors}
|
|
defaultValue={values[`field_${o.id}`]}
|
|
config={o.validators}
|
|
options={options ? options.value : []}
|
|
/>
|
|
})}
|
|
</form>
|
|
|
|
<div className="appPageSection__preview">
|
|
<Button
|
|
type="button"
|
|
outlined
|
|
onClick={closePreview}
|
|
label={__('Chiudi Anteprima', 'gepafin')}
|
|
icon="pi pi-arrow-left" iconPos="left"/>
|
|
</div>
|
|
</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>
|
|
)
|
|
|
|
}
|
|
|
|
export default BandoFormsPreview; |