- added new setting 'isPecEmail';
- added automatic enabling/disabling participating of the field in CSV report for tables based on enabling individual columns;
This commit is contained in:
@@ -21,6 +21,7 @@ import ElementSettingTableColumnsForCsv from '../ElementSettingTableColumnsForCs
|
|||||||
|
|
||||||
import { mimeTypes } from '../../../../../../configData';
|
import { mimeTypes } from '../../../../../../configData';
|
||||||
import ElementSettingReportHeader from '../ElementSettingReportHeader';
|
import ElementSettingReportHeader from '../ElementSettingReportHeader';
|
||||||
|
import ElementSettingReportEnable from '../ElementSettingReportEnable';
|
||||||
|
|
||||||
|
|
||||||
const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => {
|
const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => {
|
||||||
@@ -119,10 +120,12 @@ const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => {
|
|||||||
name={setting.name}
|
name={setting.name}
|
||||||
bandoStatus={bandoStatus}
|
bandoStatus={bandoStatus}
|
||||||
setDataFn={updateDataFn}/>
|
setDataFn={updateDataFn}/>
|
||||||
} else if (['isRequestedAmount', 'isDelegation', 'isChecklistItem', 'reportEnable'].includes(setting.name)) {
|
} else if (['isRequestedAmount', 'isDelegation', 'isChecklistItem'].includes(setting.name)) {
|
||||||
return <InputSwitch
|
return <InputSwitch
|
||||||
checked={setting.value}
|
checked={setting.value}
|
||||||
onChange={(e) => changeFn(e.value, setting.name)}/>
|
onChange={(e) => changeFn(e.value, setting.name)}/>
|
||||||
|
} else if (['reportEnable'].includes(setting.name)) {
|
||||||
|
return <ElementSettingReportEnable setting={setting} setDataFn={updateDataFn}/>
|
||||||
} else if (setting.name === 'reportColumns') {
|
} else if (setting.name === 'reportColumns') {
|
||||||
return <ElementSettingTableColumnsForCsv
|
return <ElementSettingTableColumnsForCsv
|
||||||
value={is(Object, setting.value) ? setting.value : {}}
|
value={is(Object, setting.value) ? setting.value : {}}
|
||||||
|
|||||||
@@ -0,0 +1,53 @@
|
|||||||
|
import React, { useCallback } from 'react';
|
||||||
|
import { head, pathOr } from 'ramda';
|
||||||
|
import { klona } from 'klona';
|
||||||
|
|
||||||
|
// components
|
||||||
|
import { useStoreValue } from '../../../../../../store';
|
||||||
|
import { InputSwitch } from 'primereact/inputswitch';
|
||||||
|
|
||||||
|
const ElementSettingReportEnable = ({ setting = {}, setDataFn }) => {
|
||||||
|
const chosenFieldSettings = useStoreValue('chosenFieldSettings');
|
||||||
|
|
||||||
|
const handleChangeFn = useCallback((value) => {
|
||||||
|
setDataFn(setting.name, value);
|
||||||
|
const tableColumns = head(chosenFieldSettings.filter(o => o.name === 'table_columns'));
|
||||||
|
let reportColumns = head(chosenFieldSettings.filter(o => o.name === 'reportColumns'));
|
||||||
|
|
||||||
|
if (tableColumns) {
|
||||||
|
if (reportColumns) {
|
||||||
|
if (reportColumns.value && reportColumns.value.length === 0) {
|
||||||
|
const settingReports = head(chosenFieldSettings.filter(o => o.name === 'reportColumns'));
|
||||||
|
const settingData = pathOr([], ['value', 'stateFieldData'], tableColumns);
|
||||||
|
const settingReportData = pathOr([], ['value'], settingReports);
|
||||||
|
const canBeEnabled = settingData.filter(o => o.predefined).length > 0;
|
||||||
|
reportColumns.value = settingData.map((o) => {
|
||||||
|
const existing = pathOr({}, [], head(settingReportData.filter(s => s.name === o.name)));
|
||||||
|
const existingEnabled = pathOr(false, ['enableCsv'], existing);
|
||||||
|
return {
|
||||||
|
...o,
|
||||||
|
...existing,
|
||||||
|
predefined: o.predefined,
|
||||||
|
enableCsv: !canBeEnabled ? false : existingEnabled
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const newValueReportColumns = klona(reportColumns.value).map(o => {
|
||||||
|
o.enableCsv = value
|
||||||
|
return o;
|
||||||
|
});
|
||||||
|
|
||||||
|
setDataFn('reportColumns', newValueReportColumns);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [chosenFieldSettings]);
|
||||||
|
|
||||||
|
return (
|
||||||
|
<InputSwitch
|
||||||
|
checked={setting.value}
|
||||||
|
onChange={(e) => handleChangeFn(e.value)}/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ElementSettingReportEnable;
|
||||||
@@ -0,0 +1,127 @@
|
|||||||
|
import React, { useCallback, useEffect, useState } from 'react';
|
||||||
|
import { __, sprintf } from '@wordpress/i18n';
|
||||||
|
import { head, pathOr, pluck } from 'ramda';
|
||||||
|
import equal from 'fast-deep-equal';
|
||||||
|
|
||||||
|
// components
|
||||||
|
import { InputText } from 'primereact/inputtext';
|
||||||
|
import { InputSwitch } from 'primereact/inputswitch';
|
||||||
|
|
||||||
|
// store
|
||||||
|
import { storeGet } from '../../../../../../store';
|
||||||
|
|
||||||
|
const ElementSettingTableColumnsForCsv = ({ name, setDataFn, value }) => {
|
||||||
|
const [stateFieldData, setStateFieldData] = useState([]);
|
||||||
|
const canBeEnabled = stateFieldData.filter(o => o.predefined).length > 0;
|
||||||
|
|
||||||
|
const onInputChange = (e, index) => {
|
||||||
|
const { value } = e.target;
|
||||||
|
const newData = stateFieldData.map((o, i) => {
|
||||||
|
if (i === index) {
|
||||||
|
o.labelCsv = value;
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
})
|
||||||
|
setStateFieldData(newData);
|
||||||
|
}
|
||||||
|
|
||||||
|
const setChecked = (value, index) => {
|
||||||
|
//let name = '';
|
||||||
|
const newData = stateFieldData.map((o, i) => {
|
||||||
|
if (i === index) {
|
||||||
|
o.enableCsv = value;
|
||||||
|
//name = o.name;
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
});
|
||||||
|
|
||||||
|
setStateFieldData(newData);
|
||||||
|
}
|
||||||
|
|
||||||
|
const properFields = useCallback((item, i) => {
|
||||||
|
return <>
|
||||||
|
<div>
|
||||||
|
<InputText
|
||||||
|
value={item.label}
|
||||||
|
disabled={true}
|
||||||
|
placeholder={sprintf(__('Colonna %d', 'gepafin'), i + 1)}
|
||||||
|
onInput={(e) => onInputChange(e, i)}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<InputText
|
||||||
|
value={item.labelCsv}
|
||||||
|
disabled={!canBeEnabled}
|
||||||
|
placeholder={item.label}
|
||||||
|
onInput={(e) => onInputChange(e, i)}/>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<InputSwitch
|
||||||
|
checked={item.enableCsv}
|
||||||
|
disabled={!canBeEnabled}
|
||||||
|
onChange={(e) => setChecked(e.value, i)}/>
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
}, [canBeEnabled]);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const settings = storeGet('chosenFieldSettings');
|
||||||
|
let newValue = []
|
||||||
|
|
||||||
|
if (settings) {
|
||||||
|
const setting = head(settings.filter(o => o.name === 'table_columns'));
|
||||||
|
const settingReports = head(settings.filter(o => o.name === 'reportColumns'));
|
||||||
|
const settingData = pathOr([], ['value', 'stateFieldData'], setting);
|
||||||
|
const settingReportData = pathOr([], ['value'], settingReports);
|
||||||
|
const canBeEnabled = settingData.filter(o => o.predefined).length > 0;
|
||||||
|
newValue = settingData.map((o) => {
|
||||||
|
const existing = pathOr({}, [], head(settingReportData.filter(s => s.name === o.name)));
|
||||||
|
const existingEnabled = pathOr(false, ['enableCsv'], existing);
|
||||||
|
return {
|
||||||
|
...o,
|
||||||
|
...existing,
|
||||||
|
predefined: o.predefined,
|
||||||
|
enableCsv: !canBeEnabled ? false : existingEnabled
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
setStateFieldData(newValue);
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const atLeastOneIsEnabled = pluck('enableCsv', stateFieldData).filter(v => v).length > 0;
|
||||||
|
setDataFn(name, stateFieldData);
|
||||||
|
|
||||||
|
if (atLeastOneIsEnabled) {
|
||||||
|
setDataFn('reportEnable', true);
|
||||||
|
} else {
|
||||||
|
setDataFn('reportEnable', false);
|
||||||
|
}
|
||||||
|
}, [stateFieldData]);
|
||||||
|
|
||||||
|
/*useEffect(() => {
|
||||||
|
console.log('value', value, stateFieldData, equal(value, stateFieldData))
|
||||||
|
if (!equal(value, stateFieldData)) {
|
||||||
|
setStateFieldData(value);
|
||||||
|
}
|
||||||
|
}, [value]);*/
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
{!canBeEnabled
|
||||||
|
? <p>{__('Almeno una colonna deve essere predefinita! ⚠️')}</p> : null}
|
||||||
|
<div className="formElementSettings__repeater">
|
||||||
|
{stateFieldData.length > 0
|
||||||
|
? <div className="formElementSettings__repeaterItem tableRowCsv">
|
||||||
|
<div>{__('Colonna', 'gepafin')}</div>
|
||||||
|
<div>{__('Header CSV', 'gepafin')}</div>
|
||||||
|
<div>{__('Abilitato?', 'gepafin')}</div>
|
||||||
|
</div> : null}
|
||||||
|
{stateFieldData.map((o, i) => <div key={i} className="formElementSettings__repeaterItem tableRowCsv">
|
||||||
|
{properFields(o, i)}
|
||||||
|
</div>)}
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ElementSettingTableColumnsForCsv;
|
||||||
@@ -1,32 +1,56 @@
|
|||||||
import React, { useCallback, useEffect, useState } from 'react';
|
import React, { useCallback, useMemo } from 'react';
|
||||||
import { __, sprintf } from '@wordpress/i18n';
|
import { __, sprintf } from '@wordpress/i18n';
|
||||||
import { head, pathOr } from 'ramda';
|
import { head, pathOr, pluck } from 'ramda';
|
||||||
|
|
||||||
// components
|
// components
|
||||||
import { InputText } from 'primereact/inputtext';
|
import { InputText } from 'primereact/inputtext';
|
||||||
import { InputSwitch } from 'primereact/inputswitch';
|
import { InputSwitch } from 'primereact/inputswitch';
|
||||||
|
|
||||||
// store
|
// store
|
||||||
import { storeGet } from '../../../../../../store';
|
import { useStoreValue } from '../../../../../../store';
|
||||||
|
|
||||||
const ElementSettingTableColumnsForCsv = ({ name, setDataFn }) => {
|
const ElementSettingTableColumnsForCsv = ({ setDataFn }) => {
|
||||||
const [stateFieldData, setStateFieldData] = useState([]);
|
const chosenFieldSettings = useStoreValue('chosenFieldSettings');
|
||||||
const canBeEnabled = stateFieldData.filter(o => o.predefined).length > 0;
|
|
||||||
|
|
||||||
const onInputChange = (e, index) => {
|
const properValue = useMemo(() => {
|
||||||
|
let newValue = []
|
||||||
|
|
||||||
|
if (chosenFieldSettings) {
|
||||||
|
const setting = head(chosenFieldSettings.filter(o => o.name === 'table_columns'));
|
||||||
|
const settingReports = head(chosenFieldSettings.filter(o => o.name === 'reportColumns'));
|
||||||
|
const settingData = pathOr([], ['value', 'stateFieldData'], setting);
|
||||||
|
const settingReportData = pathOr([], ['value'], settingReports);
|
||||||
|
const canBeEnabled = settingData.filter(o => o.predefined).length > 0;
|
||||||
|
newValue = settingData.map((o) => {
|
||||||
|
const existing = pathOr({}, [], head(settingReportData.filter(s => s.name === o.name)));
|
||||||
|
const existingEnabled = pathOr(false, ['enableCsv'], existing);
|
||||||
|
return {
|
||||||
|
...o,
|
||||||
|
...existing,
|
||||||
|
predefined: o.predefined,
|
||||||
|
enableCsv: !canBeEnabled ? false : existingEnabled
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return newValue;
|
||||||
|
}, [chosenFieldSettings]);
|
||||||
|
const canBeEnabled = properValue.filter(o => o.predefined).length > 0;
|
||||||
|
|
||||||
|
const onInputChange = useCallback((e, index) => {
|
||||||
const { value } = e.target;
|
const { value } = e.target;
|
||||||
const newData = stateFieldData.map((o, i) => {
|
const newData = properValue.map((o, i) => {
|
||||||
if (i === index) {
|
if (i === index) {
|
||||||
o.labelCsv = value;
|
o.labelCsv = value;
|
||||||
}
|
}
|
||||||
return o;
|
return o;
|
||||||
})
|
})
|
||||||
setStateFieldData(newData);
|
|
||||||
}
|
|
||||||
|
|
||||||
const setChecked = (value, index) => {
|
setDataFn('reportColumns', newData);
|
||||||
//let name = '';
|
}, [properValue]);
|
||||||
const newData = stateFieldData.map((o, i) => {
|
|
||||||
|
const setChecked = useCallback((value, index) => {
|
||||||
|
const newData = properValue.map((o, i) => {
|
||||||
if (i === index) {
|
if (i === index) {
|
||||||
o.enableCsv = value;
|
o.enableCsv = value;
|
||||||
//name = o.name;
|
//name = o.name;
|
||||||
@@ -34,8 +58,16 @@ const ElementSettingTableColumnsForCsv = ({ name, setDataFn }) => {
|
|||||||
return o;
|
return o;
|
||||||
});
|
});
|
||||||
|
|
||||||
setStateFieldData(newData);
|
setDataFn('reportColumns', newData);
|
||||||
|
|
||||||
|
const atLeastOneIsEnabled = pluck('enableCsv', newData).filter(v => v).length > 0;
|
||||||
|
|
||||||
|
if (atLeastOneIsEnabled) {
|
||||||
|
setDataFn('reportEnable', true);
|
||||||
|
} else {
|
||||||
|
setDataFn('reportEnable', false);
|
||||||
}
|
}
|
||||||
|
}, [properValue]);
|
||||||
|
|
||||||
const properFields = useCallback((item, i) => {
|
const properFields = useCallback((item, i) => {
|
||||||
return <>
|
return <>
|
||||||
@@ -62,46 +94,18 @@ const ElementSettingTableColumnsForCsv = ({ name, setDataFn }) => {
|
|||||||
</>
|
</>
|
||||||
}, [canBeEnabled]);
|
}, [canBeEnabled]);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const settings = storeGet('chosenFieldSettings');
|
|
||||||
let newValue = []
|
|
||||||
|
|
||||||
if (settings) {
|
|
||||||
const setting = head(settings.filter(o => o.name === 'table_columns'));
|
|
||||||
const settingReports = head(settings.filter(o => o.name === 'reportColumns'));
|
|
||||||
const settingData = pathOr([], ['value', 'stateFieldData'], setting);
|
|
||||||
const settingReportData = pathOr([], ['value'], settingReports);
|
|
||||||
const canBeEnabled = settingData.filter(o => o.predefined).length > 0;
|
|
||||||
newValue = settingData.map((o) => {
|
|
||||||
const existing = pathOr({}, [], head(settingReportData.filter(s => s.name === o.name)));
|
|
||||||
const existingEnabled = pathOr(false, ['enableCsv'], existing);
|
|
||||||
return {
|
|
||||||
...o,
|
|
||||||
...existing,
|
|
||||||
predefined: o.predefined,
|
|
||||||
enableCsv: !canBeEnabled ? false : existingEnabled
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
setStateFieldData(newValue);
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
setDataFn(name, stateFieldData);
|
|
||||||
}, [stateFieldData]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{!canBeEnabled
|
{!canBeEnabled
|
||||||
? <p>{__('Almeno una colonna deve essere predefinita! ⚠️')}</p> : null}
|
? <p>{__('Almeno una colonna deve essere predefinita! ⚠️')}</p> : null}
|
||||||
<div className="formElementSettings__repeater">
|
<div className="formElementSettings__repeater">
|
||||||
{stateFieldData.length > 0
|
{properValue.length > 0
|
||||||
? <div className="formElementSettings__repeaterItem tableRowCsv">
|
? <div className="formElementSettings__repeaterItem tableRowCsv">
|
||||||
<div>{__('Colonna', 'gepafin')}</div>
|
<div>{__('Colonna', 'gepafin')}</div>
|
||||||
<div>{__('Header CSV', 'gepafin')}</div>
|
<div>{__('Header CSV', 'gepafin')}</div>
|
||||||
<div>{__('Abilitato?', 'gepafin')}</div>
|
<div>{__('Abilitato?', 'gepafin')}</div>
|
||||||
</div> : null}
|
</div> : null}
|
||||||
{stateFieldData.map((o, i) => <div key={i} className="formElementSettings__repeaterItem tableRowCsv">
|
{properValue.map((o, i) => <div key={i} className="formElementSettings__repeaterItem tableRowCsv">
|
||||||
{properFields(o, i)}
|
{properFields(o, i)}
|
||||||
</div>)}
|
</div>)}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -448,6 +448,10 @@ export const elementItems = [
|
|||||||
{
|
{
|
||||||
name: "reportHeader",
|
name: "reportHeader",
|
||||||
value: ""
|
value: ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "isPecEmail",
|
||||||
|
value: false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
validators: {
|
validators: {
|
||||||
@@ -477,6 +481,10 @@ export const elementItems = [
|
|||||||
{
|
{
|
||||||
name: "reportHeader",
|
name: "reportHeader",
|
||||||
value: ""
|
value: ""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "isPecEmail",
|
||||||
|
value: false
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
validators: {
|
validators: {
|
||||||
|
|||||||
Reference in New Issue
Block a user