import React, { useEffect, useState } from 'react'; import { head, isEmpty, isNil, uniq } from 'ramda'; import { __, sprintf } from '@wordpress/i18n'; import { klona } from 'klona'; import { wrap } from 'object-path-immutable'; // store import { storeGet, storeSet, useStoreValue } from '../../../../store'; // components import { InputText } from 'primereact/inputtext'; import { Button } from 'primereact/button'; import { Tag } from 'primereact/tag'; import { TabView, TabPanel } from 'primereact/tabview'; import { InputSwitch } from 'primereact/inputswitch'; import ElementSetting from './components/ElementSetting'; import { Dropdown } from 'primereact/dropdown'; import { MultiSelect } from 'primereact/multiselect'; import { dynamicDataOptions } from '../../../../configData'; const BuilderElementSettings = ({ closeSettingsFn, callStatus, context }) => { const elements = useStoreValue('formElements'); const activeElement = useStoreValue('activeElement'); const criteriaOptions = useStoreValue('bandoCriteria'); const [activeElementData, setActiveElementData] = useState({}); const [settings, setSettings] = useState([]); const [validators, setValidators] = useState({}); const [dynamicData, setDynamicData] = useState([]); const [criteria, setCriteria] = useState([]); const numberBasedValidatorFields = ['min', 'max', 'minLength', 'maxLength']; const customValidationOptions = [ { value: 'isPIVA', label: 'isPIVA' }, { value: 'isCodiceFiscale', label: 'isCodiceFiscale' }, { value: 'isCAP', label: 'isCAP' }, { value: 'isIBAN', label: 'isIBAN' }, { value: 'isEmail', label: 'isEmail' }, { value: 'isEmailPEC', label: 'isEmailPEC' }, { value: 'isUrl', label: 'isUrl' }, { value: 'isMarcaDaBollo', label: 'isMarcaDaBollo' }, { value: 'minChecks', label: 'minChecks' }, { value: 'maxChecks', label: 'maxChecks' }, { value: 'nonEmptyTables', label: 'nonEmptyTables' } ] const onChange = (value, name) => { const newSettings = settings .map(o => { if (o.name === name) { o.value = value; } return o; }); setSettings(newSettings); storeSet('chosenFieldSettings', newSettings); } const onUpdateOptions = (name, value) => { const newSettings = settings .map(o => { if (o.name === name) { o.value = value; } return o; }); setSettings(newSettings); storeSet('chosenFieldSettings', newSettings); } const saveSettings = () => { let newActiveElementData = klona(activeElementData); // Prefer the store value over React state: child components (e.g. ElementSettingSpreadsheet) // write to the store synchronously, but React state updates are batched and may lag behind // when saveSettings is called in the same event as the last setDataFn call. const latestSettings = storeGet('chosenFieldSettings') || settings; newActiveElementData = wrap(newActiveElementData).set(['settings'], latestSettings).value(); newActiveElementData = wrap(newActiveElementData).set(['validators'], validators).value(); newActiveElementData = wrap(newActiveElementData).set(['dynamicData'], dynamicData).value(); newActiveElementData = wrap(newActiveElementData).set(['criteria'], criteria).value(); const newElements = elements.map(o => o.id === newActiveElementData.id ? newActiveElementData : o); storeSet('formElements', newElements); closeSettingsFn(); } const showField = (value, key) => { let newValidators = klona(validators); if (value) { newValidators[key] = ''; } else { newValidators[key] = null; } setValidators(newValidators); } const toggleRequired = (value, key) => { let newValidators = klona(validators); newValidators[key] = value; setValidators(newValidators); } const onChangeValidator = (value, name) => { let newValidators = klona(validators); newValidators[name] = value; setValidators(newValidators); } const onChangeCriteriaData = (value) => { setCriteria(value); } const getDynamicDataOptions = (type) => { return dynamicDataOptions[type] ?? []; } useEffect(() => { const chosen = head(elements.filter(o => o.id === activeElement)); const elementItems = storeGet('elementItems'); const chosenElementItemCfg = head(elementItems.filter(o => o.name === chosen.name)); let settings = []; if (chosenElementItemCfg && chosenElementItemCfg.settings) { settings = chosenElementItemCfg.settings.map((o) => { const setting = head(chosen.settings.filter(s => s.name === o.name)); return setting ? klona(setting) : klona(o) }); } settings = uniq([...settings, ...chosen.settings]).filter(o => context === 'call' ? !['isRequestedAmount', 'isDelegation', ''].includes(o.name) : !['isChecklistItem'].includes(o.name)); if (chosen) { setActiveElementData(klona(chosen)); setSettings(settings); storeSet('chosenFieldSettings', settings); setValidators(klona(chosen.validators)); setDynamicData(chosen.dynamicData ? chosen.dynamicData : ''); setCriteria(chosen.criteria ? chosen.criteria : []); } else { setActiveElementData({}); setSettings([]); setValidators({}); setDynamicData([]); setCriteria([]); } }, [activeElement]); return (activeElementData ?