@plone/volto 19.0.0-alpha.3 → 19.0.0-alpha.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintignore +2 -0
- package/.eslintrc +37 -6
- package/CHANGELOG.md +534 -2
- package/README.md +23 -21
- package/babel.js +1 -9
- package/cypress/docker/prefixed-rules.yml +26 -0
- package/cypress/docker/prefixed.yml +24 -0
- package/cypress/support/commands.js +12 -6
- package/cypress/support/guillotina.js +1 -0
- package/cypress.config.js +1 -0
- package/global-test-setup.js +1 -2
- package/locales/af/LC_MESSAGES/volto.po +5500 -0
- package/locales/af.json +1 -1
- package/locales/ar/LC_MESSAGES/volto.po +5500 -0
- package/locales/ar.json +1 -1
- package/locales/bg/LC_MESSAGES/volto.po +5500 -0
- package/locales/bg.json +1 -1
- package/locales/bn/LC_MESSAGES/volto.po +5500 -0
- package/locales/bn.json +1 -1
- package/locales/ca/LC_MESSAGES/volto.po +559 -349
- package/locales/ca.json +1 -1
- package/locales/cs/LC_MESSAGES/volto.po +5500 -0
- package/locales/cs.json +1 -1
- package/locales/cy/LC_MESSAGES/volto.po +5500 -0
- package/locales/cy.json +1 -1
- package/locales/da/LC_MESSAGES/volto.po +5500 -0
- package/locales/da.json +1 -1
- package/locales/de/LC_MESSAGES/volto.po +232 -21
- package/locales/de.json +1 -1
- package/locales/el/LC_MESSAGES/volto.po +5500 -0
- package/locales/el.json +1 -1
- package/locales/en/LC_MESSAGES/volto.po +226 -11
- package/locales/en.json +1 -1
- package/locales/en_AU/LC_MESSAGES/volto.po +5500 -0
- package/locales/en_AU.json +1 -1
- package/locales/en_GB/LC_MESSAGES/volto.po +5500 -0
- package/locales/en_GB.json +1 -1
- package/locales/eo/LC_MESSAGES/volto.po +5500 -0
- package/locales/eo.json +1 -1
- package/locales/es/LC_MESSAGES/volto.po +321 -111
- package/locales/es.json +1 -1
- package/locales/et/LC_MESSAGES/volto.po +5500 -0
- package/locales/et.json +1 -1
- package/locales/eu/LC_MESSAGES/volto.po +404 -194
- package/locales/eu.json +1 -1
- package/locales/fa/LC_MESSAGES/volto.po +5500 -0
- package/locales/fa.json +1 -1
- package/locales/fi/LC_MESSAGES/volto.po +221 -11
- package/locales/fi.json +1 -1
- package/locales/fr/LC_MESSAGES/volto.po +220 -10
- package/locales/fr.json +1 -1
- package/locales/fu/LC_MESSAGES/volto.po +5500 -0
- package/locales/fu.json +1 -1
- package/locales/gl/LC_MESSAGES/volto.po +5501 -0
- package/locales/gl.json +1 -1
- package/locales/he/LC_MESSAGES/volto.po +5500 -0
- package/locales/he.json +1 -1
- package/locales/hi/LC_MESSAGES/volto.po +225 -10
- package/locales/hi.json +1 -1
- package/locales/hr/LC_MESSAGES/volto.po +5500 -0
- package/locales/hr.json +1 -1
- package/locales/hu/LC_MESSAGES/volto.po +5500 -0
- package/locales/hu.json +1 -1
- package/locales/hy/LC_MESSAGES/volto.po +5500 -0
- package/locales/hy.json +1 -1
- package/locales/id/LC_MESSAGES/volto.po +5500 -0
- package/locales/id.json +1 -1
- package/locales/it/LC_MESSAGES/volto.po +239 -24
- package/locales/it.json +1 -1
- package/locales/ja/LC_MESSAGES/volto.po +264 -53
- package/locales/ja.json +1 -1
- package/locales/ka/LC_MESSAGES/volto.po +5500 -0
- package/locales/ka.json +1 -1
- package/locales/kn/LC_MESSAGES/volto.po +5500 -0
- package/locales/kn.json +1 -1
- package/locales/ko/LC_MESSAGES/volto.po +5500 -0
- package/locales/ko.json +1 -1
- package/locales/lt/LC_MESSAGES/volto.po +5500 -0
- package/locales/lt.json +1 -1
- package/locales/lv/LC_MESSAGES/volto.po +5500 -0
- package/locales/lv.json +1 -1
- package/locales/mi/LC_MESSAGES/volto.po +5500 -0
- package/locales/mi.json +1 -1
- package/locales/mk/LC_MESSAGES/volto.po +5500 -0
- package/locales/mk.json +1 -1
- package/locales/my/LC_MESSAGES/volto.po +5500 -0
- package/locales/my.json +1 -1
- package/locales/nb_NO/LC_MESSAGES/volto.po +5500 -0
- package/locales/nb_NO.json +1 -1
- package/locales/nl/LC_MESSAGES/volto.po +243 -32
- package/locales/nl.json +1 -1
- package/locales/nn/LC_MESSAGES/volto.po +5500 -0
- package/locales/nn.json +1 -1
- package/locales/pl/LC_MESSAGES/volto.po +5500 -0
- package/locales/pl.json +1 -1
- package/locales/pt/LC_MESSAGES/volto.po +869 -659
- package/locales/pt.json +1 -1
- package/locales/pt_BR/LC_MESSAGES/volto.po +229 -19
- package/locales/pt_BR.json +1 -1
- package/locales/rm/LC_MESSAGES/volto.po +5500 -0
- package/locales/rm.json +1 -1
- package/locales/ro/LC_MESSAGES/volto.po +252 -42
- package/locales/ro.json +1 -1
- package/locales/ru/LC_MESSAGES/volto.po +220 -10
- package/locales/ru.json +1 -1
- package/locales/sk/LC_MESSAGES/volto.po +5500 -0
- package/locales/sk.json +1 -1
- package/locales/sl/LC_MESSAGES/volto.po +5500 -0
- package/locales/sl.json +1 -1
- package/locales/sm/LC_MESSAGES/volto.po +5500 -0
- package/locales/sm.json +1 -1
- package/locales/sq/LC_MESSAGES/volto.po +5500 -0
- package/locales/sq.json +1 -1
- package/locales/sr/LC_MESSAGES/volto.po +5500 -0
- package/locales/sr.json +1 -1
- package/locales/sr@cyrl/LC_MESSAGES/volto.po +5500 -0
- package/locales/sr@cyrl.json +1 -1
- package/locales/sr@latn/LC_MESSAGES/volto.po +5500 -0
- package/locales/sr@latn.json +1 -1
- package/locales/sv/LC_MESSAGES/volto.po +5500 -0
- package/locales/sv.json +1 -1
- package/locales/ta/LC_MESSAGES/volto.po +5501 -0
- package/locales/ta.json +1 -1
- package/locales/te/LC_MESSAGES/volto.po +5500 -0
- package/locales/te.json +1 -1
- package/locales/th/LC_MESSAGES/volto.po +5500 -0
- package/locales/th.json +1 -1
- package/locales/to/LC_MESSAGES/volto.po +5500 -0
- package/locales/to.json +1 -1
- package/locales/tr/LC_MESSAGES/volto.po +5501 -0
- package/locales/tr.json +1 -1
- package/locales/uk/LC_MESSAGES/volto.po +5500 -0
- package/locales/uk.json +1 -1
- package/locales/vi/LC_MESSAGES/volto.po +5500 -0
- package/locales/vi.json +1 -1
- package/locales/volto.pot +220 -10
- package/locales/zh_CN/LC_MESSAGES/volto.po +221 -10
- package/locales/zh_CN.json +1 -1
- package/locales/zh_Hant/LC_MESSAGES/volto.po +5500 -0
- package/locales/zh_Hant.json +1 -1
- package/locales/zh_Hant_HK/LC_MESSAGES/volto.po +5500 -0
- package/locales/zh_Hant_HK.json +1 -1
- package/package.json +72 -146
- package/razzle.config.js +32 -25
- package/src/actions/blockTypes/blockTypes.ts +24 -0
- package/src/components/manage/Actions/Actions.test.jsx +1 -5
- package/src/components/manage/Add/Add.jsx +15 -10
- package/src/components/manage/BlockChooser/BlockChooser.jsx +1 -0
- package/src/components/manage/Blocks/Block/BlocksForm.jsx +10 -7
- package/src/components/manage/Blocks/Block/BlocksForm.test.jsx +3 -14
- package/src/components/manage/Blocks/Block/EditBlockWrapper.jsx +9 -4
- package/src/components/manage/Blocks/Block/Order/Item.jsx +27 -13
- package/src/components/manage/Blocks/Block/Order/Item.test.jsx +90 -0
- package/src/components/manage/Blocks/Block/Order/Order.jsx +116 -67
- package/src/components/manage/Blocks/Block/Order/utilities.js +28 -11
- package/src/components/manage/Blocks/Block/Settings.test.jsx +1 -5
- package/src/components/manage/Blocks/Grid/View.jsx +14 -11
- package/src/components/manage/Blocks/Grid/context.js +3 -0
- package/src/components/manage/Blocks/HTML/Edit.test.jsx +1 -5
- package/src/components/manage/Blocks/Image/Edit.jsx +5 -1
- package/src/components/manage/Blocks/Image/ImageSidebar.test.jsx +2 -5
- package/src/components/manage/Blocks/LeadImage/Edit.jsx +2 -2
- package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +1 -1
- package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +2 -5
- package/src/components/manage/Blocks/Listing/Edit.jsx +1 -0
- package/src/components/manage/Blocks/Listing/ImageGallery.jsx +6 -4
- package/src/components/manage/Blocks/Listing/ListingBody.jsx +4 -0
- package/src/components/manage/Blocks/Maps/Edit.jsx +2 -1
- package/src/components/manage/Blocks/Maps/MapsSidebar.test.jsx +1 -5
- package/src/components/manage/Blocks/Search/SearchBlockView.jsx +21 -4
- package/src/components/manage/Blocks/Search/components/DateRangeFacet.test.jsx +1 -6
- package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +22 -1
- package/src/components/manage/Blocks/Search/components/SelectFacet.test.jsx +1 -6
- package/src/components/manage/Blocks/Search/components/SortOn.jsx +8 -2
- package/src/components/manage/Blocks/Search/components/ToggleFacet.jsx +14 -0
- package/src/components/manage/Blocks/Teaser/Data.jsx +21 -7
- package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +11 -3
- package/src/components/manage/Blocks/Teaser/View.jsx +0 -1
- package/src/components/manage/Blocks/Teaser/utils.js +13 -0
- package/src/components/manage/Blocks/Teaser/utils.test.js +34 -0
- package/src/components/manage/Blocks/Title/Edit.jsx +5 -0
- package/src/components/manage/Blocks/Video/Body.jsx +69 -43
- package/src/components/manage/Blocks/Video/Body.test.jsx +122 -5
- package/src/components/manage/Blocks/Video/Edit.jsx +22 -3
- package/src/components/manage/Blocks/Video/Edit.test.jsx +6 -0
- package/src/components/manage/Blocks/Video/VideoSidebar.test.jsx +1 -5
- package/src/components/manage/Blocks/Video/View.jsx +1 -0
- package/src/components/manage/Blocks/Video/View.test.jsx +29 -15
- package/src/components/manage/Blocks/Video/schema.js +14 -1
- package/src/components/manage/Contents/Contents.jsx +697 -659
- package/src/components/manage/Contents/Contents.test.jsx +1 -5
- package/src/components/manage/Contents/ContentsBreadcrumbs.jsx +6 -5
- package/src/components/manage/Contents/ContentsItem.jsx +1 -1
- package/src/components/manage/Contents/ContentsPropertiesModal.test.jsx +1 -5
- package/src/components/manage/Contents/ContentsRenameModal.test.jsx +1 -5
- package/src/components/manage/Contents/ContentsTagsModal.test.jsx +1 -5
- package/src/components/manage/Contents/ContentsWorkflowModal.test.jsx +1 -5
- package/src/components/manage/Contents/DropZoneContent.jsx +338 -0
- package/src/components/manage/Contents/__mocks__/index.tsx +2 -18
- package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +7 -0
- package/src/components/manage/Controlpanels/Aliases.test.jsx +1 -5
- package/src/components/manage/Controlpanels/BlockType.tsx +166 -0
- package/src/components/manage/Controlpanels/BlockTypes.tsx +145 -0
- package/src/components/manage/Controlpanels/ContentType.jsx +1 -1
- package/src/components/manage/Controlpanels/ContentType.test.jsx +1 -5
- package/src/components/manage/Controlpanels/ContentTypeSchema.jsx +1 -1
- package/src/components/manage/Controlpanels/Controlpanels.jsx +28 -5
- package/src/components/manage/Controlpanels/Controlpanels.test.jsx +10 -0
- package/src/components/manage/Controlpanels/DatabaseInformation.jsx +9 -0
- package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +3 -2
- package/src/components/manage/Controlpanels/ModerateComments.jsx +8 -0
- package/src/components/manage/Controlpanels/Relations/Relations.jsx +1 -1
- package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +1 -5
- package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +1 -5
- package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +1 -5
- package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +156 -175
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.test.jsx +3 -0
- package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +575 -631
- package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +58 -11
- package/src/components/manage/Diff/Diff.jsx +201 -298
- package/src/components/manage/Diff/Diff.test.jsx +1 -6
- package/src/components/manage/Diff/DiffField.test.jsx +1 -6
- package/src/components/manage/Display/Display.test.jsx +2 -11
- package/src/components/manage/Edit/Edit.test.jsx +1 -5
- package/src/components/manage/Form/BlockDataForm.test.jsx +1 -5
- package/src/components/manage/Form/Form.jsx +3 -3
- package/src/components/manage/Form/Form.test.jsx +1 -5
- package/src/components/manage/Form/InlineForm.jsx +2 -2
- package/src/components/manage/Form/InlineForm.test.jsx +1 -5
- package/src/components/manage/Form/ModalForm.jsx +12 -10
- package/src/components/manage/Form/ModalForm.test.jsx +27 -5
- package/src/components/manage/Form/__mocks__/index.tsx +9 -27
- package/src/components/manage/Multilingual/CompareLanguages.jsx +6 -6
- package/src/components/manage/Multilingual/CreateTranslation.jsx +16 -13
- package/src/components/manage/Multilingual/ManageTranslations.jsx +5 -5
- package/src/components/manage/Multilingual/TranslationObject.jsx +11 -8
- package/src/components/manage/Preferences/ChangePassword.test.jsx +1 -5
- package/src/components/manage/Preferences/PersonalPreferences.jsx +8 -5
- package/src/components/manage/Preferences/PersonalPreferences.test.jsx +1 -17
- package/src/components/manage/Sharing/Sharing.jsx +21 -15
- package/src/components/manage/Sidebar/ObjectBrowser.jsx +3 -0
- package/src/components/manage/Sidebar/ObjectBrowserBody.jsx +18 -2
- package/src/components/manage/Sidebar/ObjectBrowserNav.jsx +2 -1
- package/src/components/manage/Sidebar/SidebarPortal.test.tsx +42 -0
- package/src/components/manage/Sidebar/SidebarPortal.tsx +48 -0
- package/src/components/manage/TemplateChooser/TemplateChooser.jsx +2 -1
- package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +1 -0
- package/src/components/manage/Toast/Toast.jsx +32 -0
- package/src/components/manage/Toast/Toast.test.jsx +9 -5
- package/src/components/manage/Toolbar/PersonalTools.jsx +2 -1
- package/src/components/manage/Toolbar/PersonalTools.test.jsx +15 -0
- package/src/components/manage/Toolbar/Toolbar.jsx +14 -4
- package/src/components/manage/Toolbar/Types.crash.test.jsx +48 -0
- package/src/components/manage/Toolbar/Types.jsx +6 -4
- package/src/components/manage/UniversalLink/UniversalLink.test.jsx +16 -0
- package/src/components/manage/UniversalLink/UniversalLink.tsx +2 -0
- package/src/components/manage/Widgets/AlignWidget.stories.jsx +9 -0
- package/src/components/manage/Widgets/AlignWidget.test.tsx +95 -0
- package/src/components/manage/Widgets/{AlignWidget.jsx → AlignWidget.tsx} +23 -7
- package/src/components/manage/Widgets/ArrayWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/BlockAlignment.stories.tsx +104 -0
- package/src/components/manage/Widgets/BlockAlignment.test.tsx +104 -0
- package/src/components/manage/Widgets/BlockAlignment.tsx +88 -0
- package/src/components/manage/Widgets/BlockWidth.stories.tsx +69 -0
- package/src/components/manage/Widgets/BlockWidth.test.tsx +62 -0
- package/src/components/manage/Widgets/BlockWidth.tsx +101 -0
- package/src/components/manage/Widgets/ButtonsWidget.stories.jsx +61 -0
- package/src/components/manage/Widgets/ButtonsWidget.test.tsx +138 -0
- package/src/components/manage/Widgets/ButtonsWidget.tsx +195 -0
- package/src/components/manage/Widgets/CheckboxGroupWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/DatetimeWidget.jsx +102 -53
- package/src/components/manage/Widgets/DatetimeWidget.test.jsx +56 -6
- package/src/components/manage/Widgets/FileWidget.jsx +21 -8
- package/src/components/manage/Widgets/FormFieldWrapper.jsx +146 -168
- package/src/components/manage/Widgets/ImageWidget.jsx +177 -38
- package/src/components/manage/Widgets/InternalUrlWidget.jsx +2 -0
- package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +8 -0
- package/src/components/manage/Widgets/ObjectListWidget.test.jsx +2 -11
- package/src/components/manage/Widgets/ObjectWidget.test.jsx +1 -5
- package/src/components/manage/Widgets/QueryWidget.jsx +137 -9
- package/src/components/manage/Widgets/RadioGroupWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/RegistryImageWidget.jsx +1 -1
- package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +4 -2
- package/src/components/manage/Widgets/SchemaWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/SchemaWidgetFieldset.test.jsx +1 -6
- package/src/components/manage/Widgets/SelectAutoComplete.jsx +29 -12
- package/src/components/manage/Widgets/SelectAutoComplete.test.jsx +1 -6
- package/src/components/manage/Widgets/SelectWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/Size.stories.tsx +69 -0
- package/src/components/manage/Widgets/Size.test.tsx +59 -0
- package/src/components/manage/Widgets/Size.tsx +78 -0
- package/src/components/manage/Widgets/TimeWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/TokenWidget.test.jsx +1 -6
- package/src/components/manage/Widgets/UrlWidget.jsx +49 -18
- package/src/components/manage/Widgets/VocabularyTermsWidget.test.jsx +2 -11
- package/src/components/manage/Widgets/__mocks__/index.tsx +33 -51
- package/src/components/manage/Widgets/index.tsx +21 -0
- package/src/components/manage/Workflow/Workflow.test.jsx +2 -11
- package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.jsx +1 -0
- package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.test.jsx +30 -0
- package/src/components/theme/App/App.jsx +5 -1
- package/src/components/theme/Avatar/Avatar.jsx +2 -1
- package/src/components/theme/Comments/CommentEditModal.test.jsx +1 -5
- package/src/components/theme/Comments/Comments.test.jsx +2 -11
- package/src/components/theme/ConnectionRefused/ConnectionRefused.jsx +3 -2
- package/src/components/theme/ContactForm/ContactForm.test.jsx +1 -5
- package/src/components/theme/Image/Image.jsx +25 -13
- package/src/components/theme/Image/Image.test.jsx +247 -146
- package/src/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.tsx +7 -0
- package/src/components/theme/LanguageSelector/LanguageSelector.tsx +89 -0
- package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +42 -12
- package/src/components/theme/PasswordReset/PasswordReset.jsx +108 -191
- package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +1 -5
- package/src/components/theme/PreviewImage/PreviewImage.jsx +1 -1
- package/src/components/theme/Register/Register.test.jsx +1 -5
- package/src/components/theme/RequestTimeout/RequestTimeout.jsx +1 -1
- package/src/components/theme/Sitemap/Sitemap.stories.jsx +82 -0
- package/src/components/theme/SlotRenderer/SlotRenderer.tsx +12 -6
- package/src/components/theme/Unauthorized/Unauthorized.jsx +35 -25
- package/src/components/theme/Unauthorized/Unauthorized.test.jsx +28 -1
- package/src/components/theme/VideoEmbed/VideoEmbed.jsx +100 -0
- package/src/components/theme/View/EventDatesInfo.test.jsx +1 -6
- package/src/components/theme/View/EventView.stories.jsx +89 -0
- package/src/components/theme/View/EventView.test.jsx +1 -6
- package/src/components/theme/View/FileView.stories.jsx +50 -0
- package/src/components/theme/View/ImageView.jsx +2 -1
- package/src/components/theme/View/ImageView.test.jsx +3 -0
- package/src/components/theme/View/LinkView.stories.jsx +57 -0
- package/src/components/theme/View/ListingView.stories.jsx +70 -0
- package/src/components/theme/View/NewsItemView.stories.jsx +58 -0
- package/src/components/theme/View/RenderBlocks.jsx +8 -10
- package/src/components/theme/View/RenderBlocks.stories.jsx +112 -0
- package/src/components/theme/View/RenderBlocks.test.jsx +14 -4
- package/src/components/theme/View/SummaryView.stories.jsx +71 -0
- package/src/components/theme/View/TabularView.stories.jsx +66 -0
- package/src/components/theme/View/View.jsx +8 -1
- package/src/components/theme/Widgets/ImageWidget.jsx +2 -1
- package/src/components/theme/Widgets/ImageWidget.test.jsx +31 -11
- package/src/config/Blocks.jsx +3 -0
- package/src/config/ControlPanels.js +3 -0
- package/src/config/Widgets.jsx +7 -0
- package/src/config/index.js +19 -12
- package/src/config/server.js +0 -2
- package/src/config/slots.js +19 -0
- package/src/config/validation.ts +8 -0
- package/src/constants/ActionTypes.js +1 -0
- package/src/express-middleware/devproxy.js +22 -5
- package/src/express-middleware/files.js +1 -0
- package/src/express-middleware/files.test.js +59 -0
- package/src/express-middleware/images.js +1 -0
- package/src/express-middleware/images.test.js +50 -0
- package/src/helpers/Api/APIResourceWithAuth.js +8 -3
- package/src/helpers/Api/Api.js +7 -4
- package/src/helpers/AsyncConnect/ssr.js +4 -1
- package/src/helpers/AuthToken/AuthToken.js +1 -6
- package/src/helpers/Blocks/Blocks.js +113 -28
- package/src/helpers/Blocks/Blocks.test.js +100 -0
- package/src/helpers/Content/Content.js +23 -0
- package/src/helpers/Content/Content.test.js +39 -0
- package/src/helpers/Content/withClientSideContent.jsx +35 -0
- package/src/helpers/Extensions/withBlockSchemaEnhancer.jsx +4 -1
- package/src/helpers/FormValidation/FormValidation.test.js +31 -0
- package/src/helpers/FormValidation/validators.ts +52 -6
- package/src/helpers/Html/Html.jsx +13 -4
- package/src/helpers/Loadable/__mocks__/Loadable.jsx +7 -22
- package/src/helpers/MessageLabels/MessageLabels.js +10 -0
- package/src/helpers/Sitemap/Sitemap.js +4 -4
- package/src/helpers/Url/Url.js +33 -2
- package/src/helpers/Url/Url.test.js +62 -0
- package/src/helpers/Utils/Utils.jsx +17 -0
- package/src/helpers/Utils/Utils.test.jsx +39 -0
- package/src/hooks/user/useUser.js +1 -1
- package/src/internalChecks.test.ts +11 -0
- package/src/middleware/api.js +17 -8
- package/src/middleware/storeProtectLoadUtils.test.js +3 -3
- package/src/reducers/blockTypes/blockTypes.js +38 -0
- package/src/reducers/content/content.js +3 -18
- package/src/reducers/diff/diff.js +5 -1
- package/src/reducers/diff/diff.test.js +60 -4
- package/src/reducers/index.js +2 -0
- package/src/reducers/querystring/querystring.js +8 -1
- package/src/reducers/users/users.js +1 -1
- package/src/routes.js +13 -1
- package/src/server.jsx +47 -13
- package/src/start-client.jsx +9 -2
- package/src/start-server.js +9 -3
- package/test-addons-loader.js +3 -0
- package/test-setup-globals.js +56 -2
- package/theme/themes/default/elements/segment.variables +9 -16
- package/theme/themes/pastanaga/collections/form.overrides +1 -1
- package/theme/themes/pastanaga/elements/segment.variables +1 -4
- package/theme/themes/pastanaga/extras/block-types.less +17 -0
- package/theme/themes/pastanaga/extras/blocks.less +19 -0
- package/theme/themes/pastanaga/extras/contents.less +75 -0
- package/theme/themes/pastanaga/extras/main.less +20 -4
- package/theme/themes/pastanaga/extras/toolbar.less +10 -5
- package/theme/themes/pastanaga/extras/videoembed.less +22 -0
- package/theme/themes/pastanaga/extras/widgets.less +79 -0
- package/tsconfig.declarations.json +1 -1
- package/tsconfig.json +4 -5
- package/types/actions/blockTypes/blockTypes.d.ts +7 -0
- package/types/components/index.d.ts +1 -1
- package/types/components/manage/Blocks/Block/Order/Item.test.d.ts +1 -0
- package/types/components/manage/Blocks/Block/Order/utilities.d.ts +2 -1
- package/types/components/manage/Blocks/Grid/context.d.ts +1 -0
- package/types/components/manage/Blocks/Teaser/utils.d.ts +5 -0
- package/types/components/manage/Blocks/Video/Body.d.ts +4 -2
- package/types/components/manage/Blocks/Video/schema.d.ts +4 -0
- package/types/components/manage/Contents/DropZoneContent.d.ts +2 -0
- package/types/components/manage/Contents/__mocks__/index.d.ts +2 -2
- package/types/components/manage/Controlpanels/BlockType.d.ts +7 -0
- package/types/components/manage/Controlpanels/BlockTypes.d.ts +7 -0
- package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
- package/types/components/manage/Controlpanels/Users/RenderUsers.d.ts +18 -2
- package/types/components/manage/Controlpanels/Users/UsersControlpanel.d.ts +6 -2
- package/types/components/manage/Controlpanels/index.d.ts +2 -2
- package/types/components/manage/Diff/Diff.d.ts +7 -2
- package/types/components/manage/Form/__mocks__/index.d.ts +8 -8
- package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
- package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
- package/types/components/manage/Sidebar/SidebarPortal.d.ts +7 -15
- package/types/components/manage/Toolbar/Types.crash.test.d.ts +1 -0
- package/types/components/manage/Widgets/AlignWidget.d.ts +8 -10
- package/types/components/manage/Widgets/AlignWidget.stories.d.ts +1 -0
- package/types/components/manage/Widgets/BlockAlignment.d.ts +7 -0
- package/types/components/manage/Widgets/BlockAlignment.stories.d.ts +8 -0
- package/types/components/manage/Widgets/BlockWidth.d.ts +7 -0
- package/types/components/manage/Widgets/BlockWidth.stories.d.ts +6 -0
- package/types/components/manage/Widgets/ButtonsWidget.d.ts +48 -1
- package/types/components/manage/Widgets/ButtonsWidget.stories.d.ts +3 -0
- package/types/components/manage/Widgets/FormFieldWrapper.d.ts +28 -5
- package/types/components/manage/Widgets/ImageWidget.d.ts +41 -1
- package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
- package/types/components/manage/Widgets/ObjectBrowserWidget.d.ts +2 -0
- package/types/components/manage/Widgets/QueryWidget.d.ts +5 -2
- package/types/components/manage/Widgets/RecurrenceWidget/Utils.d.ts +12 -18
- package/types/components/manage/Widgets/Size.d.ts +7 -0
- package/types/components/manage/Widgets/Size.stories.d.ts +6 -0
- package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
- package/types/components/manage/Widgets/__mocks__/index.d.ts +33 -33
- package/types/components/manage/Widgets/index.d.ts +11 -6
- package/types/components/theme/ConnectionRefused/ConnectionRefused.d.ts +2 -2
- package/types/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.d.ts +3 -0
- package/types/components/theme/LanguageSelector/LanguageSelector.d.ts +3 -10
- package/types/components/theme/PasswordReset/PasswordReset.d.ts +6 -2
- package/types/components/theme/Sitemap/Sitemap.stories.d.ts +13 -0
- package/types/components/theme/SlotRenderer/SlotRenderer.d.ts +4 -5
- package/types/components/theme/Unauthorized/Unauthorized.d.ts +2 -2
- package/types/components/theme/VideoEmbed/VideoEmbed.d.ts +2 -0
- package/types/components/theme/View/EventView.stories.d.ts +19 -0
- package/types/components/theme/View/FileView.stories.d.ts +18 -0
- package/types/components/theme/View/LinkView.stories.d.ts +18 -0
- package/types/components/theme/View/ListingView.stories.d.ts +24 -0
- package/types/components/theme/View/NewsItemView.stories.d.ts +23 -0
- package/types/components/theme/View/RenderBlocks.stories.d.ts +23 -0
- package/types/components/theme/View/SummaryView.stories.d.ts +23 -0
- package/types/components/theme/View/TabularView.stories.d.ts +23 -0
- package/types/config/ControlPanels.d.ts +1 -0
- package/types/config/Views.d.ts +1 -1
- package/types/config/Widgets.d.ts +6 -0
- package/types/config/slots.d.ts +7 -0
- package/types/constants/ActionTypes.d.ts +1 -0
- package/types/helpers/Blocks/Blocks.d.ts +4 -0
- package/types/helpers/Content/Content.d.ts +7 -0
- package/types/helpers/Content/withClientSideContent.d.ts +1 -0
- package/types/helpers/Extensions/withBlockSchemaEnhancer.d.ts +4 -5
- package/types/helpers/FormValidation/validators.d.ts +18 -1
- package/types/helpers/Helmet/Helmet.d.ts +1 -1
- package/types/helpers/Loadable/__mocks__/Loadable.d.ts +2 -2
- package/types/helpers/MessageLabels/MessageLabels.d.ts +105 -93
- package/types/helpers/Url/Url.d.ts +14 -0
- package/types/helpers/Url/bulkFlattenToAppURL.d.ts +5 -0
- package/types/helpers/Utils/Utils.d.ts +1 -0
- package/types/reducers/blockTypes/blockTypes.d.ts +16 -0
- package/types/reducers/index.d.ts +3 -0
- package/types/routes.d.ts +7 -5
- package/types/start-client.d.ts +0 -1
- package/vitest.config.mjs +84 -42
- package/webpack-plugins/webpack-less-plugin.js +1 -1
- package/webpack-plugins/webpack-scss-plugin.js +172 -0
- package/cypress/downloads/downloads.html +0 -0
- package/jest-addons-loader.js +0 -3
- package/jest-extender-plugin.js +0 -39
- package/jest-setup-afterenv.js +0 -2
- package/jest-svgsystem-transform.js +0 -10
- package/package-why.json +0 -34
- package/patches/patchit.sh +0 -2
- package/patches/razzle-jest.patch +0 -10
- package/src/components/manage/Contents/__mocks__/index.vitest.tsx +0 -5
- package/src/components/manage/Form/__mocks__/index.vitest.tsx +0 -73
- package/src/components/manage/Sidebar/SidebarPortal.jsx +0 -47
- package/src/components/manage/Sidebar/SidebarPortal.test.jsx +0 -26
- package/src/components/manage/Widgets/AlignWidget.test.jsx +0 -59
- package/src/components/manage/Widgets/ButtonsWidget.jsx +0 -41
- package/src/components/manage/Widgets/ButtonsWidget.test.jsx +0 -70
- package/src/components/manage/Widgets/__mocks__/index.vitest.tsx +0 -41
- package/src/components/theme/LanguageSelector/LanguageSelector.jsx +0 -79
- package/src/helpers/Loadable/__mocks__/Loadable.vitest.jsx +0 -39
- package/test-setup-globals-vitest.js +0 -46
- package/theme/themes/pastanaga/extras/utils.less +0 -63
- /package/src/components/theme/LanguageSelector/{LanguageSelector.test.jsx → LanguageSelector.test.tsx} +0 -0
|
@@ -8,17 +8,8 @@ import Display from './Display';
|
|
|
8
8
|
|
|
9
9
|
const mockStore = configureStore();
|
|
10
10
|
|
|
11
|
-
vi.mock('@plone/volto/components/manage/Widgets'
|
|
12
|
-
|
|
13
|
-
'@plone/volto/components/manage/Widgets/__mocks__/index.vitest.tsx'
|
|
14
|
-
);
|
|
15
|
-
});
|
|
16
|
-
vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
|
|
17
|
-
return await import(
|
|
18
|
-
'@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
|
|
19
|
-
);
|
|
20
|
-
});
|
|
21
|
-
|
|
11
|
+
vi.mock('@plone/volto/components/manage/Widgets');
|
|
12
|
+
vi.mock('@plone/volto/helpers/Loadable/Loadable');
|
|
22
13
|
beforeAll(async () => {
|
|
23
14
|
const { __setLoadables } = await import(
|
|
24
15
|
'@plone/volto/helpers/Loadable/Loadable'
|
|
@@ -8,11 +8,7 @@ import { __test__ as Edit } from './Edit';
|
|
|
8
8
|
|
|
9
9
|
const mockStore = configureStore();
|
|
10
10
|
|
|
11
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
12
|
-
return await import(
|
|
13
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
14
|
-
);
|
|
15
|
-
});
|
|
11
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
16
12
|
vi.mock('../Toolbar/Toolbar', () => ({
|
|
17
13
|
default: vi.fn(() => <div id="Portal" />),
|
|
18
14
|
}));
|
|
@@ -5,11 +5,7 @@ import configureStore from 'redux-mock-store';
|
|
|
5
5
|
import config from '@plone/volto/registry';
|
|
6
6
|
import { Provider } from 'react-intl-redux';
|
|
7
7
|
|
|
8
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
9
|
-
return await import(
|
|
10
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
11
|
-
);
|
|
12
|
-
});
|
|
8
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
13
9
|
|
|
14
10
|
const mockStore = configureStore();
|
|
15
11
|
|
|
@@ -191,8 +191,8 @@ class Form extends Component {
|
|
|
191
191
|
// Adding fallback in case the fields are empty, so we are sure that the edit form
|
|
192
192
|
// shows at least the default blocks
|
|
193
193
|
if (
|
|
194
|
-
formData
|
|
195
|
-
formData
|
|
194
|
+
formData?.hasOwnProperty(blocksFieldname) &&
|
|
195
|
+
formData?.hasOwnProperty(blocksLayoutFieldname)
|
|
196
196
|
) {
|
|
197
197
|
if (
|
|
198
198
|
!formData[blocksLayoutFieldname] ||
|
|
@@ -216,7 +216,7 @@ class Form extends Component {
|
|
|
216
216
|
|
|
217
217
|
let selectedBlock = null;
|
|
218
218
|
if (
|
|
219
|
-
formData
|
|
219
|
+
formData?.hasOwnProperty(blocksLayoutFieldname) &&
|
|
220
220
|
formData[blocksLayoutFieldname].items.length > 0
|
|
221
221
|
) {
|
|
222
222
|
if (config.blocks?.initialBlocksFocus === null) {
|
|
@@ -9,11 +9,7 @@ const mockStore = configureStore();
|
|
|
9
9
|
const errorMessage =
|
|
10
10
|
"[{'message': 'The specified email is not valid.', 'field': 'contact_email', 'error': 'ValidationError'}";
|
|
11
11
|
|
|
12
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
13
|
-
return await import(
|
|
14
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
15
|
-
);
|
|
16
|
-
});
|
|
12
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
17
13
|
|
|
18
14
|
describe('Form', () => {
|
|
19
15
|
it('renders a form component', () => {
|
|
@@ -158,7 +158,7 @@ const InlineForm = (props) => {
|
|
|
158
158
|
onChangeField(id, value, itemInfo);
|
|
159
159
|
}}
|
|
160
160
|
key={field}
|
|
161
|
-
error={errors?.[block]?.[field] ||
|
|
161
|
+
error={errors?.[block]?.[field] || []}
|
|
162
162
|
block={block}
|
|
163
163
|
/>
|
|
164
164
|
))}
|
|
@@ -199,7 +199,7 @@ const InlineForm = (props) => {
|
|
|
199
199
|
onChangeField(id, value);
|
|
200
200
|
}}
|
|
201
201
|
key={field}
|
|
202
|
-
error={errors?.[block]?.[field] ||
|
|
202
|
+
error={errors?.[block]?.[field] || []}
|
|
203
203
|
block={block}
|
|
204
204
|
/>
|
|
205
205
|
))}
|
|
@@ -6,11 +6,7 @@ import config from '@plone/volto/registry';
|
|
|
6
6
|
|
|
7
7
|
import InlineForm from './InlineForm';
|
|
8
8
|
|
|
9
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
10
|
-
return await import(
|
|
11
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
12
|
-
);
|
|
13
|
-
});
|
|
9
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
14
10
|
|
|
15
11
|
const mockStore = configureStore();
|
|
16
12
|
|
|
@@ -245,15 +245,17 @@ class ModalForm extends Component {
|
|
|
245
245
|
const { schema, onCancel, description } = this.props;
|
|
246
246
|
const currentFieldset = schema.fieldsets[this.state.currentTab];
|
|
247
247
|
|
|
248
|
-
const fields =
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
248
|
+
const fields = currentFieldset
|
|
249
|
+
? map(currentFieldset.fields, (field) => ({
|
|
250
|
+
...schema.properties[field],
|
|
251
|
+
id: field,
|
|
252
|
+
value: this.state.formData[field],
|
|
253
|
+
required: schema.required.indexOf(field) !== -1,
|
|
254
|
+
onChange: this.onChangeField,
|
|
255
|
+
onBlur: this.onBlurField,
|
|
256
|
+
onClick: this.onClickInput,
|
|
257
|
+
}))
|
|
258
|
+
: [];
|
|
257
259
|
|
|
258
260
|
const state_errors = keys(this.state.errors).length > 0;
|
|
259
261
|
return (
|
|
@@ -288,7 +290,7 @@ class ModalForm extends Component {
|
|
|
288
290
|
)}
|
|
289
291
|
<div>{this.props.submitError}</div>
|
|
290
292
|
</Message>
|
|
291
|
-
{schema.fieldsets
|
|
293
|
+
{schema.fieldsets?.length > 1 && (
|
|
292
294
|
<Menu tabular stackable>
|
|
293
295
|
{map(schema.fieldsets, (item, index) => (
|
|
294
296
|
<Menu.Item
|
|
@@ -8,11 +8,7 @@ import ModalForm from './ModalForm';
|
|
|
8
8
|
|
|
9
9
|
const mockStore = configureStore();
|
|
10
10
|
|
|
11
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
12
|
-
return await import(
|
|
13
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
14
|
-
);
|
|
15
|
-
});
|
|
11
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
16
12
|
|
|
17
13
|
describe('ModalForm', () => {
|
|
18
14
|
it('renders a modal form component', () => {
|
|
@@ -93,4 +89,30 @@ describe('ModalForm', () => {
|
|
|
93
89
|
const loadingMessage = getByText(/renaming items.../i);
|
|
94
90
|
expect(loadingMessage).toBeInTheDocument();
|
|
95
91
|
});
|
|
92
|
+
|
|
93
|
+
it('renders with empty fieldsets array', () => {
|
|
94
|
+
const store = mockStore({
|
|
95
|
+
intl: {
|
|
96
|
+
locale: 'en',
|
|
97
|
+
messages: {},
|
|
98
|
+
},
|
|
99
|
+
});
|
|
100
|
+
const component = renderer.create(
|
|
101
|
+
<Provider store={store}>
|
|
102
|
+
<ModalForm
|
|
103
|
+
schema={{
|
|
104
|
+
fieldsets: [],
|
|
105
|
+
properties: {},
|
|
106
|
+
required: [],
|
|
107
|
+
}}
|
|
108
|
+
onSubmit={() => {}}
|
|
109
|
+
onCancel={() => {}}
|
|
110
|
+
open={false}
|
|
111
|
+
title="Action without form"
|
|
112
|
+
/>
|
|
113
|
+
</Provider>,
|
|
114
|
+
);
|
|
115
|
+
const json = component.toJSON();
|
|
116
|
+
expect(json).toMatchSnapshot();
|
|
117
|
+
});
|
|
96
118
|
});
|
|
@@ -1,25 +1,7 @@
|
|
|
1
|
-
/* TODO: When the Volto Team removes Jest configuration support from Volto core, update this file with the Vitest version of the mock.
|
|
2
|
-
Then, in the tests, we need to replace:
|
|
3
|
-
|
|
4
|
-
vi.mock('@plone/volto/components/manage/Form', async () => {
|
|
5
|
-
return await import(
|
|
6
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
7
|
-
);
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
with the following:
|
|
12
|
-
|
|
13
|
-
vi.mock('@plone/volto/components/manage/Form');
|
|
14
|
-
|
|
15
|
-
Finally, remove this comment.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
1
|
import type { JSONSchema } from '@plone/types';
|
|
19
2
|
import type { Ref } from 'react';
|
|
20
|
-
|
|
3
|
+
import { forwardRef } from 'react';
|
|
21
4
|
|
|
22
|
-
// Field descriptions can contain react elements and those are not JSON stringifiable
|
|
23
5
|
const cleanupSchema = (schema: JSONSchema | null): JSONSchema | null => {
|
|
24
6
|
if (!schema || !schema.properties) return schema;
|
|
25
7
|
return {
|
|
@@ -40,38 +22,38 @@ const cleanupSchema = (schema: JSONSchema | null): JSONSchema | null => {
|
|
|
40
22
|
};
|
|
41
23
|
};
|
|
42
24
|
|
|
43
|
-
export const Field =
|
|
25
|
+
export const Field = vi.fn((props) => (
|
|
44
26
|
<div className="Field" id={props.id}>
|
|
45
27
|
{props.title}
|
|
46
28
|
</div>
|
|
47
29
|
));
|
|
48
30
|
|
|
49
|
-
export const InlineForm =
|
|
31
|
+
export const InlineForm = vi.fn((props) => (
|
|
50
32
|
<div
|
|
51
33
|
id="InlineForm"
|
|
52
34
|
data-schema={JSON.stringify(cleanupSchema(props.schema), null, 2)}
|
|
53
35
|
/>
|
|
54
36
|
));
|
|
55
37
|
|
|
56
|
-
export const ModalForm =
|
|
38
|
+
export const ModalForm = vi.fn((props) => (
|
|
57
39
|
<div
|
|
58
40
|
id="ModalForm"
|
|
59
41
|
data-schema={JSON.stringify(cleanupSchema(props.schema), null, 2)}
|
|
60
42
|
/>
|
|
61
43
|
));
|
|
62
44
|
|
|
63
|
-
export const UndoToolbar =
|
|
45
|
+
export const UndoToolbar = vi.fn(() => <div id="UndoToolbar" />);
|
|
64
46
|
|
|
65
|
-
export const BlocksToolbar =
|
|
47
|
+
export const BlocksToolbar = vi.fn(() => <div id="BlocksToolbar" />);
|
|
66
48
|
|
|
67
|
-
export const BlockDataForm =
|
|
49
|
+
export const BlockDataForm = vi.fn((props) => (
|
|
68
50
|
<div
|
|
69
51
|
id="BlockDataForm"
|
|
70
52
|
data-schema={JSON.stringify(cleanupSchema(props.schema), null, 2)}
|
|
71
53
|
/>
|
|
72
54
|
));
|
|
73
55
|
|
|
74
|
-
export const BlocksForm =
|
|
56
|
+
export const BlocksForm = vi.fn((props) => (
|
|
75
57
|
<div
|
|
76
58
|
id="BlocksForm"
|
|
77
59
|
data-schema={JSON.stringify(cleanupSchema(props.schema), null, 2)}
|
|
@@ -88,4 +70,4 @@ const MockForm = forwardRef(
|
|
|
88
70
|
),
|
|
89
71
|
);
|
|
90
72
|
|
|
91
|
-
export const Form =
|
|
73
|
+
export const Form = vi.fn((props) => <MockForm {...props} />);
|
|
@@ -56,33 +56,33 @@ const CompareLanguagesMenu = ({
|
|
|
56
56
|
{comparingLanguage === t.language ? (
|
|
57
57
|
<button
|
|
58
58
|
aria-label={`${intl.formatMessage(messages.stop_compare)} ${
|
|
59
|
-
langmap[t.language].
|
|
59
|
+
langmap[t.language]?.nativeName || t.language
|
|
60
60
|
}`}
|
|
61
61
|
title={`${intl.formatMessage(messages.stop_compare)} ${
|
|
62
|
-
langmap[t.language].
|
|
62
|
+
langmap[t.language]?.nativeName || t.language
|
|
63
63
|
}`}
|
|
64
64
|
onClick={() => {
|
|
65
65
|
setComparingLanguage(null);
|
|
66
66
|
closeMenu();
|
|
67
67
|
}}
|
|
68
68
|
>
|
|
69
|
-
{langmap[t.language].
|
|
69
|
+
{langmap[t.language]?.nativeName || t.language}
|
|
70
70
|
<Icon name={clearSVG} size="30px" />
|
|
71
71
|
</button>
|
|
72
72
|
) : (
|
|
73
73
|
<button
|
|
74
74
|
aria-label={`${intl.formatMessage(
|
|
75
75
|
messages.compare_to,
|
|
76
|
-
)} ${langmap[t.language]
|
|
76
|
+
)} ${(langmap[t.language]?.nativeName || t.language).toLowerCase()}`}
|
|
77
77
|
title={`${intl.formatMessage(
|
|
78
78
|
messages.compare_to,
|
|
79
|
-
)} ${langmap[t.language]
|
|
79
|
+
)} ${(langmap[t.language]?.nativeName || t.language).toLowerCase()}`}
|
|
80
80
|
onClick={() => {
|
|
81
81
|
setComparingLanguage(t.language);
|
|
82
82
|
closeMenu();
|
|
83
83
|
}}
|
|
84
84
|
>
|
|
85
|
-
{langmap[t.language].
|
|
85
|
+
{langmap[t.language]?.nativeName || t.language}
|
|
86
86
|
</button>
|
|
87
87
|
)}
|
|
88
88
|
</li>
|
|
@@ -12,9 +12,12 @@ const CreateTranslation = (props) => {
|
|
|
12
12
|
const dispatch = useDispatch();
|
|
13
13
|
const { language, translationOf } = props.location.state;
|
|
14
14
|
const [translationLocation, setTranslationLocation] = React.useState(null);
|
|
15
|
-
const [translationObject, setTranslationObject] = React.useState(null);
|
|
16
15
|
const languageFrom = useSelector((state) => state.intl.locale);
|
|
17
16
|
|
|
17
|
+
const translationObject = useSelector(
|
|
18
|
+
(state) => state.content.subrequests['translationObject'],
|
|
19
|
+
);
|
|
20
|
+
|
|
18
21
|
React.useEffect(() => {
|
|
19
22
|
// Only on mount, we dispatch the locator query
|
|
20
23
|
dispatch(getTranslationLocator(translationOf, language)).then((resp) => {
|
|
@@ -22,22 +25,21 @@ const CreateTranslation = (props) => {
|
|
|
22
25
|
});
|
|
23
26
|
|
|
24
27
|
//and we load the translationObject
|
|
25
|
-
dispatch(getContent(translationOf, null, 'translationObject'))
|
|
26
|
-
(resp) => {
|
|
27
|
-
setTranslationObject(resp);
|
|
28
|
-
},
|
|
29
|
-
);
|
|
28
|
+
dispatch(getContent(translationOf, null, 'translationObject'));
|
|
30
29
|
|
|
31
30
|
// On unmount we dispatch the language change
|
|
32
31
|
return () => {
|
|
33
32
|
// We change the interface language
|
|
34
33
|
if (config.settings.supportedLanguages.includes(language)) {
|
|
35
34
|
const langFileName = toGettextLang(language);
|
|
36
|
-
import(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
35
|
+
import(/* @vite-ignore */ '@root/../locales/' + langFileName + '.json')
|
|
36
|
+
.then((locale) => {
|
|
37
|
+
dispatch(changeLanguage(language, locale.default));
|
|
38
|
+
})
|
|
39
|
+
.catch(() => {
|
|
40
|
+
// If locale file doesn't exist, still switch language with empty locale
|
|
41
|
+
dispatch(changeLanguage(language, {}));
|
|
42
|
+
});
|
|
41
43
|
}
|
|
42
44
|
};
|
|
43
45
|
// On mount only
|
|
@@ -46,7 +48,8 @@ const CreateTranslation = (props) => {
|
|
|
46
48
|
|
|
47
49
|
return (
|
|
48
50
|
translationLocation &&
|
|
49
|
-
translationObject &&
|
|
51
|
+
translationObject.data &&
|
|
52
|
+
translationObject.loaded > 0 && (
|
|
50
53
|
<Redirect
|
|
51
54
|
to={{
|
|
52
55
|
pathname: `${flattenToAppURL(translationLocation)}/add`,
|
|
@@ -54,7 +57,7 @@ const CreateTranslation = (props) => {
|
|
|
54
57
|
state: {
|
|
55
58
|
translationOf: props.location.state.translationOf,
|
|
56
59
|
language: props.location.state.language,
|
|
57
|
-
translationObject: translationObject,
|
|
60
|
+
translationObject: translationObject.data,
|
|
58
61
|
languageFrom,
|
|
59
62
|
},
|
|
60
63
|
}}
|
|
@@ -178,7 +178,7 @@ const ManageTranslations = (props) => {
|
|
|
178
178
|
<FormattedMessage
|
|
179
179
|
id="Manage translations for {title}"
|
|
180
180
|
defaultMessage="Manage translations for {title}"
|
|
181
|
-
values={{ title: <q>{content
|
|
181
|
+
values={{ title: <q>{content?.title || ''}</q> }}
|
|
182
182
|
/>
|
|
183
183
|
</Segment>
|
|
184
184
|
{content && (
|
|
@@ -195,9 +195,9 @@ const ManageTranslations = (props) => {
|
|
|
195
195
|
<Table.Row key={lang}>
|
|
196
196
|
<Table.Cell collapsing>
|
|
197
197
|
{lang === content.language.token ? (
|
|
198
|
-
<strong>{langmap[lang]
|
|
198
|
+
<strong>{langmap[lang]?.nativeName || lang}</strong>
|
|
199
199
|
) : (
|
|
200
|
-
langmap[lang]
|
|
200
|
+
langmap[lang]?.nativeName || lang
|
|
201
201
|
)}
|
|
202
202
|
</Table.Cell>
|
|
203
203
|
<Table.Cell>
|
|
@@ -235,7 +235,7 @@ const ManageTranslations = (props) => {
|
|
|
235
235
|
<Button
|
|
236
236
|
aria-label={`${intl.formatMessage(
|
|
237
237
|
messages.unlink,
|
|
238
|
-
)} ${langmap[lang]
|
|
238
|
+
)} ${(langmap[lang]?.nativeName || lang).toLowerCase()}`}
|
|
239
239
|
basic
|
|
240
240
|
icon
|
|
241
241
|
disabled={lang === content.language.token}
|
|
@@ -256,7 +256,7 @@ const ManageTranslations = (props) => {
|
|
|
256
256
|
<Button
|
|
257
257
|
aria-label={`${intl.formatMessage(
|
|
258
258
|
messages.link,
|
|
259
|
-
)} ${langmap[lang]
|
|
259
|
+
)} ${(langmap[lang]?.nativeName || lang).toLowerCase()}`}
|
|
260
260
|
basic
|
|
261
261
|
icon
|
|
262
262
|
disabled={lang === content.language.token}
|
|
@@ -48,12 +48,15 @@ const TranslationObject = ({
|
|
|
48
48
|
let lang =
|
|
49
49
|
config.settings.supportedLanguages[Object.keys(locales).length];
|
|
50
50
|
const langFileName = toGettextLang(lang);
|
|
51
|
-
import(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
51
|
+
import(/* @vite-ignore */ '@root/../locales/' + langFileName + '.json')
|
|
52
|
+
.then((locale) => {
|
|
53
|
+
setLocales({ ...locales, [toReactIntlLang(lang)]: locale.default });
|
|
54
|
+
setLoadingLocale(false);
|
|
55
|
+
})
|
|
56
|
+
.catch(() => {
|
|
57
|
+
setLocales({ ...locales, [toReactIntlLang(lang)]: {} });
|
|
58
|
+
setLoadingLocale(false);
|
|
59
|
+
});
|
|
57
60
|
}
|
|
58
61
|
}, [loadingLocale, locales]);
|
|
59
62
|
|
|
@@ -83,7 +86,7 @@ const TranslationObject = ({
|
|
|
83
86
|
active={activeMenu === 'language'}
|
|
84
87
|
onClick={handleMenuClick}
|
|
85
88
|
>
|
|
86
|
-
{langmap[lang]
|
|
89
|
+
{langmap[lang]?.nativeName || lang}
|
|
87
90
|
</Menu.Item>
|
|
88
91
|
{visual && (
|
|
89
92
|
<Menu.Item
|
|
@@ -107,7 +110,7 @@ const TranslationObject = ({
|
|
|
107
110
|
hideActions
|
|
108
111
|
pathname={flattenToAppURL(translationObject['@id'])}
|
|
109
112
|
visual={visual}
|
|
110
|
-
title={langmap[lang]
|
|
113
|
+
title={langmap[lang]?.nativeName || lang}
|
|
111
114
|
loading={false}
|
|
112
115
|
isFormSelected={isFormSelected}
|
|
113
116
|
onSelectForm={onSelectForm}
|
|
@@ -9,11 +9,7 @@ import ChangePassword from './ChangePassword';
|
|
|
9
9
|
|
|
10
10
|
const mockStore = configureStore();
|
|
11
11
|
|
|
12
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
13
|
-
return await import(
|
|
14
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
15
|
-
);
|
|
16
|
-
});
|
|
12
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
17
13
|
|
|
18
14
|
vi.mock('../Toolbar/Toolbar', () => ({
|
|
19
15
|
default: vi.fn(() => <div id="Portal" />),
|
|
@@ -53,11 +53,14 @@ const PersonalPreferences = (props) => {
|
|
|
53
53
|
let language = data.language || 'en';
|
|
54
54
|
if (config.settings.supportedLanguages.includes(language)) {
|
|
55
55
|
const langFileName = toGettextLang(language);
|
|
56
|
-
import(
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
import(/* @vite-ignore */ '@root/../locales/' + langFileName + '.json')
|
|
57
|
+
.then((locale) => {
|
|
58
|
+
dispatch(changeLanguage(language, locale.default));
|
|
59
|
+
})
|
|
60
|
+
.catch(() => {
|
|
61
|
+
// If locale file doesn't exist, still switch language with empty locale
|
|
62
|
+
dispatch(changeLanguage(language, {}));
|
|
63
|
+
});
|
|
61
64
|
}
|
|
62
65
|
toast.success(<Toast success title={intl.formatMessage(messages.saved)} />);
|
|
63
66
|
closeMenu();
|
|
@@ -12,23 +12,7 @@ vi.mock('../Toolbar/Toolbar', () => ({
|
|
|
12
12
|
default: vi.fn(() => <div id="Portal" />),
|
|
13
13
|
}));
|
|
14
14
|
|
|
15
|
-
vi.mock('@plone/volto/components/manage/Form'
|
|
16
|
-
return await import(
|
|
17
|
-
'@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
|
|
18
|
-
);
|
|
19
|
-
});
|
|
20
|
-
vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
|
|
21
|
-
return await import(
|
|
22
|
-
'@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
|
|
23
|
-
);
|
|
24
|
-
});
|
|
25
|
-
|
|
26
|
-
beforeAll(async () => {
|
|
27
|
-
const { __setLoadables } = await import(
|
|
28
|
-
'@plone/volto/helpers/Loadable/Loadable'
|
|
29
|
-
);
|
|
30
|
-
await __setLoadables();
|
|
31
|
-
});
|
|
15
|
+
vi.mock('@plone/volto/components/manage/Form');
|
|
32
16
|
|
|
33
17
|
describe('PersonalPreferences', () => {
|
|
34
18
|
it('renders a personal preferences component', () => {
|
|
@@ -473,23 +473,39 @@ class SharingComponent extends Component {
|
|
|
473
473
|
<p className="help">
|
|
474
474
|
<FormattedMessage
|
|
475
475
|
id="By default, permissions from the container of this item are inherited. If you disable this, only the explicitly defined sharing permissions will be valid. In the overview, the symbol {inherited} indicates an inherited value. Similarly, the symbol {global} indicates a global role, which is managed by the site administrator."
|
|
476
|
-
defaultMessage="By default, permissions from the container of this item are inherited. If you disable this, only the explicitly defined sharing permissions will be valid. In the overview,
|
|
476
|
+
defaultMessage="By default, permissions from the container of this item are inherited. If you disable this, only the explicitly defined sharing permissions will be valid. In the overview, inherited values are explicitly labeled as 'Inherited value' and receive a green check mark {inherited}. Similarly, roles managed by the site administrator are labeled as 'Global role' and receive a blue check mark {global}."
|
|
477
477
|
values={{
|
|
478
478
|
inherited: (
|
|
479
|
-
<IconOld
|
|
479
|
+
<IconOld
|
|
480
|
+
aria-hidden="true"
|
|
481
|
+
name="check circle outline"
|
|
482
|
+
color="green"
|
|
483
|
+
/>
|
|
480
484
|
),
|
|
481
485
|
global: (
|
|
482
|
-
<IconOld
|
|
486
|
+
<IconOld
|
|
487
|
+
aria-hidden="true"
|
|
488
|
+
name="check circle outline"
|
|
489
|
+
color="blue"
|
|
490
|
+
/>
|
|
483
491
|
),
|
|
484
492
|
}}
|
|
485
493
|
/>
|
|
486
494
|
</p>
|
|
487
495
|
</Segment>
|
|
488
|
-
<Segment className="actions" attached clearing>
|
|
496
|
+
<Segment className="right aligned actions" attached clearing>
|
|
497
|
+
<Button
|
|
498
|
+
basic
|
|
499
|
+
secondary
|
|
500
|
+
aria-label={this.props.intl.formatMessage(messages.cancel)}
|
|
501
|
+
title={this.props.intl.formatMessage(messages.cancel)}
|
|
502
|
+
onClick={this.onCancel}
|
|
503
|
+
>
|
|
504
|
+
<Icon className="circled" name={clearSVG} size="30px" />
|
|
505
|
+
</Button>
|
|
489
506
|
<Button
|
|
490
507
|
basic
|
|
491
508
|
primary
|
|
492
|
-
floated="right"
|
|
493
509
|
type="submit"
|
|
494
510
|
aria-label={this.props.intl.formatMessage(messages.save)}
|
|
495
511
|
title={this.props.intl.formatMessage(messages.save)}
|
|
@@ -498,16 +514,6 @@ class SharingComponent extends Component {
|
|
|
498
514
|
>
|
|
499
515
|
<Icon className="circled" name={aheadSVG} size="30px" />
|
|
500
516
|
</Button>
|
|
501
|
-
<Button
|
|
502
|
-
basic
|
|
503
|
-
secondary
|
|
504
|
-
aria-label={this.props.intl.formatMessage(messages.cancel)}
|
|
505
|
-
title={this.props.intl.formatMessage(messages.cancel)}
|
|
506
|
-
floated="right"
|
|
507
|
-
onClick={this.onCancel}
|
|
508
|
-
>
|
|
509
|
-
<Icon className="circled" name={clearSVG} size="30px" />
|
|
510
|
-
</Button>
|
|
511
517
|
</Segment>
|
|
512
518
|
</Form>
|
|
513
519
|
</Plug>
|
|
@@ -58,6 +58,7 @@ const withObjectBrowser = (WrappedComponent) =>
|
|
|
58
58
|
selectableTypes,
|
|
59
59
|
maximumSelectionSize,
|
|
60
60
|
currentPath,
|
|
61
|
+
onlyFolderishSelectable,
|
|
61
62
|
} = {}) =>
|
|
62
63
|
this.setState(() => ({
|
|
63
64
|
isObjectBrowserOpen: true,
|
|
@@ -70,6 +71,7 @@ const withObjectBrowser = (WrappedComponent) =>
|
|
|
70
71
|
selectableTypes,
|
|
71
72
|
maximumSelectionSize,
|
|
72
73
|
currentPath,
|
|
74
|
+
onlyFolderishSelectable,
|
|
73
75
|
}));
|
|
74
76
|
|
|
75
77
|
closeObjectBrowser = () => this.setState({ isObjectBrowserOpen: false });
|
|
@@ -110,6 +112,7 @@ const withObjectBrowser = (WrappedComponent) =>
|
|
|
110
112
|
searchableTypes={this.state.searchableTypes}
|
|
111
113
|
selectableTypes={this.state.selectableTypes}
|
|
112
114
|
maximumSelectionSize={this.state.maximumSelectionSize}
|
|
115
|
+
onlyFolderishSelectable={this.state.onlyFolderishSelectable}
|
|
113
116
|
/>
|
|
114
117
|
</SidebarPopup>
|
|
115
118
|
</>
|
|
@@ -86,6 +86,7 @@ class ObjectBrowserBody extends Component {
|
|
|
86
86
|
maximumSelectionSize: PropTypes.number,
|
|
87
87
|
contextURL: PropTypes.string,
|
|
88
88
|
searchableTypes: PropTypes.arrayOf(PropTypes.string),
|
|
89
|
+
onlyFolderishSelectable: PropTypes.bool,
|
|
89
90
|
};
|
|
90
91
|
|
|
91
92
|
/**
|
|
@@ -101,6 +102,7 @@ class ObjectBrowserBody extends Component {
|
|
|
101
102
|
selectableTypes: [],
|
|
102
103
|
searchableTypes: null,
|
|
103
104
|
maximumSelectionSize: null,
|
|
105
|
+
onlyFolderishSelectable: false,
|
|
104
106
|
};
|
|
105
107
|
|
|
106
108
|
/**
|
|
@@ -142,10 +144,14 @@ class ObjectBrowserBody extends Component {
|
|
|
142
144
|
showSearchInput: false,
|
|
143
145
|
// In image mode, the searchable types default to the image types which
|
|
144
146
|
// can be overridden with the property if specified.
|
|
147
|
+
// If selectableTypes are passed, the searchableTypes are the selectableTypes
|
|
145
148
|
searchableTypes:
|
|
146
149
|
this.props.mode === 'image'
|
|
147
150
|
? this.props.searchableTypes || config.settings.imageObjects
|
|
148
|
-
:
|
|
151
|
+
: [
|
|
152
|
+
...(this.props.searchableTypes ?? []),
|
|
153
|
+
...(this.props.selectableTypes ?? []),
|
|
154
|
+
],
|
|
149
155
|
view: this.props.mode === 'image' ? 'icons' : 'list',
|
|
150
156
|
};
|
|
151
157
|
this.searchInputRef = React.createRef();
|
|
@@ -329,7 +335,17 @@ class ObjectBrowserBody extends Component {
|
|
|
329
335
|
};
|
|
330
336
|
|
|
331
337
|
isSelectable = (item) => {
|
|
332
|
-
const {
|
|
338
|
+
const {
|
|
339
|
+
maximumSelectionSize,
|
|
340
|
+
data,
|
|
341
|
+
mode,
|
|
342
|
+
selectableTypes,
|
|
343
|
+
onlyFolderishSelectable,
|
|
344
|
+
} = this.props;
|
|
345
|
+
|
|
346
|
+
if (onlyFolderishSelectable && !item.is_folderish) {
|
|
347
|
+
return false;
|
|
348
|
+
}
|
|
333
349
|
if (
|
|
334
350
|
maximumSelectionSize &&
|
|
335
351
|
data &&
|