@plone/volto 17.0.0-alpha.9 → 17.0.1

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 (365) hide show
  1. package/.eslintrc +26 -3
  2. package/CHANGELOG.md +774 -5
  3. package/CONTRIBUTING.md +5 -1
  4. package/README.md +12 -9
  5. package/RELEASING.md +5 -5
  6. package/addon-registry.js +10 -1
  7. package/create-addons-loader.js +1 -1
  8. package/cypress/support/commands.js +70 -14
  9. package/cypress/support/e2e.js +1 -2
  10. package/cypress/support/volto-slate.js +4 -5
  11. package/cypress.config.js +1 -0
  12. package/docker-compose.yml +1 -1
  13. package/locales/ca/LC_MESSAGES/volto.po +281 -53
  14. package/locales/ca.json +1 -1
  15. package/locales/de/LC_MESSAGES/volto.po +289 -61
  16. package/locales/de.json +1 -1
  17. package/locales/en/LC_MESSAGES/volto.po +279 -51
  18. package/locales/en.json +1 -1
  19. package/locales/es/LC_MESSAGES/volto.po +318 -90
  20. package/locales/es.json +1 -1
  21. package/locales/eu/LC_MESSAGES/volto.po +280 -52
  22. package/locales/eu.json +1 -1
  23. package/locales/fi/LC_MESSAGES/volto.po +280 -52
  24. package/locales/fi.json +1 -1
  25. package/locales/fr/LC_MESSAGES/volto.po +281 -53
  26. package/locales/fr.json +1 -1
  27. package/locales/it/LC_MESSAGES/volto.po +474 -246
  28. package/locales/it.json +1 -1
  29. package/locales/ja/LC_MESSAGES/volto.po +280 -52
  30. package/locales/ja.json +1 -1
  31. package/locales/nl/LC_MESSAGES/volto.po +281 -53
  32. package/locales/nl.json +1 -1
  33. package/locales/pt/LC_MESSAGES/volto.po +281 -53
  34. package/locales/pt.json +1 -1
  35. package/locales/pt_BR/LC_MESSAGES/volto.po +314 -86
  36. package/locales/pt_BR.json +1 -1
  37. package/locales/ro/LC_MESSAGES/volto.po +281 -53
  38. package/locales/ro.json +1 -1
  39. package/locales/volto.pot +284 -52
  40. package/locales/zh_CN/LC_MESSAGES/volto.po +281 -53
  41. package/locales/zh_CN.json +1 -1
  42. package/package.json +44 -34
  43. package/packages/volto-slate/package.json +1 -1
  44. package/packages/volto-slate/src/actions/index.js +1 -1
  45. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  46. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  47. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  48. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  49. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  50. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  51. package/packages/volto-slate/src/editor/config.jsx +5 -4
  52. package/packages/volto-slate/src/editor/index.js +4 -4
  53. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  54. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  55. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  56. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  57. package/packages/volto-slate/src/editor/render.jsx +77 -8
  58. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  59. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  60. package/packages/volto-slate/src/index.js +2 -2
  61. package/packages/volto-slate/src/utils/blocks.js +7 -0
  62. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  63. package/razzle.config.js +4 -6
  64. package/src/actions/index.js +4 -0
  65. package/src/actions/navroot/navroot.js +16 -0
  66. package/src/actions/navroot/navroot.test.js +15 -0
  67. package/src/actions/relations/rebuild.js +7 -7
  68. package/src/actions/relations/relations.js +17 -0
  69. package/src/actions/site/site.js +16 -0
  70. package/src/actions/site/site.test.js +15 -0
  71. package/src/actions/userSession/userSession.js +17 -1
  72. package/src/components/index.js +194 -192
  73. package/src/components/manage/Actions/Actions.jsx +133 -243
  74. package/src/components/manage/Add/Add.jsx +7 -8
  75. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  76. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  77. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  78. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  79. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  80. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  81. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  82. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  83. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  84. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  85. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  86. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  87. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  88. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  89. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  90. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  91. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  92. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  93. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  94. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  95. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  96. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  97. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  98. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  99. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  100. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  101. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  102. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  103. package/src/components/manage/Blocks/Image/schema.js +17 -10
  104. package/src/components/manage/Blocks/Image/utils.js +14 -0
  105. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  106. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  107. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  108. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  109. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  110. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  111. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  112. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  113. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  114. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  115. package/src/components/manage/Blocks/Listing/getAsyncData.js +3 -5
  116. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +27 -17
  117. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  118. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  119. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  120. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +3 -2
  121. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  122. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  123. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  124. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  125. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  126. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  127. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  128. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +70 -36
  129. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  130. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  131. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  132. package/src/components/manage/Blocks/Search/schema.js +29 -14
  133. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  134. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  135. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  136. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  137. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  138. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  139. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  140. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  141. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  142. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  143. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  144. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  145. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  146. package/src/components/manage/Blocks/Video/View.test.jsx +1 -1
  147. package/src/components/manage/Contents/Contents.jsx +285 -114
  148. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  149. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  150. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  151. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  152. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  153. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  154. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  155. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  156. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  157. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  158. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +38 -13
  159. package/src/components/manage/Controlpanels/Relations/Relations.jsx +5 -5
  160. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +8 -7
  161. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +68 -68
  162. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  163. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  164. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  165. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  166. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  167. package/src/components/manage/Delete/Delete.jsx +96 -171
  168. package/src/components/manage/Diff/DiffField.jsx +25 -1
  169. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  170. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  171. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  172. package/src/components/manage/Form/Form.jsx +7 -6
  173. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  174. package/src/components/manage/History/History.jsx +11 -1
  175. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  176. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  177. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  178. package/src/components/manage/Messages/Messages.jsx +32 -99
  179. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  180. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  181. package/src/components/manage/Sharing/Sharing.jsx +80 -22
  182. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  183. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  184. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  185. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  186. package/src/components/manage/TemplateChooser/template.svg +10 -0
  187. package/src/components/manage/Toast/Toast.jsx +1 -1
  188. package/src/components/manage/Toolbar/More.jsx +17 -2
  189. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  190. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  191. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  192. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  193. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  194. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  195. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  196. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  197. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  198. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  199. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  200. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  201. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  202. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  203. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +3 -10
  204. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  205. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  206. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  207. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  208. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  209. package/src/components/manage/Widgets/SelectWidget.jsx +15 -1
  210. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  211. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  212. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  213. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  214. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  215. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  216. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  217. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  218. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  219. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  220. package/src/components/theme/Comments/Comments.jsx +268 -380
  221. package/src/components/theme/Component/Component.jsx +1 -1
  222. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  223. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  224. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  225. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  226. package/src/components/theme/Error/ServerError.jsx +29 -0
  227. package/src/components/theme/Header/Header.jsx +37 -63
  228. package/src/components/theme/Header/Header.test.jsx +18 -0
  229. package/src/components/theme/Image/Image.jsx +96 -0
  230. package/src/components/theme/Image/Image.test.jsx +125 -0
  231. package/src/components/theme/Login/Login.jsx +160 -243
  232. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  233. package/src/components/theme/Logo/Logo.jsx +35 -27
  234. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  235. package/src/components/theme/Logout/Logout.jsx +36 -83
  236. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  237. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -5
  238. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +95 -170
  239. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  240. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  241. package/src/components/theme/Register/Register.jsx +2 -4
  242. package/src/components/theme/Search/SearchTags.jsx +30 -60
  243. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  244. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  245. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  246. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  247. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  248. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  249. package/src/components/theme/View/AlbumView.jsx +21 -16
  250. package/src/components/theme/View/EventView.jsx +36 -25
  251. package/src/components/theme/View/FileView.jsx +23 -18
  252. package/src/components/theme/View/ImageView.jsx +40 -32
  253. package/src/components/theme/View/ImageView.test.jsx +4 -0
  254. package/src/components/theme/View/LinkView.jsx +53 -78
  255. package/src/components/theme/View/ListingView.jsx +36 -28
  256. package/src/components/theme/View/NewsItemView.jsx +16 -17
  257. package/src/components/theme/View/RenderBlocks.jsx +56 -27
  258. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  259. package/src/components/theme/View/SummaryView.jsx +49 -39
  260. package/src/components/theme/View/TabularView.jsx +59 -53
  261. package/src/components/theme/View/View.jsx +2 -0
  262. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  263. package/src/config/Blocks.jsx +46 -0
  264. package/src/config/Components.jsx +3 -1
  265. package/src/config/ControlPanels.js +0 -1
  266. package/src/config/Loadables.jsx +1 -1
  267. package/src/config/NonContentRoutes.jsx +1 -0
  268. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  269. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  270. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  271. package/src/config/RichTextEditor/Styles.jsx +1 -1
  272. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  273. package/src/config/RichTextEditor/index.js +2 -3
  274. package/src/config/Views.jsx +6 -4
  275. package/src/config/Widgets.jsx +3 -0
  276. package/src/config/index.js +36 -2
  277. package/src/config/server.js +2 -0
  278. package/src/constants/ActionTypes.js +4 -0
  279. package/src/constants/Indexes.js +3 -1
  280. package/src/express-middleware/devproxy.js +1 -1
  281. package/src/express-middleware/files.js +11 -9
  282. package/src/express-middleware/images.js +12 -5
  283. package/src/express-middleware/ok.js +16 -0
  284. package/src/express-middleware/robotstxt.js +1 -1
  285. package/src/express-middleware/sitemap.js +1 -1
  286. package/src/express-middleware/static.js +3 -3
  287. package/src/helpers/Blocks/Blocks.js +52 -6
  288. package/src/helpers/Blocks/Blocks.test.js +92 -13
  289. package/src/helpers/Extensions/index.js +2 -1
  290. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  291. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  292. package/src/helpers/FormValidation/FormValidation.js +37 -7
  293. package/src/helpers/FormValidation/FormValidation.test.js +32 -0
  294. package/src/helpers/Html/Html.jsx +2 -8
  295. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  296. package/src/helpers/MessageLabels/MessageLabels.js +39 -4
  297. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  298. package/src/helpers/Site/index.js +21 -0
  299. package/src/helpers/Url/Url.js +22 -1
  300. package/src/helpers/Url/Url.test.js +41 -0
  301. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  302. package/src/helpers/Utils/Utils.js +35 -0
  303. package/src/helpers/Utils/Utils.test.js +13 -0
  304. package/src/helpers/Utils/usePagination.js +67 -14
  305. package/src/helpers/Utils/usePagination.test.js +115 -0
  306. package/src/helpers/index.js +15 -8
  307. package/src/hooks/client/useClient.js +11 -0
  308. package/src/hooks/clipboard/useClipboard.js +26 -0
  309. package/src/hooks/index.js +2 -0
  310. package/src/icons/grid-block.svg +11 -0
  311. package/src/middleware/api.js +203 -173
  312. package/src/middleware/blacklistRoutes.js +25 -22
  313. package/src/middleware/index.js +2 -2
  314. package/src/middleware/storeProtectLoadUtils.js +61 -62
  315. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  316. package/src/reducers/actions/actions.js +7 -5
  317. package/src/reducers/actions/actions.test.js +70 -0
  318. package/src/reducers/content/content.test.js +4 -4
  319. package/src/reducers/index.js +4 -0
  320. package/src/reducers/navigation/navigation.js +5 -5
  321. package/src/reducers/navigation/navigation.test.js +30 -0
  322. package/src/reducers/navroot/navroot.js +79 -0
  323. package/src/reducers/navroot/navroot.test.js +110 -0
  324. package/src/reducers/relations/relations.js +74 -46
  325. package/src/reducers/site/site.js +51 -0
  326. package/src/reducers/site/site.test.js +67 -0
  327. package/src/reducers/userSession/userSession.js +15 -1
  328. package/src/registry.js +2 -2
  329. package/src/routes.js +9 -0
  330. package/src/server.jsx +9 -0
  331. package/src/start-server.js +6 -2
  332. package/src/storybook.jsx +24 -38
  333. package/test-setup-config.js +11 -1
  334. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  335. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  336. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  337. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  338. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  339. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  340. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  341. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  342. package/theme/themes/pastanaga/extras/contents.less +6 -1
  343. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  344. package/theme/themes/pastanaga/extras/grid.less +427 -0
  345. package/theme/themes/pastanaga/extras/login.less +3 -0
  346. package/theme/themes/pastanaga/extras/main.less +14 -7
  347. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  348. package/theme/themes/pastanaga/extras/search.less +7 -1
  349. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  350. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  351. package/theme/themes/pastanaga/extras/toc.less +29 -0
  352. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  353. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  354. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  355. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  356. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  357. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  358. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  359. package/tsconfig.json +33 -0
  360. package/webpack-plugins/webpack-less-plugin.js +19 -0
  361. package/.yarn/install-state.gz +0 -0
  362. package/.yarn/releases/yarn-3.2.3.cjs +0 -783
  363. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  364. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  365. package/src/components/theme/Header/Header.md +0 -27
@@ -50,8 +50,8 @@ const messages = defineMessages({
50
50
  defaultMessage: 'New password',
51
51
  },
52
52
  passwordDescription: {
53
- id: 'Enter your new password. Minimum 5 characters.',
54
- defaultMessage: 'Enter your new password. Minimum 5 characters.',
53
+ id: 'Enter your new password. Minimum 8 characters.',
54
+ defaultMessage: 'Enter your new password. Minimum 8 characters.',
55
55
  },
56
56
  passwordRepeatTitle: {
57
57
  id: 'Confirm password',
@@ -79,8 +79,7 @@ const messages = defineMessages({
79
79
  defaultMessage: 'Account activation completed',
80
80
  },
81
81
  successRedirectToLoginBody: {
82
- id:
83
- 'Your password has been set successfully. You may now {link} with your new password.',
82
+ id: 'Your password has been set successfully. You may now {link} with your new password.',
84
83
  defaultMessage:
85
84
  'Your password has been set successfully. You may now {link} with your new password.',
86
85
  },
@@ -227,6 +226,9 @@ class PasswordReset extends Component {
227
226
  );
228
227
  }
229
228
  if (this.props.token) {
229
+ const errmsg = this.props.error
230
+ ? this.props.error.response.body.error
231
+ : null;
230
232
  return (
231
233
  <div id="page-password-reset">
232
234
  <Helmet
@@ -238,7 +240,7 @@ class PasswordReset extends Component {
238
240
  description={this.props.intl.formatMessage(messages.description)}
239
241
  onSubmit={this.onSubmit}
240
242
  onCancel={this.onCancel}
241
- error={this.state.error || this.props.error}
243
+ error={this.state.error || errmsg}
242
244
  schema={{
243
245
  fieldsets: [
244
246
  {
@@ -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';
@@ -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;