@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
@@ -96,6 +96,7 @@ class GroupsControlpanel extends Component {
96
96
  this.updateGroupRole = this.updateGroupRole.bind(this);
97
97
  this.state = {
98
98
  search: '',
99
+ isLoading: false,
99
100
  addGroupError: '',
100
101
  showDelete: false,
101
102
  groupToDelete: undefined,
@@ -173,8 +174,18 @@ class GroupsControlpanel extends Component {
173
174
  * @returns {undefined}
174
175
  */
175
176
  onSearchGroups(event) {
177
+ this.setState({ isLoading: true });
176
178
  event.preventDefault();
177
- this.props.listGroups(this.state.search);
179
+ this.props
180
+ .listGroups(this.state.search)
181
+ .then(() => {
182
+ this.setState({ isLoading: false });
183
+ })
184
+ .catch((error) => {
185
+ this.setState({ isLoading: false });
186
+ // eslint-disable-next-line no-console
187
+ console.error('Error searching group', error);
188
+ });
178
189
  }
179
190
 
180
191
  /**
@@ -487,7 +498,11 @@ class GroupsControlpanel extends Component {
487
498
  <Form.Field>
488
499
  <Input
489
500
  name="SearchableText"
490
- action={{ icon: 'search' }}
501
+ action={{
502
+ icon: 'search',
503
+ loading: this.state.isLoading,
504
+ disabled: this.state.isLoading,
505
+ }}
491
506
  placeholder={this.props.intl.formatMessage(
492
507
  messages.searchGroups,
493
508
  )}
@@ -499,43 +514,55 @@ class GroupsControlpanel extends Component {
499
514
  </Segment>
500
515
  <Form>
501
516
  <div className="table">
502
- <Table padded striped attached unstackable>
503
- <Table.Header>
504
- <Table.Row>
505
- <Table.HeaderCell>
506
- <FormattedMessage
507
- id="Groupname"
508
- defaultMessage="Groupname"
509
- />
510
- </Table.HeaderCell>
511
- {this.props.roles.map((role) => (
512
- <Table.HeaderCell key={role.id}>
513
- {role.title}
517
+ {((this.props.many_groups &&
518
+ this.state.groupEntries.length > 0) ||
519
+ !this.props.many_groups) && (
520
+ <Table padded striped attached unstackable>
521
+ <Table.Header>
522
+ <Table.Row>
523
+ <Table.HeaderCell>
524
+ <FormattedMessage
525
+ id="Groupname"
526
+ defaultMessage="Groupname"
527
+ />
528
+ </Table.HeaderCell>
529
+ {this.props.roles.map((role) => (
530
+ <Table.HeaderCell key={role.id}>
531
+ {role.title}
532
+ </Table.HeaderCell>
533
+ ))}
534
+ <Table.HeaderCell>
535
+ <FormattedMessage
536
+ id="Actions"
537
+ defaultMessage="Actions"
538
+ />
514
539
  </Table.HeaderCell>
515
- ))}
516
- <Table.HeaderCell>
517
- <FormattedMessage id="Actions" defaultMessage="Actions" />
518
- </Table.HeaderCell>
519
- </Table.Row>
520
- </Table.Header>
521
- <Table.Body data-group="groups">
522
- {this.state.groupEntries
523
- .slice(
524
- this.state.currentPage * 10,
525
- this.state.pageSize * (this.state.currentPage + 1),
526
- )
527
- .map((group) => (
528
- <RenderGroups
529
- key={group.id}
530
- onDelete={this.deleteGroup}
531
- roles={this.props.roles}
532
- group={group}
533
- updateGroups={this.updateGroupRole}
534
- inheritedRole={this.state.authenticatedRole}
535
- />
536
- ))}
537
- </Table.Body>
538
- </Table>
540
+ </Table.Row>
541
+ </Table.Header>
542
+ <Table.Body data-group="groups">
543
+ {this.state.groupEntries
544
+ .slice(
545
+ this.state.currentPage * 10,
546
+ this.state.pageSize * (this.state.currentPage + 1),
547
+ )
548
+ .map((group) => (
549
+ <RenderGroups
550
+ key={group.id}
551
+ onDelete={this.deleteGroup}
552
+ roles={this.props.roles}
553
+ group={group}
554
+ updateGroups={this.updateGroupRole}
555
+ inheritedRole={this.state.authenticatedRole}
556
+ />
557
+ ))}
558
+ </Table.Body>
559
+ </Table>
560
+ )}
561
+ {this.state.groupEntries.length === 0 && this.state.search && (
562
+ <Segment>
563
+ {this.props.intl.formatMessage(messages.groupSearchNoResults)}
564
+ </Segment>
565
+ )}
539
566
  </div>
540
567
  <div className="contents-pagination">
541
568
  <Pagination
@@ -57,7 +57,7 @@ class RenderGroups extends Component {
57
57
  * @memberof UsersControlpanelUser
58
58
  */
59
59
  onChange(event, { value }) {
60
- const [group, role] = value.split('.');
60
+ const [group, role] = value.split('&role=');
61
61
  this.props.updateGroups(group, role);
62
62
  }
63
63
 
@@ -97,7 +97,7 @@ class RenderGroups extends Component {
97
97
  : this.props.group.roles.includes(role.id)
98
98
  }
99
99
  onChange={this.onChange}
100
- value={`${this.props.group.id}.${role.id}`}
100
+ value={`${this.props.group.id}&role=${role.id}`}
101
101
  />
102
102
  )}
103
103
  </Table.Cell>
@@ -5,15 +5,15 @@ import { useSelector, useDispatch } from 'react-redux';
5
5
  import { Divider, Segment, Table } from 'semantic-ui-react';
6
6
  import { queryRelations } from '@plone/volto/actions';
7
7
  import { flattenToAppURL } from '@plone/volto/helpers';
8
- import { UniversalLink } from '@plone/volto/components';
8
+ import { ConditionalLink } from '@plone/volto/components';
9
9
 
10
10
  const BrokenRelations = () => {
11
11
  const dispatch = useDispatch();
12
12
  const brokenRelationStats = useSelector(
13
- (state) => state.relations?.stats?.broken || {},
13
+ (state) => state.relations?.stats?.data?.broken || {},
14
14
  );
15
15
  const brokenRelations = useSelector(
16
- (state) => state.relations?.subrequests?.broken?.relations,
16
+ (state) => state.relations?.subrequests?.broken?.data,
17
17
  );
18
18
 
19
19
  useEffect(() => {
@@ -34,24 +34,49 @@ const BrokenRelations = () => {
34
34
  <div key={relationname}>
35
35
  <Divider section hidden />
36
36
  <h4>
37
- {brokenRelationStats[relationname]} broken <i>{relationname}</i>{' '}
38
- relations
37
+ <FormattedMessage
38
+ id="countBrokenRelations"
39
+ defaultMessage="{countofrelation} broken {countofrelation, plural, one {relation} other {relations}} of type {typeofrelation}"
40
+ values={{
41
+ countofrelation: brokenRelationStats[relationname],
42
+ typeofrelation: relationname,
43
+ }}
44
+ />
39
45
  </h4>
40
- <Table>
46
+ <Table compact="very">
47
+ <Table.Header>
48
+ <Table.Row>
49
+ <Table.HeaderCell width={6}>
50
+ <FormattedMessage id="Source" defaultMessage="Source" />
51
+ </Table.HeaderCell>
52
+ <Table.HeaderCell>
53
+ <FormattedMessage id="Target" defaultMessage="Target" />
54
+ </Table.HeaderCell>
55
+ </Table.Row>
56
+ </Table.Header>
41
57
  <Table.Body>
42
58
  {uniqBy(brokenRelations[relationname].items, function (el) {
43
- return el[0];
44
- }).map((el) => (
45
- <Table.Row key={el[0]}>
59
+ return el.toString();
60
+ }).map((el, index) => (
61
+ <Table.Row key={index}>
46
62
  <Table.Cell>
47
- <UniversalLink
48
- href={`${flattenToAppURL(el[0])}/edit`}
63
+ <ConditionalLink
64
+ to={`${el[0]}/edit`}
49
65
  openLinkInNewTab={true}
66
+ condition={el[0].includes('http')}
50
67
  >
51
68
  {flattenToAppURL(el[0])}
52
- </UniversalLink>
69
+ </ConditionalLink>
70
+ </Table.Cell>
71
+ <Table.Cell>
72
+ <ConditionalLink
73
+ to={`${el[1]}/edit`}
74
+ openLinkInNewTab={true}
75
+ condition={el[1].includes('http')}
76
+ >
77
+ {flattenToAppURL(el[1])}
78
+ </ConditionalLink>
53
79
  </Table.Cell>
54
- <Table.Cell>{el[1]}</Table.Cell>
55
80
  </Table.Row>
56
81
  ))}
57
82
  </Table.Body>
@@ -24,10 +24,10 @@ const RelationsControlPanel = () => {
24
24
  const dispatch = useDispatch();
25
25
 
26
26
  const brokenRelations = useSelector(
27
- (state) => state.relations?.stats?.broken,
27
+ (state) => state.relations?.stats?.data?.broken,
28
28
  );
29
29
 
30
- const relations_stats = useSelector((state) => state.relations?.stats?.stats);
30
+ const relations_stats = useSelector((state) => state.relations?.stats?.data);
31
31
  const actions = useSelector((state) => state.actions?.actions ?? {});
32
32
  const can_edit = find(actions.object, {
33
33
  id: 'edit',
@@ -58,13 +58,13 @@ const RelationsControlPanel = () => {
58
58
  <h1>
59
59
  <FormattedMessage id="Relations" defaultMessage="Relations" />
60
60
  </h1>
61
- {!relations_stats ? (
61
+ {relations_stats?.error ? (
62
62
  <React.Fragment>
63
63
  <Divider hidden />
64
64
  <Message warning>
65
65
  <FormattedMessage
66
- id="Please upgrade to plone.restapi >= 8.35.3."
67
- defaultMessage="Please upgrade to plone.restapi >= 8.35.3."
66
+ id="Please upgrade to plone.restapi >= 8.39.0."
67
+ defaultMessage="Please upgrade to plone.restapi >= 8.39.0."
68
68
  />
69
69
  </Message>
70
70
  </React.Fragment>
@@ -11,6 +11,7 @@ import {
11
11
  createRelations,
12
12
  deleteRelations,
13
13
  queryRelations,
14
+ resetSearchContent,
14
15
  searchContent,
15
16
  } from '@plone/volto/actions';
16
17
 
@@ -28,9 +29,10 @@ const ListingTemplate = ({
28
29
  const MAX = 40; // Maximum of rows and columns
29
30
  const MAX_RELATIONS = 1000;
30
31
 
31
- const stats = useSelector((state) => state.relations?.stats || null);
32
+ const stats = useSelector((state) => state.relations?.stats?.data || null);
33
+
32
34
  let relations = useSelector(
33
- (state) => state.relations?.relations?.[relationtype]?.items || [],
35
+ (state) => state.relations?.relations?.data?.[relationtype]?.items || [],
34
36
  );
35
37
 
36
38
  let potential_targets_objects = useSelector(
@@ -49,7 +51,8 @@ const ListingTemplate = ({
49
51
 
50
52
  // Editable if plone.api.relations available
51
53
  const editable = useSelector(
52
- (state) => state.relations?.relations?.[relationtype]?.readonly !== true,
54
+ (state) =>
55
+ state.relations?.relations?.data?.[relationtype]?.readonly !== true,
53
56
  );
54
57
 
55
58
  let relationMatrix = {};
@@ -192,8 +195,7 @@ const ListingTemplate = ({
192
195
  ),
193
196
  );
194
197
  } else {
195
- // TODO Better just reset redux store
196
- dispatch(searchContent('/findstenichätsch', null, 'potential_targets'));
198
+ dispatch(resetSearchContent('potential_targets'));
197
199
  }
198
200
 
199
201
  // Fetch fresh potential sources
@@ -211,8 +213,7 @@ const ListingTemplate = ({
211
213
  ),
212
214
  );
213
215
  } else {
214
- // TODO Better just reset redux store
215
- dispatch(searchContent('/findstenichätsch', null, 'potential_sources'));
216
+ dispatch(resetSearchContent('potential_sources'));
216
217
  }
217
218
  }, [
218
219
  dispatch,
@@ -17,7 +17,11 @@ import {
17
17
  import withObjectBrowser from '@plone/volto/components/manage/Sidebar/ObjectBrowser';
18
18
  import { messages } from '@plone/volto/helpers';
19
19
  import { Icon, Toast } from '@plone/volto/components';
20
- import { rebuildRelations, queryRelations } from '@plone/volto/actions';
20
+ import {
21
+ getRelationStats,
22
+ queryRelations,
23
+ rebuildRelations,
24
+ } from '@plone/volto/actions';
21
25
  import RelationsListing from './RelationsListing';
22
26
  import BrokenRelations from './BrokenRelations';
23
27
  import helpSVG from '@plone/volto/icons/help.svg';
@@ -39,12 +43,14 @@ const RelationsMatrix = (props) => {
39
43
  id: 'plone_setup',
40
44
  });
41
45
 
42
- const relationtypes = useSelector((state) => state.relations?.stats?.stats);
46
+ const relationtypes = useSelector(
47
+ (state) => state.relations?.stats?.data?.stats,
48
+ );
43
49
  const relationsListError = useSelector(
44
- (state) => state.relations?.list?.error?.response?.body?.error,
50
+ (state) => state.relations?.stats?.error?.response?.body?.error,
45
51
  );
46
52
  const brokenRelations = useSelector(
47
- (state) => state.relations?.stats?.broken,
53
+ (state) => state.relations?.stats?.data?.broken,
48
54
  );
49
55
 
50
56
  let filter_options = useSelector((state) => state.groups.filter_groups);
@@ -67,7 +73,7 @@ const RelationsMatrix = (props) => {
67
73
  }
68
74
 
69
75
  useEffect(() => {
70
- dispatch(queryRelations());
76
+ dispatch(getRelationStats());
71
77
  }, [dispatch]);
72
78
 
73
79
  const onReset = (event) => {
@@ -128,9 +134,7 @@ const RelationsMatrix = (props) => {
128
134
  const rebuildRelationsHandler = (flush = false) => {
129
135
  dispatch(rebuildRelations(flush))
130
136
  .then(() => {
131
- dispatch(queryRelations());
132
- })
133
- .then(() => {
137
+ dispatch(getRelationStats());
134
138
  dispatch(queryRelations(null, true, 'broken'));
135
139
  })
136
140
  .then(() => {
@@ -443,7 +447,9 @@ const RelationsMatrix = (props) => {
443
447
  ) : null}
444
448
  </div>
445
449
  ) : (
446
- <p>{relationsListError?.message}</p>
450
+ <p>
451
+ <b>{relationsListError?.type}</b> {relationsListError?.message}
452
+ </p>
447
453
  )}
448
454
  </Tab.Pane>
449
455
  ),
@@ -452,68 +458,62 @@ const RelationsMatrix = (props) => {
452
458
  menuItem: intl.formatMessage(messages.fixRelations),
453
459
  pane: (
454
460
  <Tab.Pane attached={true} key="rebuild">
455
- {brokenRelations && Object.keys(brokenRelations).length > 0 ? (
456
- <div>
457
- {can_fix_relations ? (
458
- <React.Fragment>
459
- <Divider hidden />
460
- <h2>
461
- {capitalize(intl.formatMessage(messages.rebuildRelations))}
462
- </h2>
461
+ <div>
462
+ {!(brokenRelations && Object.keys(brokenRelations).length > 0) && (
463
+ <div>
464
+ <FormattedMessage
465
+ id="No broken relations found."
466
+ defaultMessage="No broken relations found."
467
+ />
468
+ </div>
469
+ )}
470
+ {can_fix_relations ? (
471
+ <React.Fragment>
472
+ <Divider hidden />
473
+ <h2>
474
+ {capitalize(intl.formatMessage(messages.rebuildRelations))}
475
+ </h2>
463
476
 
464
- <Button.Group>
465
- <Button
466
- primary
467
- onClick={() => rebuildRelationsHandler(false)}
468
- content={intl.formatMessage(messages.rebuildRelations)}
469
- aria-label={intl.formatMessage(messages.rebuildRelations)}
470
- />
471
- </Button.Group>
477
+ <Button.Group>
478
+ <Button
479
+ primary
480
+ onClick={() => rebuildRelationsHandler(false)}
481
+ content={intl.formatMessage(messages.rebuildRelations)}
482
+ aria-label={intl.formatMessage(messages.rebuildRelations)}
483
+ />
484
+ </Button.Group>
472
485
 
473
- <Divider hidden />
474
- <h2>
475
- {capitalize(
476
- intl.formatMessage(messages.flushAndRebuildRelations),
486
+ <Divider hidden />
487
+ <h2>
488
+ {capitalize(
489
+ intl.formatMessage(messages.flushAndRebuildRelations),
490
+ )}
491
+ </h2>
492
+ <div
493
+ dangerouslySetInnerHTML={{
494
+ __html: intl.formatMessage(
495
+ messages.flushAndRebuildRelationsHints,
496
+ ),
497
+ }}
498
+ />
499
+ <Divider hidden />
500
+ <Button.Group>
501
+ <Button
502
+ secondary
503
+ color="red"
504
+ onClick={() => rebuildRelationsHandler(true)}
505
+ content={intl.formatMessage(
506
+ messages.flushAndRebuildRelations,
477
507
  )}
478
- </h2>
479
- <ul>
480
- <li>
481
- Regenerate intIds (tokens of relations in relation
482
- catalog)
483
- </li>
484
- <li>Rebuild relations</li>
485
- </ul>
486
- <p>Check the log for details!</p>
487
- <p>
488
- <b>Warning</b>: If you have add-ons relying on intIds, you
489
- should not flush them.
490
- </p>
491
- <Divider hidden />
492
- <Button.Group>
493
- <Button
494
- secondary
495
- color="red"
496
- onClick={() => rebuildRelationsHandler(true)}
497
- content={intl.formatMessage(
498
- messages.flushAndRebuildRelations,
499
- )}
500
- aria-label={intl.formatMessage(
501
- messages.flushAndRebuildRelations,
502
- )}
503
- />
504
- </Button.Group>
505
- </React.Fragment>
506
- ) : null}
507
- <BrokenRelations />
508
- </div>
509
- ) : (
510
- <div>
511
- <FormattedMessage
512
- id="No broken relations found."
513
- defaultMessage="No broken relations found."
514
- />
515
- </div>
516
- )}
508
+ aria-label={intl.formatMessage(
509
+ messages.flushAndRebuildRelations,
510
+ )}
511
+ />
512
+ </Button.Group>
513
+ </React.Fragment>
514
+ ) : null}
515
+ <BrokenRelations />
516
+ </div>
517
517
  </Tab.Pane>
518
518
  ),
519
519
  },
@@ -155,15 +155,8 @@ class AddRule extends Component {
155
155
  * @returns {undefined}
156
156
  */
157
157
  handleAdd() {
158
- const {
159
- title,
160
- description,
161
- event,
162
- cascading,
163
- stop,
164
- enabled,
165
- invalidForm,
166
- } = this.state;
158
+ const { title, description, event, cascading, stop, enabled, invalidForm } =
159
+ this.state;
167
160
  const data = { title, description, event, cascading, enabled, stop };
168
161
  if (!invalidForm) {
169
162
  this.props.addNewRule(getBaseUrl(this.props.pathname), data);
@@ -179,7 +172,7 @@ class AddRule extends Component {
179
172
  const { title, description, event, cascading, stop, enabled } = this.state;
180
173
  const triggeringEvents =
181
174
  this.props.events?.items && this.props.events?.items.length > 0
182
- ? this.props.events?.items.map((event) => [event.title, event.token])
175
+ ? this.props.events?.items.map((event) => [event.token, event.title])
183
176
  : '';
184
177
 
185
178
  return (
@@ -209,7 +209,7 @@ class EditRule extends Component {
209
209
 
210
210
  const triggeringEvents =
211
211
  this.props.events?.items && this.props.events?.items.length > 0
212
- ? this.props.events?.items.map((event) => [event.title, event.token])
212
+ ? this.props.events?.items.map((event) => [event.token, event.title])
213
213
  : '';
214
214
 
215
215
  return (
@@ -141,15 +141,12 @@ class UndoControlpanel extends Component {
141
141
  this.onNext = this.onNext.bind(this);
142
142
  this.onUndo = this.onUndo.bind(this);
143
143
  this.handleTableVisiblity = this.handleTableVisiblity.bind(this);
144
- this.handleNotSortedNextPrevButtons = this.handleNotSortedNextPrevButtons.bind(
145
- this,
146
- );
147
- this.handleSortedNextPrevButtons = this.handleSortedNextPrevButtons.bind(
148
- this,
149
- );
150
- this.checkTransactionsUndoneStatus = this.checkTransactionsUndoneStatus.bind(
151
- this,
152
- );
144
+ this.handleNotSortedNextPrevButtons =
145
+ this.handleNotSortedNextPrevButtons.bind(this);
146
+ this.handleSortedNextPrevButtons =
147
+ this.handleSortedNextPrevButtons.bind(this);
148
+ this.checkTransactionsUndoneStatus =
149
+ this.checkTransactionsUndoneStatus.bind(this);
153
150
  }
154
151
 
155
152
  /**