@plone/volto 17.0.0-alpha.3 → 17.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/.eslintrc +26 -3
- package/.yarn/install-state.gz +0 -0
- package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
- package/.yarn/releases/yarn-3.6.3.cjs +874 -0
- package/CHANGELOG.md +716 -20
- package/CONTRIBUTING.md +5 -1
- package/README.md +20 -21
- package/addon-registry.js +44 -1
- package/create-addons-loader.js +1 -1
- package/create-theme-addons-loader.js +79 -0
- package/cypress/support/commands.js +70 -14
- package/cypress/support/e2e.js +1 -2
- package/cypress/support/volto-slate.js +4 -5
- package/cypress.config.js +1 -0
- package/docker-compose.yml +1 -1
- package/locales/ca/LC_MESSAGES/volto.po +422 -53
- package/locales/ca.json +1 -1
- package/locales/de/LC_MESSAGES/volto.po +442 -73
- package/locales/de.json +1 -1
- package/locales/en/LC_MESSAGES/volto.po +420 -51
- package/locales/en.json +1 -1
- package/locales/es/LC_MESSAGES/volto.po +431 -62
- package/locales/es.json +1 -1
- package/locales/eu/LC_MESSAGES/volto.po +421 -52
- package/locales/eu.json +1 -1
- package/locales/fi/LC_MESSAGES/volto.po +4985 -0
- package/locales/fi.json +1 -1
- package/locales/fr/LC_MESSAGES/volto.po +422 -53
- package/locales/fr.json +1 -1
- package/locales/it/LC_MESSAGES/volto.po +589 -220
- package/locales/it.json +1 -1
- package/locales/ja/LC_MESSAGES/volto.po +421 -52
- package/locales/ja.json +1 -1
- package/locales/nl/LC_MESSAGES/volto.po +1072 -691
- package/locales/nl.json +1 -1
- package/locales/pt/LC_MESSAGES/volto.po +422 -53
- package/locales/pt.json +1 -1
- package/locales/pt_BR/LC_MESSAGES/volto.po +429 -60
- package/locales/pt_BR.json +1 -1
- package/locales/ro/LC_MESSAGES/volto.po +422 -53
- package/locales/ro.json +1 -1
- package/locales/volto.pot +425 -52
- package/locales/zh_CN/LC_MESSAGES/volto.po +422 -53
- package/locales/zh_CN.json +1 -1
- package/package.json +46 -35
- package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
- package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
- package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
- package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
- package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
- package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
- package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
- package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
- package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
- package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
- package/packages/volto-slate/package.json +1 -1
- package/packages/volto-slate/src/actions/index.js +1 -1
- package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
- package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
- package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
- package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
- package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
- package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
- package/packages/volto-slate/src/blocks/Text/index.js +10 -7
- package/packages/volto-slate/src/editor/config.jsx +5 -4
- package/packages/volto-slate/src/editor/deserialize.js +0 -1
- package/packages/volto-slate/src/editor/index.js +4 -4
- package/packages/volto-slate/src/editor/less/slate.less +28 -0
- package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
- package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
- package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
- package/packages/volto-slate/src/editor/render.jsx +77 -8
- package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
- package/packages/volto-slate/src/editor/ui/index.js +15 -15
- package/packages/volto-slate/src/index.js +2 -2
- package/packages/volto-slate/src/utils/blocks.js +7 -0
- package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
- package/razzle.config.js +32 -6
- package/src/actions/index.js +10 -0
- package/src/actions/language/language.js +9 -8
- package/src/actions/navroot/navroot.js +16 -0
- package/src/actions/navroot/navroot.test.js +15 -0
- package/src/actions/querystringsearch/querystringsearch.js +20 -14
- package/src/actions/relations/rebuild.js +25 -0
- package/src/actions/relations/relations.js +103 -0
- package/src/actions/relations/relations.test.js +15 -0
- package/src/actions/site/site.js +16 -0
- package/src/actions/site/site.test.js +15 -0
- package/src/actions/userSession/userSession.js +17 -1
- package/src/components/index.js +194 -191
- package/src/components/manage/Actions/Actions.jsx +133 -243
- package/src/components/manage/Add/Add.jsx +9 -10
- package/src/components/manage/AnchorPlugin/index.jsx +2 -2
- package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
- package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -3
- package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
- package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
- package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
- package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
- package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
- package/src/components/manage/Blocks/Block/Style.jsx +2 -2
- package/src/components/manage/Blocks/Container/Data.jsx +32 -0
- package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
- package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
- package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
- package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
- package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
- package/src/components/manage/Blocks/Grid/View.jsx +43 -0
- package/src/components/manage/Blocks/Grid/adapter.js +14 -0
- package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
- package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
- package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
- package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
- package/src/components/manage/Blocks/Grid/schema.js +35 -0
- package/src/components/manage/Blocks/Grid/templates.js +47 -0
- package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
- package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
- package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
- package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
- package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
- package/src/components/manage/Blocks/Image/View.jsx +26 -5
- package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
- package/src/components/manage/Blocks/Image/schema.js +17 -10
- package/src/components/manage/Blocks/Image/utils.js +14 -0
- package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
- package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
- package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
- package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
- package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
- package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
- package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
- package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
- package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
- package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
- package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
- package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
- package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +34 -19
- package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
- package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
- package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
- package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
- package/src/components/manage/Blocks/Search/SearchBlockView.jsx +4 -2
- package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
- package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
- package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
- package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
- package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
- package/src/components/manage/Blocks/Search/components/index.js +13 -13
- package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
- package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
- package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +93 -46
- package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
- package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
- package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
- package/src/components/manage/Blocks/Search/schema.js +29 -14
- package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
- package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
- package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
- package/src/components/manage/Blocks/Teaser/schema.js +5 -0
- package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
- package/src/components/manage/Blocks/Title/View.jsx +0 -23
- package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
- package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
- package/src/components/manage/Blocks/ToC/View.jsx +84 -14
- package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
- package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
- package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
- package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
- package/src/components/manage/Contents/Contents.jsx +319 -139
- package/src/components/manage/Contents/ContentsItem.jsx +6 -0
- package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
- package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
- package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
- package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
- package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
- package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
- package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
- package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
- package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
- package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
- package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
- package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
- package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +91 -0
- package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
- package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +480 -0
- package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
- package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
- package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
- package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
- package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
- package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
- package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
- package/src/components/manage/Delete/Delete.jsx +96 -171
- package/src/components/manage/Diff/DiffField.jsx +25 -1
- package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
- package/src/components/manage/Form/BlockDataForm.jsx +3 -2
- package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
- package/src/components/manage/Form/Form.jsx +7 -6
- package/src/components/manage/Form/InlineForm.jsx +39 -9
- package/src/components/manage/Form/InlineForm.test.jsx +16 -14
- package/src/components/manage/Form/InlineFormState.js +8 -0
- package/src/components/manage/History/History.jsx +11 -1
- package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
- package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
- package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
- package/src/components/manage/Messages/Messages.jsx +32 -99
- package/src/components/manage/Messages/Messages.test.jsx +0 -1
- package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
- package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
- package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
- package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
- package/src/components/manage/Sharing/Sharing.jsx +62 -22
- package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
- package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
- package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
- package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
- package/src/components/manage/TemplateChooser/template.svg +10 -0
- package/src/components/manage/Toast/Toast.jsx +2 -2
- package/src/components/manage/Toolbar/More.jsx +17 -2
- package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
- package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
- package/src/components/manage/Toolbar/Types.jsx +2 -2
- package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
- package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
- package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
- package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
- package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
- package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
- package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
- package/src/components/manage/Widgets/DatetimeWidget.jsx +11 -13
- package/src/components/manage/Widgets/FileWidget.jsx +2 -1
- package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
- package/src/components/manage/Widgets/IdWidget.jsx +1 -2
- package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
- package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
- package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
- package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
- package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
- package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +10 -12
- package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
- package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
- package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
- package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
- package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
- package/src/components/manage/Widgets/SelectUtils.js +2 -2
- package/src/components/manage/Widgets/SelectWidget.jsx +16 -2
- package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
- package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
- package/src/components/manage/Workflow/Workflow.jsx +75 -184
- package/src/components/theme/Anontools/Anontools.jsx +44 -72
- package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
- package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
- package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
- package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
- package/src/components/theme/Comments/Comment.stories.jsx +84 -0
- package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
- package/src/components/theme/Comments/Comments.jsx +268 -380
- package/src/components/theme/Component/Component.jsx +1 -1
- package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
- package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
- package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
- package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
- package/src/components/theme/Error/ServerError.jsx +29 -0
- package/src/components/theme/Footer/Footer.jsx +2 -13
- package/src/components/theme/Header/Header.jsx +37 -63
- package/src/components/theme/Header/Header.test.jsx +18 -0
- package/src/components/theme/Icon/Icon.jsx +2 -2
- package/src/components/theme/Image/Image.jsx +96 -0
- package/src/components/theme/Image/Image.test.jsx +125 -0
- package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
- package/src/components/theme/Login/Login.jsx +160 -242
- package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
- package/src/components/theme/Logo/Logo.jsx +35 -26
- package/src/components/theme/Logo/Logo.test.jsx +135 -1
- package/src/components/theme/Logout/Logout.jsx +36 -83
- package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
- package/src/components/theme/Navigation/NavItem.jsx +4 -2
- package/src/components/theme/Navigation/Navigation.jsx +86 -171
- package/src/components/theme/NotFound/NotFound.jsx +55 -41
- package/src/components/theme/PasswordReset/PasswordReset.jsx +8 -6
- package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +96 -171
- package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
- package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
- package/src/components/theme/Register/Register.jsx +2 -4
- package/src/components/theme/Search/SearchTags.jsx +30 -60
- package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
- package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
- package/src/components/theme/Sitemap/Sitemap.jsx +25 -12
- package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
- package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
- package/src/components/theme/TsTest/TsTest.tsx +15 -0
- package/src/components/theme/View/AlbumView.jsx +21 -16
- package/src/components/theme/View/DefaultView.jsx +1 -1
- package/src/components/theme/View/EventDatesInfo.jsx +2 -1
- package/src/components/theme/View/EventView.jsx +36 -25
- package/src/components/theme/View/FileView.jsx +23 -18
- package/src/components/theme/View/ImageView.jsx +40 -32
- package/src/components/theme/View/ImageView.test.jsx +4 -0
- package/src/components/theme/View/LinkView.jsx +53 -78
- package/src/components/theme/View/ListingView.jsx +36 -28
- package/src/components/theme/View/NewsItemView.jsx +16 -17
- package/src/components/theme/View/RenderBlocks.jsx +56 -21
- package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
- package/src/components/theme/View/SummaryView.jsx +49 -39
- package/src/components/theme/View/TabularView.jsx +59 -53
- package/src/components/theme/View/View.jsx +2 -0
- package/src/components/theme/Widgets/DateWidget.jsx +2 -1
- package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
- package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
- package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
- package/src/config/Blocks.jsx +46 -0
- package/src/config/Components.jsx +3 -1
- package/src/config/ControlPanels.js +2 -1
- package/src/config/Loadables.jsx +1 -1
- package/src/config/NonContentRoutes.jsx +1 -0
- package/src/config/RichTextEditor/Blocks.jsx +4 -5
- package/src/config/RichTextEditor/FromHTML.jsx +2 -2
- package/src/config/RichTextEditor/Plugins.jsx +2 -3
- package/src/config/RichTextEditor/Styles.jsx +1 -1
- package/src/config/RichTextEditor/ToHTML.jsx +12 -10
- package/src/config/RichTextEditor/index.js +2 -3
- package/src/config/Views.jsx +6 -4
- package/src/config/Widgets.jsx +4 -0
- package/src/config/index.js +38 -2
- package/src/config/server.js +2 -0
- package/src/constants/ActionTypes.js +8 -0
- package/src/constants/Indexes.js +3 -1
- package/src/constants/Languages.js +8 -4
- package/src/express-middleware/devproxy.js +1 -1
- package/src/express-middleware/files.js +11 -9
- package/src/express-middleware/images.js +12 -5
- package/src/express-middleware/ok.js +16 -0
- package/src/express-middleware/robotstxt.js +1 -1
- package/src/express-middleware/sitemap.js +37 -5
- package/src/express-middleware/static.js +3 -3
- package/src/helpers/Api/Api.js +1 -1
- package/src/helpers/Blocks/Blocks.js +52 -6
- package/src/helpers/Blocks/Blocks.test.js +92 -13
- package/src/helpers/Extensions/index.js +2 -1
- package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
- package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
- package/src/helpers/FormValidation/FormValidation.js +42 -3
- package/src/helpers/FormValidation/FormValidation.test.js +73 -0
- package/src/helpers/Html/Html.jsx +5 -9
- package/src/helpers/Html/Html.test.jsx +5 -0
- package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
- package/src/helpers/MessageLabels/MessageLabels.js +111 -4
- package/src/helpers/Robots/Robots.js +24 -6
- package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
- package/src/helpers/Site/index.js +21 -0
- package/src/helpers/Sitemap/Sitemap.js +44 -2
- package/src/helpers/Url/Url.js +30 -4
- package/src/helpers/Url/Url.test.js +55 -0
- package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
- package/src/helpers/Utils/Utils.js +73 -13
- package/src/helpers/Utils/Utils.test.js +17 -4
- package/src/helpers/Utils/usePagination.js +67 -14
- package/src/helpers/Utils/usePagination.test.js +115 -0
- package/src/helpers/index.js +22 -10
- package/src/hooks/client/useClient.js +11 -0
- package/src/hooks/clipboard/useClipboard.js +26 -0
- package/src/hooks/index.js +2 -0
- package/src/icons/grid-block.svg +11 -0
- package/src/middleware/Api.test.js +54 -0
- package/src/middleware/api.js +209 -175
- package/src/middleware/blacklistRoutes.js +25 -22
- package/src/middleware/index.js +2 -2
- package/src/middleware/storeProtectLoadUtils.js +61 -62
- package/src/middleware/storeProtectLoadUtils.test.js +47 -43
- package/src/reducers/actions/actions.js +8 -6
- package/src/reducers/actions/actions.test.js +70 -0
- package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
- package/src/reducers/content/content.test.js +4 -4
- package/src/reducers/index.js +6 -0
- package/src/reducers/navigation/navigation.js +6 -6
- package/src/reducers/navigation/navigation.test.js +30 -0
- package/src/reducers/navroot/navroot.js +79 -0
- package/src/reducers/navroot/navroot.test.js +110 -0
- package/src/reducers/relations/relations.js +201 -0
- package/src/reducers/site/site.js +51 -0
- package/src/reducers/site/site.test.js +67 -0
- package/src/reducers/types/types.js +1 -1
- package/src/reducers/userSession/userSession.js +15 -1
- package/src/registry.js +2 -2
- package/src/routes.js +14 -0
- package/src/server.jsx +37 -23
- package/src/start-server.js +2 -2
- package/src/storybook.jsx +24 -38
- package/test-setup-config.js +12 -1
- package/theme/themes/pastanaga/collections/form.overrides +46 -0
- package/theme/themes/pastanaga/collections/menu.overrides +3 -2
- package/theme/themes/pastanaga/elements/container.overrides +5 -2
- package/theme/themes/pastanaga/elements/input.overrides +11 -1
- package/theme/themes/pastanaga/elements/label.overrides +10 -0
- package/theme/themes/pastanaga/elements/step.overrides +2 -1
- package/theme/themes/pastanaga/extras/blocks.less +25 -15
- package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
- package/theme/themes/pastanaga/extras/contents.less +6 -1
- package/theme/themes/pastanaga/extras/draftjs.less +4 -4
- package/theme/themes/pastanaga/extras/grid.less +427 -0
- package/theme/themes/pastanaga/extras/login.less +3 -0
- package/theme/themes/pastanaga/extras/main.less +14 -7
- package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
- package/theme/themes/pastanaga/extras/search.less +7 -1
- package/theme/themes/pastanaga/extras/sidebar.less +9 -4
- package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
- package/theme/themes/pastanaga/extras/toc.less +29 -0
- package/theme/themes/pastanaga/extras/toolbar.less +6 -2
- package/theme/themes/pastanaga/extras/userscontrolpanel.less +104 -73
- package/theme/themes/pastanaga/extras/widgets.less +1 -1
- package/theme/themes/pastanaga/modules/rating.overrides +2 -1
- package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
- package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
- package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
- package/tsconfig.json +33 -0
- package/webpack-plugins/webpack-less-plugin.js +19 -0
- package/.changelog.draft +0 -19
- package/.editorconfig +0 -36
- package/.storybook/main.js +0 -127
- package/.storybook/manager.js +0 -15
- package/.storybook/preview.js +0 -21
- package/.storybook/static/previewImage.svg +0 -48
- package/.vale.ini +0 -10
- package/.yarnrc.yml +0 -5
- package/jsdoc.json +0 -16
- package/netlify.toml +0 -5
- package/pyvenv.cfg +0 -3
- package/share/man/man1/ttx.1 +0 -225
- package/src/components/manage/Blocks/Teaser/utils.js +0 -44
- package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
- package/src/components/theme/Header/Header.md +0 -27
- package/styles/Vocab/Base/accept.txt +0 -0
- package/styles/Vocab/Base/reject.txt +0 -0
- package/styles/Vocab/Plone/accept.txt +0 -8
- package/styles/Vocab/Plone/reject.txt +0 -0
- package/towncrier.toml +0 -33
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { map, uniq, keys, intersection, isEmpty } from 'lodash';
|
|
2
2
|
import { messages } from '../MessageLabels/MessageLabels';
|
|
3
|
+
import config from '@plone/volto/registry';
|
|
4
|
+
import { toast } from 'react-toastify';
|
|
5
|
+
import Toast from '@plone/volto/components/manage/Toast/Toast';
|
|
3
6
|
|
|
4
7
|
/**
|
|
5
8
|
* Will return the intl message if invalid
|
|
@@ -44,7 +47,8 @@ const widgetValidation = {
|
|
|
44
47
|
isValidEmail: (emailValue, emailObj, intlFunc) => {
|
|
45
48
|
// Email Regex taken from from WHATWG living standard:
|
|
46
49
|
// https://html.spec.whatwg.org/multipage/input.html#e-mail-state-(type=email)
|
|
47
|
-
const emailRegex =
|
|
50
|
+
const emailRegex =
|
|
51
|
+
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
|
|
48
52
|
const isValid = emailRegex.test(emailValue);
|
|
49
53
|
return !isValid ? intlFunc(messages.isValidEmail) : null;
|
|
50
54
|
},
|
|
@@ -65,7 +69,16 @@ const widgetValidation = {
|
|
|
65
69
|
},
|
|
66
70
|
url: {
|
|
67
71
|
isValidURL: (urlValue, urlObj, intlFunc) => {
|
|
68
|
-
|
|
72
|
+
var urlRegex = new RegExp(
|
|
73
|
+
'^(https?:\\/\\/)?' + // validate protocol
|
|
74
|
+
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|' + // validate domain name
|
|
75
|
+
'((\\d{1,3}\\.){3}\\d{1,3}))|' + // validate OR ip (v4) address
|
|
76
|
+
'(localhost)' + // validate OR localhost address
|
|
77
|
+
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*' + // validate port and path
|
|
78
|
+
'(\\?[;&a-z\\d%_.~+=-]*)?' + // validate query string
|
|
79
|
+
'(\\#[-a-z\\d_]*)?$', // validate fragment locator
|
|
80
|
+
'i',
|
|
81
|
+
);
|
|
69
82
|
const isValid = urlRegex.test(urlValue);
|
|
70
83
|
return !isValid ? intlFunc(messages.isValidURL) : null;
|
|
71
84
|
},
|
|
@@ -194,7 +207,7 @@ const validateRequiredFields = (
|
|
|
194
207
|
const type = schema.properties[requiredField]?.type;
|
|
195
208
|
const widget = schema.properties[requiredField]?.widget;
|
|
196
209
|
|
|
197
|
-
let isEmpty = !formData[requiredField];
|
|
210
|
+
let isEmpty = !formData[requiredField] && formData[requiredField] !== 0;
|
|
198
211
|
if (!isEmpty) {
|
|
199
212
|
if (type === 'array') {
|
|
200
213
|
isEmpty = formData[requiredField]
|
|
@@ -360,3 +373,29 @@ class FormValidation {
|
|
|
360
373
|
}
|
|
361
374
|
|
|
362
375
|
export default FormValidation;
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Check if a file upload is within the maximum size limit.
|
|
379
|
+
* @param {File} file
|
|
380
|
+
* @param {Function} intlFunc
|
|
381
|
+
* @returns {Boolean}
|
|
382
|
+
*/
|
|
383
|
+
export const validateFileUploadSize = (file, intlFunc) => {
|
|
384
|
+
const isValid =
|
|
385
|
+
!config.settings.maxFileUploadSize ||
|
|
386
|
+
file.size <= config.settings.maxFileUploadSize;
|
|
387
|
+
if (!isValid) {
|
|
388
|
+
toast.error(
|
|
389
|
+
<Toast
|
|
390
|
+
error
|
|
391
|
+
title={intlFunc(messages.error)}
|
|
392
|
+
content={intlFunc(messages.fileTooLarge, {
|
|
393
|
+
limit: `${Math.floor(
|
|
394
|
+
config.settings.maxFileUploadSize / 1024 / 1024,
|
|
395
|
+
)}MB`,
|
|
396
|
+
})}
|
|
397
|
+
/>,
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
return isValid;
|
|
401
|
+
};
|
|
@@ -5,6 +5,7 @@ const schema = {
|
|
|
5
5
|
properties: {
|
|
6
6
|
username: { title: 'Username', type: 'string', description: '' },
|
|
7
7
|
email: { title: 'Email', type: 'string', widget: 'email', description: '' },
|
|
8
|
+
url: { title: 'url', type: 'string', widget: 'url', description: '' },
|
|
8
9
|
},
|
|
9
10
|
fieldsets: [
|
|
10
11
|
{ id: 'default', title: 'FIXME: User Data', fields: ['username'] },
|
|
@@ -65,6 +66,38 @@ describe('FormValidation', () => {
|
|
|
65
66
|
});
|
|
66
67
|
});
|
|
67
68
|
|
|
69
|
+
it('do not treat 0 as missing required value', () => {
|
|
70
|
+
let newSchema = {
|
|
71
|
+
...schema,
|
|
72
|
+
properties: {
|
|
73
|
+
...schema.properties,
|
|
74
|
+
age: {
|
|
75
|
+
title: 'age',
|
|
76
|
+
type: 'integer',
|
|
77
|
+
widget: 'number',
|
|
78
|
+
description: '',
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
required: ['age'],
|
|
82
|
+
};
|
|
83
|
+
expect(
|
|
84
|
+
FormValidation.validateFieldsPerFieldset({
|
|
85
|
+
schema: newSchema,
|
|
86
|
+
formData: { username: 'test username', age: null },
|
|
87
|
+
formatMessage,
|
|
88
|
+
}),
|
|
89
|
+
).toEqual({
|
|
90
|
+
age: [messages.required.defaultMessage],
|
|
91
|
+
});
|
|
92
|
+
expect(
|
|
93
|
+
FormValidation.validateFieldsPerFieldset({
|
|
94
|
+
schema: newSchema,
|
|
95
|
+
formData: { username: 'test username', age: 0 },
|
|
96
|
+
formatMessage,
|
|
97
|
+
}),
|
|
98
|
+
).toEqual({});
|
|
99
|
+
});
|
|
100
|
+
|
|
68
101
|
it('validates incorrect email', () => {
|
|
69
102
|
expect(
|
|
70
103
|
FormValidation.validateFieldsPerFieldset({
|
|
@@ -87,5 +120,45 @@ describe('FormValidation', () => {
|
|
|
87
120
|
}),
|
|
88
121
|
).toEqual({});
|
|
89
122
|
});
|
|
123
|
+
it('validates incorrect url', () => {
|
|
124
|
+
formData.url = 'foo';
|
|
125
|
+
expect(
|
|
126
|
+
FormValidation.validateFieldsPerFieldset({
|
|
127
|
+
schema,
|
|
128
|
+
formData,
|
|
129
|
+
formatMessage,
|
|
130
|
+
}),
|
|
131
|
+
).toEqual({ url: [messages.isValidURL.defaultMessage] });
|
|
132
|
+
});
|
|
133
|
+
it('validates url', () => {
|
|
134
|
+
formData.url = 'https://plone.org/';
|
|
135
|
+
expect(
|
|
136
|
+
FormValidation.validateFieldsPerFieldset({
|
|
137
|
+
schema,
|
|
138
|
+
formData,
|
|
139
|
+
formatMessage,
|
|
140
|
+
}),
|
|
141
|
+
).toEqual({});
|
|
142
|
+
});
|
|
143
|
+
it('validates url with ip', () => {
|
|
144
|
+
formData.url = 'http://127.0.0.1:8080/Plone';
|
|
145
|
+
expect(
|
|
146
|
+
FormValidation.validateFieldsPerFieldset({
|
|
147
|
+
schema,
|
|
148
|
+
formData,
|
|
149
|
+
formatMessage,
|
|
150
|
+
}),
|
|
151
|
+
).toEqual({});
|
|
152
|
+
});
|
|
153
|
+
it('validates url with localhost', () => {
|
|
154
|
+
formData.url = 'http://localhost:8080/Plone';
|
|
155
|
+
expect(
|
|
156
|
+
FormValidation.validateFieldsPerFieldset({
|
|
157
|
+
schema,
|
|
158
|
+
formData,
|
|
159
|
+
formatMessage,
|
|
160
|
+
}),
|
|
161
|
+
).toEqual({});
|
|
162
|
+
});
|
|
90
163
|
});
|
|
91
164
|
});
|
|
@@ -87,18 +87,14 @@ class Html extends Component {
|
|
|
87
87
|
* @returns {string} Markup for the component.
|
|
88
88
|
*/
|
|
89
89
|
render() {
|
|
90
|
-
const {
|
|
91
|
-
|
|
92
|
-
markup,
|
|
93
|
-
store,
|
|
94
|
-
criticalCss,
|
|
95
|
-
apiPath,
|
|
96
|
-
publicURL,
|
|
97
|
-
} = this.props;
|
|
90
|
+
const { extractor, markup, store, criticalCss, apiPath, publicURL } =
|
|
91
|
+
this.props;
|
|
98
92
|
const head = Helmet.rewind();
|
|
99
93
|
const bodyClass = join(BodyClass.rewind(), ' ');
|
|
94
|
+
const htmlAttributes = head.htmlAttributes.toComponent();
|
|
95
|
+
|
|
100
96
|
return (
|
|
101
|
-
<html lang=
|
|
97
|
+
<html lang={htmlAttributes.lang}>
|
|
102
98
|
<head>
|
|
103
99
|
<meta charSet="utf-8" />
|
|
104
100
|
{head.base.toComponent()}
|
|
@@ -18,22 +18,22 @@ export const __setLoadables = async () => {
|
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
// TODO: filter mockAllLoadables
|
|
21
|
-
export const injectLazyLibs = jest
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
21
|
+
export const injectLazyLibs = jest.fn().mockImplementation(function ([
|
|
22
|
+
libraries,
|
|
23
|
+
]) {
|
|
24
|
+
return jest.fn((WrappedComponent) =>
|
|
25
|
+
jest.fn((props) => {
|
|
26
|
+
return <WrappedComponent {...props} {...mockAllLoadables} />;
|
|
27
|
+
}),
|
|
28
|
+
);
|
|
29
|
+
});
|
|
30
30
|
|
|
31
|
-
export const preloadLazyLibs = jest
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
31
|
+
export const preloadLazyLibs = jest.fn().mockImplementation(function ([
|
|
32
|
+
libraries,
|
|
33
|
+
]) {
|
|
34
|
+
return jest.fn((WrappedComponent) =>
|
|
35
|
+
jest.fn((props) => {
|
|
36
|
+
return <WrappedComponent {...props} />;
|
|
37
|
+
}),
|
|
38
|
+
);
|
|
39
|
+
});
|
|
@@ -172,6 +172,27 @@ export const messages = defineMessages({
|
|
|
172
172
|
id: 'Roles',
|
|
173
173
|
defaultMessage: 'Roles',
|
|
174
174
|
},
|
|
175
|
+
addUserFormPasswordAndSendPasswordTogetherNotAllowed: {
|
|
176
|
+
id: 'It is not allowed to define both the password and to request sending the password reset message by e-mail. You need to select one of them.',
|
|
177
|
+
defaultMessage:
|
|
178
|
+
'It is not allowed to define both the password and to request sending the password reset message by e-mail. You need to select one of them.',
|
|
179
|
+
},
|
|
180
|
+
userSearchNoResults: {
|
|
181
|
+
id: 'There are no users with the searched criteria',
|
|
182
|
+
defaultMessage: 'There are no users with the searched criteria',
|
|
183
|
+
},
|
|
184
|
+
groupSearchNoResults: {
|
|
185
|
+
id: 'There are no groups with the searched criteria',
|
|
186
|
+
defaultMessage: 'There are no groups with the searched criteria',
|
|
187
|
+
},
|
|
188
|
+
updateUserFormTitle: {
|
|
189
|
+
id: 'Update User',
|
|
190
|
+
defaultMessage: 'Update User',
|
|
191
|
+
},
|
|
192
|
+
updateUserSuccess: {
|
|
193
|
+
id: 'User updated successfuly',
|
|
194
|
+
defaultMessage: 'User updated successfuly',
|
|
195
|
+
},
|
|
175
196
|
updateRoles: {
|
|
176
197
|
id: 'User roles updated',
|
|
177
198
|
defaultMessage: 'User roles updated',
|
|
@@ -234,19 +255,19 @@ export const messages = defineMessages({
|
|
|
234
255
|
},
|
|
235
256
|
copyBlocks: {
|
|
236
257
|
id: 'Copy blocks',
|
|
237
|
-
|
|
258
|
+
defaultMessage: 'Copy blocks',
|
|
238
259
|
},
|
|
239
260
|
cutBlocks: {
|
|
240
261
|
id: 'Cut blocks',
|
|
241
|
-
|
|
262
|
+
defaultMessage: 'Cut blocks',
|
|
242
263
|
},
|
|
243
264
|
pasteBlocks: {
|
|
244
265
|
id: 'Paste blocks',
|
|
245
|
-
|
|
266
|
+
defaultMessage: 'Paste blocks',
|
|
246
267
|
},
|
|
247
268
|
deleteBlocks: {
|
|
248
269
|
id: 'Delete blocks',
|
|
249
|
-
|
|
270
|
+
defaultMessage: 'Delete blocks',
|
|
250
271
|
},
|
|
251
272
|
showAllUserButton: {
|
|
252
273
|
id: 'Show All',
|
|
@@ -260,4 +281,90 @@ export const messages = defineMessages({
|
|
|
260
281
|
id: 'Show groups of users below',
|
|
261
282
|
defaultMessage: 'Show groups of users below',
|
|
262
283
|
},
|
|
284
|
+
urlClipboardCopy: {
|
|
285
|
+
id: 'Link copied to clipboard',
|
|
286
|
+
defaultMessage: 'Anchor link copied to the clipboard',
|
|
287
|
+
},
|
|
288
|
+
inspectRelations: {
|
|
289
|
+
id: 'Inspect relations',
|
|
290
|
+
defaultMessage: 'Inspect relations',
|
|
291
|
+
},
|
|
292
|
+
relations: {
|
|
293
|
+
id: 'Relations',
|
|
294
|
+
defaultMessage: 'Relations',
|
|
295
|
+
},
|
|
296
|
+
fixRelations: {
|
|
297
|
+
id: 'Fix relations',
|
|
298
|
+
defaultMessage: 'Fix relations',
|
|
299
|
+
},
|
|
300
|
+
searchRelationSource: {
|
|
301
|
+
id: 'Search sources by title or path',
|
|
302
|
+
defaultMessage: 'Search sources by title or path',
|
|
303
|
+
},
|
|
304
|
+
searchRelationTarget: {
|
|
305
|
+
id: 'Search targets by title or path',
|
|
306
|
+
defaultMessage: 'Search targets by title or path',
|
|
307
|
+
},
|
|
308
|
+
createOrDeleteRelationsToTarget: {
|
|
309
|
+
id: 'Create or delete relations to target',
|
|
310
|
+
defaultMessage: 'Create or delete relations to target',
|
|
311
|
+
},
|
|
312
|
+
relationName: {
|
|
313
|
+
id: 'Relation name',
|
|
314
|
+
defaultMessage: 'relation',
|
|
315
|
+
},
|
|
316
|
+
selectRelation: {
|
|
317
|
+
id: 'Select relation',
|
|
318
|
+
defaultMessage: 'Select relation',
|
|
319
|
+
},
|
|
320
|
+
norelationfound: {
|
|
321
|
+
id: 'No relation found',
|
|
322
|
+
defaultMessage: 'No relation found',
|
|
323
|
+
},
|
|
324
|
+
toomanyrelationsfound: {
|
|
325
|
+
id: 'Many relations found. Please search.',
|
|
326
|
+
defaultMessage: 'Many relations found. Please search.',
|
|
327
|
+
},
|
|
328
|
+
rebuildRelations: {
|
|
329
|
+
id: 'rebuild relations',
|
|
330
|
+
defaultMessage: 'rebuild relations',
|
|
331
|
+
},
|
|
332
|
+
flushAndRebuildRelations: {
|
|
333
|
+
id: 'flush intIds and rebuild relations',
|
|
334
|
+
defaultMessage: 'flush intIds and rebuild relations',
|
|
335
|
+
},
|
|
336
|
+
flushAndRebuildRelationsHints: {
|
|
337
|
+
id: 'flushAndRebuildRelationsHints',
|
|
338
|
+
defaultMessage:
|
|
339
|
+
'<ul><li>Regenerate intIds (tokens of relations in relation catalog)</li><li>Rebuild relations</li></ul><p>Check the log for details!</p><p><b>Warning</b>: If you have add-ons relying on intIds, you should not flush them.</p>',
|
|
340
|
+
},
|
|
341
|
+
|
|
342
|
+
addPotentialTargetsPath: {
|
|
343
|
+
id: 'target path',
|
|
344
|
+
defaultMessage: 'target path',
|
|
345
|
+
},
|
|
346
|
+
addPotentialSourcesPath: {
|
|
347
|
+
id: 'sources path',
|
|
348
|
+
defaultMessage: 'sources path',
|
|
349
|
+
},
|
|
350
|
+
relationsUpdated: {
|
|
351
|
+
id: 'Relations updated',
|
|
352
|
+
defaultMessage: 'Relations updated',
|
|
353
|
+
},
|
|
354
|
+
select: {
|
|
355
|
+
id: 'Select',
|
|
356
|
+
defaultMessage: 'Select',
|
|
357
|
+
},
|
|
358
|
+
selected: {
|
|
359
|
+
id: 'Selected',
|
|
360
|
+
defaultMessage: 'Selected',
|
|
361
|
+
},
|
|
362
|
+
filter: {
|
|
363
|
+
id: 'Filter',
|
|
364
|
+
defaultMessage: 'Filter',
|
|
365
|
+
},
|
|
366
|
+
fileTooLarge: {
|
|
367
|
+
id: 'fileTooLarge',
|
|
368
|
+
defaultMessage: 'This website does not accept files larger than {limit}',
|
|
369
|
+
},
|
|
263
370
|
});
|
|
@@ -15,12 +15,9 @@ import { addHeadersFactory } from '@plone/volto/helpers/Proxy/Proxy';
|
|
|
15
15
|
*/
|
|
16
16
|
export const generateRobots = (req) =>
|
|
17
17
|
new Promise((resolve) => {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
config.settings.internalApiPath ?? config.settings.apiPath
|
|
22
|
-
}/robots.txt`,
|
|
23
|
-
);
|
|
18
|
+
const internalUrl =
|
|
19
|
+
config.settings.internalApiPath ?? config.settings.apiPath;
|
|
20
|
+
const request = superagent.get(`${internalUrl}/robots.txt`);
|
|
24
21
|
request.set('Accept', 'text/plain');
|
|
25
22
|
const authToken = req.universalCookies.get('auth_token');
|
|
26
23
|
if (authToken) {
|
|
@@ -31,6 +28,27 @@ export const generateRobots = (req) =>
|
|
|
31
28
|
if (error) {
|
|
32
29
|
resolve(text || error);
|
|
33
30
|
} else {
|
|
31
|
+
// It appears that express does not take the x-forwarded headers into
|
|
32
|
+
// consideration, so we do it ourselves.
|
|
33
|
+
const {
|
|
34
|
+
'x-forwarded-proto': forwardedProto,
|
|
35
|
+
'x-forwarded-host': forwardedHost,
|
|
36
|
+
'x-forwarded-port': forwardedPort,
|
|
37
|
+
} = req.headers;
|
|
38
|
+
const proto = forwardedProto ?? req.protocol;
|
|
39
|
+
const host = forwardedHost ?? req.get('Host');
|
|
40
|
+
const portNum = forwardedPort ?? req.get('Port');
|
|
41
|
+
const port =
|
|
42
|
+
(proto === 'https' && '' + portNum === '443') ||
|
|
43
|
+
(proto === 'http' && '' + portNum === '80')
|
|
44
|
+
? ''
|
|
45
|
+
: `:${portNum}`;
|
|
46
|
+
// Plone has probably returned the sitemap link with the internal url.
|
|
47
|
+
// If so, let's replace it with the current one.
|
|
48
|
+
const url = `${proto}://${host}${port}`;
|
|
49
|
+
text = text.replace(internalUrl, url);
|
|
50
|
+
// Replace the sitemap with the sitemap index.
|
|
51
|
+
text = text.replace('sitemap.xml.gz', 'sitemap-index.xml');
|
|
34
52
|
resolve(text);
|
|
35
53
|
}
|
|
36
54
|
});
|
|
@@ -28,15 +28,17 @@ class ScrollToTop extends React.Component {
|
|
|
28
28
|
* @memberof ScrollToTop
|
|
29
29
|
*/
|
|
30
30
|
componentDidUpdate(prevProps) {
|
|
31
|
+
const { location } = this.props;
|
|
31
32
|
const noInitialBlocksFocus = // Do not scroll on /edit
|
|
32
33
|
config.blocks?.initialBlocksFocus === null
|
|
33
34
|
? this.props.location?.pathname.slice(-5) !== '/edit'
|
|
34
35
|
: true;
|
|
36
|
+
|
|
37
|
+
const isHash = location?.hash || location?.pathname.hash;
|
|
35
38
|
if (
|
|
36
|
-
!
|
|
37
|
-
!this.props.location?.pathname.hash &&
|
|
39
|
+
!isHash &&
|
|
38
40
|
noInitialBlocksFocus &&
|
|
39
|
-
|
|
41
|
+
location?.pathname !== prevProps.location?.pathname
|
|
40
42
|
) {
|
|
41
43
|
window.scrollTo(0, 0);
|
|
42
44
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { GET_SITE } from '@plone/volto/constants/ActionTypes';
|
|
2
|
+
import { getSite } from '@plone/volto/actions';
|
|
3
|
+
|
|
4
|
+
const getSiteAsyncPropExtender = {
|
|
5
|
+
path: '/',
|
|
6
|
+
extend: (dispatchActions) => {
|
|
7
|
+
if (
|
|
8
|
+
dispatchActions.filter((asyncAction) => asyncAction.key === GET_SITE)
|
|
9
|
+
.length === 0
|
|
10
|
+
) {
|
|
11
|
+
dispatchActions.push({
|
|
12
|
+
key: GET_SITE,
|
|
13
|
+
promise: ({ location, store: { dispatch } }) =>
|
|
14
|
+
__SERVER__ && dispatch(getSite()),
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
return dispatchActions;
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { getSiteAsyncPropExtender };
|
|
@@ -11,19 +11,23 @@ import { addHeadersFactory } from '@plone/volto/helpers/Proxy/Proxy';
|
|
|
11
11
|
|
|
12
12
|
import config from '@plone/volto/registry';
|
|
13
13
|
|
|
14
|
+
export const SITEMAP_BATCH_SIZE = 5000;
|
|
15
|
+
|
|
14
16
|
/**
|
|
15
17
|
* Generate sitemap
|
|
16
18
|
* @function generateSitemap
|
|
17
19
|
* @param {Object} _req Request object
|
|
18
20
|
* @return {string} Generated sitemap
|
|
19
21
|
*/
|
|
20
|
-
export const generateSitemap = (_req) =>
|
|
22
|
+
export const generateSitemap = (_req, start = 0, size = undefined) =>
|
|
21
23
|
new Promise((resolve) => {
|
|
22
24
|
const { settings } = config;
|
|
23
25
|
const APISUFIX = settings.legacyTraverse ? '' : '/++api++';
|
|
24
26
|
const apiPath = settings.internalApiPath ?? settings.apiPath;
|
|
25
27
|
const request = superagent.get(
|
|
26
|
-
`${apiPath}${APISUFIX}/@search?metadata_fields=modified&b_size
|
|
28
|
+
`${apiPath}${APISUFIX}/@search?metadata_fields=modified&b_start=${start}&b_size=${
|
|
29
|
+
size !== undefined ? size : 100000000
|
|
30
|
+
}&use_site_search_settings=1`,
|
|
27
31
|
);
|
|
28
32
|
request.set('Accept', 'application/json');
|
|
29
33
|
request.use(addHeadersFactory(_req));
|
|
@@ -50,3 +54,41 @@ export const generateSitemap = (_req) =>
|
|
|
50
54
|
}
|
|
51
55
|
});
|
|
52
56
|
});
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Generate sitemap
|
|
60
|
+
* @function generateSitemapIndex
|
|
61
|
+
* @param {Object} _req Request object
|
|
62
|
+
* @return {string} Generated sitemap index
|
|
63
|
+
*/
|
|
64
|
+
export const generateSitemapIndex = (_req) =>
|
|
65
|
+
new Promise((resolve) => {
|
|
66
|
+
const { settings } = config;
|
|
67
|
+
const APISUFIX = settings.legacyTraverse ? '' : '/++api++';
|
|
68
|
+
const apiPath = settings.internalApiPath ?? settings.apiPath;
|
|
69
|
+
const request = superagent.get(
|
|
70
|
+
`${apiPath}${APISUFIX}/@search?metadata_fields=modified&b_size=0&use_site_search_settings=1`,
|
|
71
|
+
);
|
|
72
|
+
request.set('Accept', 'application/json');
|
|
73
|
+
const authToken = _req.universalCookies.get('auth_token');
|
|
74
|
+
if (authToken) {
|
|
75
|
+
request.set('Authorization', `Bearer ${authToken}`);
|
|
76
|
+
}
|
|
77
|
+
request.end((error, { body } = {}) => {
|
|
78
|
+
if (error) {
|
|
79
|
+
resolve(body || error);
|
|
80
|
+
} else {
|
|
81
|
+
const items = Array.from(
|
|
82
|
+
{ length: Math.ceil(body.items_total / SITEMAP_BATCH_SIZE) },
|
|
83
|
+
(_, i) =>
|
|
84
|
+
` <sitemap>
|
|
85
|
+
<loc>${toPublicURL('/sitemap' + (i + 1) + '.xml.gz')}</loc>
|
|
86
|
+
</sitemap>`,
|
|
87
|
+
);
|
|
88
|
+
const result = `<?xml version="1.0" encoding="UTF-8"?>
|
|
89
|
+
<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
90
|
+
${items.join('\n')}\n</sitemapindex>`;
|
|
91
|
+
resolve(result);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
});
|
package/src/helpers/Url/Url.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* @module helpers/Url
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import { last, memoize } from 'lodash';
|
|
6
|
+
import { last, memoize, isArray, isObject, isString } from 'lodash';
|
|
7
7
|
import { urlRegex, telRegex, mailRegex } from './urlRegex';
|
|
8
8
|
import prependHttp from 'prepend-http';
|
|
9
9
|
import config from '@plone/volto/registry';
|
|
@@ -251,6 +251,27 @@ export function isUrl(url) {
|
|
|
251
251
|
return urlRegex().test(url);
|
|
252
252
|
}
|
|
253
253
|
|
|
254
|
+
/**
|
|
255
|
+
* Get field url
|
|
256
|
+
* @method getFieldURL
|
|
257
|
+
* @param {object} data
|
|
258
|
+
* @returns {string | any} URL string value if field is of url type or any.
|
|
259
|
+
*/
|
|
260
|
+
export const getFieldURL = (data) => {
|
|
261
|
+
let url = data;
|
|
262
|
+
const _isObject = data && isObject(data) && !isArray(data);
|
|
263
|
+
if (_isObject && data['@type'] === 'URL') {
|
|
264
|
+
url = data['value'] ?? data['url'] ?? data['href'] ?? data;
|
|
265
|
+
} else if (_isObject) {
|
|
266
|
+
url = data['@id'] ?? data['url'] ?? data['href'] ?? data;
|
|
267
|
+
}
|
|
268
|
+
if (isArray(data)) {
|
|
269
|
+
url = data.map((item) => getFieldURL(item));
|
|
270
|
+
}
|
|
271
|
+
if (isString(url) && isInternalURL(url)) return flattenToAppURL(url);
|
|
272
|
+
return url;
|
|
273
|
+
};
|
|
274
|
+
|
|
254
275
|
/**
|
|
255
276
|
* Normalize URL, adds protocol (if required eg. user has not entered the protocol)
|
|
256
277
|
* @method normalizeUrl
|
|
@@ -280,14 +301,14 @@ export function isTelephone(text) {
|
|
|
280
301
|
}
|
|
281
302
|
|
|
282
303
|
export function normaliseMail(email) {
|
|
283
|
-
if (email
|
|
304
|
+
if (email?.toLowerCase()?.startsWith('mailto:')) {
|
|
284
305
|
return email;
|
|
285
306
|
}
|
|
286
307
|
return `mailto:${email}`;
|
|
287
308
|
}
|
|
288
309
|
|
|
289
310
|
export function normalizeTelephone(tel) {
|
|
290
|
-
if (tel
|
|
311
|
+
if (tel?.toLowerCase()?.startsWith('tel:')) {
|
|
291
312
|
return tel;
|
|
292
313
|
}
|
|
293
314
|
return `tel:${tel}`;
|
|
@@ -310,12 +331,17 @@ export function checkAndNormalizeUrl(url) {
|
|
|
310
331
|
res.url = URLUtils.normalizeTelephone(url);
|
|
311
332
|
} else {
|
|
312
333
|
//url
|
|
313
|
-
if (
|
|
334
|
+
if (
|
|
335
|
+
res.url?.length >= 0 &&
|
|
336
|
+
!res.url.startsWith('/') &&
|
|
337
|
+
!res.url.startsWith('#')
|
|
338
|
+
) {
|
|
314
339
|
res.url = URLUtils.normalizeUrl(url);
|
|
315
340
|
if (!URLUtils.isUrl(res.url)) {
|
|
316
341
|
res.isValid = false;
|
|
317
342
|
}
|
|
318
343
|
}
|
|
344
|
+
if (res.url === undefined || res.url === null) res.isValid = false;
|
|
319
345
|
}
|
|
320
346
|
return res;
|
|
321
347
|
}
|