diff --git a/src/App.js b/src/App.js index 876cce0..451b994 100644 --- a/src/App.js +++ b/src/App.js @@ -8,6 +8,7 @@ import AuthenticationService from './service/authentication-service'; // store import { useStore, storeSet } from './store'; +import CompanyService from './service/company-service'; const i18n = createI18n({}, 'gepafin'); @@ -17,6 +18,8 @@ function App() { const callback = (data) => { if (data.status === 'SUCCESS') { storeSet.main.userData(data.data); + storeSet.main.setAsyncRequest(); + CompanyService.getCompanyForUser(data.data.id, companyCallback, errCompanyCallback) } else { storeSet.main.doLogout(); } @@ -28,6 +31,18 @@ function App() { 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(() => { storeSet.main.setAsyncRequest(); AuthenticationService.me(callback, errCallback); diff --git a/src/assets/scss/components/appForm.scss b/src/assets/scss/components/appForm.scss index caa1f36..06d11d3 100644 --- a/src/assets/scss/components/appForm.scss +++ b/src/assets/scss/components/appForm.scss @@ -150,4 +150,8 @@ border: 1px solid var(--menuitem-active-background); } } +} + +.appForm__content { + } \ No newline at end of file diff --git a/src/assets/scss/components/layout.scss b/src/assets/scss/components/layout.scss index 07fa909..36ed39b 100644 --- a/src/assets/scss/components/layout.scss +++ b/src/assets/scss/components/layout.scss @@ -12,8 +12,8 @@ body { margin: 0; font-family: "Montserrat", sans-serif; - p, span:not(.p-button-label, .p-button-icon, .p-badge, .p-message-detail, .p-highlight), - input, label:not(.p-error), textarea, a, li, h1, h2, h3, h4, h5, h6, div, th, td { + 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:not(.p-inline-message, .p-toast-detail), th, td { color: var(--global-textColor); } } diff --git a/src/components/FormField/components/Datepicker/index.js b/src/components/FormField/components/Datepicker/index.js index 6769409..c2a84f0 100644 --- a/src/components/FormField/components/Datepicker/index.js +++ b/src/components/FormField/components/Datepicker/index.js @@ -24,12 +24,12 @@ const Datepicker = ({ ( field.onChange(e.value)} dateFormat="dd/mm/yy" diff --git a/src/components/FormField/components/NumberInput/index.js b/src/components/FormField/components/NumberInput/index.js index c26ceb7..93fb7a4 100644 --- a/src/components/FormField/components/NumberInput/index.js +++ b/src/components/FormField/components/NumberInput/index.js @@ -36,6 +36,7 @@ const NumberInput = ({ max={max} locale={locale} useGrouping={useGrouping} + maxFractionDigits={maxFractionDigits} minFractionDigits={minFractionDigits} className={classNames({ 'p-invalid': fieldState.invalid })}/> )}/> diff --git a/src/components/FormField/components/TextInput/index.js b/src/components/FormField/components/TextInput/index.js index 5432a53..4646a0b 100644 --- a/src/components/FormField/components/TextInput/index.js +++ b/src/components/FormField/components/TextInput/index.js @@ -15,7 +15,8 @@ const TextInput = ({ icon = null, placeholder = '', inputtype = 'text', - disabled = false + disabled = false, + onBlurFn = () => {} }) => { const input = diff --git a/src/helpers/getNumberWithCurrency.js b/src/helpers/getNumberWithCurrency.js index 6f0889b..c263122 100644 --- a/src/helpers/getNumberWithCurrency.js +++ b/src/helpers/getNumberWithCurrency.js @@ -5,7 +5,7 @@ const getNumberWithCurrency = (value, currency = 'EUR') => { currency }) - return formatter.format(value) + return value ? formatter.format(value) : formatter.format(0) } export default getNumberWithCurrency; \ No newline at end of file diff --git a/src/pages/BandoApplication/index.js b/src/pages/BandoApplication/index.js index 308b60b..15ea3c1 100644 --- a/src/pages/BandoApplication/index.js +++ b/src/pages/BandoApplication/index.js @@ -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 { useParams } from 'react-router-dom'; import { klona } from 'klona'; import { head, range, is, pluck } from 'ramda'; import { useForm } from 'react-hook-form'; +import { TZDate } from '@date-fns/tz'; // store import { storeSet, useStore } from '../../store'; @@ -22,15 +23,15 @@ import { isUrl, isMarcaDaBollo } from '../../helpers/validators'; +import renderHtmlContent from '../../helpers/renderHtmlContent'; +import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; // components import { Skeleton } from 'primereact/skeleton'; import { Button } from 'primereact/button'; import FormField from '../../components/FormField'; -import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; import { Steps } from 'primereact/steps'; import { Toast } from 'primereact/toast'; -import { TZDate } from '@date-fns/tz'; import { Messages } from 'primereact/messages'; const BandoApplication = () => { @@ -300,6 +301,7 @@ const BandoApplication = () => {
{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 step = head(o.settings.filter(o => o.name === 'step')); @@ -329,7 +331,9 @@ const BandoApplication = () => { return acc; }, {}); - return {renderHtmlContent(text.value)} + : diff --git a/src/pages/BandoEdit/components/BandoEditFormStep2/index.js b/src/pages/BandoEdit/components/BandoEditFormStep2/index.js index bc75d5b..44a38d2 100644 --- a/src/pages/BandoEdit/components/BandoEditFormStep2/index.js +++ b/src/pages/BandoEdit/components/BandoEditFormStep2/index.js @@ -41,11 +41,11 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st }, [formInitialData]), mode: 'onChange' }); const values = getValues(); - const step2Props = ['threshold', 'criteria', 'checkList', 'docs', 'images']; + //const step2Props = ['threshold', 'criteria', 'checkList', 'docs', 'images']; const toast = useRef(null); const onSubmit = (formData) => { - if (!isNil(formData.dates) && formData.dates.length) { + /*if (!isNil(formData.dates) && formData.dates.length) { formData.dates = formData.dates.map(v => { if (is(String, v)) { return v; @@ -64,10 +64,11 @@ const BandoEditFormStep2 = forwardRef(function ({ initialData, getFormErrors, st }, {}); storeSet.main.setAsyncRequest(); - BandoService.updateBandoStep2(formData.id, forSubmit, createCallback, errCreateCallback); + BandoService.updateBandoStep2(formData.id, forSubmit, createCallback, errCreateCallback);*/ }; const onSaveDraft = () => { + trigger(); const formData = getValues(); if (!isNil(formData.dates) && formData.dates.length) { 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(); if (!formData.id) { diff --git a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js index 6403454..0dee676 100644 --- a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js +++ b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js @@ -14,7 +14,7 @@ const ElementSetting = ({ setting, changeFn, updateDataFn }) => { const settingLabels = { label: __('Label', 'gepafin'), placeholder: __('Segnaposto', 'gepafin'), - step: __('Precisione decimale', 'gepafin'), + step: __('Numero Decimali', 'gepafin'), options: __('Opzioni', 'gepafin'), mime: __('Tipo di file', 'gepafin'), text: __('Testo formattato', 'gepafin') diff --git a/src/pages/BandoFormsPreview/index.js b/src/pages/BandoFormsPreview/index.js index b9d1c01..560b4af 100644 --- a/src/pages/BandoFormsPreview/index.js +++ b/src/pages/BandoFormsPreview/index.js @@ -28,6 +28,7 @@ import { isPIVA, isUrl } from '../../helpers/validators'; +import renderHtmlContent from '../../helpers/renderHtmlContent'; const BandoFormsPreview = () => { const { id, formId } = useParams(); @@ -55,7 +56,8 @@ const BandoFormsPreview = () => { isMarcaDaBollo } - const onSubmit = () => {} + const onSubmit = () => { + } const closePreview = () => { const parsedId = parseInt(id) @@ -116,6 +118,7 @@ const BandoFormsPreview = () => { {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 step = head(o.settings.filter(o => o.name === 'step')); @@ -145,23 +148,25 @@ const BandoFormsPreview = () => { return acc; }, {}); - return + return ['paragraph'].includes(o.name) && text + ?
{renderHtmlContent(text.value)}
+ : })} diff --git a/src/pages/BandoView/index.js b/src/pages/BandoView/index.js index 715ac03..a1a335f 100644 --- a/src/pages/BandoView/index.js +++ b/src/pages/BandoView/index.js @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef } from 'react'; import { __, sprintf } from '@wordpress/i18n'; import { useNavigate, useParams } from 'react-router-dom'; -import { is, isEmpty } from 'ramda'; +import { is, isEmpty, isNil } from 'ramda'; // store import { storeSet, useStore } from '../../store'; @@ -113,6 +113,10 @@ const BandoView = () => { {__('Importo totale', 'gepafin')} {getNumberWithCurrency(data.amount)}

+

+ {__('Importo minimo per progetto', 'gepafin')} + {getNumberWithCurrency(data.amountMin)} +

{__('Importo massimo per progetto', 'gepafin')} {getNumberWithCurrency(data.amountMax)} @@ -122,11 +126,11 @@ const BandoView = () => {

{__('Data apertura', 'gepafin')} - {getDateFromISOstring(data.dates[0])} + {getDateFromISOstring(data.dates[0])} {data.startTime}

{__('Data chiusura', 'gepafin')} - {getDateFromISOstring(data.dates[1])} + {getDateFromISOstring(data.dates[1])} {data.endTime}

@@ -246,8 +250,8 @@ const BandoView = () => {

{__('Contatti per Assistenza', 'gepafin')}

-

Email: bandi@gepafin.it

-

Telefono: +39 075 123 4567

+

Email: {data.email}

+ {!isNil(data.phoneNumber) ?

{__('Telefono', 'gepafin')}: +39 {data.phoneNumber}

: null}
diff --git a/src/pages/BandoViewBeneficiario/index.js b/src/pages/BandoViewBeneficiario/index.js index 902ba8c..b8932d1 100644 --- a/src/pages/BandoViewBeneficiario/index.js +++ b/src/pages/BandoViewBeneficiario/index.js @@ -1,7 +1,7 @@ import React, { useState, useEffect, useRef } from 'react'; import { __, sprintf } from '@wordpress/i18n'; import { useNavigate, useParams } from 'react-router-dom'; -import { is, isEmpty } from 'ramda'; +import { is, isEmpty, pathOr, isNil } from 'ramda'; // store import { storeSet, useStore } from '../../store'; @@ -9,6 +9,8 @@ import { storeSet, useStore } from '../../store'; // tools import getNumberWithCurrency from '../../helpers/getNumberWithCurrency'; import getDateFromISOstring from '../../helpers/getDateFromISOstring'; +import set404FromErrorResponse from '../../helpers/set404FromErrorResponse'; +import renderHtmlContent from '../../helpers/renderHtmlContent'; // components import { Skeleton } from 'primereact/skeleton'; @@ -16,21 +18,24 @@ import { Accordion } from 'primereact/accordion'; import { AccordionTab } from 'primereact/accordion'; import { InputTextarea } from 'primereact/inputtextarea'; import { Button } from 'primereact/button'; -import BandoService from '../../service/bando-service'; 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 ApplicationService from '../../service/application-service'; -import renderHtmlContent from '../../helpers/renderHtmlContent'; const BandoViewBeneficiario = () => { const isAsyncRequest = useStore().main.isAsyncRequest(); + const companies = useStore().main.companies(); const { id } = useParams(); const navigate = useNavigate(); const [data, setData] = useState({}); const [newQuestion, setNewQuestion] = useState(''); const [applicationObj, setApplicationObj] = useState(true); const bandoMsgs = useRef(null); + const chosenCompanyId = pathOr(0, [0], companies); const scaricaBando = () => { @@ -212,6 +217,10 @@ const BandoViewBeneficiario = () => { {__('Importo totale', 'gepafin')} {getNumberWithCurrency(data.amount)}

+

+ {__('Importo minimo per progetto', 'gepafin')} + {getNumberWithCurrency(data.amountMin)} +

{__('Importo massimo per progetto', 'gepafin')} {getNumberWithCurrency(data.amountMax)} @@ -221,11 +230,11 @@ const BandoViewBeneficiario = () => {

{__('Data apertura', 'gepafin')} - {getDateFromISOstring(data.dates[0])} + {getDateFromISOstring(data.dates[0])} {data.startTime}

{__('Data chiusura', 'gepafin')} - {getDateFromISOstring(data.dates[1])} + {getDateFromISOstring(data.dates[1])} {data.endTime}

@@ -311,6 +320,12 @@ const BandoViewBeneficiario = () => { label={__('Salva', 'gepafin')}/> + {chosenCompanyId === 0 + ? <> + + + : null} +

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

@@ -330,7 +345,7 @@ const BandoViewBeneficiario = () => { icon="pi pi-download" iconPos="right"/>
diff --git a/src/pages/ProfileCompany/index.js b/src/pages/ProfileCompany/index.js index 8192a9f..db9bc78 100644 --- a/src/pages/ProfileCompany/index.js +++ b/src/pages/ProfileCompany/index.js @@ -1,5 +1,6 @@ import React, { useMemo, useRef } from 'react'; import { __ } from '@wordpress/i18n'; +import { isEmpty, isNil } from 'ramda'; // store import { storeSet, useStore } from '../../store'; @@ -12,12 +13,15 @@ import { Button } from 'primereact/button'; import { useForm } from 'react-hook-form'; // api -import UserService from '../../service/user-service'; -import getDateFromISOstring from '../../helpers/getDateFromISOstring'; +import CompanyService from '../../service/company-service'; + +// tools +import { isPIVA } from '../../helpers/validators'; +import BlockingOverlay from '../../components/BlockingOverlay'; const ProfileCompany = () => { const isAsyncRequest = useStore().main.isAsyncRequest(); - const userData = useStore().main.userData(); + const companies = useStore().main.companies(); const infoMsgs = useRef(null); const { @@ -27,8 +31,8 @@ const ProfileCompany = () => { setValue } = useForm({ defaultValues: useMemo(() => { - return userData; - }, [userData]), + return companies[0]; + }, [companies]), mode: 'onChange' }); @@ -36,7 +40,11 @@ const ProfileCompany = () => { infoMsgs.current.clear(); 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) => { @@ -51,6 +59,47 @@ const ProfileCompany = () => { 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 (
@@ -61,25 +110,101 @@ const ProfileCompany = () => {
- +

{__('Informazioni aziendali', 'gepafin')}

+
+ + +
+ +
+ + + + + {/**/} +
+ +
+ + + + + { + 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); + }; +} diff --git a/src/store/initial.js b/src/store/initial.js index 7004e05..64db6ae 100644 --- a/src/store/initial.js +++ b/src/store/initial.js @@ -5,6 +5,7 @@ const initialStore = { // user userData: {}, token: '', + companies: [], // bando form formInitialData: {}, // form builder