@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,9 +1,18 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useState, useMemo } from 'react';
|
|
2
|
+
import { Button, Grid } from 'semantic-ui-react';
|
|
2
3
|
import { resolveExtension } from '@plone/volto/helpers/Extensions/withBlockExtensions';
|
|
3
4
|
import config from '@plone/volto/registry';
|
|
4
5
|
import { hasNonValueOperation, hasDateOperation } from '../utils';
|
|
6
|
+
import { defineMessages, useIntl } from 'react-intl';
|
|
5
7
|
|
|
6
|
-
const
|
|
8
|
+
const messages = defineMessages({
|
|
9
|
+
moreFilters: { id: 'More filters', defaultMessage: 'More filters' },
|
|
10
|
+
lessFilters: { id: 'Less filters', defaultMessage: 'Less filters' },
|
|
11
|
+
showFilters: { id: 'Show filters', defaultMessage: 'Show filters' },
|
|
12
|
+
hideFilters: { id: 'Hide filters', defaultMessage: 'Hide filters' },
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
const defaultShowFacet = (index) => {
|
|
7
16
|
const { values } = index;
|
|
8
17
|
return index
|
|
9
18
|
? hasNonValueOperation(index.operations || []) ||
|
|
@@ -14,6 +23,7 @@ const showFacet = (index) => {
|
|
|
14
23
|
};
|
|
15
24
|
|
|
16
25
|
const Facets = (props) => {
|
|
26
|
+
const [hidden, setHidden] = useState(true);
|
|
17
27
|
const {
|
|
18
28
|
querystring,
|
|
19
29
|
data = {},
|
|
@@ -24,11 +34,29 @@ const Facets = (props) => {
|
|
|
24
34
|
} = props;
|
|
25
35
|
const { search } = config.blocks.blocksConfig;
|
|
26
36
|
|
|
37
|
+
const advancedFilters = useMemo(() => {
|
|
38
|
+
let count = 0;
|
|
39
|
+
for (let facetSettings of data.facets || []) {
|
|
40
|
+
if (facetSettings.advanced) {
|
|
41
|
+
count++;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
if (count === data.facets?.length) {
|
|
46
|
+
return 2;
|
|
47
|
+
}
|
|
48
|
+
if (count) {
|
|
49
|
+
return 1;
|
|
50
|
+
}
|
|
51
|
+
return 0;
|
|
52
|
+
}, [data.facets]);
|
|
53
|
+
|
|
27
54
|
const FacetWrapper = facetWrapper;
|
|
28
55
|
const query_to_values = Object.assign(
|
|
29
56
|
{},
|
|
30
57
|
...(data?.query?.query?.map(({ i, v }) => ({ [i]: v })) || []),
|
|
31
58
|
);
|
|
59
|
+
const intl = useIntl();
|
|
32
60
|
|
|
33
61
|
return (
|
|
34
62
|
<>
|
|
@@ -36,6 +64,7 @@ const Facets = (props) => {
|
|
|
36
64
|
?.filter((facetSettings) => !facetSettings.hidden)
|
|
37
65
|
.map((facetSettings) => {
|
|
38
66
|
const field = facetSettings?.field?.value;
|
|
67
|
+
const isAdvanced = facetSettings?.advanced;
|
|
39
68
|
const index = querystring.indexes[field] || {};
|
|
40
69
|
const { values = {} } = index;
|
|
41
70
|
|
|
@@ -58,10 +87,15 @@ const Facets = (props) => {
|
|
|
58
87
|
|
|
59
88
|
const isMulti = facetSettings.multiple;
|
|
60
89
|
const selectedValue = facets[facetSettings?.field?.value];
|
|
90
|
+
const visible = (isAdvanced && !hidden) || !isAdvanced;
|
|
61
91
|
|
|
62
92
|
// TODO :handle changing the type of facet (multi/nonmulti)
|
|
63
93
|
|
|
64
|
-
const {
|
|
94
|
+
const {
|
|
95
|
+
view: FacetWidget,
|
|
96
|
+
stateToValue,
|
|
97
|
+
showFacet = defaultShowFacet,
|
|
98
|
+
} = resolveExtension(
|
|
65
99
|
'type',
|
|
66
100
|
search.extensions.facetWidgets.types,
|
|
67
101
|
facetSettings,
|
|
@@ -69,12 +103,15 @@ const Facets = (props) => {
|
|
|
69
103
|
|
|
70
104
|
let value = stateToValue({ facetSettings, index, selectedValue });
|
|
71
105
|
|
|
72
|
-
const {
|
|
73
|
-
|
|
74
|
-
} = search.extensions.facetWidgets;
|
|
106
|
+
const { rewriteOptions = (name, options) => options } =
|
|
107
|
+
search.extensions.facetWidgets;
|
|
75
108
|
|
|
76
109
|
return FacetWrapper && (isEditMode || showFacet(index)) ? (
|
|
77
|
-
<FacetWrapper
|
|
110
|
+
<FacetWrapper
|
|
111
|
+
key={facetSettings['@id']}
|
|
112
|
+
facetSettings={facetSettings}
|
|
113
|
+
visible={visible}
|
|
114
|
+
>
|
|
78
115
|
<FacetWidget
|
|
79
116
|
facet={facetSettings}
|
|
80
117
|
choices={rewriteOptions(facetSettings?.field?.value, choices)}
|
|
@@ -90,6 +127,28 @@ const Facets = (props) => {
|
|
|
90
127
|
''
|
|
91
128
|
);
|
|
92
129
|
})}
|
|
130
|
+
{advancedFilters > 0 && (
|
|
131
|
+
<Grid.Column
|
|
132
|
+
mobile={12}
|
|
133
|
+
tablet={12}
|
|
134
|
+
computer={12}
|
|
135
|
+
className="toggle-advanced-facets"
|
|
136
|
+
>
|
|
137
|
+
<Button
|
|
138
|
+
onClick={() => {
|
|
139
|
+
setHidden((prevHidden) => !prevHidden);
|
|
140
|
+
}}
|
|
141
|
+
>
|
|
142
|
+
{hidden
|
|
143
|
+
? advancedFilters === 2
|
|
144
|
+
? intl.formatMessage(messages.showFilters)
|
|
145
|
+
: intl.formatMessage(messages.moreFilters)
|
|
146
|
+
: advancedFilters === 2
|
|
147
|
+
? intl.formatMessage(messages.hideFilters)
|
|
148
|
+
: intl.formatMessage(messages.lessFilters)}
|
|
149
|
+
</Button>
|
|
150
|
+
</Grid.Column>
|
|
151
|
+
)}
|
|
93
152
|
</>
|
|
94
153
|
);
|
|
95
154
|
};
|
|
@@ -36,9 +36,8 @@ const FilterList = (props) => {
|
|
|
36
36
|
!isEmpty(facets[field.value]),
|
|
37
37
|
).length;
|
|
38
38
|
|
|
39
|
-
const {
|
|
40
|
-
|
|
41
|
-
} = config.blocks.blocksConfig.search.extensions.facetWidgets;
|
|
39
|
+
const { types: facetWidgetTypes } =
|
|
40
|
+
config.blocks.blocksConfig.search.extensions.facetWidgets;
|
|
42
41
|
|
|
43
42
|
const intl = useIntl();
|
|
44
43
|
|
|
@@ -70,9 +69,8 @@ const FilterList = (props) => {
|
|
|
70
69
|
<Accordion.Content className="filter-list-content" active={isOpened}>
|
|
71
70
|
<div className="filter-list">
|
|
72
71
|
{data.facets?.map((facetSettings, i) => {
|
|
73
|
-
const {
|
|
74
|
-
|
|
75
|
-
} = resolveExtension('type', facetWidgetTypes, facetSettings);
|
|
72
|
+
const { filterListComponent: FilterListComponent } =
|
|
73
|
+
resolveExtension('type', facetWidgetTypes, facetSettings);
|
|
76
74
|
const facet = facetSettings?.field?.value;
|
|
77
75
|
if (!facet) return null;
|
|
78
76
|
|
|
@@ -13,7 +13,14 @@ const messages = defineMessages({
|
|
|
13
13
|
});
|
|
14
14
|
|
|
15
15
|
const SearchInput = (props) => {
|
|
16
|
-
const {
|
|
16
|
+
const {
|
|
17
|
+
data,
|
|
18
|
+
searchText,
|
|
19
|
+
setSearchText,
|
|
20
|
+
isLive,
|
|
21
|
+
onTriggerSearch,
|
|
22
|
+
removeSearchQuery,
|
|
23
|
+
} = props;
|
|
17
24
|
const intl = useIntl();
|
|
18
25
|
|
|
19
26
|
return (
|
|
@@ -44,7 +51,7 @@ const SearchInput = (props) => {
|
|
|
44
51
|
className="search-input-clear-icon-button"
|
|
45
52
|
onClick={() => {
|
|
46
53
|
setSearchText('');
|
|
47
|
-
|
|
54
|
+
removeSearchQuery();
|
|
48
55
|
}}
|
|
49
56
|
>
|
|
50
57
|
<Icon name={clearSVG} />
|
|
@@ -13,15 +13,8 @@ import {
|
|
|
13
13
|
} from './base';
|
|
14
14
|
|
|
15
15
|
const SelectFacet = (props) => {
|
|
16
|
-
const {
|
|
17
|
-
|
|
18
|
-
choices,
|
|
19
|
-
reactSelect,
|
|
20
|
-
isMulti,
|
|
21
|
-
onChange,
|
|
22
|
-
value,
|
|
23
|
-
isEditMode,
|
|
24
|
-
} = props;
|
|
16
|
+
const { facet, choices, reactSelect, isMulti, onChange, value, isEditMode } =
|
|
17
|
+
props;
|
|
25
18
|
const Select = reactSelect.default;
|
|
26
19
|
const v = Array.isArray(value) && value.length === 0 ? null : value;
|
|
27
20
|
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export SearchDetails from './SearchDetails';
|
|
2
|
-
export Facets from './Facets';
|
|
3
|
-
export SelectFacet from './SelectFacet';
|
|
4
|
-
export CheckboxFacet from './CheckboxFacet';
|
|
5
|
-
export DateRangeFacet from './DateRangeFacet';
|
|
6
|
-
export SearchInput from './SearchInput';
|
|
7
|
-
export FilterList from './FilterList';
|
|
8
|
-
export SortOn from './SortOn';
|
|
9
|
-
export ToggleFacet from './ToggleFacet';
|
|
10
|
-
export SelectFacetFilterListEntry from './SelectFacetFilterListEntry';
|
|
11
|
-
export ToggleFacetFilterListEntry from './ToggleFacetFilterListEntry';
|
|
12
|
-
export DateRangeFacetFilterListEntry from './DateRangeFacetFilterListEntry';
|
|
13
|
-
export ViewSwitcher from './ViewSwitcher';
|
|
1
|
+
export { default as SearchDetails } from './SearchDetails';
|
|
2
|
+
export { default as Facets } from './Facets';
|
|
3
|
+
export { default as SelectFacet } from './SelectFacet';
|
|
4
|
+
export { default as CheckboxFacet } from './CheckboxFacet';
|
|
5
|
+
export { default as DateRangeFacet } from './DateRangeFacet';
|
|
6
|
+
export { default as SearchInput } from './SearchInput';
|
|
7
|
+
export { default as FilterList } from './FilterList';
|
|
8
|
+
export { default as SortOn } from './SortOn';
|
|
9
|
+
export { default as ToggleFacet } from './ToggleFacet';
|
|
10
|
+
export { default as SelectFacetFilterListEntry } from './SelectFacetFilterListEntry';
|
|
11
|
+
export { default as ToggleFacetFilterListEntry } from './ToggleFacetFilterListEntry';
|
|
12
|
+
export { default as DateRangeFacetFilterListEntry } from './DateRangeFacetFilterListEntry';
|
|
13
|
+
export { default as ViewSwitcher } from './ViewSwitcher';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export withQueryString from './withQueryString';
|
|
2
|
-
export withSearch from './withSearch';
|
|
1
|
+
export { default as withQueryString } from './withQueryString';
|
|
2
|
+
export { default as withSearch } from './withSearch';
|
|
@@ -10,11 +10,14 @@ function getDisplayName(WrappedComponent) {
|
|
|
10
10
|
* A HOC that injects querystring metadata information from the backend.
|
|
11
11
|
*
|
|
12
12
|
*/
|
|
13
|
-
export default (WrappedComponent)
|
|
13
|
+
export default function withQueryString(WrappedComponent) {
|
|
14
14
|
function WithQueryString(props) {
|
|
15
15
|
const dispatch = useDispatch();
|
|
16
16
|
|
|
17
17
|
const qs = useSelector((state) => state.querystring);
|
|
18
|
+
// This showed up after updating eslint-plugin-react-hooks
|
|
19
|
+
// TODO: fix it properly
|
|
20
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
18
21
|
const indexes = qs?.indexes || {};
|
|
19
22
|
|
|
20
23
|
React.useEffect(() => {
|
|
@@ -29,4 +32,4 @@ export default (WrappedComponent) => {
|
|
|
29
32
|
WrappedComponent,
|
|
30
33
|
)})`;
|
|
31
34
|
return WithQueryString;
|
|
32
|
-
}
|
|
35
|
+
}
|
|
@@ -5,6 +5,8 @@ import { useLocation, useHistory } from 'react-router-dom';
|
|
|
5
5
|
|
|
6
6
|
import { resolveExtension } from '@plone/volto/helpers/Extensions/withBlockExtensions';
|
|
7
7
|
import config from '@plone/volto/registry';
|
|
8
|
+
import { usePrevious } from '@plone/volto/helpers';
|
|
9
|
+
import { isEqual } from 'lodash';
|
|
8
10
|
|
|
9
11
|
function getDisplayName(WrappedComponent) {
|
|
10
12
|
return WrappedComponent.displayName || WrappedComponent.name || 'Component';
|
|
@@ -27,9 +29,8 @@ const PAQO = 'plone.app.querystring.operation';
|
|
|
27
29
|
*
|
|
28
30
|
*/
|
|
29
31
|
function getInitialState(data, facets, urlSearchText, id) {
|
|
30
|
-
const {
|
|
31
|
-
|
|
32
|
-
} = config.blocks.blocksConfig.search.extensions.facetWidgets;
|
|
32
|
+
const { types: facetWidgetTypes } =
|
|
33
|
+
config.blocks.blocksConfig.search.extensions.facetWidgets;
|
|
33
34
|
const facetSettings = data?.facets || [];
|
|
34
35
|
|
|
35
36
|
return {
|
|
@@ -85,9 +86,8 @@ function normalizeState({
|
|
|
85
86
|
sortOrder,
|
|
86
87
|
facetSettings, // data.facets extracted from block data
|
|
87
88
|
}) {
|
|
88
|
-
const {
|
|
89
|
-
|
|
90
|
-
} = config.blocks.blocksConfig.search.extensions.facetWidgets;
|
|
89
|
+
const { types: facetWidgetTypes } =
|
|
90
|
+
config.blocks.blocksConfig.search.extensions.facetWidgets;
|
|
91
91
|
|
|
92
92
|
const params = {
|
|
93
93
|
query: [
|
|
@@ -114,15 +114,19 @@ function normalizeState({
|
|
|
114
114
|
block: id,
|
|
115
115
|
};
|
|
116
116
|
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
);
|
|
117
|
+
// Note Ideally the searchtext functionality should be restructured as being just
|
|
118
|
+
// another facet. But right now it's the same. This means that if a searchText
|
|
119
|
+
// is provided, it will override the SearchableText facet.
|
|
120
|
+
// If there is no searchText, the SearchableText in the query remains in effect.
|
|
121
|
+
// TODO eventually the searchText should be a distinct facet from SearchableText, and
|
|
122
|
+
// the two conditions could be combined, in comparison to the current state, when
|
|
123
|
+
// one overrides the other.
|
|
125
124
|
if (searchText) {
|
|
125
|
+
params.query = params.query.reduce(
|
|
126
|
+
// Remove SearchableText from query
|
|
127
|
+
(acc, kvp) => (kvp.i === 'SearchableText' ? acc : [...acc, kvp]),
|
|
128
|
+
[],
|
|
129
|
+
);
|
|
126
130
|
params.query.push({
|
|
127
131
|
i: 'SearchableText',
|
|
128
132
|
o: 'plone.app.querystring.operation.string.contains',
|
|
@@ -144,12 +148,16 @@ const getSearchFields = (searchData) => {
|
|
|
144
148
|
};
|
|
145
149
|
|
|
146
150
|
/**
|
|
147
|
-
* A
|
|
151
|
+
* A hook that will mirror the search block state to a hash location
|
|
148
152
|
*/
|
|
149
153
|
const useHashState = () => {
|
|
150
154
|
const location = useLocation();
|
|
151
155
|
const history = useHistory();
|
|
152
156
|
|
|
157
|
+
/**
|
|
158
|
+
* Required to maintain parameter compatibility.
|
|
159
|
+
With this we will maintain support for receiving hash (#) and search (?) type parameters.
|
|
160
|
+
*/
|
|
153
161
|
const oldState = React.useMemo(() => {
|
|
154
162
|
return {
|
|
155
163
|
...qs.parse(location.search),
|
|
@@ -165,7 +173,7 @@ const useHashState = () => {
|
|
|
165
173
|
|
|
166
174
|
const setSearchData = React.useCallback(
|
|
167
175
|
(searchData) => {
|
|
168
|
-
const newParams = qs.parse(location.
|
|
176
|
+
const newParams = qs.parse(location.search);
|
|
169
177
|
|
|
170
178
|
let changed = false;
|
|
171
179
|
|
|
@@ -182,11 +190,11 @@ const useHashState = () => {
|
|
|
182
190
|
|
|
183
191
|
if (changed) {
|
|
184
192
|
history.push({
|
|
185
|
-
|
|
193
|
+
search: qs.stringify(newParams),
|
|
186
194
|
});
|
|
187
195
|
}
|
|
188
196
|
},
|
|
189
|
-
[history, oldState, location.
|
|
197
|
+
[history, oldState, location.search],
|
|
190
198
|
);
|
|
191
199
|
|
|
192
200
|
return [current, setSearchData];
|
|
@@ -230,6 +238,8 @@ const withSearch = (options) => (WrappedComponent) => {
|
|
|
230
238
|
editable,
|
|
231
239
|
);
|
|
232
240
|
|
|
241
|
+
// TODO: Improve the hook dependencies out of the scope of https://github.com/plone/volto/pull/4662
|
|
242
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
233
243
|
const urlQuery = locationSearchData.query
|
|
234
244
|
? deserializeQuery(locationSearchData.query)
|
|
235
245
|
: [];
|
|
@@ -240,46 +250,69 @@ const withSearch = (options) => (WrappedComponent) => {
|
|
|
240
250
|
|
|
241
251
|
// TODO: refactor, should use only useLocationStateManager()!!!
|
|
242
252
|
const [searchText, setSearchText] = React.useState(urlSearchText);
|
|
253
|
+
// TODO: Improve the hook dependencies out of the scope of https://github.com/plone/volto/pull/4662
|
|
254
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
243
255
|
const configuredFacets =
|
|
244
256
|
data.facets?.map((facet) => facet?.field?.value) || [];
|
|
245
257
|
const multiFacets = data.facets
|
|
246
258
|
?.filter((facet) => facet?.multiple)
|
|
247
259
|
.map((facet) => facet?.field?.value);
|
|
248
|
-
const [facets, setFacets] = React.useState(
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
260
|
+
const [facets, setFacets] = React.useState({});
|
|
261
|
+
const previousUrlQuery = usePrevious(urlQuery);
|
|
262
|
+
|
|
263
|
+
React.useEffect(() => {
|
|
264
|
+
if (!isEqual(urlQuery, previousUrlQuery)) {
|
|
265
|
+
setFacets(
|
|
266
|
+
Object.assign(
|
|
267
|
+
{},
|
|
268
|
+
...urlQuery.map(({ i, v }) => ({ [i]: v })), // TODO: the 'o' should be kept. This would be a major refactoring of the facets
|
|
269
|
+
|
|
270
|
+
// support for simple filters like ?Subject=something
|
|
271
|
+
// TODO: since the move to hash params this is no longer working.
|
|
272
|
+
// We'd have to treat the location.search and manage it just like the
|
|
273
|
+
// hash, to support it. We can read it, but we'd have to reset it as
|
|
274
|
+
// well, so at that point what's the difference to the hash?
|
|
275
|
+
...configuredFacets.map((f) =>
|
|
276
|
+
locationSearchData[f]
|
|
277
|
+
? {
|
|
278
|
+
[f]:
|
|
279
|
+
multiFacets.indexOf(f) > -1
|
|
280
|
+
? [locationSearchData[f]]
|
|
281
|
+
: locationSearchData[f],
|
|
282
|
+
}
|
|
283
|
+
: {},
|
|
284
|
+
),
|
|
285
|
+
),
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
}, [
|
|
289
|
+
urlQuery,
|
|
290
|
+
configuredFacets,
|
|
291
|
+
locationSearchData,
|
|
292
|
+
multiFacets,
|
|
293
|
+
previousUrlQuery,
|
|
294
|
+
]);
|
|
270
295
|
|
|
271
296
|
const [sortOn, setSortOn] = React.useState(data?.query?.sort_on);
|
|
272
297
|
const [sortOrder, setSortOrder] = React.useState(data?.query?.sort_order);
|
|
273
298
|
|
|
274
|
-
const [searchData, setSearchData] = React.useState(
|
|
275
|
-
|
|
276
|
-
)
|
|
299
|
+
const [searchData, setSearchData] = React.useState({});
|
|
300
|
+
|
|
301
|
+
React.useEffect(() => {
|
|
302
|
+
setSearchData(getInitialState(data, facets, urlSearchText, id));
|
|
303
|
+
}, [facets, data, urlSearchText, id]);
|
|
277
304
|
|
|
278
305
|
const timeoutRef = React.useRef();
|
|
279
306
|
const facetSettings = data?.facets;
|
|
280
307
|
|
|
308
|
+
const deepQuery = JSON.stringify(data.query);
|
|
281
309
|
const onTriggerSearch = React.useCallback(
|
|
282
|
-
(
|
|
310
|
+
(
|
|
311
|
+
toSearchText = undefined,
|
|
312
|
+
toSearchFacets = undefined,
|
|
313
|
+
toSortOn = undefined,
|
|
314
|
+
toSortOrder = undefined,
|
|
315
|
+
) => {
|
|
283
316
|
if (timeoutRef.current) clearTimeout(timeoutRef.current);
|
|
284
317
|
timeoutRef.current = setTimeout(
|
|
285
318
|
() => {
|
|
@@ -287,7 +320,7 @@ const withSearch = (options) => (WrappedComponent) => {
|
|
|
287
320
|
id,
|
|
288
321
|
query: data.query || {},
|
|
289
322
|
facets: toSearchFacets || facets,
|
|
290
|
-
searchText: toSearchText,
|
|
323
|
+
searchText: toSearchText ? toSearchText.trim() : '',
|
|
291
324
|
sortOn: toSortOn || sortOn,
|
|
292
325
|
sortOrder: toSortOrder || sortOrder,
|
|
293
326
|
facetSettings,
|
|
@@ -301,17 +334,30 @@ const withSearch = (options) => (WrappedComponent) => {
|
|
|
301
334
|
toSearchFacets ? inputDelay / 3 : inputDelay,
|
|
302
335
|
);
|
|
303
336
|
},
|
|
337
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
304
338
|
[
|
|
305
|
-
data.query
|
|
339
|
+
// Use deep comparison of data.query
|
|
340
|
+
deepQuery,
|
|
306
341
|
facets,
|
|
307
342
|
id,
|
|
308
343
|
setLocationSearchData,
|
|
344
|
+
searchText,
|
|
309
345
|
sortOn,
|
|
310
346
|
sortOrder,
|
|
311
347
|
facetSettings,
|
|
312
348
|
],
|
|
313
349
|
);
|
|
314
350
|
|
|
351
|
+
const removeSearchQuery = () => {
|
|
352
|
+
searchData.query = searchData.query.reduce(
|
|
353
|
+
// Remove SearchableText from query
|
|
354
|
+
(acc, kvp) => (kvp.i === 'SearchableText' ? acc : [...acc, kvp]),
|
|
355
|
+
[],
|
|
356
|
+
);
|
|
357
|
+
setSearchData(searchData);
|
|
358
|
+
setLocationSearchData(getSearchFields(searchData));
|
|
359
|
+
};
|
|
360
|
+
|
|
315
361
|
const querystringResults = useSelector(
|
|
316
362
|
(state) => state.querystringsearch.subrequests,
|
|
317
363
|
);
|
|
@@ -330,6 +376,7 @@ const withSearch = (options) => (WrappedComponent) => {
|
|
|
330
376
|
sortOrder={sortOrder}
|
|
331
377
|
searchedText={urlSearchText}
|
|
332
378
|
searchText={searchText}
|
|
379
|
+
removeSearchQuery={removeSearchQuery}
|
|
333
380
|
setSearchText={setSearchText}
|
|
334
381
|
onTriggerSearch={onTriggerSearch}
|
|
335
382
|
totalItems={totalItems}
|
|
@@ -11,6 +11,7 @@ import { Grid, Segment } from 'semantic-ui-react';
|
|
|
11
11
|
import { Button } from 'semantic-ui-react';
|
|
12
12
|
import { flushSync } from 'react-dom';
|
|
13
13
|
import { defineMessages, useIntl } from 'react-intl';
|
|
14
|
+
import cx from 'classnames';
|
|
14
15
|
|
|
15
16
|
const messages = defineMessages({
|
|
16
17
|
searchButtonText: {
|
|
@@ -19,11 +20,22 @@ const messages = defineMessages({
|
|
|
19
20
|
},
|
|
20
21
|
});
|
|
21
22
|
|
|
22
|
-
const FacetWrapper = ({ children }) =>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
const FacetWrapper = ({ children, facetSettings = {}, visible }) => {
|
|
24
|
+
const { advanced, field = {} } = facetSettings;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Segment
|
|
28
|
+
basic
|
|
29
|
+
className={cx('facet', {
|
|
30
|
+
[`facet-index-${field.value}`]: !!field.value,
|
|
31
|
+
'advanced-facet': advanced,
|
|
32
|
+
'advanced-facet-hidden': !visible,
|
|
33
|
+
})}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</Segment>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
27
39
|
|
|
28
40
|
const LeftColumnFacets = (props) => {
|
|
29
41
|
const {
|
|
@@ -11,6 +11,7 @@ import { Grid, Segment } from 'semantic-ui-react';
|
|
|
11
11
|
import { Button } from 'semantic-ui-react';
|
|
12
12
|
import { flushSync } from 'react-dom';
|
|
13
13
|
import { defineMessages, useIntl } from 'react-intl';
|
|
14
|
+
import cx from 'classnames';
|
|
14
15
|
|
|
15
16
|
const messages = defineMessages({
|
|
16
17
|
searchButtonText: {
|
|
@@ -19,11 +20,22 @@ const messages = defineMessages({
|
|
|
19
20
|
},
|
|
20
21
|
});
|
|
21
22
|
|
|
22
|
-
const FacetWrapper = ({ children }) =>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
const FacetWrapper = ({ children, facetSettings = {}, visible }) => {
|
|
24
|
+
const { advanced, field = {} } = facetSettings;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Segment
|
|
28
|
+
basic
|
|
29
|
+
className={cx('facet', {
|
|
30
|
+
[`facet-index-${field.value}`]: !!field.value,
|
|
31
|
+
'advanced-facet': advanced,
|
|
32
|
+
'advanced-facet-hidden': !visible,
|
|
33
|
+
})}
|
|
34
|
+
>
|
|
35
|
+
{children}
|
|
36
|
+
</Segment>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
27
39
|
|
|
28
40
|
const RightColumnFacets = (props) => {
|
|
29
41
|
const {
|
|
@@ -11,6 +11,7 @@ import {
|
|
|
11
11
|
SortOn,
|
|
12
12
|
ViewSwitcher,
|
|
13
13
|
} from '../components';
|
|
14
|
+
import cx from 'classnames';
|
|
14
15
|
|
|
15
16
|
const messages = defineMessages({
|
|
16
17
|
searchButtonText: {
|
|
@@ -19,11 +20,24 @@ const messages = defineMessages({
|
|
|
19
20
|
},
|
|
20
21
|
});
|
|
21
22
|
|
|
22
|
-
const FacetWrapper = ({ children }) =>
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
const FacetWrapper = ({ children, facetSettings = {}, visible }) => {
|
|
24
|
+
const { advanced, field = {} } = facetSettings;
|
|
25
|
+
|
|
26
|
+
return (
|
|
27
|
+
<Grid.Column
|
|
28
|
+
mobile={12}
|
|
29
|
+
tablet={4}
|
|
30
|
+
computer={3}
|
|
31
|
+
className={cx('facet', {
|
|
32
|
+
[`facet-index-${field.value}`]: !!field.value,
|
|
33
|
+
'advanced-facet': advanced,
|
|
34
|
+
'advanced-facet-hidden': !visible,
|
|
35
|
+
})}
|
|
36
|
+
>
|
|
37
|
+
{children}
|
|
38
|
+
</Grid.Column>
|
|
39
|
+
);
|
|
40
|
+
};
|
|
27
41
|
|
|
28
42
|
const TopSideFacets = (props) => {
|
|
29
43
|
const {
|
|
@@ -117,6 +131,7 @@ const TopSideFacets = (props) => {
|
|
|
117
131
|
<ViewSwitcher {...props} />
|
|
118
132
|
)}
|
|
119
133
|
</div>
|
|
134
|
+
|
|
120
135
|
{data.facets?.length > 0 && (
|
|
121
136
|
<div className="facets">
|
|
122
137
|
{data.facetsTitle && <h3>{data.facetsTitle}</h3>}
|
|
@@ -136,6 +151,7 @@ const TopSideFacets = (props) => {
|
|
|
136
151
|
</Grid>
|
|
137
152
|
</div>
|
|
138
153
|
)}
|
|
154
|
+
|
|
139
155
|
<SearchDetails
|
|
140
156
|
text={searchedText}
|
|
141
157
|
total={totalItems}
|