@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.
Files changed (438) hide show
  1. package/.eslintrc +26 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
  4. package/.yarn/releases/yarn-3.6.3.cjs +874 -0
  5. package/CHANGELOG.md +716 -20
  6. package/CONTRIBUTING.md +5 -1
  7. package/README.md +20 -21
  8. package/addon-registry.js +44 -1
  9. package/create-addons-loader.js +1 -1
  10. package/create-theme-addons-loader.js +79 -0
  11. package/cypress/support/commands.js +70 -14
  12. package/cypress/support/e2e.js +1 -2
  13. package/cypress/support/volto-slate.js +4 -5
  14. package/cypress.config.js +1 -0
  15. package/docker-compose.yml +1 -1
  16. package/locales/ca/LC_MESSAGES/volto.po +422 -53
  17. package/locales/ca.json +1 -1
  18. package/locales/de/LC_MESSAGES/volto.po +442 -73
  19. package/locales/de.json +1 -1
  20. package/locales/en/LC_MESSAGES/volto.po +420 -51
  21. package/locales/en.json +1 -1
  22. package/locales/es/LC_MESSAGES/volto.po +431 -62
  23. package/locales/es.json +1 -1
  24. package/locales/eu/LC_MESSAGES/volto.po +421 -52
  25. package/locales/eu.json +1 -1
  26. package/locales/fi/LC_MESSAGES/volto.po +4985 -0
  27. package/locales/fi.json +1 -1
  28. package/locales/fr/LC_MESSAGES/volto.po +422 -53
  29. package/locales/fr.json +1 -1
  30. package/locales/it/LC_MESSAGES/volto.po +589 -220
  31. package/locales/it.json +1 -1
  32. package/locales/ja/LC_MESSAGES/volto.po +421 -52
  33. package/locales/ja.json +1 -1
  34. package/locales/nl/LC_MESSAGES/volto.po +1072 -691
  35. package/locales/nl.json +1 -1
  36. package/locales/pt/LC_MESSAGES/volto.po +422 -53
  37. package/locales/pt.json +1 -1
  38. package/locales/pt_BR/LC_MESSAGES/volto.po +429 -60
  39. package/locales/pt_BR.json +1 -1
  40. package/locales/ro/LC_MESSAGES/volto.po +422 -53
  41. package/locales/ro.json +1 -1
  42. package/locales/volto.pot +425 -52
  43. package/locales/zh_CN/LC_MESSAGES/volto.po +422 -53
  44. package/locales/zh_CN.json +1 -1
  45. package/package.json +46 -35
  46. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  47. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  48. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  49. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  50. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  51. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  52. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  53. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  54. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  55. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  56. package/packages/volto-slate/package.json +1 -1
  57. package/packages/volto-slate/src/actions/index.js +1 -1
  58. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  59. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  60. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  61. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  62. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  63. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  64. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  65. package/packages/volto-slate/src/editor/config.jsx +5 -4
  66. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  67. package/packages/volto-slate/src/editor/index.js +4 -4
  68. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  69. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  70. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  71. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  72. package/packages/volto-slate/src/editor/render.jsx +77 -8
  73. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  74. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  75. package/packages/volto-slate/src/index.js +2 -2
  76. package/packages/volto-slate/src/utils/blocks.js +7 -0
  77. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  78. package/razzle.config.js +32 -6
  79. package/src/actions/index.js +10 -0
  80. package/src/actions/language/language.js +9 -8
  81. package/src/actions/navroot/navroot.js +16 -0
  82. package/src/actions/navroot/navroot.test.js +15 -0
  83. package/src/actions/querystringsearch/querystringsearch.js +20 -14
  84. package/src/actions/relations/rebuild.js +25 -0
  85. package/src/actions/relations/relations.js +103 -0
  86. package/src/actions/relations/relations.test.js +15 -0
  87. package/src/actions/site/site.js +16 -0
  88. package/src/actions/site/site.test.js +15 -0
  89. package/src/actions/userSession/userSession.js +17 -1
  90. package/src/components/index.js +194 -191
  91. package/src/components/manage/Actions/Actions.jsx +133 -243
  92. package/src/components/manage/Add/Add.jsx +9 -10
  93. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  94. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  95. package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -3
  96. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  97. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  98. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  99. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  100. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  101. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  102. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  103. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  104. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  105. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  106. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  107. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  108. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  109. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  110. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  111. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  112. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  113. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  114. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  115. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  116. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  117. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  118. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  119. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  120. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  121. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  122. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  123. package/src/components/manage/Blocks/Image/schema.js +17 -10
  124. package/src/components/manage/Blocks/Image/utils.js +14 -0
  125. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  126. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  127. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  128. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  129. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  130. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  131. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  132. package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
  133. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  134. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  135. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  136. package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
  137. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +34 -19
  138. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  139. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  140. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  141. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
  142. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +4 -2
  143. package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
  144. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  145. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  146. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  147. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  148. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  149. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  150. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  151. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +93 -46
  152. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  153. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  154. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  155. package/src/components/manage/Blocks/Search/schema.js +29 -14
  156. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  157. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  158. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  159. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  160. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  161. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  162. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  163. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  164. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  165. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  166. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  167. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  168. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  169. package/src/components/manage/Contents/Contents.jsx +319 -139
  170. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  171. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  172. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  173. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  174. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  175. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  176. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  177. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  178. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  179. package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
  180. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
  181. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  182. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  183. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +91 -0
  184. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  185. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +480 -0
  186. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  187. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  188. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  189. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  190. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  191. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  192. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  193. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  194. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  195. package/src/components/manage/Delete/Delete.jsx +96 -171
  196. package/src/components/manage/Diff/DiffField.jsx +25 -1
  197. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  198. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  199. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  200. package/src/components/manage/Form/Form.jsx +7 -6
  201. package/src/components/manage/Form/InlineForm.jsx +39 -9
  202. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  203. package/src/components/manage/Form/InlineFormState.js +8 -0
  204. package/src/components/manage/History/History.jsx +11 -1
  205. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  206. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  207. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  208. package/src/components/manage/Messages/Messages.jsx +32 -99
  209. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  210. package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
  211. package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
  212. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  213. package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
  214. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  215. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  216. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  217. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  218. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  219. package/src/components/manage/TemplateChooser/template.svg +10 -0
  220. package/src/components/manage/Toast/Toast.jsx +2 -2
  221. package/src/components/manage/Toolbar/More.jsx +17 -2
  222. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  223. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  224. package/src/components/manage/Toolbar/Types.jsx +2 -2
  225. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  226. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  227. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  228. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  229. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  230. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  231. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  232. package/src/components/manage/Widgets/DatetimeWidget.jsx +11 -13
  233. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  234. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  235. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  236. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  237. package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
  238. package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
  239. package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
  240. package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
  241. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +10 -12
  242. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
  243. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  244. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  245. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  246. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  247. package/src/components/manage/Widgets/SelectUtils.js +2 -2
  248. package/src/components/manage/Widgets/SelectWidget.jsx +16 -2
  249. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  250. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  251. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  252. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  253. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  254. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  255. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  256. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  257. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  258. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  259. package/src/components/theme/Comments/Comments.jsx +268 -380
  260. package/src/components/theme/Component/Component.jsx +1 -1
  261. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  262. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  263. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  264. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  265. package/src/components/theme/Error/ServerError.jsx +29 -0
  266. package/src/components/theme/Footer/Footer.jsx +2 -13
  267. package/src/components/theme/Header/Header.jsx +37 -63
  268. package/src/components/theme/Header/Header.test.jsx +18 -0
  269. package/src/components/theme/Icon/Icon.jsx +2 -2
  270. package/src/components/theme/Image/Image.jsx +96 -0
  271. package/src/components/theme/Image/Image.test.jsx +125 -0
  272. package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
  273. package/src/components/theme/Login/Login.jsx +160 -242
  274. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  275. package/src/components/theme/Logo/Logo.jsx +35 -26
  276. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  277. package/src/components/theme/Logout/Logout.jsx +36 -83
  278. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
  279. package/src/components/theme/Navigation/NavItem.jsx +4 -2
  280. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  281. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  282. package/src/components/theme/PasswordReset/PasswordReset.jsx +8 -6
  283. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +96 -171
  284. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  285. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  286. package/src/components/theme/Register/Register.jsx +2 -4
  287. package/src/components/theme/Search/SearchTags.jsx +30 -60
  288. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  289. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  290. package/src/components/theme/Sitemap/Sitemap.jsx +25 -12
  291. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  292. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  293. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  294. package/src/components/theme/View/AlbumView.jsx +21 -16
  295. package/src/components/theme/View/DefaultView.jsx +1 -1
  296. package/src/components/theme/View/EventDatesInfo.jsx +2 -1
  297. package/src/components/theme/View/EventView.jsx +36 -25
  298. package/src/components/theme/View/FileView.jsx +23 -18
  299. package/src/components/theme/View/ImageView.jsx +40 -32
  300. package/src/components/theme/View/ImageView.test.jsx +4 -0
  301. package/src/components/theme/View/LinkView.jsx +53 -78
  302. package/src/components/theme/View/ListingView.jsx +36 -28
  303. package/src/components/theme/View/NewsItemView.jsx +16 -17
  304. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  305. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  306. package/src/components/theme/View/SummaryView.jsx +49 -39
  307. package/src/components/theme/View/TabularView.jsx +59 -53
  308. package/src/components/theme/View/View.jsx +2 -0
  309. package/src/components/theme/Widgets/DateWidget.jsx +2 -1
  310. package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
  311. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  312. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  313. package/src/config/Blocks.jsx +46 -0
  314. package/src/config/Components.jsx +3 -1
  315. package/src/config/ControlPanels.js +2 -1
  316. package/src/config/Loadables.jsx +1 -1
  317. package/src/config/NonContentRoutes.jsx +1 -0
  318. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  319. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  320. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  321. package/src/config/RichTextEditor/Styles.jsx +1 -1
  322. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  323. package/src/config/RichTextEditor/index.js +2 -3
  324. package/src/config/Views.jsx +6 -4
  325. package/src/config/Widgets.jsx +4 -0
  326. package/src/config/index.js +38 -2
  327. package/src/config/server.js +2 -0
  328. package/src/constants/ActionTypes.js +8 -0
  329. package/src/constants/Indexes.js +3 -1
  330. package/src/constants/Languages.js +8 -4
  331. package/src/express-middleware/devproxy.js +1 -1
  332. package/src/express-middleware/files.js +11 -9
  333. package/src/express-middleware/images.js +12 -5
  334. package/src/express-middleware/ok.js +16 -0
  335. package/src/express-middleware/robotstxt.js +1 -1
  336. package/src/express-middleware/sitemap.js +37 -5
  337. package/src/express-middleware/static.js +3 -3
  338. package/src/helpers/Api/Api.js +1 -1
  339. package/src/helpers/Blocks/Blocks.js +52 -6
  340. package/src/helpers/Blocks/Blocks.test.js +92 -13
  341. package/src/helpers/Extensions/index.js +2 -1
  342. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  343. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  344. package/src/helpers/FormValidation/FormValidation.js +42 -3
  345. package/src/helpers/FormValidation/FormValidation.test.js +73 -0
  346. package/src/helpers/Html/Html.jsx +5 -9
  347. package/src/helpers/Html/Html.test.jsx +5 -0
  348. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  349. package/src/helpers/MessageLabels/MessageLabels.js +111 -4
  350. package/src/helpers/Robots/Robots.js +24 -6
  351. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  352. package/src/helpers/Site/index.js +21 -0
  353. package/src/helpers/Sitemap/Sitemap.js +44 -2
  354. package/src/helpers/Url/Url.js +30 -4
  355. package/src/helpers/Url/Url.test.js +55 -0
  356. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  357. package/src/helpers/Utils/Utils.js +73 -13
  358. package/src/helpers/Utils/Utils.test.js +17 -4
  359. package/src/helpers/Utils/usePagination.js +67 -14
  360. package/src/helpers/Utils/usePagination.test.js +115 -0
  361. package/src/helpers/index.js +22 -10
  362. package/src/hooks/client/useClient.js +11 -0
  363. package/src/hooks/clipboard/useClipboard.js +26 -0
  364. package/src/hooks/index.js +2 -0
  365. package/src/icons/grid-block.svg +11 -0
  366. package/src/middleware/Api.test.js +54 -0
  367. package/src/middleware/api.js +209 -175
  368. package/src/middleware/blacklistRoutes.js +25 -22
  369. package/src/middleware/index.js +2 -2
  370. package/src/middleware/storeProtectLoadUtils.js +61 -62
  371. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  372. package/src/reducers/actions/actions.js +8 -6
  373. package/src/reducers/actions/actions.test.js +70 -0
  374. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  375. package/src/reducers/content/content.test.js +4 -4
  376. package/src/reducers/index.js +6 -0
  377. package/src/reducers/navigation/navigation.js +6 -6
  378. package/src/reducers/navigation/navigation.test.js +30 -0
  379. package/src/reducers/navroot/navroot.js +79 -0
  380. package/src/reducers/navroot/navroot.test.js +110 -0
  381. package/src/reducers/relations/relations.js +201 -0
  382. package/src/reducers/site/site.js +51 -0
  383. package/src/reducers/site/site.test.js +67 -0
  384. package/src/reducers/types/types.js +1 -1
  385. package/src/reducers/userSession/userSession.js +15 -1
  386. package/src/registry.js +2 -2
  387. package/src/routes.js +14 -0
  388. package/src/server.jsx +37 -23
  389. package/src/start-server.js +2 -2
  390. package/src/storybook.jsx +24 -38
  391. package/test-setup-config.js +12 -1
  392. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  393. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  394. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  395. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  396. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  397. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  398. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  399. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  400. package/theme/themes/pastanaga/extras/contents.less +6 -1
  401. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  402. package/theme/themes/pastanaga/extras/grid.less +427 -0
  403. package/theme/themes/pastanaga/extras/login.less +3 -0
  404. package/theme/themes/pastanaga/extras/main.less +14 -7
  405. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  406. package/theme/themes/pastanaga/extras/search.less +7 -1
  407. package/theme/themes/pastanaga/extras/sidebar.less +9 -4
  408. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  409. package/theme/themes/pastanaga/extras/toc.less +29 -0
  410. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  411. package/theme/themes/pastanaga/extras/userscontrolpanel.less +104 -73
  412. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  413. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  414. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  415. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  416. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  417. package/tsconfig.json +33 -0
  418. package/webpack-plugins/webpack-less-plugin.js +19 -0
  419. package/.changelog.draft +0 -19
  420. package/.editorconfig +0 -36
  421. package/.storybook/main.js +0 -127
  422. package/.storybook/manager.js +0 -15
  423. package/.storybook/preview.js +0 -21
  424. package/.storybook/static/previewImage.svg +0 -48
  425. package/.vale.ini +0 -10
  426. package/.yarnrc.yml +0 -5
  427. package/jsdoc.json +0 -16
  428. package/netlify.toml +0 -5
  429. package/pyvenv.cfg +0 -3
  430. package/share/man/man1/ttx.1 +0 -225
  431. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  432. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  433. package/src/components/theme/Header/Header.md +0 -27
  434. package/styles/Vocab/Base/accept.txt +0 -0
  435. package/styles/Vocab/Base/reject.txt +0 -0
  436. package/styles/Vocab/Plone/accept.txt +0 -8
  437. package/styles/Vocab/Plone/reject.txt +0 -0
  438. 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 showFacet = (index) => {
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 { view: FacetWidget, stateToValue } = resolveExtension(
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
- rewriteOptions = (name, options) => options,
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 key={facetSettings['@id']}>
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
- types: facetWidgetTypes,
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
- filterListComponent: FilterListComponent,
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 { data, searchText, setSearchText, isLive, onTriggerSearch } = props;
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
- onTriggerSearch('');
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
- facet,
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
- types: facetWidgetTypes,
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
- types: facetWidgetTypes,
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
- // TODO: need to check if SearchableText facet is not already in the query
118
- // Ideally the searchtext functionality should be restructured as being just
119
- // another facet
120
- params.query = params.query.reduce(
121
- // Remove SearchableText from query
122
- (acc, kvp) => (kvp.i === 'SearchableText' ? acc : [...acc, kvp]),
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 HOC that will mirror the search block state to a hash location
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.hash);
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
- hash: qs.stringify(newParams),
193
+ search: qs.stringify(newParams),
186
194
  });
187
195
  }
188
196
  },
189
- [history, oldState, location.hash],
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
- Object.assign(
250
- {},
251
- ...urlQuery.map(({ i, v }) => ({ [i]: v })), // TODO: the 'o' should be kept. This would be a major refactoring of the facets
252
-
253
- // support for simple filters like ?Subject=something
254
- // TODO: since the move to hash params this is no longer working.
255
- // We'd have to treat the location.search and manage it just like the
256
- // hash, to support it. We can read it, but we'd have to reset it as
257
- // well, so at that point what's the difference to the hash?
258
- ...configuredFacets.map((f) =>
259
- locationSearchData[f]
260
- ? {
261
- [f]:
262
- multiFacets.indexOf(f) > -1
263
- ? [locationSearchData[f]]
264
- : locationSearchData[f],
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
- getInitialState(data, facets, urlSearchText, id),
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
- (toSearchText, toSearchFacets, toSortOn, toSortOrder) => {
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
- <Segment basic className="facet">
24
- {children}
25
- </Segment>
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
- <Segment basic className="facet">
24
- {children}
25
- </Segment>
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
- <Grid.Column mobile={12} tablet={4} computer={3}>
24
- {children}
25
- </Grid.Column>
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}