@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
@@ -1,14 +1,6 @@
1
- /**
2
- * Login container.
3
- * @module components/theme/Login/Login
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import PropTypes from 'prop-types';
8
- import { Helmet } from '@plone/volto/helpers';
9
- import { connect } from 'react-redux';
10
- import { compose } from 'redux';
11
- import { Link } from 'react-router-dom';
1
+ import { useEffect } from 'react';
2
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
3
+ import { Link, useHistory, useLocation } from 'react-router-dom';
12
4
  import {
13
5
  Container,
14
6
  Button,
@@ -17,20 +9,18 @@ import {
17
9
  Segment,
18
10
  Grid,
19
11
  } from 'semantic-ui-react';
20
- import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
12
+ import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
21
13
  import qs from 'query-string';
22
- import { withRouter } from 'react-router-dom';
23
14
 
15
+ import { Helmet } from '@plone/volto/helpers';
16
+ import config from '@plone/volto/registry';
24
17
  import { Icon } from '@plone/volto/components';
25
- import { login } from '@plone/volto/actions';
18
+ import { login, resetLoginRequest } from '@plone/volto/actions';
26
19
  import { toast } from 'react-toastify';
27
20
  import { Toast } from '@plone/volto/components';
28
-
29
21
  import aheadSVG from '@plone/volto/icons/ahead.svg';
30
22
  import clearSVG from '@plone/volto/icons/clear.svg';
31
23
 
32
- import config from '@plone/volto/registry';
33
-
34
24
  const messages = defineMessages({
35
25
  login: {
36
26
  id: 'Log in',
@@ -61,8 +51,7 @@ const messages = defineMessages({
61
51
  defaultMessage: 'Login Failed',
62
52
  },
63
53
  loginFailedContent: {
64
- id:
65
- 'Both email address and password are case sensitive, check that caps lock is not enabled.',
54
+ id: 'Both email address and password are case sensitive, check that caps lock is not enabled.',
66
55
  defaultMessage:
67
56
  'Both email address and password are case sensitive, check that caps lock is not enabled.',
68
57
  },
@@ -76,59 +65,21 @@ const messages = defineMessages({
76
65
  },
77
66
  });
78
67
 
79
- /**
80
- * Login class.
81
- * @class Login
82
- * @extends Component
83
- */
84
- class Login extends Component {
85
- /**
86
- * Property types.
87
- * @property {Object} propTypes Property types.
88
- * @static
89
- */
90
- static propTypes = {
91
- login: PropTypes.func.isRequired,
92
- error: PropTypes.shape({
93
- message: PropTypes.string,
94
- }),
95
- loading: PropTypes.bool,
96
- token: PropTypes.string, // eslint-disable-line react/no-unused-prop-types
97
- returnUrl: PropTypes.string,
98
- };
99
-
100
- /**
101
- * Default properties.
102
- * @property {Object} defaultProps Default properties.
103
- * @static
104
- */
105
- static defaultProps = {
106
- error: null,
107
- loading: null,
108
- token: null,
109
- returnUrl: null,
110
- };
111
-
112
- /**
113
- * Constructor
114
- * @method constructor
115
- * @param {Object} props Component properties
116
- * @constructs WysiwygEditor
117
- */
118
- constructor(props) {
119
- super(props);
120
- this.onLogin = this.onLogin.bind(this);
121
- }
122
-
123
- /**
124
- * Component will receive props
125
- * @method componentWillReceiveProps
126
- * @param {Object} nextProps Next properties
127
- * @returns {undefined}
128
- */
129
- UNSAFE_componentWillReceiveProps(nextProps) {
130
- if (nextProps.token) {
131
- this.props.history.push(this.props.returnUrl || '/');
68
+ const Login = (props) => {
69
+ const intl = useIntl();
70
+ const history = useHistory();
71
+ const location = useLocation();
72
+ const dispatch = useDispatch();
73
+ const token = useSelector((state) => state.userSession.token, shallowEqual);
74
+ const error = useSelector((state) => state.userSession.login.error);
75
+ const loading = useSelector((state) => state.userSession.login.loading);
76
+ const returnUrl =
77
+ qs.parse(props.location.search ?? location.search).return_url ||
78
+ location.pathname.replace(/\/login\/?$/, '').replace(/\/logout\/?$/, '') ||
79
+ '/';
80
+ useEffect(() => {
81
+ if (token && !props.isLogout) {
82
+ history.push(returnUrl || '/');
132
83
  if (toast.isActive('loggedOut')) {
133
84
  toast.dismiss('loggedOut');
134
85
  }
@@ -136,7 +87,7 @@ class Login extends Component {
136
87
  toast.dismiss('loginFailed');
137
88
  }
138
89
  }
139
- if (nextProps.error) {
90
+ if (error) {
140
91
  if (toast.isActive('loggedOut')) {
141
92
  toast.dismiss('loggedOut');
142
93
  }
@@ -144,189 +95,155 @@ class Login extends Component {
144
95
  toast.error(
145
96
  <Toast
146
97
  error
147
- title={this.props.intl.formatMessage(messages.loginFailed)}
148
- content={this.props.intl.formatMessage(messages.loginFailedContent)}
98
+ title={intl.formatMessage(messages.loginFailed)}
99
+ content={intl.formatMessage(messages.loginFailedContent)}
149
100
  />,
150
101
  { autoClose: false, toastId: 'loginFailed' },
151
102
  );
152
103
  }
153
104
  }
154
- }
155
-
156
- componentWillUnmount() {
157
- if (toast.isActive('loginFailed')) {
158
- toast.dismiss('loginFailed');
159
- }
160
- }
105
+ return () => {
106
+ if (toast.isActive('loginFailed')) {
107
+ toast.dismiss('loginFailed');
108
+ dispatch(resetLoginRequest());
109
+ }
110
+ };
111
+ }, [dispatch, token, error, intl, history, returnUrl, props.isLogout]);
161
112
 
162
- /**
163
- * On login handler
164
- * @method onLogin
165
- * @param {Object} event Event object.
166
- * @returns {undefined}
167
- */
168
- onLogin(event) {
169
- this.props.login(
170
- document.getElementsByName('login')[0].value,
171
- document.getElementsByName('password')[0].value,
113
+ const onLogin = (event) => {
114
+ dispatch(
115
+ login(
116
+ document.getElementsByName('login')[0].value,
117
+ document.getElementsByName('password')[0].value,
118
+ ),
172
119
  );
173
120
  event.preventDefault();
174
- }
121
+ };
175
122
 
176
- /**
177
- * Render method.
178
- * @method render
179
- * @returns {string} Markup for the component.
180
- */
181
- render() {
182
- return (
183
- <div id="page-login">
184
- <Helmet title={this.props.intl.formatMessage(messages.Login)} />
185
- <Container text>
186
- <Form method="post" onSubmit={this.onLogin}>
187
- <Segment.Group raised>
188
- <Segment className="primary">
189
- <FormattedMessage id="Log In" defaultMessage="Login" />
190
- </Segment>
191
- <Segment secondary>
192
- <FormattedMessage
193
- id="Sign in to start session"
194
- defaultMessage="Sign in to start session"
195
- />
196
- </Segment>
197
- <Segment className="form">
198
- <Form.Field inline className="help">
199
- <Grid>
200
- <Grid.Row stretched>
201
- <Grid.Column width="4">
202
- <div className="wrapper">
203
- <label htmlFor="login">
204
- <FormattedMessage
205
- id="Login Name"
206
- defaultMessage="Login Name"
207
- />
208
- </label>
209
- </div>
210
- </Grid.Column>
211
- <Grid.Column width="8">
212
- {/* eslint-disable jsx-a11y/no-autofocus */}
213
- <Input
214
- id="login"
215
- name="login"
216
- placeholder={this.props.intl.formatMessage(
217
- messages.loginName,
218
- )}
219
- autoFocus
220
- />
221
- </Grid.Column>
222
- </Grid.Row>
223
- </Grid>
224
- </Form.Field>
225
- <Form.Field inline className="help">
226
- <Grid>
227
- <Grid.Row stretched>
228
- <Grid.Column stretched width="4">
229
- <div className="wrapper">
230
- <label htmlFor="password">
231
- <FormattedMessage
232
- id="Password"
233
- defaultMessage="Password"
234
- />
235
- </label>
236
- </div>
237
- </Grid.Column>
238
- <Grid.Column stretched width="8">
239
- <Input
240
- type="password"
241
- id="password"
242
- autocomplete="current-password"
243
- name="password"
244
- placeholder={this.props.intl.formatMessage(
245
- messages.password,
246
- )}
247
- tabIndex={0}
248
- />
249
- </Grid.Column>
250
- </Grid.Row>
251
- </Grid>
252
- </Form.Field>
253
- <Form.Field inline className="help">
254
- <Grid>
255
- <Grid.Row stretched>
256
- {config.settings.showSelfRegistration && (
257
- <Grid.Column stretched width="12">
258
- <p className="help">
259
- <Link to="/register">
260
- {this.props.intl.formatMessage(messages.register)}
261
- </Link>
262
- </p>
263
- </Grid.Column>
264
- )}
123
+ return (
124
+ <div id="page-login">
125
+ <Helmet title={intl.formatMessage(messages.Login)} />
126
+ <Container text>
127
+ <Form method="post" onSubmit={onLogin}>
128
+ <Segment.Group raised>
129
+ <Segment className="primary">
130
+ <FormattedMessage id="Log In" defaultMessage="Login" />
131
+ </Segment>
132
+ <Segment secondary>
133
+ <FormattedMessage
134
+ id="Sign in to start session"
135
+ defaultMessage="Sign in to start session"
136
+ />
137
+ </Segment>
138
+ <Segment className="form">
139
+ <Form.Field inline className="help">
140
+ <Grid>
141
+ <Grid.Row stretched>
142
+ <Grid.Column width="4">
143
+ <div className="wrapper">
144
+ <label htmlFor="login">
145
+ <FormattedMessage
146
+ id="Login Name"
147
+ defaultMessage="Login Name"
148
+ />
149
+ </label>
150
+ </div>
151
+ </Grid.Column>
152
+ <Grid.Column width="8">
153
+ {/* eslint-disable jsx-a11y/no-autofocus */}
154
+ <Input
155
+ id="login"
156
+ name="login"
157
+ placeholder={intl.formatMessage(messages.loginName)}
158
+ autoFocus
159
+ />
160
+ </Grid.Column>
161
+ </Grid.Row>
162
+ </Grid>
163
+ </Form.Field>
164
+ <Form.Field inline className="help">
165
+ <Grid>
166
+ <Grid.Row stretched>
167
+ <Grid.Column stretched width="4">
168
+ <div className="wrapper">
169
+ <label htmlFor="password">
170
+ <FormattedMessage
171
+ id="Password"
172
+ defaultMessage="Password"
173
+ />
174
+ </label>
175
+ </div>
176
+ </Grid.Column>
177
+ <Grid.Column stretched width="8">
178
+ <Input
179
+ type="password"
180
+ id="password"
181
+ autoComplete="current-password"
182
+ name="password"
183
+ placeholder={intl.formatMessage(messages.password)}
184
+ tabIndex={0}
185
+ />
186
+ </Grid.Column>
187
+ </Grid.Row>
188
+ </Grid>
189
+ </Form.Field>
190
+ <Form.Field inline className="help">
191
+ <Grid>
192
+ <Grid.Row stretched>
193
+ {config.settings.showSelfRegistration && (
265
194
  <Grid.Column stretched width="12">
266
195
  <p className="help">
267
- <Link to="/passwordreset">
268
- {this.props.intl.formatMessage(
269
- messages.forgotPassword,
270
- )}
196
+ <Link to="/register">
197
+ {intl.formatMessage(messages.register)}
271
198
  </Link>
272
199
  </p>
273
200
  </Grid.Column>
274
- </Grid.Row>
275
- </Grid>
276
- </Form.Field>
277
- </Segment>
278
- <Segment className="actions" clearing>
279
- <Button
280
- basic
281
- primary
282
- icon
283
- floated="right"
284
- type="submit"
285
- id="login-form-submit"
286
- aria-label={this.props.intl.formatMessage(messages.login)}
287
- title={this.props.intl.formatMessage(messages.login)}
288
- loading={this.props.loading}
289
- >
290
- <Icon className="circled" name={aheadSVG} size="30px" />
291
- </Button>
201
+ )}
202
+ <Grid.Column stretched width="12">
203
+ <p className="help">
204
+ <Link to="/passwordreset">
205
+ {intl.formatMessage(messages.forgotPassword)}
206
+ </Link>
207
+ </p>
208
+ </Grid.Column>
209
+ </Grid.Row>
210
+ </Grid>
211
+ </Form.Field>
212
+ </Segment>
213
+ <Segment className="actions" clearing>
214
+ <Button
215
+ basic
216
+ primary
217
+ icon
218
+ floated="right"
219
+ type="submit"
220
+ id="login-form-submit"
221
+ aria-label={intl.formatMessage(messages.login)}
222
+ title={intl.formatMessage(messages.login)}
223
+ loading={loading}
224
+ >
225
+ <Icon className="circled" name={aheadSVG} size="30px" />
226
+ </Button>
292
227
 
293
- <Button
294
- basic
295
- secondary
296
- icon
297
- floated="right"
298
- id="login-form-cancel"
299
- as={Link}
300
- to="/"
301
- aria-label={this.props.intl.formatMessage(messages.cancel)}
302
- title={this.props.intl.formatMessage(messages.cancel)}
303
- >
304
- <Icon className="circled" name={clearSVG} size="30px" />
305
- </Button>
306
- </Segment>
307
- </Segment.Group>
308
- </Form>
309
- </Container>
310
- </div>
311
- );
312
- }
313
- }
228
+ <Button
229
+ basic
230
+ secondary
231
+ icon
232
+ floated="right"
233
+ id="login-form-cancel"
234
+ as={Link}
235
+ to="/"
236
+ aria-label={intl.formatMessage(messages.cancel)}
237
+ title={intl.formatMessage(messages.cancel)}
238
+ >
239
+ <Icon className="circled" name={clearSVG} size="30px" />
240
+ </Button>
241
+ </Segment>
242
+ </Segment.Group>
243
+ </Form>
244
+ </Container>
245
+ </div>
246
+ );
247
+ };
314
248
 
315
- export default compose(
316
- withRouter,
317
- injectIntl,
318
- connect(
319
- (state, props) => ({
320
- error: state.userSession.login.error,
321
- loading: state.userSession.login.loading,
322
- token: state.userSession.token,
323
- returnUrl:
324
- qs.parse(props.location.search).return_url ||
325
- props.location.pathname
326
- .replace(/\/login\/?$/, '')
327
- .replace(/\/logout\/?$/, '') ||
328
- '/',
329
- }),
330
- { login },
331
- ),
332
- )(Login);
249
+ export default Login;
@@ -14,12 +14,142 @@ beforeAll(() => {
14
14
  const mockStore = configureStore();
15
15
 
16
16
  describe('Multilingual Logo', () => {
17
- it('renders a logo component with multilingual', () => {
17
+ it('renders a logo component in a multilingual site root', () => {
18
18
  const store = mockStore({
19
19
  intl: {
20
20
  locale: 'en',
21
21
  messages: {},
22
22
  },
23
+ navroot: {
24
+ data: {
25
+ id: 'http://localhost:3000/@navroot',
26
+ navroot: {
27
+ '@id': 'http://localhost:3000',
28
+ title: 'Plone Site',
29
+ },
30
+ },
31
+ },
32
+ router: {
33
+ location: {
34
+ pathname: '/',
35
+ },
36
+ },
37
+ site: {
38
+ data: {},
39
+ },
40
+ });
41
+ const component = renderer.create(
42
+ <Provider store={store}>
43
+ <MemoryRouter>
44
+ <Logo />
45
+ </MemoryRouter>
46
+ </Provider>,
47
+ );
48
+ const json = component.toJSON();
49
+ expect(json).toMatchSnapshot();
50
+ });
51
+
52
+ it('renders a logo component in a multilingual site language root', () => {
53
+ const store = mockStore({
54
+ intl: {
55
+ locale: 'en',
56
+ messages: {},
57
+ },
58
+ navroot: {
59
+ data: {
60
+ id: 'http://localhost:3000/en/@navroot',
61
+ navroot: {
62
+ '@id': 'http://localhost:3000/en',
63
+ title: 'English',
64
+ },
65
+ },
66
+ },
67
+ router: {
68
+ location: {
69
+ pathname: '/en',
70
+ },
71
+ },
72
+ site: {
73
+ data: {
74
+ 'plone.site_title': 'Plone Site',
75
+ },
76
+ },
77
+ });
78
+ const component = renderer.create(
79
+ <Provider store={store}>
80
+ <MemoryRouter>
81
+ <Logo />
82
+ </MemoryRouter>
83
+ </Provider>,
84
+ );
85
+ const json = component.toJSON();
86
+ expect(json).toMatchSnapshot();
87
+ });
88
+
89
+ it('renders a logo component with a custom logo in a non-root url', () => {
90
+ const store = mockStore({
91
+ intl: {
92
+ locale: 'en',
93
+ messages: {},
94
+ },
95
+ navroot: {
96
+ data: {
97
+ id: 'http://localhost:3000/en/@navroot',
98
+ navroot: {
99
+ '@id': 'http://localhost:3000/en',
100
+ title: 'English',
101
+ },
102
+ },
103
+ },
104
+ router: {
105
+ location: {
106
+ pathname: '/en',
107
+ },
108
+ },
109
+ site: {
110
+ data: {
111
+ 'plone.site_logo':
112
+ 'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
113
+ },
114
+ },
115
+ });
116
+ const component = renderer.create(
117
+ <Provider store={store}>
118
+ <MemoryRouter>
119
+ <Logo />
120
+ </MemoryRouter>
121
+ </Provider>,
122
+ );
123
+ const json = component.toJSON();
124
+ expect(json).toMatchSnapshot();
125
+ });
126
+
127
+ it('renders a logo component with a custom logo in a non-root url with path', () => {
128
+ const store = mockStore({
129
+ intl: {
130
+ locale: 'en',
131
+ messages: {},
132
+ },
133
+ navroot: {
134
+ data: {
135
+ id: 'http://localhost:3000/en/@navroot',
136
+ navroot: {
137
+ '@id': 'http://localhost:3000/en',
138
+ title: 'English',
139
+ },
140
+ },
141
+ },
142
+ router: {
143
+ location: {
144
+ pathname: '/en/my/path',
145
+ },
146
+ },
147
+ site: {
148
+ data: {
149
+ 'plone.site_logo':
150
+ 'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
151
+ },
152
+ },
23
153
  });
24
154
  const component = renderer.create(
25
155
  <Provider store={store}>