diff --git a/RELEASE.md b/RELEASE.md index a26f3510d..74d5ce146 100644 --- a/RELEASE.md +++ b/RELEASE.md @@ -29,12 +29,24 @@ ### Fix - ... --> - ## Versione X.X.X (dd/mm/yyyy) + +### Novità +* Aggiornato il Blocco Form con diverse proprietà aggiuntive: + * è possibile aggiungere un testo in header e in footer nell'email inviata, + * è stato inserito un nuovo livello di sicurezza OTP nel caso in cui venga scelta l'opzione dell'invio copia della mail, + * è stato aggiunto un messaggio personalizzabile da mostrare dopo l'invio del form, + * è possibile mostrare un pulsante per il reset dei campi della form, + * sono stati sistemati i messaggi d'errore dei campi, + * è stata aggiunta una legenda per i campi obbligatori. + + +## Versione 7.28.2 (18/06/2024) + ### Fix -- Blocchi elenco dentro ad un grid con la corretta visualizzazione quando scelto una variazione. +- Sistemati Blocchi Elenco dentro al un Blocco Grid, ora viene mostrata la variazione scelta. ## Versione 7.27.1 (10/04/2024) diff --git a/locales/de/LC_MESSAGES/volto.po b/locales/de/LC_MESSAGES/volto.po index 7a20b533c..f36182860 100644 --- a/locales/de/LC_MESSAGES/volto.po +++ b/locales/de/LC_MESSAGES/volto.po @@ -2004,6 +2004,16 @@ msgstr "" msgid "fine_termine" msgstr "" +#: overrideTranslations +# defaultMessage: Annulla +msgid "form_default_cancel_label" +msgstr "" + +#: overrideTranslations +# defaultMessage: Ricomincia +msgid "form_reset" +msgstr "" + #: components/ItaliaTheme/View/PersonaView/PersonaRuolo # defaultMessage: Foto dell'attività politica msgid "foto_attivita_politica" @@ -2166,6 +2176,11 @@ msgstr "" msgid "legami_strutture_figlie" msgstr "" +#: overrideTranslations +# defaultMessage: I campi contrassegnati da (*) sono obbligatori. +msgid "legend_required" +msgstr "" + #: components/ItaliaTheme/Blocks/SearchSections/SideBar # defaultMessage: Collegamento msgid "link" diff --git a/locales/en/LC_MESSAGES/volto.po b/locales/en/LC_MESSAGES/volto.po index 2a758a19e..477654897 100644 --- a/locales/en/LC_MESSAGES/volto.po +++ b/locales/en/LC_MESSAGES/volto.po @@ -1989,6 +1989,16 @@ msgstr "Search" msgid "fine_termine" msgstr "End of term" +#: overrideTranslations +# defaultMessage: Annulla +msgid "form_default_cancel_label" +msgstr "" + +#: overrideTranslations +# defaultMessage: Ricomincia +msgid "form_reset" +msgstr "" + #: components/ItaliaTheme/View/PersonaView/PersonaRuolo # defaultMessage: Foto dell'attività politica msgid "foto_attivita_politica" @@ -2151,6 +2161,11 @@ msgstr "Association service or office" msgid "legami_strutture_figlie" msgstr "Internal services or offices" +#: overrideTranslations +# defaultMessage: I campi contrassegnati da (*) sono obbligatori. +msgid "legend_required" +msgstr "" + #: components/ItaliaTheme/Blocks/SearchSections/SideBar # defaultMessage: Collegamento msgid "link" diff --git a/locales/es/LC_MESSAGES/volto.po b/locales/es/LC_MESSAGES/volto.po index f4d874b52..4ce8b5b09 100644 --- a/locales/es/LC_MESSAGES/volto.po +++ b/locales/es/LC_MESSAGES/volto.po @@ -1998,6 +1998,16 @@ msgstr "Buscar" msgid "fine_termine" msgstr "Fin de los términos" +#: overrideTranslations +# defaultMessage: Annulla +msgid "form_default_cancel_label" +msgstr "" + +#: overrideTranslations +# defaultMessage: Ricomincia +msgid "form_reset" +msgstr "" + #: components/ItaliaTheme/View/PersonaView/PersonaRuolo # defaultMessage: Foto dell'attività politica msgid "foto_attivita_politica" @@ -2160,6 +2170,11 @@ msgstr "Servicio u oficina de la asociación" msgid "legami_strutture_figlie" msgstr "Servicios internos u oficinas" +#: overrideTranslations +# defaultMessage: I campi contrassegnati da (*) sono obbligatori. +msgid "legend_required" +msgstr "" + #: components/ItaliaTheme/Blocks/SearchSections/SideBar # defaultMessage: Collegamento msgid "link" diff --git a/locales/fr/LC_MESSAGES/volto.po b/locales/fr/LC_MESSAGES/volto.po index 54367e282..e98b64a94 100644 --- a/locales/fr/LC_MESSAGES/volto.po +++ b/locales/fr/LC_MESSAGES/volto.po @@ -2006,6 +2006,16 @@ msgstr "Rechercher" msgid "fine_termine" msgstr "Fin du mandat" +#: overrideTranslations +# defaultMessage: Annulla +msgid "form_default_cancel_label" +msgstr "" + +#: overrideTranslations +# defaultMessage: Ricomincia +msgid "form_reset" +msgstr "" + #: components/ItaliaTheme/View/PersonaView/PersonaRuolo # defaultMessage: Foto dell'attività politica msgid "foto_attivita_politica" @@ -2168,6 +2178,11 @@ msgstr "" msgid "legami_strutture_figlie" msgstr "" +#: overrideTranslations +# defaultMessage: I campi contrassegnati da (*) sono obbligatori. +msgid "legend_required" +msgstr "" + #: components/ItaliaTheme/Blocks/SearchSections/SideBar # defaultMessage: Collegamento msgid "link" diff --git a/locales/it/LC_MESSAGES/volto.po b/locales/it/LC_MESSAGES/volto.po index 4c165c29d..90e55b986 100644 --- a/locales/it/LC_MESSAGES/volto.po +++ b/locales/it/LC_MESSAGES/volto.po @@ -1989,6 +1989,16 @@ msgstr "Cerca" msgid "fine_termine" msgstr "Fine termine" +#: overrideTranslations +# defaultMessage: Annulla +msgid "form_default_cancel_label" +msgstr "Annulla" + +#: overrideTranslations +# defaultMessage: Ricomincia +msgid "form_reset" +msgstr "Ricomincia" + #: components/ItaliaTheme/View/PersonaView/PersonaRuolo # defaultMessage: Foto dell'attività politica msgid "foto_attivita_politica" @@ -2151,6 +2161,11 @@ msgstr "Servizio o ufficio di appartenenza" msgid "legami_strutture_figlie" msgstr "Servizi o uffici interni" +#: overrideTranslations +# defaultMessage: I campi contrassegnati da (*) sono obbligatori. +msgid "legend_required" +msgstr "I campi contrassegnati da (*) sono obbligatori." + #: components/ItaliaTheme/Blocks/SearchSections/SideBar # defaultMessage: Collegamento msgid "link" diff --git a/locales/volto.pot b/locales/volto.pot index 5cffc80d4..34568edad 100644 --- a/locales/volto.pot +++ b/locales/volto.pot @@ -1,7 +1,7 @@ msgid "" msgstr "" "Project-Id-Version: Plone\n" -"POT-Creation-Date: 2024-03-27T13:29:18.025Z\n" +"POT-Creation-Date: 2024-06-21T09:58:51.722Z\n" "Last-Translator: Plone i18n \n" "Language-Team: Plone i18n \n" "MIME-Version: 1.0\n" @@ -1991,6 +1991,16 @@ msgstr "" msgid "fine_termine" msgstr "" +#: overrideTranslations +# defaultMessage: Annulla +msgid "form_default_cancel_label" +msgstr "" + +#: overrideTranslations +# defaultMessage: Ricomincia +msgid "form_reset" +msgstr "" + #: components/ItaliaTheme/View/PersonaView/PersonaRuolo # defaultMessage: Foto dell'attività politica msgid "foto_attivita_politica" @@ -2153,6 +2163,11 @@ msgstr "" msgid "legami_strutture_figlie" msgstr "" +#: overrideTranslations +# defaultMessage: I campi contrassegnati da (*) sono obbligatori. +msgid "legend_required" +msgstr "" + #: components/ItaliaTheme/Blocks/SearchSections/SideBar # defaultMessage: Collegamento msgid "link" diff --git a/package.json b/package.json index e4f44a6b1..3a28d7efa 100644 --- a/package.json +++ b/package.json @@ -204,7 +204,7 @@ "volto-customer-satisfaction": "1.0.0", "volto-dropdownmenu": "4.0.0", "volto-editablefooter": "5.0.1", - "volto-form-block": "3.1.0", + "volto-form-block": "3.9.0", "volto-gdpr-privacy": "2.1.0", "volto-google-analytics": "2.0.0", "volto-multilingual-widget": "3.0.0", diff --git a/src/components/ItaliaTheme/manage/Widgets/FileWidget.jsx b/src/components/ItaliaTheme/manage/Widgets/FileWidget.jsx index 83eb4214d..cda0d531a 100644 --- a/src/components/ItaliaTheme/manage/Widgets/FileWidget.jsx +++ b/src/components/ItaliaTheme/manage/Widgets/FileWidget.jsx @@ -5,6 +5,7 @@ import React from 'react'; import PropTypes from 'prop-types'; +import cx from 'classnames'; import { Dimmer, Button } from 'design-react-kit/dist/design-react-kit'; import { readAsDataURL } from 'promise-file-reader'; import { injectIntl, defineMessages, useIntl } from 'react-intl'; @@ -56,13 +57,25 @@ const messages = defineMessages({ * @returns {string} Markup of the component. */ const FileWidget = (props) => { - const { id, value, onChange, label, onEdit, infoText } = props; + const { + id, + value, + onChange, + label, + onEdit, + infoText, + required, + invalid, + validationText, + } = props; const [isImage, setIsImage] = React.useState(false); const intl = useIntl(); React.useEffect(() => { if (value && imageMimetypes.includes(value['content-type'])) { setIsImage(true); + } else { + setIsImage(false); } }, [value]); @@ -98,6 +111,16 @@ const FileWidget = (props) => { reader.readAsDataURL(files[0]); }; + let attributes = {}; + if (required) { + attributes.required = true; + attributes['aria-required'] = true; + } + const isInvalid = invalid === true || invalid === 'true'; + if (isInvalid) { + attributes['aria-invalid'] = true; + } + return (
)} - {infoText && {infoText}} + {infoText && ( + + {infoText} + + )} {value && (
{value.filename} @@ -177,6 +210,11 @@ const FileWidget = (props) => {
)} + {validationText && ( +
+ {validationText} +
+ )} ); }; diff --git a/src/customizations/volto-form-block/components/Edit.jsx b/src/customizations/volto-form-block/components/Edit.jsx index f36dbe403..c4a8a917e 100644 --- a/src/customizations/volto-form-block/components/Edit.jsx +++ b/src/customizations/volto-form-block/components/Edit.jsx @@ -11,6 +11,7 @@ import React from 'react'; import EditBlock from 'volto-form-block/components/EditBlock'; // eslint-disable-next-line import/no-unresolved import Sidebar from 'volto-form-block/components/Sidebar'; +import ValidateConfigForm from 'volto-form-block/components/ValidateConfigForm'; import { Card, @@ -38,6 +39,10 @@ const messages = defineMessages({ id: 'form_default_submit_label', defaultMessage: 'Invia', }, + default_cancel_label: { + id: 'form_default_cancel_label', + defaultMessage: 'Annulla', + }, warning: { id: 'form_edit_warning', defaultMessage: 'Attenzione!', @@ -80,17 +85,24 @@ class Edit extends SubblocksEdit { return (
-
- {this.props?.data?.title &&

{this.props.data.title}

} - {this.props?.data?.description && ( -
- {this.props.data.description} -
- )} - - - - {/*this.state.subblocks.filter((s) => s.field_type === 'from') + { + this.props.onChangeBlock(this.props.block, data); + }} + > +
+ {this.props?.data?.title &&

{this.props.data.title}

} + {this.props?.data?.description && ( +
+ {this.props.data.description} +
+ )} + + + + {/*this.state.subblocks.filter((s) => s.field_type === 'from') .length == 0 && (

{this.props.intl.formatMessage(messages.warning)}

@@ -100,40 +112,49 @@ class Edit extends SubblocksEdit {
)*/} - {this.state.subblocks.map((subblock, subindex) => ( -
- -
- ))} + {this.state.subblocks.map((subblock, subindex) => ( +
+ +
+ ))} - {this.props.selected && ( -
- {this.renderAddBlockButton( - this.props.intl.formatMessage(messages.addField), - )} -
- )} + {this.props.selected && ( +
+ {this.renderAddBlockButton( + this.props.intl.formatMessage(messages.addField), + )} +
+ )} - - - - - -
-
-
-
+ + + {this.props.data?.show_cancel && ( + + )} + + + +
+
+
+
+ { + const intl = useIntl(); + const components = props.reactSelect.components; + return ( + + + + ); }); /** @@ -46,6 +65,7 @@ const Field = ({ valid, disabled = false, formHasErrors = false, + errorMessage, id, reactSelect, }) => { @@ -60,6 +80,15 @@ const Field = ({ return !isOnEdit && !valid; }; + const infoText = errorMessage ? ( + <> +
{description}
+ {errorMessage} + + ) : ( + description + ); + return (
{field_type === 'text' && ( @@ -69,7 +98,7 @@ const Field = ({ label={getLabel()} type="text" required={required} - infoText={description} + infoText={infoText} disabled={disabled} readOnly={disabled} invalid={isInvalid() ? 'true' : null} @@ -87,14 +116,14 @@ const Field = ({ type="textarea" rows={10} required={required} - infoText={description} + infoText={infoText} disabled={disabled} readOnly={disabled} invalid={isInvalid() ? 'true' : null} onChange={(e) => { onChange(name, e.target.value); }} - {...(value ? { value } : {})} + value={value ?? undefined} /> )} {field_type === 'select' && ( @@ -108,6 +137,7 @@ const Field = ({