@plone/volto 17.0.0-alpha.8 → 17.0.0

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 +488 -5
  3. package/CONTRIBUTING.md +5 -1
  4. package/README.md +12 -9
  5. package/addon-registry.js +10 -1
  6. package/create-addons-loader.js +1 -1
  7. package/cypress/support/commands.js +70 -14
  8. package/cypress/support/e2e.js +1 -2
  9. package/cypress/support/volto-slate.js +4 -5
  10. package/cypress.config.js +1 -0
  11. package/docker-compose.yml +1 -1
  12. package/locales/ca/LC_MESSAGES/volto.po +276 -53
  13. package/locales/ca.json +1 -1
  14. package/locales/de/LC_MESSAGES/volto.po +284 -61
  15. package/locales/de.json +1 -1
  16. package/locales/en/LC_MESSAGES/volto.po +274 -51
  17. package/locales/en.json +1 -1
  18. package/locales/es/LC_MESSAGES/volto.po +313 -90
  19. package/locales/es.json +1 -1
  20. package/locales/eu/LC_MESSAGES/volto.po +275 -52
  21. package/locales/eu.json +1 -1
  22. package/locales/fi/LC_MESSAGES/volto.po +275 -52
  23. package/locales/fi.json +1 -1
  24. package/locales/fr/LC_MESSAGES/volto.po +276 -53
  25. package/locales/fr.json +1 -1
  26. package/locales/it/LC_MESSAGES/volto.po +469 -246
  27. package/locales/it.json +1 -1
  28. package/locales/ja/LC_MESSAGES/volto.po +275 -52
  29. package/locales/ja.json +1 -1
  30. package/locales/nl/LC_MESSAGES/volto.po +276 -53
  31. package/locales/nl.json +1 -1
  32. package/locales/pt/LC_MESSAGES/volto.po +276 -53
  33. package/locales/pt.json +1 -1
  34. package/locales/pt_BR/LC_MESSAGES/volto.po +309 -86
  35. package/locales/pt_BR.json +1 -1
  36. package/locales/ro/LC_MESSAGES/volto.po +276 -53
  37. package/locales/ro.json +1 -1
  38. package/locales/volto.pot +279 -52
  39. package/locales/zh_CN/LC_MESSAGES/volto.po +276 -53
  40. package/locales/zh_CN.json +1 -1
  41. package/package.json +44 -34
  42. package/packages/volto-slate/package.json +1 -1
  43. package/packages/volto-slate/src/actions/index.js +1 -1
  44. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  45. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  46. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  47. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  48. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  49. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  50. package/packages/volto-slate/src/editor/config.jsx +5 -4
  51. package/packages/volto-slate/src/editor/index.js +4 -4
  52. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  53. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  54. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  55. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  56. package/packages/volto-slate/src/editor/render.jsx +77 -8
  57. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  58. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  59. package/packages/volto-slate/src/index.js +2 -2
  60. package/packages/volto-slate/src/utils/blocks.js +7 -0
  61. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  62. package/razzle.config.js +4 -6
  63. package/src/actions/index.js +4 -0
  64. package/src/actions/navroot/navroot.js +16 -0
  65. package/src/actions/navroot/navroot.test.js +15 -0
  66. package/src/actions/relations/rebuild.js +7 -7
  67. package/src/actions/relations/relations.js +17 -0
  68. package/src/actions/site/site.js +16 -0
  69. package/src/actions/site/site.test.js +15 -0
  70. package/src/actions/userSession/userSession.js +17 -1
  71. package/src/components/index.js +194 -192
  72. package/src/components/manage/Actions/Actions.jsx +133 -243
  73. package/src/components/manage/Add/Add.jsx +7 -8
  74. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  75. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  76. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  77. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  78. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  79. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  80. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  81. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  82. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  83. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  84. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  85. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  86. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  87. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  88. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  89. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  90. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  91. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  92. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  93. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  94. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  95. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  96. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  97. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  98. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  99. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  100. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  101. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  102. package/src/components/manage/Blocks/Image/schema.js +17 -10
  103. package/src/components/manage/Blocks/Image/utils.js +14 -0
  104. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  105. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  106. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  107. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  108. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  109. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  110. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  111. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  112. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  113. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  114. package/src/components/manage/Blocks/Listing/getAsyncData.js +3 -5
  115. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +27 -17
  116. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  117. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  118. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  119. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +3 -2
  120. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  121. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  122. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  123. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  124. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  125. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  126. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  127. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +70 -36
  128. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  129. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  130. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  131. package/src/components/manage/Blocks/Search/schema.js +29 -14
  132. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  133. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  134. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  135. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  136. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  137. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  138. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  139. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  140. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  141. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  142. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  143. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  144. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  145. package/src/components/manage/Contents/Contents.jsx +285 -114
  146. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  147. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  148. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  149. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  150. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  151. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  152. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  153. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  154. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  155. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  156. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +38 -13
  157. package/src/components/manage/Controlpanels/Relations/Relations.jsx +5 -5
  158. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +8 -7
  159. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +68 -68
  160. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  161. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  162. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  163. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  164. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  165. package/src/components/manage/Delete/Delete.jsx +96 -171
  166. package/src/components/manage/Diff/DiffField.jsx +25 -1
  167. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  168. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  169. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  170. package/src/components/manage/Form/Form.jsx +7 -6
  171. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  172. package/src/components/manage/History/History.jsx +11 -1
  173. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  174. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  175. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  176. package/src/components/manage/Messages/Messages.jsx +32 -99
  177. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  178. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  179. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  180. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  181. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  182. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  183. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  184. package/src/components/manage/TemplateChooser/template.svg +10 -0
  185. package/src/components/manage/Toast/Toast.jsx +1 -1
  186. package/src/components/manage/Toolbar/More.jsx +17 -2
  187. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  188. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  189. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  190. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  191. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  192. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  193. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  194. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  195. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  196. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  197. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  198. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  199. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  200. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  201. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +3 -10
  202. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  203. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  204. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  205. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  206. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  207. package/src/components/manage/Widgets/SelectWidget.jsx +15 -1
  208. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  209. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  210. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  211. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  212. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  213. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  214. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  215. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  216. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  217. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  218. package/src/components/theme/Comments/Comments.jsx +268 -380
  219. package/src/components/theme/Component/Component.jsx +1 -1
  220. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  221. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  222. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  223. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  224. package/src/components/theme/Error/ServerError.jsx +29 -0
  225. package/src/components/theme/Header/Header.jsx +37 -63
  226. package/src/components/theme/Header/Header.test.jsx +18 -0
  227. package/src/components/theme/Image/Image.jsx +96 -0
  228. package/src/components/theme/Image/Image.test.jsx +125 -0
  229. package/src/components/theme/Login/Login.jsx +160 -243
  230. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  231. package/src/components/theme/Logo/Logo.jsx +35 -27
  232. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  233. package/src/components/theme/Logout/Logout.jsx +36 -83
  234. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  235. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  236. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -5
  237. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +95 -170
  238. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  239. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  240. package/src/components/theme/Register/Register.jsx +2 -4
  241. package/src/components/theme/Search/SearchTags.jsx +30 -60
  242. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  243. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  244. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  245. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  246. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  247. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  248. package/src/components/theme/View/AlbumView.jsx +21 -16
  249. package/src/components/theme/View/EventView.jsx +36 -25
  250. package/src/components/theme/View/FileView.jsx +23 -18
  251. package/src/components/theme/View/ImageView.jsx +40 -32
  252. package/src/components/theme/View/ImageView.test.jsx +4 -0
  253. package/src/components/theme/View/LinkView.jsx +53 -78
  254. package/src/components/theme/View/ListingView.jsx +36 -28
  255. package/src/components/theme/View/NewsItemView.jsx +16 -17
  256. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  257. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  258. package/src/components/theme/View/SummaryView.jsx +49 -39
  259. package/src/components/theme/View/TabularView.jsx +59 -53
  260. package/src/components/theme/View/View.jsx +2 -0
  261. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  262. package/src/config/Blocks.jsx +46 -0
  263. package/src/config/Components.jsx +3 -1
  264. package/src/config/ControlPanels.js +0 -1
  265. package/src/config/Loadables.jsx +1 -1
  266. package/src/config/NonContentRoutes.jsx +1 -0
  267. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  268. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  269. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  270. package/src/config/RichTextEditor/Styles.jsx +1 -1
  271. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  272. package/src/config/RichTextEditor/index.js +2 -3
  273. package/src/config/Views.jsx +6 -4
  274. package/src/config/Widgets.jsx +3 -0
  275. package/src/config/index.js +36 -2
  276. package/src/config/server.js +2 -0
  277. package/src/constants/ActionTypes.js +4 -0
  278. package/src/constants/Indexes.js +3 -1
  279. package/src/express-middleware/devproxy.js +1 -1
  280. package/src/express-middleware/files.js +11 -9
  281. package/src/express-middleware/images.js +12 -5
  282. package/src/express-middleware/ok.js +16 -0
  283. package/src/express-middleware/robotstxt.js +1 -1
  284. package/src/express-middleware/sitemap.js +1 -1
  285. package/src/express-middleware/static.js +3 -3
  286. package/src/helpers/Api/Api.js +1 -1
  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 +2 -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
@@ -2,25 +2,18 @@
2
2
  * Logo component.
3
3
  * @module components/theme/Logo/Logo
4
4
  */
5
-
6
- import { defineMessages, useIntl } from 'react-intl';
5
+ import { useEffect } from 'react';
7
6
  import { Image } from 'semantic-ui-react';
8
- import { useSelector } from 'react-redux';
9
- import config from '@plone/volto/registry';
10
- import { UniversalLink } from '@plone/volto/components';
11
- import { toBackendLang } from '@plone/volto/helpers';
7
+ import { ConditionalLink } from '@plone/volto/components';
12
8
  import LogoImage from '@plone/volto/components/theme/Logo/Logo.svg';
13
-
14
- const messages = defineMessages({
15
- site: {
16
- id: 'Site',
17
- defaultMessage: 'Site',
18
- },
19
- plonesite: {
20
- id: 'Plone Site',
21
- defaultMessage: 'Plone Site',
22
- },
23
- });
9
+ import { useSelector, useDispatch } from 'react-redux';
10
+ import { getNavroot } from '@plone/volto/actions';
11
+ import {
12
+ flattenToAppURL,
13
+ hasApiExpander,
14
+ getBaseUrl,
15
+ toPublicURL,
16
+ } from '@plone/volto/helpers';
24
17
 
25
18
  /**
26
19
  * Logo component class.
@@ -29,21 +22,36 @@ const messages = defineMessages({
29
22
  * @returns {string} Markup of the component.
30
23
  */
31
24
  const Logo = () => {
32
- const { settings } = config;
33
- const lang = useSelector((state) => state.intl.locale);
34
- const intl = useIntl();
25
+ const pathname = useSelector((state) => state.router.location.pathname);
26
+ const site = useSelector((state) => state.site.data);
27
+ const navroot = useSelector((state) => state.navroot.data);
28
+ const dispatch = useDispatch();
29
+
30
+ useEffect(() => {
31
+ if (pathname && !hasApiExpander('navroot', getBaseUrl(pathname))) {
32
+ dispatch(getNavroot(getBaseUrl(pathname)));
33
+ }
34
+ }, [dispatch, pathname]);
35
+
36
+ // remove trailing slash
37
+ const currentURL = toPublicURL(pathname).replace(/\/$/, '');
35
38
 
36
39
  return (
37
- <UniversalLink
38
- href={settings.isMultilingual ? `/${toBackendLang(lang)}` : '/'}
39
- title={intl.formatMessage(messages.site)}
40
+ <ConditionalLink
41
+ href={navroot?.navroot?.['@id']}
42
+ title={navroot?.navroot?.title}
43
+ condition={currentURL !== navroot?.navroot?.['@id']}
40
44
  >
41
45
  <Image
42
- src={LogoImage}
43
- alt={intl.formatMessage(messages.plonesite)}
44
- title={intl.formatMessage(messages.plonesite)}
46
+ src={
47
+ site['plone.site_logo']
48
+ ? flattenToAppURL(site['plone.site_logo'])
49
+ : LogoImage
50
+ }
51
+ alt={navroot?.navroot?.title}
52
+ title={navroot?.navroot?.title}
45
53
  />
46
- </UniversalLink>
54
+ </ConditionalLink>
47
55
  );
48
56
  };
49
57
 
@@ -4,17 +4,151 @@ import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
5
  import { MemoryRouter } from 'react-router-dom';
6
6
 
7
+ import config from '@plone/volto/registry';
8
+
7
9
  import Logo from './Logo';
8
10
 
9
11
  const mockStore = configureStore();
10
12
 
13
+ beforeAll(() => {
14
+ config.settings.publicURL = 'http://localhost:3000';
15
+ });
16
+
11
17
  describe('Logo', () => {
12
- it('renders a logo component', () => {
18
+ it('renders a logo component with default config', () => {
19
+ const store = mockStore({
20
+ intl: {
21
+ locale: 'en',
22
+ messages: {},
23
+ },
24
+ navroot: {
25
+ data: {
26
+ id: 'http://localhost:3000/@navroot',
27
+ navroot: {
28
+ '@id': 'http://localhost:3000',
29
+ title: 'Plone Site',
30
+ },
31
+ },
32
+ },
33
+ router: {
34
+ location: {
35
+ pathname: '/',
36
+ },
37
+ },
38
+ site: {
39
+ data: {},
40
+ },
41
+ });
42
+ const component = renderer.create(
43
+ <Provider store={store}>
44
+ <MemoryRouter>
45
+ <Logo />
46
+ </MemoryRouter>
47
+ </Provider>,
48
+ );
49
+ const json = component.toJSON();
50
+ expect(json).toMatchSnapshot();
51
+ });
52
+ it('renders a logo component with a custom logo', () => {
13
53
  const store = mockStore({
14
54
  intl: {
15
55
  locale: 'en',
16
56
  messages: {},
17
57
  },
58
+ navroot: {
59
+ data: {
60
+ id: 'http://localhost:3000/@navroot',
61
+ navroot: {
62
+ '@id': 'http://localhost:3000',
63
+ title: 'Plone Site',
64
+ },
65
+ },
66
+ },
67
+ router: {
68
+ location: {
69
+ pathname: '/',
70
+ },
71
+ },
72
+ site: {
73
+ data: {
74
+ 'plone.site_logo':
75
+ 'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
76
+ },
77
+ },
78
+ });
79
+ const component = renderer.create(
80
+ <Provider store={store}>
81
+ <MemoryRouter>
82
+ <Logo />
83
+ </MemoryRouter>
84
+ </Provider>,
85
+ );
86
+ const json = component.toJSON();
87
+ expect(json).toMatchSnapshot();
88
+ });
89
+ it('renders a logo component with default config 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/@navroot',
98
+ navroot: {
99
+ '@id': 'http://localhost:3000',
100
+ title: 'Plone Site',
101
+ },
102
+ },
103
+ },
104
+ router: {
105
+ location: {
106
+ pathname: '/some-page',
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
+ it('renders a logo component with a custom logo in a non-root url', () => {
127
+ const store = mockStore({
128
+ intl: {
129
+ locale: 'en',
130
+ messages: {},
131
+ },
132
+ navroot: {
133
+ data: {
134
+ id: 'http://localhost:3000/@navroot',
135
+ navroot: {
136
+ '@id': 'http://localhost:3000',
137
+ title: 'Plone Site',
138
+ },
139
+ },
140
+ },
141
+ router: {
142
+ location: {
143
+ pathname: '/some-page',
144
+ },
145
+ },
146
+ site: {
147
+ data: {
148
+ 'plone.site_logo':
149
+ 'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
150
+ },
151
+ },
18
152
  });
19
153
  const component = renderer.create(
20
154
  <Provider store={store}>
@@ -1,19 +1,11 @@
1
- /**
2
- * Login container.
3
- * @module components/theme/Logout/Logout
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 { defineMessages, injectIntl } from 'react-intl';
1
+ import { useEffect, useMemo } from 'react';
2
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
3
+ import { useHistory } from 'react-router-dom';
4
+ import { defineMessages, useIntl } from 'react-intl';
11
5
  import qs from 'query-string';
12
-
13
- import { Login } from '@plone/volto/components';
6
+ import { Login, Toast } from '@plone/volto/components';
14
7
  import { logout, purgeMessages } from '@plone/volto/actions';
15
8
  import { toast } from 'react-toastify';
16
- import { Toast } from '@plone/volto/components';
17
9
 
18
10
  const messages = defineMessages({
19
11
  loggedOut: {
@@ -26,83 +18,44 @@ const messages = defineMessages({
26
18
  },
27
19
  });
28
20
 
29
- /**
30
- * Logout class.
31
- * @class Logout
32
- * @extends Component
33
- */
34
- class Logout extends Component {
35
- /**
36
- * Property types.
37
- * @property {Object} propTypes Property types.
38
- * @static
39
- */
40
- static propTypes = {
41
- logout: PropTypes.func.isRequired,
42
- purgeMessages: PropTypes.func.isRequired,
43
- query: PropTypes.shape({
44
- return_url: PropTypes.string,
45
- }),
46
- };
47
-
48
- /**
49
- * Default properties.
50
- * @property {Object} defaultProps Default properties.
51
- * @static
52
- */
53
- static defaultProps = {
54
- query: null,
55
- };
56
-
57
- componentDidMount() {
58
- this.props.logout();
59
- this.props.purgeMessages();
60
- }
61
-
62
- /**
63
- * Component will receive props
64
- * @method componentWillReceiveProps
65
- * @param {Object} nextProps Next properties
66
- * @returns {undefined}
67
- */
68
- UNSAFE_componentWillReceiveProps(nextProps) {
69
- if (!nextProps.token) {
70
- this.props.history.replace(this.props.returnUrl || '/');
21
+ const Logout = ({ location }) => {
22
+ const token = useSelector((state) => state.userSession.token, shallowEqual);
23
+ const history = useHistory();
24
+ const dispatch = useDispatch();
25
+ const intl = useIntl();
26
+
27
+ const returnUrl = useMemo(
28
+ () =>
29
+ qs.parse(location.search).return_url ||
30
+ location.pathname
31
+ .replace(/\/login\/?$/, '')
32
+ .replace(/\/logout\/?$/, '') ||
33
+ '/',
34
+ [location],
35
+ );
36
+
37
+ useEffect(() => {
38
+ dispatch(logout());
39
+ dispatch(purgeMessages());
40
+ }, [dispatch]);
41
+
42
+ useEffect(() => {
43
+ if (!token) {
44
+ history.replace(returnUrl || '/');
71
45
  if (!toast.isActive('loggedOut')) {
72
46
  toast.info(
73
47
  <Toast
74
48
  info
75
- title={this.props.intl.formatMessage(messages.loggedOut)}
76
- content={this.props.intl.formatMessage(messages.loggedOutContent)}
49
+ title={intl.formatMessage(messages.loggedOut)}
50
+ content={intl.formatMessage(messages.loggedOutContent)}
77
51
  />,
78
52
  { autoClose: false, toastId: 'loggedOut' },
79
53
  );
80
54
  }
81
55
  }
82
- }
56
+ }, [history, returnUrl, intl, token]);
57
+
58
+ return <Login location={{ query: location.query }} isLogout={true} />;
59
+ };
83
60
 
84
- /**
85
- * Render method.
86
- * @method render
87
- * @returns {string} Markup for the component.
88
- */
89
- render() {
90
- return <Login location={{ query: this.props.location.query }} />;
91
- }
92
- }
93
- export default compose(
94
- injectIntl,
95
- connect(
96
- (state, props) => ({
97
- query: qs.parse(props.location.search),
98
- token: state.userSession.token,
99
- returnUrl:
100
- qs.parse(props.location.search).return_url ||
101
- props.location.pathname
102
- .replace(/\/login\/?$/, '')
103
- .replace(/\/logout\/?$/, '') ||
104
- '/',
105
- }),
106
- { logout, purgeMessages },
107
- ),
108
- )(Logout);
61
+ export default Logout;
@@ -1,14 +1,9 @@
1
- /**
2
- * Navigation components.
3
- * @module components/theme/Navigation/Navigation
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import { useEffect, useState } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
10
- import { defineMessages, injectIntl } from 'react-intl';
3
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
4
+ import { defineMessages, useIntl } from 'react-intl';
11
5
  import { Menu } from 'semantic-ui-react';
6
+
12
7
  import cx from 'classnames';
13
8
  import { BodyClass, getBaseUrl, hasApiExpander } from '@plone/volto/helpers';
14
9
  import config from '@plone/volto/registry';
@@ -27,176 +22,96 @@ const messages = defineMessages({
27
22
  },
28
23
  });
29
24
 
30
- /**
31
- * Navigation container class.
32
- * @class Navigation
33
- * @extends Component
34
- */
35
- class Navigation extends Component {
36
- /**
37
- * Property types.
38
- * @property {Object} propTypes Property types.
39
- * @static
40
- */
41
- static propTypes = {
42
- getNavigation: PropTypes.func.isRequired,
43
- pathname: PropTypes.string.isRequired,
44
- items: PropTypes.arrayOf(
45
- PropTypes.shape({
46
- title: PropTypes.string,
47
- url: PropTypes.string,
48
- }),
49
- ).isRequired,
50
- lang: PropTypes.string.isRequired,
51
- };
52
-
53
- static defaultProps = {
54
- token: null,
55
- };
56
-
57
- /**
58
- * Constructor
59
- * @method constructor
60
- * @param {Object} props Component properties
61
- * @constructs Navigation
62
- */
63
- constructor(props) {
64
- super(props);
65
- this.toggleMobileMenu = this.toggleMobileMenu.bind(this);
66
- this.closeMobileMenu = this.closeMobileMenu.bind(this);
67
- this.state = {
68
- isMobileMenuOpen: false,
69
- };
70
- }
25
+ const Navigation = (props) => {
26
+ const intl = useIntl();
27
+ const dispatch = useDispatch();
28
+ const { pathname, type } = props;
29
+ const [isMobileMenuOpen, setisMobileMenuOpen] = useState(false);
30
+ const token = useSelector((state) => state.userSession.token, shallowEqual);
31
+ const items = useSelector((state) => state.navigation.items, shallowEqual);
32
+ const lang = useSelector((state) => state.intl.locale);
71
33
 
72
- componentDidMount() {
34
+ useEffect(() => {
73
35
  const { settings } = config;
74
- if (!hasApiExpander('navigation', getBaseUrl(this.props.pathname))) {
75
- this.props.getNavigation(
76
- getBaseUrl(this.props.pathname),
77
- settings.navDepth,
78
- );
36
+ if (!hasApiExpander('navigation', getBaseUrl(pathname))) {
37
+ dispatch(getNavigation(getBaseUrl(pathname), settings.navDepth));
79
38
  }
80
- }
39
+ }, [pathname, token, dispatch]);
81
40
 
82
- /**
83
- * Component will receive props
84
- * @method componentWillReceiveProps
85
- * @param {Object} nextProps Next properties
86
- * @returns {undefined}
87
- */
88
- UNSAFE_componentWillReceiveProps(nextProps) {
89
- const { settings } = config;
90
- if (
91
- nextProps.pathname !== this.props.pathname ||
92
- nextProps.token !== this.props.token
93
- ) {
94
- if (!hasApiExpander('navigation', getBaseUrl(this.props.pathname))) {
95
- this.props.getNavigation(
96
- getBaseUrl(nextProps.pathname),
97
- settings.navDepth,
98
- );
99
- }
100
- }
101
- }
102
-
103
- /**
104
- * Toggle mobile menu's open state
105
- * @method toggleMobileMenu
106
- * @returns {undefined}
107
- */
108
- toggleMobileMenu() {
109
- this.setState({ isMobileMenuOpen: !this.state.isMobileMenuOpen });
110
- }
41
+ const toggleMobileMenu = () => {
42
+ setisMobileMenuOpen(!isMobileMenuOpen);
43
+ };
111
44
 
112
- /**
113
- * Close mobile menu
114
- * @method closeMobileMenu
115
- * @returns {undefined}
116
- */
117
- closeMobileMenu() {
118
- if (!this.state.isMobileMenuOpen) {
45
+ const closeMobileMenu = () => {
46
+ if (!isMobileMenuOpen) {
119
47
  return;
120
48
  }
121
- this.setState({ isMobileMenuOpen: false });
122
- }
49
+ setisMobileMenuOpen(false);
50
+ };
123
51
 
124
- /**
125
- * Render method.
126
- * @method render
127
- * @returns {string} Markup for the component.
128
- */
129
- render() {
130
- return (
131
- <nav className="navigation" id="navigation" aria-label="navigation">
132
- <div className="hamburger-wrapper mobile tablet only">
133
- <button
134
- className={cx('hamburger hamburger--spin', {
135
- 'is-active': this.state.isMobileMenuOpen,
136
- })}
137
- aria-label={
138
- this.state.isMobileMenuOpen
139
- ? this.props.intl.formatMessage(messages.closeMobileMenu, {
140
- type: this.props.type,
141
- })
142
- : this.props.intl.formatMessage(messages.openMobileMenu, {
143
- type: this.props.type,
144
- })
145
- }
146
- title={
147
- this.state.isMobileMenuOpen
148
- ? this.props.intl.formatMessage(messages.closeMobileMenu, {
149
- type: this.props.type,
150
- })
151
- : this.props.intl.formatMessage(messages.openMobileMenu, {
152
- type: this.props.type,
153
- })
154
- }
155
- type="button"
156
- onClick={this.toggleMobileMenu}
157
- >
158
- <span className="hamburger-box">
159
- <span className="hamburger-inner" />
160
- </span>
161
- </button>
162
- </div>
163
- <Menu
164
- stackable
165
- pointing
166
- secondary
167
- className="computer large screen widescreen only"
168
- onClick={this.closeMobileMenu}
52
+ return (
53
+ <nav className="navigation" id="navigation" aria-label="navigation">
54
+ <div className="hamburger-wrapper mobile tablet only">
55
+ <button
56
+ className={cx('hamburger hamburger--spin', {
57
+ 'is-active': isMobileMenuOpen,
58
+ })}
59
+ aria-label={
60
+ isMobileMenuOpen
61
+ ? intl.formatMessage(messages.closeMobileMenu, {
62
+ type: type,
63
+ })
64
+ : intl.formatMessage(messages.openMobileMenu, {
65
+ type: type,
66
+ })
67
+ }
68
+ title={
69
+ isMobileMenuOpen
70
+ ? intl.formatMessage(messages.closeMobileMenu, {
71
+ type: type,
72
+ })
73
+ : intl.formatMessage(messages.openMobileMenu, {
74
+ type: type,
75
+ })
76
+ }
77
+ type="button"
78
+ onClick={toggleMobileMenu}
169
79
  >
170
- <NavItems items={this.props.items} lang={this.props.lang} />
171
- </Menu>
172
- <CSSTransition
173
- in={this.state.isMobileMenuOpen}
174
- timeout={500}
175
- classNames="mobile-menu"
176
- unmountOnExit
177
- >
178
- <div key="mobile-menu-key" className="mobile-menu">
179
- <BodyClass className="has-mobile-menu-open" />
180
- <div className="mobile-menu-nav">
181
- <Menu stackable pointing secondary onClick={this.closeMobileMenu}>
182
- <NavItems items={this.props.items} lang={this.props.lang} />
183
- </Menu>
184
- </div>
80
+ <span className="hamburger-box">
81
+ <span className="hamburger-inner" />
82
+ </span>
83
+ </button>
84
+ </div>
85
+ <Menu
86
+ stackable
87
+ pointing
88
+ secondary
89
+ className="computer large screen widescreen only"
90
+ onClick={closeMobileMenu}
91
+ >
92
+ <NavItems items={items} lang={lang} />
93
+ </Menu>
94
+ <CSSTransition
95
+ in={isMobileMenuOpen}
96
+ timeout={500}
97
+ classNames="mobile-menu"
98
+ unmountOnExit
99
+ >
100
+ <div key="mobile-menu-key" className="mobile-menu">
101
+ <BodyClass className="has-mobile-menu-open" />
102
+ <div className="mobile-menu-nav">
103
+ <Menu stackable pointing secondary onClick={closeMobileMenu}>
104
+ <NavItems items={items} lang={lang} />
105
+ </Menu>
185
106
  </div>
186
- </CSSTransition>
187
- </nav>
188
- );
189
- }
190
- }
107
+ </div>
108
+ </CSSTransition>
109
+ </nav>
110
+ );
111
+ };
112
+
113
+ Navigation.propTypes = {
114
+ pathname: PropTypes.string.isRequired,
115
+ };
191
116
 
192
- export default compose(
193
- injectIntl,
194
- connect(
195
- (state) => ({
196
- token: state.userSession.token,
197
- items: state.navigation.items,
198
- lang: state.intl.locale,
199
- }),
200
- { getNavigation },
201
- ),
202
- )(Navigation);
117
+ export default Navigation;