From 090b58ba591d9ef1c2b88707f630ee75a7d7e0a3 Mon Sep 17 00:00:00 2001 From: Vitalii Kiiko Date: Wed, 4 Jun 2025 16:32:20 +0200 Subject: [PATCH] - added new setting 'isPecEmail'; - added automatic enabling/disabling participating of the field in CSV report for tables based on enabling individual columns; --- .../components/ElementSetting/index.js | 5 +- .../ElementSettingReportEnable/index.js | 53 ++++++++ .../index OLD.js | 127 ++++++++++++++++++ .../ElementSettingTableColumnsForCsv/index.js | 94 ++++++------- src/tempData.js | 8 ++ 5 files changed, 241 insertions(+), 46 deletions(-) create mode 100644 src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingReportEnable/index.js create mode 100644 src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index OLD.js diff --git a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js index 2c6b7bc..be87424 100644 --- a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js +++ b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSetting/index.js @@ -21,6 +21,7 @@ import ElementSettingTableColumnsForCsv from '../ElementSettingTableColumnsForCs import { mimeTypes } from '../../../../../../configData'; import ElementSettingReportHeader from '../ElementSettingReportHeader'; +import ElementSettingReportEnable from '../ElementSettingReportEnable'; const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => { @@ -119,10 +120,12 @@ const ElementSetting = ({ setting, changeFn, updateDataFn, bandoStatus }) => { name={setting.name} bandoStatus={bandoStatus} setDataFn={updateDataFn}/> - } else if (['isRequestedAmount', 'isDelegation', 'isChecklistItem', 'reportEnable'].includes(setting.name)) { + } else if (['isRequestedAmount', 'isDelegation', 'isChecklistItem'].includes(setting.name)) { return changeFn(e.value, setting.name)}/> + } else if (['reportEnable'].includes(setting.name)) { + return } else if (setting.name === 'reportColumns') { return { + 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 ( + handleChangeFn(e.value)}/> + ); +} + +export default ElementSettingReportEnable; \ No newline at end of file diff --git a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index OLD.js b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index OLD.js new file mode 100644 index 0000000..cac9ff5 --- /dev/null +++ b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index OLD.js @@ -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 <> +
+ onInputChange(e, i)}/> +
+
+ onInputChange(e, i)}/> +
+
+ setChecked(e.value, i)}/> +
+ + }, [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 + ?

{__('Almeno una colonna deve essere predefinita! ⚠️')}

: null} +
+ {stateFieldData.length > 0 + ?
+
{__('Colonna', 'gepafin')}
+
{__('Header CSV', 'gepafin')}
+
{__('Abilitato?', 'gepafin')}
+
: null} + {stateFieldData.map((o, i) =>
+ {properFields(o, i)} +
)} +
+ + ) +} + +export default ElementSettingTableColumnsForCsv; \ No newline at end of file diff --git a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index.js b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index.js index af5bcf0..c35e3e8 100644 --- a/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index.js +++ b/src/pages/BandoFormsEdit/components/BuilderElementSettings/components/ElementSettingTableColumnsForCsv/index.js @@ -1,32 +1,56 @@ -import React, { useCallback, useEffect, useState } from 'react'; +import React, { useCallback, useMemo } from 'react'; import { __, sprintf } from '@wordpress/i18n'; -import { head, pathOr } from 'ramda'; +import { head, pathOr, pluck } from 'ramda'; // components import { InputText } from 'primereact/inputtext'; import { InputSwitch } from 'primereact/inputswitch'; // store -import { storeGet } from '../../../../../../store'; +import { useStoreValue } from '../../../../../../store'; -const ElementSettingTableColumnsForCsv = ({ name, setDataFn }) => { - const [stateFieldData, setStateFieldData] = useState([]); - const canBeEnabled = stateFieldData.filter(o => o.predefined).length > 0; +const ElementSettingTableColumnsForCsv = ({ setDataFn }) => { + const chosenFieldSettings = useStoreValue('chosenFieldSettings'); - 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 newData = stateFieldData.map((o, i) => { + const newData = properValue.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) => { + setDataFn('reportColumns', newData); + }, [properValue]); + + const setChecked = useCallback((value, index) => { + const newData = properValue.map((o, i) => { if (i === index) { o.enableCsv = value; //name = o.name; @@ -34,8 +58,16 @@ const ElementSettingTableColumnsForCsv = ({ name, setDataFn }) => { 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) => { return <> @@ -62,46 +94,18 @@ const ElementSettingTableColumnsForCsv = ({ name, setDataFn }) => { }, [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 ( <> {!canBeEnabled ?

{__('Almeno una colonna deve essere predefinita! ⚠️')}

: null}
- {stateFieldData.length > 0 + {properValue.length > 0 ?
{__('Colonna', 'gepafin')}
{__('Header CSV', 'gepafin')}
{__('Abilitato?', 'gepafin')}
: null} - {stateFieldData.map((o, i) =>
+ {properValue.map((o, i) =>
{properFields(o, i)}
)}
diff --git a/src/tempData.js b/src/tempData.js index 4c4c116..bf12269 100644 --- a/src/tempData.js +++ b/src/tempData.js @@ -448,6 +448,10 @@ export const elementItems = [ { name: "reportHeader", value: "" + }, + { + name: "isPecEmail", + value: false } ], validators: { @@ -477,6 +481,10 @@ export const elementItems = [ { name: "reportHeader", value: "" + }, + { + name: "isPecEmail", + value: false } ], validators: {