@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,17 +1,10 @@
1
- /**
2
- * RequestPasswordReset component.
3
- * @module components/theme/RequestPasswordReset/RequestPasswordReset
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
10
- import { withRouter } from 'react-router-dom';
11
- import { Helmet } from '@plone/volto/helpers';
1
+ import { useState, useEffect, useRef } from 'react';
2
+ import { useDispatch, useSelector } from 'react-redux';
3
+ import { useHistory } from 'react-router-dom';
12
4
  import { Container } from 'semantic-ui-react';
13
- import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
5
+ import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
14
6
 
7
+ import { Helmet, usePrevious } from '@plone/volto/helpers';
15
8
  import { Form } from '@plone/volto/components';
16
9
  import { resetPassword } from '@plone/volto/actions';
17
10
  import config from '@plone/volto/registry';
@@ -32,7 +25,7 @@ const messages = defineMessages({
32
25
  },
33
26
  usernameTitle: {
34
27
  id: 'label_my_username_is',
35
- defaultMessage: 'My username is',
28
+ defaultMessage: 'My user name is',
36
29
  },
37
30
  emailTitle: {
38
31
  id: 'label_my_email_is',
@@ -56,178 +49,110 @@ const messages = defineMessages({
56
49
  },
57
50
  });
58
51
 
59
- /**
60
- * RequestPasswordReset class.
61
- * @class RequestPasswordReset
62
- * @extends Component
63
- */
64
- class RequestPasswordReset extends Component {
65
- /**
66
- * Property types.
67
- * @property {Object} propTypes Property types.
68
- * @static
69
- */
70
- static propTypes = {
71
- loading: PropTypes.bool.isRequired,
72
- loaded: PropTypes.bool.isRequired,
73
- error: PropTypes.string,
74
- resetPassword: PropTypes.func.isRequired,
75
- };
52
+ const useUsers = () => {
53
+ const loading = useSelector((state) => state.users.reset.loading);
54
+ const loaded = useSelector((state) => state.users.reset.loaded);
55
+ const error = useSelector((state) => state.users.reset.error);
76
56
 
77
- /**
78
- * Default properties.
79
- * @property {Object} defaultProps Default properties.
80
- * @static
81
- */
82
- static defaultProps = {
83
- error: null,
84
- };
57
+ return { loading, loaded, error };
58
+ };
85
59
 
86
- /**
87
- * Constructor
88
- * @method constructor
89
- * @param {Object} props Component properties
90
- * @constructs Controlpanel
91
- */
92
- constructor(props) {
93
- super(props);
94
- this.onCancel = this.onCancel.bind(this);
95
- this.onSubmit = this.onSubmit.bind(this);
96
- this.identifierField = config.settings.useEmailAsLogin
97
- ? 'email'
98
- : 'username';
60
+ const RequestPasswordReset = () => {
61
+ const intl = useIntl();
62
+ const dispatch = useDispatch();
63
+ const [error, setError] = useState(null);
64
+ const [isSuccessful, setisSuccessful] = useState(false);
65
+ const history = useHistory();
66
+ const identifierTitle = useRef();
67
+ const identifierRequiredMessage = useRef();
68
+ const { loaded, loading, error: props_error } = useUsers();
69
+ const prevloading = usePrevious(loading);
99
70
 
100
- if (this.identifierField === 'email') {
101
- this.identifierTitle = this.props.intl.formatMessage(messages.emailTitle);
102
- this.identifierRequiredMessage = this.props.intl.formatMessage(
103
- messages.emailRequired,
104
- );
105
- } else {
106
- this.identifierTitle = this.props.intl.formatMessage(
107
- messages.usernameTitle,
108
- );
109
- this.identifierRequiredMessage = this.props.intl.formatMessage(
110
- messages.usernameRequired,
111
- );
112
- }
71
+ const identifierField = config.settings.useEmailAsLogin
72
+ ? 'email'
73
+ : 'username';
113
74
 
114
- this.state = {
115
- error: null,
116
- isSuccessful: false,
117
- };
75
+ if (identifierField === 'email') {
76
+ identifierTitle.current = intl.formatMessage(messages.emailTitle);
77
+ identifierRequiredMessage.current = intl.formatMessage(
78
+ messages.emailRequired,
79
+ );
80
+ } else {
81
+ identifierTitle.current = intl.formatMessage(messages.usernameTitle);
82
+ identifierRequiredMessage.current = intl.formatMessage(
83
+ messages.usernameRequired,
84
+ );
118
85
  }
119
86
 
120
- /**
121
- * Component will receive props
122
- * @method componentWillReceiveProps
123
- * @param {Object} nextProps Next properties
124
- * @returns {undefined}
125
- */
126
- UNSAFE_componentWillReceiveProps(nextProps) {
127
- if (this.props.loading && nextProps.loaded) {
128
- this.setState({ isSuccessful: true });
129
- }
130
- }
87
+ useEffect(() => {
88
+ if (prevloading && loaded) setisSuccessful(true);
89
+ }, [prevloading, loaded]);
131
90
 
132
- /**
133
- * Submit handler
134
- * @method onSubmit
135
- * @param {object} data Form data.
136
- * @param {object} event Form data.
137
- * @returns {undefined}
138
- */
139
- onSubmit(data) {
140
- if (data[this.identifierField]) {
141
- this.props.resetPassword(data[this.identifierField]);
142
- this.setState({
143
- error: null,
144
- });
91
+ const onSubmit = (data) => {
92
+ if (data[identifierField]) {
93
+ dispatch(resetPassword(data[identifierField]));
94
+ setError(null);
145
95
  } else {
146
- this.setState({
147
- error: {
148
- message: this.identifierRequiredMessage,
149
- },
96
+ setError({
97
+ message: identifierRequiredMessage.current,
150
98
  });
151
99
  }
152
- }
153
-
154
- /**
155
- * Cancel handler
156
- * @method onCancel
157
- * @returns {undefined}
158
- */
159
- onCancel() {
160
- this.props.history.goBack();
161
- }
100
+ };
162
101
 
163
- /**
164
- * Render method.
165
- * @method render
166
- * @returns {string} Markup for the component.
167
- */
168
- render() {
169
- if (this.state.isSuccessful) {
170
- return (
171
- <Container>
172
- <h1 className="documentFirstHeading">
173
- <FormattedMessage
174
- id="heading_sent_password"
175
- defaultMessage="Password reset confirmation sent"
176
- />
177
- </h1>
178
- <p className="description">
179
- <FormattedMessage
180
- id="description_sent_password"
181
- defaultMessage="Your password reset request has been mailed. It should arrive in your mailbox shortly. When you receive the message, visit the address it contains to reset your password."
182
- />
183
- </p>
184
- </Container>
185
- );
186
- }
102
+ const onCancel = () => {
103
+ history.goBack();
104
+ };
187
105
 
106
+ if (isSuccessful) {
188
107
  return (
189
- <div id="page-password-reset">
190
- <Helmet title={this.props.intl.formatMessage(messages.passwordReset)} />
191
- <Container>
192
- <Form
193
- title={this.props.intl.formatMessage(messages.title)}
194
- description={this.props.intl.formatMessage(messages.description)}
195
- onSubmit={this.onSubmit}
196
- onCancel={this.onCancel}
197
- error={this.state.error || this.props.error}
198
- schema={{
199
- fieldsets: [
200
- {
201
- id: 'default',
202
- title: this.props.intl.formatMessage(messages.default),
203
- fields: [this.identifierField],
204
- },
205
- ],
206
- properties: {
207
- [this.identifierField]: {
208
- type: 'string',
209
- title: this.identifierTitle,
210
- },
211
- },
212
- submitLabel: this.props.intl.formatMessage(messages.sendEmail),
213
- required: [this.identifierField],
214
- }}
108
+ <Container>
109
+ <h1 className="documentFirstHeading">
110
+ <FormattedMessage
111
+ id="heading_sent_password"
112
+ defaultMessage="Password reset confirmation sent"
113
+ />
114
+ </h1>
115
+ <p className="description">
116
+ <FormattedMessage
117
+ id="description_sent_password"
118
+ defaultMessage="Your password reset request has been mailed. It should arrive in your mailbox shortly. When you receive the message, visit the address it contains to reset your password."
215
119
  />
216
- </Container>
217
- </div>
120
+ </p>
121
+ </Container>
218
122
  );
219
123
  }
220
- }
221
124
 
222
- export default compose(
223
- withRouter,
224
- injectIntl,
225
- connect(
226
- (state) => ({
227
- loading: state.users.reset.loading,
228
- loaded: state.users.reset.loaded,
229
- error: state.users.reset.error,
230
- }),
231
- { resetPassword },
232
- ),
233
- )(RequestPasswordReset);
125
+ return (
126
+ <div id="page-password-reset">
127
+ <Helmet title={intl.formatMessage(messages.passwordReset)} />
128
+ <Container>
129
+ <Form
130
+ title={intl.formatMessage(messages.title)}
131
+ description={intl.formatMessage(messages.description)}
132
+ onSubmit={onSubmit}
133
+ onCancel={onCancel}
134
+ error={error || props_error}
135
+ schema={{
136
+ fieldsets: [
137
+ {
138
+ id: 'default',
139
+ title: intl.formatMessage(messages.default),
140
+ fields: [identifierField],
141
+ },
142
+ ],
143
+ properties: {
144
+ [identifierField]: {
145
+ type: 'string',
146
+ title: identifierTitle.current,
147
+ },
148
+ },
149
+ submitLabel: intl.formatMessage(messages.sendEmail),
150
+ required: [identifierField],
151
+ }}
152
+ />
153
+ </Container>
154
+ </div>
155
+ );
156
+ };
157
+
158
+ export default RequestPasswordReset;
@@ -1,34 +1,50 @@
1
- import React from 'react';
2
1
  import PropTypes from 'prop-types';
3
2
 
4
- import { flattenToAppURL } from '@plone/volto/helpers';
5
3
  import config from '@plone/volto/registry';
6
4
 
7
5
  import DefaultImageSVG from '@plone/volto/components/manage/Blocks/Listing/default-image.svg';
8
6
 
9
7
  /**
10
8
  * Renders a preview image for a catalog brain result item.
11
- *
12
9
  */
13
- function PreviewImage(props) {
14
- const { item, size = 'preview', alt, ...rest } = props;
15
- const src = item.image_field
16
- ? flattenToAppURL(`${item['@id']}/@@images/${item.image_field}/${size}`)
17
- : config.getComponent({
18
- name: 'DefaultImage',
19
- dependencies: ['listing', 'summary'],
20
- }).component || DefaultImageSVG;
21
-
22
- return <img src={src} alt={alt ?? item.title} {...rest} />;
10
+ function PreviewImage({ item, alt, image_field, showDefault = true, ...rest }) {
11
+ const Image = config.getComponent({ name: 'Image' }).component;
12
+
13
+ const image = (
14
+ <Image item={item} image_field={image_field} alt={alt} {...rest} />
15
+ );
16
+
17
+ if (!image && !showDefault) return null;
18
+
19
+ if (image) {
20
+ return image;
21
+ } else {
22
+ return (
23
+ <img
24
+ src={
25
+ config.getComponent({
26
+ name: 'DefaultImage',
27
+ dependencies: ['listing', 'summary'],
28
+ }).component || DefaultImageSVG
29
+ }
30
+ alt={alt}
31
+ {...rest}
32
+ width="400"
33
+ height="300"
34
+ />
35
+ );
36
+ }
23
37
  }
24
38
 
25
39
  PreviewImage.propTypes = {
26
- size: PropTypes.string,
27
40
  item: PropTypes.shape({
28
41
  '@id': PropTypes.string.isRequired,
29
- image_field: PropTypes.string,
30
42
  title: PropTypes.string.isRequired,
43
+ image_field: PropTypes.string,
44
+ image_scales: PropTypes.object,
45
+ showDefault: PropTypes.bool,
31
46
  }),
47
+ alt: PropTypes.string.isRequired,
32
48
  };
33
49
 
34
50
  export default PreviewImage;
@@ -7,10 +7,28 @@ describe('PreviewImage', () => {
7
7
  it('renders a preview image', () => {
8
8
  const item = {
9
9
  image_field: 'image',
10
+ image_scales: {
11
+ image: [
12
+ {
13
+ download: '@@images/image',
14
+ width: 400,
15
+ height: 400,
16
+ scales: {
17
+ preview: {
18
+ download: '@@images/image-400.png',
19
+ width: 400,
20
+ height: 400,
21
+ },
22
+ },
23
+ },
24
+ ],
25
+ },
10
26
  title: 'Item title',
11
27
  '@id': 'http://localhost:3000/something',
12
28
  };
13
- const component = renderer.create(<PreviewImage item={item} />);
29
+ const component = renderer.create(
30
+ <PreviewImage item={item} alt={item.title} />,
31
+ );
14
32
  const json = component.toJSON();
15
33
  expect(json).toMatchSnapshot();
16
34
  });
@@ -18,70 +36,92 @@ describe('PreviewImage', () => {
18
36
  it('renders a preview image with extra props', () => {
19
37
  const item = {
20
38
  image_field: 'image',
39
+ image_scales: {
40
+ image: [
41
+ {
42
+ download: '@@images/image',
43
+ width: 400,
44
+ height: 400,
45
+ scales: {
46
+ preview: {
47
+ download: '@@images/image-400.png',
48
+ width: 400,
49
+ height: 400,
50
+ },
51
+ },
52
+ },
53
+ ],
54
+ },
21
55
  title: 'Item title',
22
56
  '@id': 'http://localhost:3000/something',
23
57
  };
24
58
  const component = renderer.create(
25
- <PreviewImage item={item} className="extra" />,
59
+ <PreviewImage item={item} alt={item.title} className="extra" />,
26
60
  );
27
61
  const json = component.toJSON();
28
62
  expect(json).toMatchSnapshot();
29
63
  });
30
64
 
31
- it('renders a preview image with custom size', () => {
65
+ it('renders a fallback image', () => {
32
66
  const item = {
33
- image_field: 'image',
34
67
  title: 'Item title',
35
68
  '@id': 'http://localhost:3000/something',
36
69
  };
37
70
  const component = renderer.create(
38
- <PreviewImage item={item} size="large" />,
71
+ <PreviewImage item={item} alt={item.title} />,
39
72
  );
40
73
  const json = component.toJSON();
41
74
  expect(json).toMatchSnapshot();
42
75
  });
43
76
 
44
- it('renders a fallback image', () => {
77
+ it('renders a fallback image with extra props', () => {
45
78
  const item = {
46
79
  title: 'Item title',
47
80
  '@id': 'http://localhost:3000/something',
48
81
  };
49
- const component = renderer.create(<PreviewImage item={item} />);
82
+ const component = renderer.create(
83
+ <PreviewImage item={item} alt={item.title} className="extra" />,
84
+ );
50
85
  const json = component.toJSON();
51
86
  expect(json).toMatchSnapshot();
52
87
  });
53
88
 
54
- it('renders a fallback image with extra props', () => {
89
+ it('renders a fallback image with alt prop empty', () => {
55
90
  const item = {
56
91
  title: 'Item title',
57
92
  '@id': 'http://localhost:3000/something',
58
93
  };
59
94
  const component = renderer.create(
60
- <PreviewImage item={item} className="extra" />,
95
+ <PreviewImage item={item} className="extra" alt="" />,
61
96
  );
62
97
  const json = component.toJSON();
63
98
  expect(json).toMatchSnapshot();
64
99
  });
65
100
 
66
- it('renders a fallback image with alt prop empty', () => {
101
+ it('renders a fallback image with alt prop', () => {
67
102
  const item = {
68
103
  title: 'Item title',
69
104
  '@id': 'http://localhost:3000/something',
70
105
  };
71
106
  const component = renderer.create(
72
- <PreviewImage item={item} className="extra" alt="" />,
107
+ <PreviewImage item={item} className="extra" alt="Alt prop" />,
73
108
  );
74
109
  const json = component.toJSON();
75
110
  expect(json).toMatchSnapshot();
76
111
  });
77
112
 
78
- it('renders a fallback image with alt prop', () => {
113
+ it('not renders a fallback image if showDefault prop is false', () => {
79
114
  const item = {
80
115
  title: 'Item title',
81
116
  '@id': 'http://localhost:3000/something',
82
117
  };
83
118
  const component = renderer.create(
84
- <PreviewImage item={item} className="extra" alt="Alt prop" />,
119
+ <PreviewImage
120
+ item={item}
121
+ className="extra"
122
+ showDefault={false}
123
+ alt={item.title}
124
+ />,
85
125
  );
86
126
  const json = component.toJSON();
87
127
  expect(json).toMatchSnapshot();
@@ -37,8 +37,7 @@ const messages = defineMessages({
37
37
  defaultMessage: 'E-mail',
38
38
  },
39
39
  emailDescription: {
40
- id:
41
- 'Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere.',
40
+ id: 'Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere.',
42
41
  defaultMessage:
43
42
  'Enter an email address. This will be your login name. We respect your privacy, and will not give the address away to any third parties or expose it anywhere.',
44
43
  },
@@ -47,8 +46,7 @@ const messages = defineMessages({
47
46
  defaultMessage: 'Account Registration Completed',
48
47
  },
49
48
  successRegisterCompletedBody: {
50
- id:
51
- 'The registration process has been successful. Please check your e-mail inbox for information on how activate your account.',
49
+ id: 'The registration process has been successful. Please check your e-mail inbox for information on how activate your account.',
52
50
  defaultMessage:
53
51
  'The registration process has been successful. Please check your e-mail inbox for information on how activate your account.',
54
52
  },
@@ -1,71 +1,41 @@
1
- /**
2
- * Search tags components.
3
- * @module components/theme/Search/SearchTags
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
1
+ import { useEffect } from 'react';
2
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
9
3
  import { Link } from 'react-router-dom';
10
4
 
11
5
  import { getVocabulary } from '@plone/volto/actions';
12
6
 
13
7
  const vocabulary = 'plone.app.vocabularies.Keywords';
14
8
 
15
- /**
16
- * Search tags container class.
17
- * @class SearchTags
18
- * @extends Component
19
- */
20
- class SearchTags extends Component {
21
- /**
22
- * Property types.
23
- * @property {Object} propTypes Property types.
24
- * @static
25
- */
26
- static propTypes = {
27
- getVocabulary: PropTypes.func.isRequired,
28
- items: PropTypes.arrayOf(
29
- PropTypes.shape({
30
- label: PropTypes.string,
31
- }),
32
- ).isRequired,
33
- };
34
-
35
- componentDidMount() {
36
- this.props.getVocabulary({ vocabNameOrURL: vocabulary });
37
- }
9
+ const SearchTags = () => {
10
+ const dispatch = useDispatch();
38
11
 
39
- /**
40
- * Render method.
41
- * @method render
42
- * @returns {string} Markup for the component.
43
- */
44
- render() {
45
- return this.props.items && this.props.items.length > 0 ? (
46
- <div>
47
- {this.props.items.map((item) => (
48
- <Link
49
- className="ui label"
50
- to={`/search?Subject=${item.label}`}
51
- key={item.label}
52
- >
53
- {item.label}
54
- </Link>
55
- ))}
56
- </div>
57
- ) : (
58
- <span />
59
- );
60
- }
61
- }
12
+ useEffect(() => {
13
+ dispatch(getVocabulary({ vocabNameOrURL: vocabulary }));
14
+ }, [dispatch]);
62
15
 
63
- export default connect(
64
- (state) => ({
65
- items:
16
+ const items = useSelector(
17
+ (state) =>
66
18
  state.vocabularies[vocabulary] && state.vocabularies[vocabulary].items
67
19
  ? state.vocabularies[vocabulary].items
68
20
  : [],
69
- }),
70
- { getVocabulary },
71
- )(SearchTags);
21
+ shallowEqual,
22
+ );
23
+
24
+ return items && items.length > 0 ? (
25
+ <div>
26
+ {items.map((item) => (
27
+ <Link
28
+ className="ui label"
29
+ to={`/search?Subject=${item.label}`}
30
+ key={item.label}
31
+ >
32
+ {item.label}
33
+ </Link>
34
+ ))}
35
+ </div>
36
+ ) : (
37
+ <span />
38
+ );
39
+ };
40
+
41
+ export default SearchTags;