@plone/volto 17.0.0-alpha.9 → 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 (363) hide show
  1. package/.eslintrc +26 -3
  2. package/CHANGELOG.md +457 -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/PasswordReset/PasswordReset.jsx +7 -5
  236. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +95 -170
  237. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  238. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  239. package/src/components/theme/Register/Register.jsx +2 -4
  240. package/src/components/theme/Search/SearchTags.jsx +30 -60
  241. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  242. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  243. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  244. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  245. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  246. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  247. package/src/components/theme/View/AlbumView.jsx +21 -16
  248. package/src/components/theme/View/EventView.jsx +36 -25
  249. package/src/components/theme/View/FileView.jsx +23 -18
  250. package/src/components/theme/View/ImageView.jsx +40 -32
  251. package/src/components/theme/View/ImageView.test.jsx +4 -0
  252. package/src/components/theme/View/LinkView.jsx +53 -78
  253. package/src/components/theme/View/ListingView.jsx +36 -28
  254. package/src/components/theme/View/NewsItemView.jsx +16 -17
  255. package/src/components/theme/View/RenderBlocks.jsx +56 -27
  256. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  257. package/src/components/theme/View/SummaryView.jsx +49 -39
  258. package/src/components/theme/View/TabularView.jsx +59 -53
  259. package/src/components/theme/View/View.jsx +2 -0
  260. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  261. package/src/config/Blocks.jsx +46 -0
  262. package/src/config/Components.jsx +3 -1
  263. package/src/config/ControlPanels.js +0 -1
  264. package/src/config/Loadables.jsx +1 -1
  265. package/src/config/NonContentRoutes.jsx +1 -0
  266. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  267. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  268. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  269. package/src/config/RichTextEditor/Styles.jsx +1 -1
  270. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  271. package/src/config/RichTextEditor/index.js +2 -3
  272. package/src/config/Views.jsx +6 -4
  273. package/src/config/Widgets.jsx +3 -0
  274. package/src/config/index.js +36 -2
  275. package/src/config/server.js +2 -0
  276. package/src/constants/ActionTypes.js +4 -0
  277. package/src/constants/Indexes.js +3 -1
  278. package/src/express-middleware/devproxy.js +1 -1
  279. package/src/express-middleware/files.js +11 -9
  280. package/src/express-middleware/images.js +12 -5
  281. package/src/express-middleware/ok.js +16 -0
  282. package/src/express-middleware/robotstxt.js +1 -1
  283. package/src/express-middleware/sitemap.js +1 -1
  284. package/src/express-middleware/static.js +3 -3
  285. package/src/helpers/Blocks/Blocks.js +52 -6
  286. package/src/helpers/Blocks/Blocks.test.js +92 -13
  287. package/src/helpers/Extensions/index.js +2 -1
  288. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  289. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  290. package/src/helpers/FormValidation/FormValidation.js +37 -7
  291. package/src/helpers/FormValidation/FormValidation.test.js +32 -0
  292. package/src/helpers/Html/Html.jsx +2 -8
  293. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  294. package/src/helpers/MessageLabels/MessageLabels.js +39 -4
  295. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  296. package/src/helpers/Site/index.js +21 -0
  297. package/src/helpers/Url/Url.js +22 -1
  298. package/src/helpers/Url/Url.test.js +41 -0
  299. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  300. package/src/helpers/Utils/Utils.js +35 -0
  301. package/src/helpers/Utils/Utils.test.js +13 -0
  302. package/src/helpers/Utils/usePagination.js +67 -14
  303. package/src/helpers/Utils/usePagination.test.js +115 -0
  304. package/src/helpers/index.js +15 -8
  305. package/src/hooks/client/useClient.js +11 -0
  306. package/src/hooks/clipboard/useClipboard.js +26 -0
  307. package/src/hooks/index.js +2 -0
  308. package/src/icons/grid-block.svg +11 -0
  309. package/src/middleware/api.js +203 -173
  310. package/src/middleware/blacklistRoutes.js +25 -22
  311. package/src/middleware/index.js +2 -2
  312. package/src/middleware/storeProtectLoadUtils.js +61 -62
  313. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  314. package/src/reducers/actions/actions.js +7 -5
  315. package/src/reducers/actions/actions.test.js +70 -0
  316. package/src/reducers/content/content.test.js +4 -4
  317. package/src/reducers/index.js +4 -0
  318. package/src/reducers/navigation/navigation.js +5 -5
  319. package/src/reducers/navigation/navigation.test.js +30 -0
  320. package/src/reducers/navroot/navroot.js +79 -0
  321. package/src/reducers/navroot/navroot.test.js +110 -0
  322. package/src/reducers/relations/relations.js +74 -46
  323. package/src/reducers/site/site.js +51 -0
  324. package/src/reducers/site/site.test.js +67 -0
  325. package/src/reducers/userSession/userSession.js +15 -1
  326. package/src/registry.js +2 -2
  327. package/src/routes.js +9 -0
  328. package/src/server.jsx +9 -0
  329. package/src/start-server.js +2 -2
  330. package/src/storybook.jsx +24 -38
  331. package/test-setup-config.js +11 -1
  332. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  333. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  334. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  335. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  336. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  337. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  338. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  339. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  340. package/theme/themes/pastanaga/extras/contents.less +6 -1
  341. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  342. package/theme/themes/pastanaga/extras/grid.less +427 -0
  343. package/theme/themes/pastanaga/extras/login.less +3 -0
  344. package/theme/themes/pastanaga/extras/main.less +14 -7
  345. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  346. package/theme/themes/pastanaga/extras/search.less +7 -1
  347. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  348. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  349. package/theme/themes/pastanaga/extras/toc.less +29 -0
  350. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  351. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  352. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  353. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  354. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  355. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  356. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  357. package/tsconfig.json +33 -0
  358. package/webpack-plugins/webpack-less-plugin.js +19 -0
  359. package/.yarn/install-state.gz +0 -0
  360. package/.yarn/releases/yarn-3.2.3.cjs +0 -783
  361. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  362. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  363. package/src/components/theme/Header/Header.md +0 -27
@@ -1,31 +1,34 @@
1
1
  import config from '@plone/volto/registry';
2
2
  import { matchPath } from 'react-router';
3
3
 
4
- const blacklistRoutes = ({ dispatch, getState }) => (next) => (action) => {
5
- if (typeof action === 'function') {
6
- return next(action);
7
- }
4
+ const blacklistRoutes =
5
+ ({ dispatch, getState }) =>
6
+ (next) =>
7
+ (action) => {
8
+ if (typeof action === 'function') {
9
+ return next(action);
10
+ }
8
11
 
9
- switch (action.type) {
10
- case '@@router/LOCATION_CHANGE':
11
- const { pathname } = action.payload.location;
12
- const { externalRoutes = [] } = config.settings;
12
+ switch (action.type) {
13
+ case '@@router/LOCATION_CHANGE':
14
+ const { pathname } = action.payload.location;
15
+ const { externalRoutes = [] } = config.settings;
13
16
 
14
- const route = externalRoutes.find((route) =>
15
- matchPath(pathname, route.match),
16
- );
17
+ const route = externalRoutes.find((route) =>
18
+ matchPath(pathname, route.match),
19
+ );
17
20
 
18
- if (!route) {
21
+ if (!route) {
22
+ return next(action);
23
+ } else {
24
+ window.location.replace(
25
+ route.url ? route.url(action.payload) : pathname,
26
+ );
27
+ }
28
+ break;
29
+ default:
19
30
  return next(action);
20
- } else {
21
- window.location.replace(
22
- route.url ? route.url(action.payload) : pathname,
23
- );
24
- }
25
- break;
26
- default:
27
- return next(action);
28
- }
29
- };
31
+ }
32
+ };
30
33
 
31
34
  export default blacklistRoutes;
@@ -4,8 +4,8 @@
4
4
  * @example import { api } from 'middleware';
5
5
  */
6
6
 
7
- export api from '@plone/volto/middleware/api';
8
- export blacklistRoutes from './blacklistRoutes';
7
+ export { default as api } from '@plone/volto/middleware/api';
8
+ export { default as blacklistRoutes } from './blacklistRoutes';
9
9
  export {
10
10
  protectLoadStart,
11
11
  protectLoadEnd,
@@ -21,42 +21,43 @@ const RESET_CONTENT = 'RESET_CONTENT';
21
21
  // such a reset when navigating between two content routes.
22
22
  // ---
23
23
 
24
- export const protectLoadStart = ({ dispatch, getState }) => (next) => (
25
- action,
26
- ) => {
27
- if (typeof action === 'function') {
28
- return next(action);
29
- }
30
- switch (action.type) {
31
- case LOCATION_CHANGE:
32
- const { location } = action.payload;
33
- const { pathname: path } = location;
34
- const currentPath = getState().router.location.pathname;
35
- const result = next(action);
36
- if (isCmsUi(path)) {
37
- // Next path: isCmsUI, Non Content. There is no
38
- // loading here, so skip counting altogether.
39
- // Will update the delayed location constantly.
40
- dispatch({
41
- type: PROTECT_SKIPPED,
42
- location,
43
- });
44
- } else {
45
- dispatch({
46
- type: PROTECT_START,
47
- location,
48
- // Only reset before the fetch, if we depart from
49
- // a not isCmsUi, Content pass. However, reset will
50
- // not occur if moving between two content paths,
51
- // only the postponed location will be booked.
52
- resetBeforeFetch: isCmsUi(currentPath),
53
- });
54
- }
55
- return result;
56
- default:
24
+ export const protectLoadStart =
25
+ ({ dispatch, getState }) =>
26
+ (next) =>
27
+ (action) => {
28
+ if (typeof action === 'function') {
57
29
  return next(action);
58
- }
59
- };
30
+ }
31
+ switch (action.type) {
32
+ case LOCATION_CHANGE:
33
+ const { location } = action.payload;
34
+ const { pathname: path } = location;
35
+ const currentPath = getState().router.location.pathname;
36
+ const result = next(action);
37
+ if (isCmsUi(path)) {
38
+ // Next path: isCmsUI, Non Content. There is no
39
+ // loading here, so skip counting altogether.
40
+ // Will update the delayed location constantly.
41
+ dispatch({
42
+ type: PROTECT_SKIPPED,
43
+ location,
44
+ });
45
+ } else {
46
+ dispatch({
47
+ type: PROTECT_START,
48
+ location,
49
+ // Only reset before the fetch, if we depart from
50
+ // a not isCmsUi, Content pass. However, reset will
51
+ // not occur if moving between two content paths,
52
+ // only the postponed location will be booked.
53
+ resetBeforeFetch: isCmsUi(currentPath),
54
+ });
55
+ }
56
+ return result;
57
+ default:
58
+ return next(action);
59
+ }
60
+ };
60
61
 
61
62
  // Note that there is a bit of heuristics here. We assume that every action
62
63
  // like this is beginning/ending an action. If this logic fails then the counting
@@ -70,34 +71,32 @@ const mapActions = {
70
71
  [GET_CONTENT_PENDING]: RESET_CONTENT,
71
72
  };
72
73
 
73
- export const protectLoadEnd = ({ dispatch, getState }) => (next) => (
74
- action,
75
- ) => {
76
- if (typeof action === 'function') {
77
- return next(action);
78
- }
79
- const {
80
- isCounting,
81
- resetBeforeFetch,
82
- requestCount,
83
- } = getState().loadProtector;
84
- if (resetBeforeFetch) {
85
- const type = mapActions[action.type];
86
- if (type) {
87
- dispatch({ type });
74
+ export const protectLoadEnd =
75
+ ({ dispatch, getState }) =>
76
+ (next) =>
77
+ (action) => {
78
+ if (typeof action === 'function') {
79
+ return next(action);
88
80
  }
89
- }
90
- if (isCounting && requestCount === 1 && isResponseAction(action)) {
91
- setTimeout(
92
- () =>
93
- dispatch({
94
- type: PROTECT_END,
95
- }),
96
- 0,
97
- );
98
- }
99
- return next(action);
100
- };
81
+ const { isCounting, resetBeforeFetch, requestCount } =
82
+ getState().loadProtector;
83
+ if (resetBeforeFetch) {
84
+ const type = mapActions[action.type];
85
+ if (type) {
86
+ dispatch({ type });
87
+ }
88
+ }
89
+ if (isCounting && requestCount === 1 && isResponseAction(action)) {
90
+ setTimeout(
91
+ () =>
92
+ dispatch({
93
+ type: PROTECT_END,
94
+ }),
95
+ 0,
96
+ );
97
+ }
98
+ return next(action);
99
+ };
101
100
 
102
101
  export function loadProtector(state = {}, action = {}) {
103
102
  switch (action.type) {
@@ -26,54 +26,58 @@ describe('storeProtectLoadUtils', () => {
26
26
  expect(result).toBe('NEXT');
27
27
  });
28
28
 
29
- const testLocationChange = ({ locationMap, resetBeforeFetch }) => () => {
30
- const dispatch = jest.fn();
31
- const getState = jest.fn(() => ({
32
- router: {
33
- location: {
34
- pathname: '/PATH',
29
+ const testLocationChange =
30
+ ({ locationMap, resetBeforeFetch }) =>
31
+ () => {
32
+ const dispatch = jest.fn();
33
+ const getState = jest.fn(() => ({
34
+ router: {
35
+ location: {
36
+ pathname: '/PATH',
37
+ },
35
38
  },
36
- },
37
- }));
38
- const next = jest.fn(() => 'NEXT');
39
- const action = {
40
- type: '@@router/LOCATION_CHANGE',
41
- payload: { location: { pathname: '/NEW-PATH' } },
39
+ }));
40
+ const next = jest.fn(() => 'NEXT');
41
+ const action = {
42
+ type: '@@router/LOCATION_CHANGE',
43
+ payload: { location: { pathname: '/NEW-PATH' } },
44
+ };
45
+ Url.isCmsUi = jest.fn((path) => locationMap[path]);
46
+ const result = protectLoadStart({ dispatch, getState })(next)(action);
47
+ expect(dispatch).toBeCalledWith({
48
+ type: '@@loadProtector/START',
49
+ location: { pathname: '/NEW-PATH' },
50
+ resetBeforeFetch,
51
+ });
52
+ expect(next).toBeCalledWith(action);
53
+ expect(result).toBe('NEXT');
42
54
  };
43
- Url.isCmsUi = jest.fn((path) => locationMap[path]);
44
- const result = protectLoadStart({ dispatch, getState })(next)(action);
45
- expect(dispatch).toBeCalledWith({
46
- type: '@@loadProtector/START',
47
- location: { pathname: '/NEW-PATH' },
48
- resetBeforeFetch,
49
- });
50
- expect(next).toBeCalledWith(action);
51
- expect(result).toBe('NEXT');
52
- };
53
55
 
54
- const testLocationSkipped = ({ locationMap }) => () => {
55
- const dispatch = jest.fn();
56
- const getState = jest.fn(() => ({
57
- router: {
58
- location: {
59
- pathname: '/PATH',
56
+ const testLocationSkipped =
57
+ ({ locationMap }) =>
58
+ () => {
59
+ const dispatch = jest.fn();
60
+ const getState = jest.fn(() => ({
61
+ router: {
62
+ location: {
63
+ pathname: '/PATH',
64
+ },
60
65
  },
61
- },
62
- }));
63
- const next = jest.fn(() => 'NEXT');
64
- const action = {
65
- type: '@@router/LOCATION_CHANGE',
66
- payload: { location: { pathname: '/NEW-PATH' } },
66
+ }));
67
+ const next = jest.fn(() => 'NEXT');
68
+ const action = {
69
+ type: '@@router/LOCATION_CHANGE',
70
+ payload: { location: { pathname: '/NEW-PATH' } },
71
+ };
72
+ Url.isCmsUi = jest.fn((path) => locationMap[path]);
73
+ const result = protectLoadStart({ dispatch, getState })(next)(action);
74
+ expect(dispatch).toBeCalledWith({
75
+ type: '@@loadProtector/SKIPPED',
76
+ location: { pathname: '/NEW-PATH' },
77
+ });
78
+ expect(next).toBeCalledWith(action);
79
+ expect(result).toBe('NEXT');
67
80
  };
68
- Url.isCmsUi = jest.fn((path) => locationMap[path]);
69
- const result = protectLoadStart({ dispatch, getState })(next)(action);
70
- expect(dispatch).toBeCalledWith({
71
- type: '@@loadProtector/SKIPPED',
72
- location: { pathname: '/NEW-PATH' },
73
- });
74
- expect(next).toBeCalledWith(action);
75
- expect(result).toBe('NEXT');
76
- };
77
81
 
78
82
  describe('location change', () => {
79
83
  test(
@@ -57,11 +57,13 @@ export default function actions(state = initialState, action = {}) {
57
57
  }
58
58
  return state;
59
59
  case `${LIST_ACTIONS}_SUCCESS`:
60
- hasExpander = hasApiExpander(
61
- 'actions',
62
- getBaseUrl(flattenToAppURL(action.result['@id'])),
63
- );
64
- if (!hasExpander) {
60
+ // Even if the expander is set or not, if the LIST_ACTIONS is
61
+ // called, we want it to store the data if the actions data is
62
+ // not set in the expander data (['@components']) but in the "normal"
63
+ // action result (we look for the object property returned by the endpoint)
64
+ // Unfortunately, this endpoint returns all the actions in a plain object
65
+ // with no structure :(
66
+ if (action.result.object) {
65
67
  return {
66
68
  ...state,
67
69
  error: null,
@@ -207,4 +207,74 @@ describe('Actions reducer - (ACTIONS)GET_CONTENT', () => {
207
207
  loading: false,
208
208
  });
209
209
  });
210
+
211
+ it('should handle (ACTIONS)LIST_ACTIONS (standalone with apiExpander enabled)', () => {
212
+ expect(
213
+ actions(undefined, {
214
+ type: `${LIST_ACTIONS}_SUCCESS`,
215
+ result: {
216
+ object: [],
217
+ object_buttons: [],
218
+ site_actions: [],
219
+ user: [
220
+ {
221
+ icon: '',
222
+ id: 'preferences',
223
+ title: 'Preferences',
224
+ },
225
+ {
226
+ icon: '',
227
+ id: 'dashboard',
228
+ title: 'Dashboard',
229
+ },
230
+ {
231
+ icon: '',
232
+ id: 'plone_setup',
233
+ title: 'Site Setup',
234
+ },
235
+ {
236
+ icon: '',
237
+ id: 'logout',
238
+ title: 'Log out',
239
+ },
240
+ ],
241
+ document_actions: [],
242
+ portal_tabs: [],
243
+ },
244
+ }),
245
+ ).toEqual({
246
+ error: null,
247
+ actions: {
248
+ object: [],
249
+ object_buttons: [],
250
+ site_actions: [],
251
+ user: [
252
+ {
253
+ icon: '',
254
+ id: 'preferences',
255
+ title: 'Preferences',
256
+ },
257
+ {
258
+ icon: '',
259
+ id: 'dashboard',
260
+ title: 'Dashboard',
261
+ },
262
+ {
263
+ icon: '',
264
+ id: 'plone_setup',
265
+ title: 'Site Setup',
266
+ },
267
+ {
268
+ icon: '',
269
+ id: 'logout',
270
+ title: 'Log out',
271
+ },
272
+ ],
273
+ document_actions: [],
274
+ portal_tabs: [],
275
+ },
276
+ loaded: true,
277
+ loading: false,
278
+ });
279
+ });
210
280
  });
@@ -82,7 +82,7 @@ describe('Content reducer', () => {
82
82
  }),
83
83
  ).toMatchObject({
84
84
  subrequests: {
85
- '1234': {
85
+ 1234: {
86
86
  data: null,
87
87
  loaded: false,
88
88
  loading: true,
@@ -136,7 +136,7 @@ describe('Content reducer', () => {
136
136
  }),
137
137
  ).toMatchObject({
138
138
  subrequests: {
139
- '1234': {
139
+ 1234: {
140
140
  data: {
141
141
  items: [
142
142
  {
@@ -170,7 +170,7 @@ describe('Content reducer', () => {
170
170
  }),
171
171
  ).toMatchObject({
172
172
  subrequests: {
173
- '1234': {
173
+ 1234: {
174
174
  data: [
175
175
  {
176
176
  '@id': `${settings.apiPath}/home-page`,
@@ -214,7 +214,7 @@ describe('Content reducer', () => {
214
214
  }),
215
215
  ).toMatchObject({
216
216
  subrequests: {
217
- '1234': {
217
+ 1234: {
218
218
  data: null,
219
219
  loaded: false,
220
220
  loading: false,
@@ -50,6 +50,8 @@ import workingCopy from './workingcopy/workingcopy';
50
50
  import transactions from './transactions/transactions';
51
51
  import upgrade from './upgrade/upgrade';
52
52
  import userschema from './userschema/userschema';
53
+ import site from './site/site';
54
+ import navroot from './navroot/navroot';
53
55
 
54
56
  /**
55
57
  * Root reducer.
@@ -105,6 +107,8 @@ const reducers = {
105
107
  workingCopy,
106
108
  transactions,
107
109
  userschema,
110
+ site,
111
+ navroot,
108
112
  };
109
113
 
110
114
  export default reducers;
@@ -73,11 +73,11 @@ export default function navigation(state = initialState, action = {}) {
73
73
  }
74
74
  return state;
75
75
  case `${GET_NAVIGATION}_SUCCESS`:
76
- hasExpander = hasApiExpander(
77
- 'navigation',
78
- getBaseUrl(flattenToAppURL(action.result['@id'])),
79
- );
80
- if (!hasExpander) {
76
+ // Even if the expander is set or not, if the GET_NAVIGATION is
77
+ // called, we want it to store the data if the actions data is
78
+ // not set in the expander data (['@components']) but in the "normal"
79
+ // action result (we look for the object property returned by the endpoint)
80
+ if (!action.result?.['@components'] && action.result?.items) {
81
81
  return {
82
82
  ...state,
83
83
  error: null,
@@ -172,4 +172,34 @@ describe('Navigation reducer (NAVIGATION)GET_CONTENT', () => {
172
172
  loading: false,
173
173
  });
174
174
  });
175
+
176
+ it('should handle (NAVIGATION)GET_NAVIGATION_SUCCESS (standalone with apiExpander enabled)', () => {
177
+ expect(
178
+ navigation(undefined, {
179
+ type: `${GET_NAVIGATION}_SUCCESS`,
180
+ result: {
181
+ items: [
182
+ {
183
+ title: 'Welcome to Plone!',
184
+ description:
185
+ 'Congratulations! You have successfully installed Plone.',
186
+ '@id': `${settings.apiPath}/front-page`,
187
+ },
188
+ ],
189
+ },
190
+ }),
191
+ ).toEqual({
192
+ error: null,
193
+ items: [
194
+ {
195
+ title: 'Welcome to Plone!',
196
+ description:
197
+ 'Congratulations! You have successfully installed Plone.',
198
+ url: '/front-page',
199
+ },
200
+ ],
201
+ loaded: true,
202
+ loading: false,
203
+ });
204
+ });
175
205
  });
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Navroot reducer.
3
+ * @module reducers/navroot/navroot
4
+ */
5
+ import {
6
+ flattenToAppURL,
7
+ getBaseUrl,
8
+ hasApiExpander,
9
+ } from '@plone/volto/helpers';
10
+
11
+ import { GET_NAVROOT, GET_CONTENT } from '@plone/volto/constants/ActionTypes';
12
+
13
+ const initialState = {
14
+ error: null,
15
+ loaded: false,
16
+ loading: false,
17
+ data: {},
18
+ };
19
+
20
+ /**
21
+ * navroot reducer.
22
+ * @function navroot
23
+ * @param {Object} state Current state.
24
+ * @param {Object} action Action to be handled.
25
+ * @returns {Object} New state.
26
+ */
27
+ export default function navroot(state = initialState, action = {}) {
28
+ let hasExpander;
29
+ switch (action.type) {
30
+ case `${GET_NAVROOT}_PENDING`:
31
+ return {
32
+ ...state,
33
+ error: null,
34
+ loaded: false,
35
+ loading: true,
36
+ data: {},
37
+ };
38
+ case `${GET_CONTENT}_SUCCESS`:
39
+ hasExpander = hasApiExpander(
40
+ 'navroot',
41
+ getBaseUrl(flattenToAppURL(action.result['@id'])),
42
+ );
43
+ if (hasExpander && !action.subrequest) {
44
+ return {
45
+ ...state,
46
+ error: null,
47
+ data: action.result['@components'].navroot,
48
+ loaded: true,
49
+ loading: false,
50
+ };
51
+ }
52
+ return state;
53
+ case `${GET_NAVROOT}_SUCCESS`:
54
+ hasExpander = hasApiExpander(
55
+ 'navroot',
56
+ getBaseUrl(flattenToAppURL(action.result['@id'])),
57
+ );
58
+ if (!hasExpander) {
59
+ return {
60
+ ...state,
61
+ error: null,
62
+ loaded: true,
63
+ loading: false,
64
+ data: action.result,
65
+ };
66
+ }
67
+ return state;
68
+ case `${GET_NAVROOT}_FAIL`:
69
+ return {
70
+ ...state,
71
+ error: action.result,
72
+ loaded: false,
73
+ loading: false,
74
+ data: {},
75
+ };
76
+ default:
77
+ return state;
78
+ }
79
+ }