- updated call form, new fields;

- updated preview pages for bando;
- fixed bug with decimal number field;
This commit is contained in:
Vitalii Kiiko
2024-10-01 12:55:17 +02:00
parent 111b1b5620
commit 676d7621e7
17 changed files with 282 additions and 56 deletions

View File

@@ -8,6 +8,7 @@ import AuthenticationService from './service/authentication-service';
// store // store
import { useStore, storeSet } from './store'; import { useStore, storeSet } from './store';
import CompanyService from './service/company-service';
const i18n = createI18n({}, 'gepafin'); const i18n = createI18n({}, 'gepafin');
@@ -17,6 +18,8 @@ function App() {
const callback = (data) => { const callback = (data) => {
if (data.status === 'SUCCESS') { if (data.status === 'SUCCESS') {
storeSet.main.userData(data.data); storeSet.main.userData(data.data);
storeSet.main.setAsyncRequest();
CompanyService.getCompanyForUser(data.data.id, companyCallback, errCompanyCallback)
} else { } else {
storeSet.main.doLogout(); storeSet.main.doLogout();
} }
@@ -28,6 +31,18 @@ function App() {
storeSet.main.unsetAsyncRequest(); storeSet.main.unsetAsyncRequest();
} }
const companyCallback = (data) => {
if (data.status === 'SUCCESS') {
storeSet.main.companies(data.data);
}
storeSet.main.unsetAsyncRequest();
}
const errCompanyCallback = (data) => {
storeSet.main.doLogout();
storeSet.main.unsetAsyncRequest();
}
useEffect(() => { useEffect(() => {
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
AuthenticationService.me(callback, errCallback); AuthenticationService.me(callback, errCallback);

View File

@@ -150,4 +150,8 @@
border: 1px solid var(--menuitem-active-background); border: 1px solid var(--menuitem-active-background);
} }
} }
}
.appForm__content {
} }

View File

@@ -12,8 +12,8 @@ body {
margin: 0; margin: 0;
font-family: "Montserrat", sans-serif; font-family: "Montserrat", sans-serif;
p, span:not(.p-button-label, .p-button-icon, .p-badge, .p-message-detail, .p-highlight), p, span:not(.p-button-label, .p-button-icon, .p-badge, .p-message-detail, .p-highlight, .p-inline-message-text),
input, label:not(.p-error), textarea, a, li, h1, h2, h3, h4, h5, h6, div, th, td { input, label:not(.p-error), textarea, a, li, h1, h2, h3, h4, h5, h6, div:not(.p-inline-message, .p-toast-detail), th, td {
color: var(--global-textColor); color: var(--global-textColor);
} }
} }

View File

@@ -24,12 +24,12 @@ const Datepicker = ({
</label> </label>
<Controller <Controller
name={fieldName} name={fieldName}
disabled={disabled}
control={control} control={control}
defaultValue={defaultValue} defaultValue={defaultValue}
rules={config} rules={config}
render={({ field, fieldState }) => ( render={({ field, fieldState }) => (
<Calendar id={field.name} <Calendar id={field.name}
disabled={disabled}
value={field.value ?? []} value={field.value ?? []}
onChange={(e) => field.onChange(e.value)} onChange={(e) => field.onChange(e.value)}
dateFormat="dd/mm/yy" dateFormat="dd/mm/yy"

View File

@@ -36,6 +36,7 @@ const NumberInput = ({
max={max} max={max}
locale={locale} locale={locale}
useGrouping={useGrouping} useGrouping={useGrouping}
maxFractionDigits={maxFractionDigits}
minFractionDigits={minFractionDigits} minFractionDigits={minFractionDigits}
className={classNames({ 'p-invalid': fieldState.invalid })}/> className={classNames({ 'p-invalid': fieldState.invalid })}/>
)}/> )}/>

View File

@@ -15,7 +15,8 @@ const TextInput = ({
icon = null, icon = null,
placeholder = '', placeholder = '',
inputtype = 'text', inputtype = 'text',
disabled = false disabled = false,
onBlurFn = () => {}
}) => { }) => {
const input = <Controller const input = <Controller
name={fieldName} name={fieldName}
@@ -26,6 +27,7 @@ const TextInput = ({
<InputText id={field.name} <InputText id={field.name}
disabled={disabled} disabled={disabled}
{...field} {...field}
onBlur={onBlurFn}
type={inputtype} type={inputtype}
placeholder={placeholder} placeholder={placeholder}
className={classNames({ 'p-invalid': fieldState.invalid })}/> className={classNames({ 'p-invalid': fieldState.invalid })}/>

View File

@@ -5,7 +5,7 @@ const getNumberWithCurrency = (value, currency = 'EUR') => {
currency currency
}) })
return formatter.format(value) return value ? formatter.format(value) : formatter.format(0)
} }
export default getNumberWithCurrency; export default getNumberWithCurrency;

View File

@@ -1,9 +1,10 @@
import React, { useState, useEffect, useCallback, useRef } from 'react'; import React, { useState, useEffect, useRef } 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 { klona } from 'klona'; import { klona } from 'klona';
import { head, range, is, pluck } from 'ramda'; import { head, range, is, pluck } from 'ramda';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
import { TZDate } from '@date-fns/tz';
// store // store
import { storeSet, useStore } from '../../store'; import { storeSet, useStore } from '../../store';
@@ -22,15 +23,15 @@ import {
isUrl, isUrl,
isMarcaDaBollo isMarcaDaBollo
} from '../../helpers/validators'; } from '../../helpers/validators';
import renderHtmlContent from '../../helpers/renderHtmlContent';
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
// components // components
import { Skeleton } from 'primereact/skeleton'; import { Skeleton } from 'primereact/skeleton';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import FormField from '../../components/FormField'; import FormField from '../../components/FormField';
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
import { Steps } from 'primereact/steps'; import { Steps } from 'primereact/steps';
import { Toast } from 'primereact/toast'; import { Toast } from 'primereact/toast';
import { TZDate } from '@date-fns/tz';
import { Messages } from 'primereact/messages'; import { Messages } from 'primereact/messages';
const BandoApplication = () => { const BandoApplication = () => {
@@ -300,6 +301,7 @@ const BandoApplication = () => {
<form className="appForm" onSubmit={handleSubmit(onSubmit)}> <form className="appForm" onSubmit={handleSubmit(onSubmit)}>
{formData.map(o => { {formData.map(o => {
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 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 = head(o.settings.filter(o => o.name === 'options'));
const step = head(o.settings.filter(o => o.name === 'step')); const step = head(o.settings.filter(o => o.name === 'step'));
@@ -329,7 +331,9 @@ const BandoApplication = () => {
return acc; return acc;
}, {}); }, {});
return <FormField return ['paragraph'].includes(o.name) && text
? <div className="appForm__content">{renderHtmlContent(text.value)}</div>
: <FormField
key={o.id} key={o.id}
type={o.name} type={o.name}
fieldName={o.id} fieldName={o.id}

View File

@@ -79,6 +79,19 @@ const BandoEditFormStep1 = forwardRef(function ({ initialData, getFormErrors, st
} }
}); });
} }
if (!isNil(formData.startTime)) {
if (!is(String, formData.startTime)) {
const tzAwareDate = new TZDate(formData.startTime, 'Europe/Berlin');
formData.startTime = tzAwareDate.toISOString().substring(11, 16);
}
}
if (!isNil(formData.endTime)) {
if (!is(String, formData.endTime)) {
const tzAwareDate = new TZDate(formData.endTime, 'Europe/Berlin');
formData.endTime = tzAwareDate.toISOString().substring(11, 16);
}
}
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
if (!formData.id) { if (!formData.id) {
@@ -384,9 +397,10 @@ const BandoEditFormStep1 = forwardRef(function ({ initialData, getFormErrors, st
errors={errors} errors={errors}
defaultValue={values['phoneNumber']} defaultValue={values['phoneNumber']}
config={{ config={{
required: __('È obbligatorio', 'gepafin'),
pattern: /^[0-9]/ pattern: /^[0-9]/
}} }}
inputgroup={true}
icon="+39"
/> />
</div> </div>

View File

@@ -41,11 +41,11 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st
}, [formInitialData]), mode: 'onChange' }, [formInitialData]), mode: 'onChange'
}); });
const values = getValues(); const values = getValues();
const step2Props = ['threshold', 'criteria', 'checkList', 'docs', 'images']; //const step2Props = ['threshold', 'criteria', 'checkList', 'docs', 'images'];
const toast = useRef(null); const toast = useRef(null);
const onSubmit = (formData) => { const onSubmit = (formData) => {
if (!isNil(formData.dates) && formData.dates.length) { /*if (!isNil(formData.dates) && formData.dates.length) {
formData.dates = formData.dates.map(v => { formData.dates = formData.dates.map(v => {
if (is(String, v)) { if (is(String, v)) {
return v; return v;
@@ -64,10 +64,11 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st
}, {}); }, {});
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
BandoService.updateBandoStep2(formData.id, forSubmit, createCallback, errCreateCallback); BandoService.updateBandoStep2(formData.id, forSubmit, createCallback, errCreateCallback);*/
}; };
const onSaveDraft = () => { const onSaveDraft = () => {
trigger();
const formData = getValues(); const formData = getValues();
if (!isNil(formData.dates) && formData.dates.length) { if (!isNil(formData.dates) && formData.dates.length) {
formData.dates = formData.dates.map(v => { formData.dates = formData.dates.map(v => {
@@ -79,6 +80,19 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st
} }
}); });
} }
if (!isNil(formData.startTime)) {
if (!is(String, formData.startTime)) {
const tzAwareDate = new TZDate(formData.startTime, 'Europe/Berlin');
formData.startTime = tzAwareDate.toISOString().substring(11, 16);
}
}
if (!isNil(formData.endTime)) {
if (!is(String, formData.endTime)) {
const tzAwareDate = new TZDate(formData.endTime, 'Europe/Berlin');
formData.endTime = tzAwareDate.toISOString().substring(11, 16);
}
}
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
if (!formData.id) { if (!formData.id) {

View File

@@ -14,7 +14,7 @@ const ElementSetting = ({ setting, changeFn, updateDataFn }) => {
const settingLabels = { const settingLabels = {
label: __('Label', 'gepafin'), label: __('Label', 'gepafin'),
placeholder: __('Segnaposto', 'gepafin'), placeholder: __('Segnaposto', 'gepafin'),
step: __('Precisione decimale', 'gepafin'), step: __('Numero Decimali', 'gepafin'),
options: __('Opzioni', 'gepafin'), options: __('Opzioni', 'gepafin'),
mime: __('Tipo di file', 'gepafin'), mime: __('Tipo di file', 'gepafin'),
text: __('Testo formattato', 'gepafin') text: __('Testo formattato', 'gepafin')

View File

@@ -28,6 +28,7 @@ import {
isPIVA, isPIVA,
isUrl isUrl
} from '../../helpers/validators'; } from '../../helpers/validators';
import renderHtmlContent from '../../helpers/renderHtmlContent';
const BandoFormsPreview = () => { const BandoFormsPreview = () => {
const { id, formId } = useParams(); const { id, formId } = useParams();
@@ -55,7 +56,8 @@ const BandoFormsPreview = () => {
isMarcaDaBollo isMarcaDaBollo
} }
const onSubmit = () => {} const onSubmit = () => {
}
const closePreview = () => { const closePreview = () => {
const parsedId = parseInt(id) const parsedId = parseInt(id)
@@ -116,6 +118,7 @@ const BandoFormsPreview = () => {
<form className="appForm" onSubmit={handleSubmit(onSubmit)}> <form className="appForm" onSubmit={handleSubmit(onSubmit)}>
{formData.map(o => { {formData.map(o => {
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 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 = head(o.settings.filter(o => o.name === 'options'));
const step = head(o.settings.filter(o => o.name === 'step')); const step = head(o.settings.filter(o => o.name === 'step'));
@@ -145,23 +148,25 @@ const BandoFormsPreview = () => {
return acc; return acc;
}, {}); }, {});
return <FormField return ['paragraph'].includes(o.name) && text
key={o.id} ? <div className="appForm__content">{renderHtmlContent(text.value)}</div>
type={o.name} : <FormField
fieldName={o.id} key={o.id}
label={label ? label.value : ''} type={o.name}
placeholder={placeholder ? placeholder.value : ''} fieldName={o.id}
control={control} label={label ? label.value : ''}
register={register} placeholder={placeholder ? placeholder.value : ''}
errors={errors} control={control}
defaultValue={values[o.id]} register={register}
maxFractionDigits={step} errors={errors}
accept={mimeValue} defaultValue={values[o.id]}
config={validations} maxFractionDigits={step ? step.value : 0}
options={options ? options.value : []} accept={mimeValue}
setDataFn={setValue} config={validations}
sourceId={0} options={options ? options.value : []}
/> setDataFn={setValue}
sourceId={0}
/>
})} })}
</form> </form>

View File

@@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef } from 'react'; import React, { useState, useEffect, useRef } from 'react';
import { __, sprintf } from '@wordpress/i18n'; import { __, sprintf } from '@wordpress/i18n';
import { useNavigate, useParams } from 'react-router-dom'; import { useNavigate, useParams } from 'react-router-dom';
import { is, isEmpty } from 'ramda'; import { is, isEmpty, isNil } from 'ramda';
// store // store
import { storeSet, useStore } from '../../store'; import { storeSet, useStore } from '../../store';
@@ -113,6 +113,10 @@ const BandoView = () => {
<span>{__('Importo totale', 'gepafin')}</span> <span>{__('Importo totale', 'gepafin')}</span>
<span>{getNumberWithCurrency(data.amount)}</span> <span>{getNumberWithCurrency(data.amount)}</span>
</p> </p>
<p className="appPageSection__pMeta">
<span>{__('Importo minimo per progetto', 'gepafin')}</span>
<span>{getNumberWithCurrency(data.amountMin)}</span>
</p>
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Importo massimo per progetto', 'gepafin')}</span> <span>{__('Importo massimo per progetto', 'gepafin')}</span>
<span>{getNumberWithCurrency(data.amountMax)}</span> <span>{getNumberWithCurrency(data.amountMax)}</span>
@@ -122,11 +126,11 @@ const BandoView = () => {
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data apertura', 'gepafin')}</span> <span>{__('Data apertura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[0])}</span> <span>{getDateFromISOstring(data.dates[0])} {data.startTime}</span>
</p> </p>
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data chiusura', 'gepafin')}</span> <span>{__('Data chiusura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[1])}</span> <span>{getDateFromISOstring(data.dates[1])} {data.endTime}</span>
</p> </p>
</div> </div>
</div> </div>
@@ -246,8 +250,8 @@ const BandoView = () => {
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<h2>{__('Contatti per Assistenza', 'gepafin')}</h2> <h2>{__('Contatti per Assistenza', 'gepafin')}</h2>
<div className="row rowContent"> <div className="row rowContent">
<p>Email: bandi@gepafin.it</p> <p>Email: {data.email}</p>
<p>Telefono: +39 075 123 4567</p> {!isNil(data.phoneNumber) ? <p>{__('Telefono', 'gepafin')}: +39 {data.phoneNumber}</p> : null}
</div> </div>
</div> </div>

View File

@@ -1,7 +1,7 @@
import React, { useState, useEffect, useRef } from 'react'; import React, { useState, useEffect, useRef } from 'react';
import { __, sprintf } from '@wordpress/i18n'; import { __, sprintf } from '@wordpress/i18n';
import { useNavigate, useParams } from 'react-router-dom'; import { useNavigate, useParams } from 'react-router-dom';
import { is, isEmpty } from 'ramda'; import { is, isEmpty, pathOr, isNil } from 'ramda';
// store // store
import { storeSet, useStore } from '../../store'; import { storeSet, useStore } from '../../store';
@@ -9,6 +9,8 @@ import { storeSet, useStore } from '../../store';
// tools // tools
import getNumberWithCurrency from '../../helpers/getNumberWithCurrency'; import getNumberWithCurrency from '../../helpers/getNumberWithCurrency';
import getDateFromISOstring from '../../helpers/getDateFromISOstring'; import getDateFromISOstring from '../../helpers/getDateFromISOstring';
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse';
import renderHtmlContent from '../../helpers/renderHtmlContent';
// components // components
import { Skeleton } from 'primereact/skeleton'; import { Skeleton } from 'primereact/skeleton';
@@ -16,21 +18,24 @@ import { Accordion } from 'primereact/accordion';
import { AccordionTab } from 'primereact/accordion'; import { AccordionTab } from 'primereact/accordion';
import { InputTextarea } from 'primereact/inputtextarea'; import { InputTextarea } from 'primereact/inputtextarea';
import { Button } from 'primereact/button'; import { Button } from 'primereact/button';
import BandoService from '../../service/bando-service';
import { Messages } from 'primereact/messages'; import { Messages } from 'primereact/messages';
import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; import { Message } from 'primereact/message';
// api
import BandoService from '../../service/bando-service';
import FaqItemService from '../../service/faq-item-service'; import FaqItemService from '../../service/faq-item-service';
import ApplicationService from '../../service/application-service'; import ApplicationService from '../../service/application-service';
import renderHtmlContent from '../../helpers/renderHtmlContent';
const BandoViewBeneficiario = () => { const BandoViewBeneficiario = () => {
const isAsyncRequest = useStore().main.isAsyncRequest(); const isAsyncRequest = useStore().main.isAsyncRequest();
const companies = useStore().main.companies();
const { id } = useParams(); const { id } = useParams();
const navigate = useNavigate(); const navigate = useNavigate();
const [data, setData] = useState({}); const [data, setData] = useState({});
const [newQuestion, setNewQuestion] = useState(''); const [newQuestion, setNewQuestion] = useState('');
const [applicationObj, setApplicationObj] = useState(true); const [applicationObj, setApplicationObj] = useState(true);
const bandoMsgs = useRef(null); const bandoMsgs = useRef(null);
const chosenCompanyId = pathOr(0, [0], companies);
const scaricaBando = () => { const scaricaBando = () => {
@@ -212,6 +217,10 @@ const BandoViewBeneficiario = () => {
<span>{__('Importo totale', 'gepafin')}</span> <span>{__('Importo totale', 'gepafin')}</span>
<span>{getNumberWithCurrency(data.amount)}</span> <span>{getNumberWithCurrency(data.amount)}</span>
</p> </p>
<p className="appPageSection__pMeta">
<span>{__('Importo minimo per progetto', 'gepafin')}</span>
<span>{getNumberWithCurrency(data.amountMin)}</span>
</p>
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Importo massimo per progetto', 'gepafin')}</span> <span>{__('Importo massimo per progetto', 'gepafin')}</span>
<span>{getNumberWithCurrency(data.amountMax)}</span> <span>{getNumberWithCurrency(data.amountMax)}</span>
@@ -221,11 +230,11 @@ const BandoViewBeneficiario = () => {
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data apertura', 'gepafin')}</span> <span>{__('Data apertura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[0])}</span> <span>{getDateFromISOstring(data.dates[0])} {data.startTime}</span>
</p> </p>
<p className="appPageSection__pMeta"> <p className="appPageSection__pMeta">
<span>{__('Data chiusura', 'gepafin')}</span> <span>{__('Data chiusura', 'gepafin')}</span>
<span>{getDateFromISOstring(data.dates[1])}</span> <span>{getDateFromISOstring(data.dates[1])} {data.endTime}</span>
</p> </p>
</div> </div>
</div> </div>
@@ -311,6 +320,12 @@ const BandoViewBeneficiario = () => {
label={__('Salva', 'gepafin')}/> label={__('Salva', 'gepafin')}/>
</div> </div>
{chosenCompanyId === 0
? <>
<Message severity="error" text={__("Devi creare un'azienda prima di partecipare nei bandi. Vai nel profilo aziendale.", 'gepafin')} />
</>
: null}
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('Download Documenti', 'gepafin')}</h2> <h2>{__('Download Documenti', 'gepafin')}</h2>
<div className="appPageSection__actions"> <div className="appPageSection__actions">
@@ -330,7 +345,7 @@ const BandoViewBeneficiario = () => {
icon="pi pi-download" iconPos="right"/> icon="pi pi-download" iconPos="right"/>
<Button <Button
type="button" type="button"
disabled={isAsyncRequest} disabled={isAsyncRequest || chosenCompanyId === 0}
onClick={submitApplication} onClick={submitApplication}
label={__('Presenta Domanda', 'gepafin')} label={__('Presenta Domanda', 'gepafin')}
icon="pi pi-save" iconPos="right"/> icon="pi pi-save" iconPos="right"/>
@@ -348,8 +363,8 @@ const BandoViewBeneficiario = () => {
<div className="appPageSection__withBorder"> <div className="appPageSection__withBorder">
<h2>{__('Contatti per Assistenza', 'gepafin')}</h2> <h2>{__('Contatti per Assistenza', 'gepafin')}</h2>
<div className="row rowContent"> <div className="row rowContent">
<p>Email: bandi@gepafin.it</p> <p>Email: {data.email}</p>
<p>Telefono: +39 075 123 4567</p> {!isNil(data.phoneNumber) ? <p>{__('Telefono', 'gepafin')}: +39 {data.phoneNumber}</p> : null}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -1,5 +1,6 @@
import React, { useMemo, useRef } from 'react'; import React, { useMemo, useRef } from 'react';
import { __ } from '@wordpress/i18n'; import { __ } from '@wordpress/i18n';
import { isEmpty, isNil } from 'ramda';
// store // store
import { storeSet, useStore } from '../../store'; import { storeSet, useStore } from '../../store';
@@ -12,12 +13,15 @@ import { Button } from 'primereact/button';
import { useForm } from 'react-hook-form'; import { useForm } from 'react-hook-form';
// api // api
import UserService from '../../service/user-service'; import CompanyService from '../../service/company-service';
import getDateFromISOstring from '../../helpers/getDateFromISOstring';
// tools
import { isPIVA } from '../../helpers/validators';
import BlockingOverlay from '../../components/BlockingOverlay';
const ProfileCompany = () => { const ProfileCompany = () => {
const isAsyncRequest = useStore().main.isAsyncRequest(); const isAsyncRequest = useStore().main.isAsyncRequest();
const userData = useStore().main.userData(); const companies = useStore().main.companies();
const infoMsgs = useRef(null); const infoMsgs = useRef(null);
const { const {
@@ -27,8 +31,8 @@ const ProfileCompany = () => {
setValue setValue
} = useForm({ } = useForm({
defaultValues: useMemo(() => { defaultValues: useMemo(() => {
return userData; return companies[0];
}, [userData]), }, [companies]),
mode: 'onChange' mode: 'onChange'
}); });
@@ -36,7 +40,11 @@ const ProfileCompany = () => {
infoMsgs.current.clear(); infoMsgs.current.clear();
storeSet.main.setAsyncRequest(); storeSet.main.setAsyncRequest();
UserService.updateUser(formData, updateCallback, updateError); if (isNil(formData.id)) {
CompanyService.createCompany(formData, updateCallback, updateError);
} else {
CompanyService.updateCompany(formData.id, formData, updateCallback, updateError);
}
}; };
const updateCallback = (data) => { const updateCallback = (data) => {
@@ -51,6 +59,47 @@ const ProfileCompany = () => {
storeSet.main.unsetAsyncRequest(); storeSet.main.unsetAsyncRequest();
} }
const checkVatNumber = (e) => {
infoMsgs.current.clear();
const isValid = isPIVA(e.target.value);
if (isValid) {
storeSet.main.setAsyncRequest();
CompanyService.checkVat(checkVatCallback, errCheckVatCallback, [['vatNumber', e.target.value]])
}
}
const checkVatCallback = (data) => {
if (data.status === 'SUCCESS') {
const resp = data.data.data;
if (!isEmpty(resp)) {
const {
cap, cf, denominazione, piva, indirizzo, comune, dettaglio: { pec }
} = resp;
const formData = {
cap,
pec,
email: pec,
city: comune,
codiceFiscale: cf,
address: indirizzo,
vatNumber: piva,
companyName: denominazione
}
console.log('formData', formData);
Object.keys(formData).map(k => setValue(k, formData[k]));
}
//setData(getFormattedBandiData(data.data));
}
storeSet.main.unsetAsyncRequest();
}
const errCheckVatCallback = (data) => {
set404FromErrorResponse(data);
storeSet.main.unsetAsyncRequest();
}
return ( return (
<div className="appPage"> <div className="appPage">
<div className="appPage__pageHeader"> <div className="appPage__pageHeader">
@@ -61,25 +110,101 @@ const ProfileCompany = () => {
<Messages ref={infoMsgs}/> <Messages ref={infoMsgs}/>
<form className="appForm" onSubmit={handleSubmit(onSubmit)}> <form className="appForm" onSubmit={handleSubmit(onSubmit)}>
<BlockingOverlay shouldDisplay={isAsyncRequest}/>
<div className="appPageSection"> <div className="appPageSection">
<h2>{__('Informazioni aziendali', 'gepafin')}</h2> <h2>{__('Informazioni aziendali', 'gepafin')}</h2>
<div className="appForm__cols"> <div className="appForm__cols">
<FormField <FormField
type="textinput" type="textinput"
fieldName="organization" disabled={true}
fieldName="companyName"
label={__('Ragione Sociale', 'gepafin')} label={__('Ragione Sociale', 'gepafin')}
control={control} control={control}
errors={errors} errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }} config={{ required: __('È obbligatorio', 'gepafin') }}
placeholder="Azienda" placeholder="Nome di azienda"
/> />
</div> </div>
<div className="appForm__cols"> <div className="appForm__cols">
<FormField <FormField
type="textinput" type="textinput"
fieldName="vatNumber"
label={__('P.IVA', 'gepafin')}
onBlurFn={checkVatNumber}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>
<FormField
type="textinput"
disabled={true}
fieldName="codiceFiscale"
label={__('Codice fiscale', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>
</div>
<div className="appForm__cols">
<FormField
type="textinput"
disabled={true}
fieldName="pec"
label={__('Email PEC', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>
<FormField
type="textinput"
disabled={true}
fieldName="email"
label={__('Email', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>
{/*<FormField
type="textinput"
fieldName="phoneNumber"
label={__('Telefono', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>*/}
</div>
<div className="appForm__cols">
<FormField
type="textinput"
disabled={true}
fieldName="address" fieldName="address"
label={__('Indirizzo Sede Legale', 'gepafin')} label={__('Indirizzo', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>
<FormField
type="textinput"
disabled={true}
fieldName="city"
label={__('Città', 'gepafin')}
control={control}
errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }}
/>
<FormField
type="textinput"
disabled={true}
fieldName="cap"
label={__('CAP', 'gepafin')}
control={control} control={control}
errors={errors} errors={errors}
config={{ required: __('È obbligatorio', 'gepafin') }} config={{ required: __('È obbligatorio', 'gepafin') }}

View File

@@ -0,0 +1,22 @@
import { NetworkService } from './network-service';
const API_BASE_URL = process.env.REACT_APP_API_EXECUTION_ADDRESS;
export default class CompanyService {
static createCompany = (body, callback, errCallback) => {
NetworkService.post(`${API_BASE_URL}/company`, body, callback, errCallback);
};
static updateCompany = (id, body, callback, errCallback) => {
NetworkService.post(`${API_BASE_URL}/company/${id}`, body, callback, errCallback);
};
static checkVat = (callback, errCallback, queryParams) => {
NetworkService.get(`${API_BASE_URL}/company/vatNumber`, callback, errCallback, queryParams);
};
static getCompanyForUser = (id, callback, errCallback) => {
NetworkService.get(`${API_BASE_URL}/company/user/${id}`, callback, errCallback);
};
}

View File

@@ -5,6 +5,7 @@ const initialStore = {
// user // user
userData: {}, userData: {},
token: '', token: '',
companies: [],
// bando form // bando form
formInitialData: {}, formInitialData: {},
// form builder // form builder