diff --git a/locales/de/LC_MESSAGES/volto.po b/locales/de/LC_MESSAGES/volto.po index a56281b62..5c047c820 100644 --- a/locales/de/LC_MESSAGES/volto.po +++ b/locales/de/LC_MESSAGES/volto.po @@ -3748,6 +3748,11 @@ msgstr "" msgid "text_filter_placeholder" msgstr "" +#: helpers/FormValidation/DataGridFormValidationHelpers +# defaultMessage: Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo" +msgid "timeline_tempi_scadenze_validation_error" +msgstr "" + #: components/ItaliaTheme/View/BandoView/BandoText # defaultMessage: Tipologia del bando msgid "tipologia_bando" diff --git a/locales/en/LC_MESSAGES/volto.po b/locales/en/LC_MESSAGES/volto.po index ce4b5ac38..be46aa89c 100644 --- a/locales/en/LC_MESSAGES/volto.po +++ b/locales/en/LC_MESSAGES/volto.po @@ -3733,6 +3733,11 @@ msgstr "" msgid "text_filter_placeholder" msgstr "Insert a value" +#: helpers/FormValidation/DataGridFormValidationHelpers +# defaultMessage: Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo" +msgid "timeline_tempi_scadenze_validation_error" +msgstr "" + #: components/ItaliaTheme/View/BandoView/BandoText # defaultMessage: Tipologia del bando msgid "tipologia_bando" diff --git a/locales/es/LC_MESSAGES/volto.po b/locales/es/LC_MESSAGES/volto.po index f23bf098a..841beeb9d 100644 --- a/locales/es/LC_MESSAGES/volto.po +++ b/locales/es/LC_MESSAGES/volto.po @@ -3742,6 +3742,11 @@ msgstr "" msgid "text_filter_placeholder" msgstr "Insertar un valor" +#: helpers/FormValidation/DataGridFormValidationHelpers +# defaultMessage: Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo" +msgid "timeline_tempi_scadenze_validation_error" +msgstr "" + #: components/ItaliaTheme/View/BandoView/BandoText # defaultMessage: Tipologia del bando msgid "tipologia_bando" diff --git a/locales/fr/LC_MESSAGES/volto.po b/locales/fr/LC_MESSAGES/volto.po index 30a6652a0..1cde37fc9 100644 --- a/locales/fr/LC_MESSAGES/volto.po +++ b/locales/fr/LC_MESSAGES/volto.po @@ -3750,6 +3750,11 @@ msgstr "" msgid "text_filter_placeholder" msgstr "Entrez du texte" +#: helpers/FormValidation/DataGridFormValidationHelpers +# defaultMessage: Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo" +msgid "timeline_tempi_scadenze_validation_error" +msgstr "" + #: components/ItaliaTheme/View/BandoView/BandoText # defaultMessage: Tipologia del bando msgid "tipologia_bando" diff --git a/locales/it/LC_MESSAGES/volto.po b/locales/it/LC_MESSAGES/volto.po index 19514b5d4..8f6015d7a 100644 --- a/locales/it/LC_MESSAGES/volto.po +++ b/locales/it/LC_MESSAGES/volto.po @@ -3733,6 +3733,11 @@ msgstr "" msgid "text_filter_placeholder" msgstr "Inserisci un valore" +#: helpers/FormValidation/DataGridFormValidationHelpers +# defaultMessage: Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo" +msgid "timeline_tempi_scadenze_validation_error" +msgstr "" + #: components/ItaliaTheme/View/BandoView/BandoText # defaultMessage: Tipologia del bando msgid "tipologia_bando" diff --git a/locales/volto.pot b/locales/volto.pot index 4b57c5d7d..3da3cc86c 100644 --- a/locales/volto.pot +++ b/locales/volto.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: Plone\n" -"POT-Creation-Date: 2023-09-20T11:30:56.175Z\n" +"POT-Creation-Date: 2023-10-10T15:52:06.253Z\n" "Last-Translator: Plone i18n \n" "Language-Team: Plone i18n \n" "MIME-Version: 1.0\n" @@ -3735,6 +3735,11 @@ msgstr "" msgid "text_filter_placeholder" msgstr "" +#: helpers/FormValidation/DataGridFormValidationHelpers +# defaultMessage: Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo" +msgid "timeline_tempi_scadenze_validation_error" +msgstr "" + #: components/ItaliaTheme/View/BandoView/BandoText # defaultMessage: Tipologia del bando msgid "tipologia_bando" diff --git a/src/customizations/volto/helpers/FormValidation/FormValidation.js b/src/customizations/volto/helpers/FormValidation/FormValidation.js index 2bc1f160b..8e0e6862c 100644 --- a/src/customizations/volto/helpers/FormValidation/FormValidation.js +++ b/src/customizations/volto/helpers/FormValidation/FormValidation.js @@ -4,6 +4,21 @@ * - gestione motivo dello stato di servizio che è required solo se il servizio non è fruibile * - gestione campi tipo dataGridField * - gestione timeline_tempi_scadenze nel servizio che ha solo un campo richiesto su 5 + * - aggiunta la possibilita' di avere validazioni pluggable per ogni campo con widget data_grid, + * aggiungi i tuoi dgfield e le funzioni di validazione sotto CUSTOM_DGFIELD_VALIDATION. + * Rispettare la convenzione con l'id del campo proveniente dallo schema del CT, ie: + * export const CUSTOM_DGFIELD_VALIDATION = { + timeline_tempi_scadenze: { + isValid: (value, itemObj, intlFunc) => { + const isValid = value.every((val, i) => val.title); + return !isValid + ? intlFunc( + dgfieldValidationMessages.timeline_tempi_scadenze_validation_error, + ) + : null; + }, + }, + }; */ import { map, uniq, keys, intersection, isEmpty } from 'lodash'; import { messages } from '@plone/volto/helpers/MessageLabels/MessageLabels'; @@ -13,6 +28,9 @@ import { serviceFormValidationHelper, eventFormValidationHelper, getRealEmptyField, + getSpecificDataGridFieldValidation, + realWidgetType, + CUSTOM_DGFIELD_VALIDATION, } from 'design-comuni-plone-theme/helpers'; import config from '@plone/volto/registry'; @@ -162,6 +180,7 @@ const widgetValidation = { maximum: (value, itemObj, intlFunc) => isMaxPropertyValid(value, itemObj.maximum, 'maximum', intlFunc), }, + ...CUSTOM_DGFIELD_VALIDATION, }; /** @@ -288,10 +307,10 @@ const validateFieldsPerFieldset = ( ); map(schema.properties, (field, fieldId) => { - const fieldWidgetType = field.widget || field.type; + const fieldWidgetType = realWidgetType(field, fieldId); const widgetValidationCriteria = widgetValidation[fieldWidgetType] ? Object.keys(widgetValidation[fieldWidgetType]) - : []; + : getSpecificDataGridFieldValidation(fieldId); let fieldData = formData[fieldId]; // test each criterion ex maximum, isEmail, isUrl, maxLength etc const fieldErrors = widgetValidationCriteria diff --git a/src/helpers/FormValidation/DataGridFormValidationHelpers.js b/src/helpers/FormValidation/DataGridFormValidationHelpers.js new file mode 100644 index 000000000..74055d071 --- /dev/null +++ b/src/helpers/FormValidation/DataGridFormValidationHelpers.js @@ -0,0 +1,38 @@ +import { defineMessages } from 'react-intl'; + +const dgfieldValidationMessages = defineMessages({ + timeline_tempi_scadenze_validation_error: { + id: 'timeline_tempi_scadenze_validation_error', + defaultMessage: + 'Impossibile aggiungere un elemento alla timeline senza aver compilato il campo "Titolo"', + }, +}); + +export const CUSTOM_DGFIELD_VALIDATION = { + timeline_tempi_scadenze: { + isValid: (value, itemObj, intlFunc) => { + const isValid = value.every((val, i) => val.title); + return !isValid + ? intlFunc( + dgfieldValidationMessages.timeline_tempi_scadenze_validation_error, + ) + : null; + }, + }, +}; + +// Obbligati a far cosi' perche' il backend non è abbastanza furbo da definire +// una specifica factory non innestata o field.widget ofield.type per dgf e +// invece fornisce solo un generico "List" o "array", che avrebbe +// un'altra validazione in Volto. +export const realWidgetType = (field, fieldId) => { + return field?.widgetOptions?.frontendOptions?.widget === 'data_grid' + ? fieldId + : field.widget || field.type; +}; + +export const getSpecificDataGridFieldValidation = (fieldId) => { + return fieldId && CUSTOM_DGFIELD_VALIDATION.hasOwnProperty(fieldId) + ? Object.keys(CUSTOM_DGFIELD_VALIDATION[fieldId]) + : []; +}; diff --git a/src/helpers/index.js b/src/helpers/index.js index 612efda42..ff7a4943a 100644 --- a/src/helpers/index.js +++ b/src/helpers/index.js @@ -43,5 +43,10 @@ export { getRealEmptyField, eventFormValidationHelper, } from 'design-comuni-plone-theme/helpers/FormValidation/FormValidationHelpers'; +export { + getSpecificDataGridFieldValidation, + realWidgetType, + CUSTOM_DGFIELD_VALIDATION, +} from 'design-comuni-plone-theme/helpers/FormValidation/DataGridFormValidationHelpers'; export { commonSearchBlockMessages } from 'design-comuni-plone-theme/helpers/Translations/searchBlockExtendedTranslations';