@plone/volto 17.0.0-alpha.9 → 17.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/.eslintrc +26 -3
  2. package/CHANGELOG.md +774 -5
  3. package/CONTRIBUTING.md +5 -1
  4. package/README.md +12 -9
  5. package/RELEASING.md +5 -5
  6. package/addon-registry.js +10 -1
  7. package/create-addons-loader.js +1 -1
  8. package/cypress/support/commands.js +70 -14
  9. package/cypress/support/e2e.js +1 -2
  10. package/cypress/support/volto-slate.js +4 -5
  11. package/cypress.config.js +1 -0
  12. package/docker-compose.yml +1 -1
  13. package/locales/ca/LC_MESSAGES/volto.po +281 -53
  14. package/locales/ca.json +1 -1
  15. package/locales/de/LC_MESSAGES/volto.po +289 -61
  16. package/locales/de.json +1 -1
  17. package/locales/en/LC_MESSAGES/volto.po +279 -51
  18. package/locales/en.json +1 -1
  19. package/locales/es/LC_MESSAGES/volto.po +318 -90
  20. package/locales/es.json +1 -1
  21. package/locales/eu/LC_MESSAGES/volto.po +280 -52
  22. package/locales/eu.json +1 -1
  23. package/locales/fi/LC_MESSAGES/volto.po +280 -52
  24. package/locales/fi.json +1 -1
  25. package/locales/fr/LC_MESSAGES/volto.po +281 -53
  26. package/locales/fr.json +1 -1
  27. package/locales/it/LC_MESSAGES/volto.po +474 -246
  28. package/locales/it.json +1 -1
  29. package/locales/ja/LC_MESSAGES/volto.po +280 -52
  30. package/locales/ja.json +1 -1
  31. package/locales/nl/LC_MESSAGES/volto.po +281 -53
  32. package/locales/nl.json +1 -1
  33. package/locales/pt/LC_MESSAGES/volto.po +281 -53
  34. package/locales/pt.json +1 -1
  35. package/locales/pt_BR/LC_MESSAGES/volto.po +314 -86
  36. package/locales/pt_BR.json +1 -1
  37. package/locales/ro/LC_MESSAGES/volto.po +281 -53
  38. package/locales/ro.json +1 -1
  39. package/locales/volto.pot +284 -52
  40. package/locales/zh_CN/LC_MESSAGES/volto.po +281 -53
  41. package/locales/zh_CN.json +1 -1
  42. package/package.json +44 -34
  43. package/packages/volto-slate/package.json +1 -1
  44. package/packages/volto-slate/src/actions/index.js +1 -1
  45. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  46. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  47. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  48. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  49. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  50. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  51. package/packages/volto-slate/src/editor/config.jsx +5 -4
  52. package/packages/volto-slate/src/editor/index.js +4 -4
  53. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  54. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  55. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  56. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  57. package/packages/volto-slate/src/editor/render.jsx +77 -8
  58. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  59. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  60. package/packages/volto-slate/src/index.js +2 -2
  61. package/packages/volto-slate/src/utils/blocks.js +7 -0
  62. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  63. package/razzle.config.js +4 -6
  64. package/src/actions/index.js +4 -0
  65. package/src/actions/navroot/navroot.js +16 -0
  66. package/src/actions/navroot/navroot.test.js +15 -0
  67. package/src/actions/relations/rebuild.js +7 -7
  68. package/src/actions/relations/relations.js +17 -0
  69. package/src/actions/site/site.js +16 -0
  70. package/src/actions/site/site.test.js +15 -0
  71. package/src/actions/userSession/userSession.js +17 -1
  72. package/src/components/index.js +194 -192
  73. package/src/components/manage/Actions/Actions.jsx +133 -243
  74. package/src/components/manage/Add/Add.jsx +7 -8
  75. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  76. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  77. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  78. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  79. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  80. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  81. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  82. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  83. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  84. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  85. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  86. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  87. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  88. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  89. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  90. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  91. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  92. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  93. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  94. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  95. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  96. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  97. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  98. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  99. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  100. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  101. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  102. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  103. package/src/components/manage/Blocks/Image/schema.js +17 -10
  104. package/src/components/manage/Blocks/Image/utils.js +14 -0
  105. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  106. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  107. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  108. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  109. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  110. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  111. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  112. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  113. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  114. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  115. package/src/components/manage/Blocks/Listing/getAsyncData.js +3 -5
  116. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +27 -17
  117. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  118. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  119. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  120. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +3 -2
  121. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  122. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  123. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  124. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  125. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  126. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  127. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  128. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +70 -36
  129. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  130. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  131. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  132. package/src/components/manage/Blocks/Search/schema.js +29 -14
  133. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  134. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  135. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  136. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  137. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  138. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  139. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  140. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  141. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  142. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  143. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  144. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  145. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  146. package/src/components/manage/Blocks/Video/View.test.jsx +1 -1
  147. package/src/components/manage/Contents/Contents.jsx +285 -114
  148. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  149. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  150. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  151. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  152. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  153. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  154. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  155. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  156. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  157. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  158. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +38 -13
  159. package/src/components/manage/Controlpanels/Relations/Relations.jsx +5 -5
  160. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +8 -7
  161. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +68 -68
  162. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  163. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  164. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  165. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  166. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  167. package/src/components/manage/Delete/Delete.jsx +96 -171
  168. package/src/components/manage/Diff/DiffField.jsx +25 -1
  169. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  170. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  171. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  172. package/src/components/manage/Form/Form.jsx +7 -6
  173. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  174. package/src/components/manage/History/History.jsx +11 -1
  175. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  176. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  177. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  178. package/src/components/manage/Messages/Messages.jsx +32 -99
  179. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  180. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  181. package/src/components/manage/Sharing/Sharing.jsx +80 -22
  182. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  183. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  184. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  185. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  186. package/src/components/manage/TemplateChooser/template.svg +10 -0
  187. package/src/components/manage/Toast/Toast.jsx +1 -1
  188. package/src/components/manage/Toolbar/More.jsx +17 -2
  189. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  190. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  191. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  192. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  193. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  194. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  195. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  196. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  197. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  198. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  199. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  200. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  201. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  202. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  203. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +3 -10
  204. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  205. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  206. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  207. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  208. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  209. package/src/components/manage/Widgets/SelectWidget.jsx +15 -1
  210. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  211. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  212. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  213. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  214. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  215. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  216. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  217. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  218. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  219. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  220. package/src/components/theme/Comments/Comments.jsx +268 -380
  221. package/src/components/theme/Component/Component.jsx +1 -1
  222. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  223. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  224. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  225. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  226. package/src/components/theme/Error/ServerError.jsx +29 -0
  227. package/src/components/theme/Header/Header.jsx +37 -63
  228. package/src/components/theme/Header/Header.test.jsx +18 -0
  229. package/src/components/theme/Image/Image.jsx +96 -0
  230. package/src/components/theme/Image/Image.test.jsx +125 -0
  231. package/src/components/theme/Login/Login.jsx +160 -243
  232. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  233. package/src/components/theme/Logo/Logo.jsx +35 -27
  234. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  235. package/src/components/theme/Logout/Logout.jsx +36 -83
  236. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  237. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -5
  238. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +95 -170
  239. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  240. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  241. package/src/components/theme/Register/Register.jsx +2 -4
  242. package/src/components/theme/Search/SearchTags.jsx +30 -60
  243. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  244. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  245. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  246. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  247. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  248. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  249. package/src/components/theme/View/AlbumView.jsx +21 -16
  250. package/src/components/theme/View/EventView.jsx +36 -25
  251. package/src/components/theme/View/FileView.jsx +23 -18
  252. package/src/components/theme/View/ImageView.jsx +40 -32
  253. package/src/components/theme/View/ImageView.test.jsx +4 -0
  254. package/src/components/theme/View/LinkView.jsx +53 -78
  255. package/src/components/theme/View/ListingView.jsx +36 -28
  256. package/src/components/theme/View/NewsItemView.jsx +16 -17
  257. package/src/components/theme/View/RenderBlocks.jsx +56 -27
  258. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  259. package/src/components/theme/View/SummaryView.jsx +49 -39
  260. package/src/components/theme/View/TabularView.jsx +59 -53
  261. package/src/components/theme/View/View.jsx +2 -0
  262. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  263. package/src/config/Blocks.jsx +46 -0
  264. package/src/config/Components.jsx +3 -1
  265. package/src/config/ControlPanels.js +0 -1
  266. package/src/config/Loadables.jsx +1 -1
  267. package/src/config/NonContentRoutes.jsx +1 -0
  268. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  269. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  270. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  271. package/src/config/RichTextEditor/Styles.jsx +1 -1
  272. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  273. package/src/config/RichTextEditor/index.js +2 -3
  274. package/src/config/Views.jsx +6 -4
  275. package/src/config/Widgets.jsx +3 -0
  276. package/src/config/index.js +36 -2
  277. package/src/config/server.js +2 -0
  278. package/src/constants/ActionTypes.js +4 -0
  279. package/src/constants/Indexes.js +3 -1
  280. package/src/express-middleware/devproxy.js +1 -1
  281. package/src/express-middleware/files.js +11 -9
  282. package/src/express-middleware/images.js +12 -5
  283. package/src/express-middleware/ok.js +16 -0
  284. package/src/express-middleware/robotstxt.js +1 -1
  285. package/src/express-middleware/sitemap.js +1 -1
  286. package/src/express-middleware/static.js +3 -3
  287. package/src/helpers/Blocks/Blocks.js +52 -6
  288. package/src/helpers/Blocks/Blocks.test.js +92 -13
  289. package/src/helpers/Extensions/index.js +2 -1
  290. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  291. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  292. package/src/helpers/FormValidation/FormValidation.js +37 -7
  293. package/src/helpers/FormValidation/FormValidation.test.js +32 -0
  294. package/src/helpers/Html/Html.jsx +2 -8
  295. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  296. package/src/helpers/MessageLabels/MessageLabels.js +39 -4
  297. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  298. package/src/helpers/Site/index.js +21 -0
  299. package/src/helpers/Url/Url.js +22 -1
  300. package/src/helpers/Url/Url.test.js +41 -0
  301. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  302. package/src/helpers/Utils/Utils.js +35 -0
  303. package/src/helpers/Utils/Utils.test.js +13 -0
  304. package/src/helpers/Utils/usePagination.js +67 -14
  305. package/src/helpers/Utils/usePagination.test.js +115 -0
  306. package/src/helpers/index.js +15 -8
  307. package/src/hooks/client/useClient.js +11 -0
  308. package/src/hooks/clipboard/useClipboard.js +26 -0
  309. package/src/hooks/index.js +2 -0
  310. package/src/icons/grid-block.svg +11 -0
  311. package/src/middleware/api.js +203 -173
  312. package/src/middleware/blacklistRoutes.js +25 -22
  313. package/src/middleware/index.js +2 -2
  314. package/src/middleware/storeProtectLoadUtils.js +61 -62
  315. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  316. package/src/reducers/actions/actions.js +7 -5
  317. package/src/reducers/actions/actions.test.js +70 -0
  318. package/src/reducers/content/content.test.js +4 -4
  319. package/src/reducers/index.js +4 -0
  320. package/src/reducers/navigation/navigation.js +5 -5
  321. package/src/reducers/navigation/navigation.test.js +30 -0
  322. package/src/reducers/navroot/navroot.js +79 -0
  323. package/src/reducers/navroot/navroot.test.js +110 -0
  324. package/src/reducers/relations/relations.js +74 -46
  325. package/src/reducers/site/site.js +51 -0
  326. package/src/reducers/site/site.test.js +67 -0
  327. package/src/reducers/userSession/userSession.js +15 -1
  328. package/src/registry.js +2 -2
  329. package/src/routes.js +9 -0
  330. package/src/server.jsx +9 -0
  331. package/src/start-server.js +6 -2
  332. package/src/storybook.jsx +24 -38
  333. package/test-setup-config.js +11 -1
  334. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  335. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  336. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  337. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  338. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  339. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  340. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  341. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  342. package/theme/themes/pastanaga/extras/contents.less +6 -1
  343. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  344. package/theme/themes/pastanaga/extras/grid.less +427 -0
  345. package/theme/themes/pastanaga/extras/login.less +3 -0
  346. package/theme/themes/pastanaga/extras/main.less +14 -7
  347. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  348. package/theme/themes/pastanaga/extras/search.less +7 -1
  349. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  350. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  351. package/theme/themes/pastanaga/extras/toc.less +29 -0
  352. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  353. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  354. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  355. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  356. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  357. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  358. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  359. package/tsconfig.json +33 -0
  360. package/webpack-plugins/webpack-less-plugin.js +19 -0
  361. package/.yarn/install-state.gz +0 -0
  362. package/.yarn/releases/yarn-3.2.3.cjs +0 -783
  363. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  364. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  365. package/src/components/theme/Header/Header.md +0 -27
@@ -1,15 +1,10 @@
1
- /**
2
- * Contents tags modal.
3
- * @module components/manage/Contents/ContentsTagsModal
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import React, { useCallback, useEffect, useMemo } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
3
+ import { useDispatch, useSelector } from 'react-redux';
10
4
  import { map } from 'lodash';
11
- import { defineMessages, injectIntl } from 'react-intl';
5
+ import { defineMessages, useIntl } from 'react-intl';
12
6
 
7
+ import { usePrevious } from '@plone/volto/helpers';
13
8
  import { updateContent } from '@plone/volto/actions';
14
9
  import { ModalForm } from '@plone/volto/components';
15
10
 
@@ -32,133 +27,91 @@ const messages = defineMessages({
32
27
  },
33
28
  });
34
29
 
35
- /**
36
- * ContentsTagsModal class.
37
- * @class ContentsTagsModal
38
- * @extends Component
39
- */
40
- class ContentsTagsModal extends Component {
41
- /**
42
- * Property types.
43
- * @property {Object} propTypes Property types.
44
- * @static
45
- */
46
- static propTypes = {
47
- updateContent: PropTypes.func.isRequired,
48
- items: PropTypes.arrayOf(
49
- PropTypes.shape({
50
- subjects: PropTypes.arrayOf(PropTypes.string),
51
- url: PropTypes.string,
52
- }),
53
- ).isRequired,
54
- request: PropTypes.shape({
55
- loading: PropTypes.bool,
56
- loaded: PropTypes.bool,
57
- }).isRequired,
58
- open: PropTypes.bool.isRequired,
59
- onOk: PropTypes.func.isRequired,
60
- onCancel: PropTypes.func.isRequired,
61
- };
62
-
63
- /**
64
- * Constructor
65
- * @method constructor
66
- * @param {Object} props Component properties
67
- * @constructs ContentsUploadModal
68
- */
69
- constructor(props) {
70
- super(props);
71
- this.onSubmit = this.onSubmit.bind(this);
72
- }
30
+ const ContentsTagsModal = (props) => {
31
+ const { items, open, onCancel, onOk } = props;
32
+ const intl = useIntl();
33
+ const dispatch = useDispatch();
34
+ const request = useSelector((state) => state.content.update);
35
+ const prevrequestloading = usePrevious(request.loading);
73
36
 
74
- /**
75
- * Component will receive props
76
- * @method componentWillReceiveProps
77
- * @param {Object} nextProps Next properties
78
- * @returns {undefined}
79
- */
80
- UNSAFE_componentWillReceiveProps(nextProps) {
81
- if (this.props.request.loading && nextProps.request.loaded) {
82
- this.props.onOk();
37
+ useEffect(() => {
38
+ if (prevrequestloading && request.loaded) {
39
+ onOk();
83
40
  }
84
- }
41
+ }, [onOk, prevrequestloading, request.loaded]);
85
42
 
86
- /**
87
- * Submit handler
88
- * @method onSubmit
89
- * @param {Object} data Form data
90
- * @returns {undefined}
91
- */
92
- onSubmit({ tags_to_add = [], tags_to_remove = [] }) {
93
- this.props.updateContent(
94
- map(this.props.items, (item) => item.url),
95
- map(this.props.items, (item) => ({
96
- subjects: [
97
- ...new Set(
98
- (item.subjects ?? [])
99
- .filter((s) => !tags_to_remove.includes(s))
100
- .concat(tags_to_add),
101
- ),
102
- ],
103
- })),
104
- );
105
- }
43
+ const onSubmit = useCallback(
44
+ ({ tags_to_add = [], tags_to_remove = [] }) => {
45
+ dispatch(
46
+ updateContent(
47
+ map(items, (item) => item.url),
48
+ map(items, (item) => ({
49
+ subjects: [
50
+ ...new Set(
51
+ (item.subjects ?? [])
52
+ .filter((s) => !tags_to_remove.includes(s))
53
+ .concat(tags_to_add),
54
+ ),
55
+ ],
56
+ })),
57
+ ),
58
+ );
59
+ },
60
+ [dispatch, items],
61
+ );
106
62
 
107
- /**
108
- * Render method.
109
- * @method render
110
- * @returns {string} Markup for the component.
111
- */
112
- render() {
113
- const currentSetTags = [
114
- ...new Set(this.props.items.map((item) => item.subjects).flat()),
115
- ];
63
+ const currentSetTags = useMemo(
64
+ () => [...new Set(items.map((item) => item.subjects).flat())],
65
+ [items],
66
+ );
116
67
 
117
- return (
118
- this.props.open && (
119
- <ModalForm
120
- open={this.props.open}
121
- onSubmit={this.onSubmit}
122
- onCancel={this.props.onCancel}
123
- title={this.props.intl.formatMessage(messages.tags)}
124
- schema={{
125
- fieldsets: [
126
- {
127
- id: 'default',
128
- title: this.props.intl.formatMessage(messages.default),
129
- fields: ['tags_to_remove', 'tags_to_add'],
130
- },
131
- ],
132
- properties: {
133
- tags_to_remove: {
134
- type: 'array',
135
- widget: 'array',
136
- title: this.props.intl.formatMessage(messages.tagsToRemove),
137
- choices: currentSetTags.map((tag) => [tag, tag]),
138
- },
139
- tags_to_add: {
140
- type: 'array',
141
- widget: 'token',
142
- title: this.props.intl.formatMessage(messages.tagsToAdd),
143
- items: {
144
- vocabulary: { '@id': 'plone.app.vocabularies.Keywords' },
145
- },
68
+ return (
69
+ open && (
70
+ <ModalForm
71
+ open={open}
72
+ onSubmit={onSubmit}
73
+ onCancel={onCancel}
74
+ title={intl.formatMessage(messages.tags)}
75
+ schema={{
76
+ fieldsets: [
77
+ {
78
+ id: 'default',
79
+ title: intl.formatMessage(messages.default),
80
+ fields: ['tags_to_remove', 'tags_to_add'],
81
+ },
82
+ ],
83
+ properties: {
84
+ tags_to_remove: {
85
+ type: 'array',
86
+ widget: 'array',
87
+ title: intl.formatMessage(messages.tagsToRemove),
88
+ choices: currentSetTags.map((tag) => [tag, tag]),
89
+ },
90
+ tags_to_add: {
91
+ type: 'array',
92
+ widget: 'token',
93
+ title: intl.formatMessage(messages.tagsToAdd),
94
+ items: {
95
+ vocabulary: { '@id': 'plone.app.vocabularies.Keywords' },
146
96
  },
147
97
  },
148
- required: [],
149
- }}
150
- />
151
- )
152
- );
153
- }
154
- }
98
+ },
99
+ required: [],
100
+ }}
101
+ />
102
+ )
103
+ );
104
+ };
155
105
 
156
- export default compose(
157
- injectIntl,
158
- connect(
159
- (state) => ({
160
- request: state.content.update,
106
+ ContentsTagsModal.propTypes = {
107
+ items: PropTypes.arrayOf(
108
+ PropTypes.shape({
109
+ subjects: PropTypes.arrayOf(PropTypes.string),
110
+ url: PropTypes.string,
161
111
  }),
162
- { updateContent },
163
- ),
164
- )(ContentsTagsModal);
112
+ ).isRequired,
113
+ open: PropTypes.bool.isRequired,
114
+ onOk: PropTypes.func.isRequired,
115
+ onCancel: PropTypes.func.isRequired,
116
+ };
117
+ export default ContentsTagsModal;
@@ -0,0 +1,68 @@
1
+ import { injectIntl } from 'react-intl';
2
+ import React from 'react';
3
+ import ContentsTagsModalComponent from './ContentsTagsModal';
4
+ import { RealStoreWrapper as Wrapper } from '@plone/volto/storybook';
5
+ import { bool } from 'prop-types';
6
+
7
+ const IntlContentTagsModalComponent = injectIntl(ContentsTagsModalComponent);
8
+
9
+ function StoryComponent(args) {
10
+ return (
11
+ <Wrapper
12
+ customStore={{
13
+ content: {
14
+ update: {
15
+ loading: false,
16
+ loaded: true,
17
+ },
18
+ },
19
+ intl: {
20
+ locale: 'en',
21
+ messages: {},
22
+ },
23
+ }}
24
+ >
25
+ <div id="toolbar" style={{ display: 'none' }} />
26
+ <IntlContentTagsModalComponent
27
+ {...args}
28
+ onOk={() => {}}
29
+ onCancel={() => {}}
30
+ items={[
31
+ {
32
+ ...args,
33
+ url: '/blog',
34
+ },
35
+ ]}
36
+ />
37
+ </Wrapper>
38
+ );
39
+ }
40
+
41
+ export const ContentTagsModal = StoryComponent.bind({});
42
+
43
+ ContentTagsModal.args = {
44
+ subjects: ['plone 6 ', 'plone 5', 'plone'],
45
+ open: true,
46
+ };
47
+
48
+ export default {
49
+ title: 'Public components/Contents/Content Tags Modal',
50
+ component: ContentTagsModal,
51
+ decorators: [
52
+ (Story) => (
53
+ <div className="ui segment form attached" style={{ width: '400px' }}>
54
+ <Story />
55
+ </div>
56
+ ),
57
+ ],
58
+ argTypes: {
59
+ subjects: {
60
+ context: 'json',
61
+ description: 'Added tags',
62
+ },
63
+ open: {
64
+ context: bool,
65
+ description: 'open/close modal',
66
+ },
67
+ },
68
+ };
@@ -25,6 +25,7 @@ import { readAsDataURL } from 'promise-file-reader';
25
25
  import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
26
26
  import { FormattedRelativeDate } from '@plone/volto/components';
27
27
  import { createContent } from '@plone/volto/actions';
28
+ import { validateFileUploadSize } from '@plone/volto/helpers';
28
29
 
29
30
  const Dropzone = loadable(() => import('react-dropzone'));
30
31
 
@@ -34,8 +35,7 @@ const messages = defineMessages({
34
35
  defaultMessage: 'Cancel',
35
36
  },
36
37
  upload: {
37
- id:
38
- '{count, plural, one {Upload {count} file} other {Upload {count} files}}',
38
+ id: '{count, plural, one {Upload {count} file} other {Upload {count} files}}',
39
39
  defaultMessage:
40
40
  '{count, plural, one {Upload {count} file} other {Upload {count} files}}',
41
41
  },
@@ -121,14 +121,18 @@ class ContentsUploadModal extends Component {
121
121
  * @returns {undefined}
122
122
  */
123
123
  onDrop = async (files) => {
124
+ const validFiles = [];
124
125
  for (let i = 0; i < files.length; i++) {
125
- await readAsDataURL(files[i]).then((data) => {
126
- const fields = data.match(/^data:(.*);(.*),(.*)$/);
127
- files[i].preview = fields[0];
128
- });
126
+ if (validateFileUploadSize(files[i], this.props.intl.formatMessage)) {
127
+ await readAsDataURL(files[i]).then((data) => {
128
+ const fields = data.match(/^data:(.*);(.*),(.*)$/);
129
+ files[i].preview = fields[0];
130
+ });
131
+ validFiles.push(files[i]);
132
+ }
129
133
  }
130
134
  this.setState({
131
- files: concat(this.state.files, files),
135
+ files: concat(this.state.files, validFiles),
132
136
  });
133
137
  };
134
138
 
@@ -1,15 +1,10 @@
1
- /**
2
- * Contents workflow modal.
3
- * @module components/manage/Contents/ContentsWorkflowModal
4
- */
5
-
6
- import React, { Component } from 'react';
1
+ import React, { useCallback, useEffect } from 'react';
7
2
  import PropTypes from 'prop-types';
8
- import { connect } from 'react-redux';
9
- import { compose } from 'redux';
3
+ import { shallowEqual, useDispatch, useSelector } from 'react-redux';
10
4
  import { concat, filter, last, map, uniqBy } from 'lodash';
11
- import { defineMessages, injectIntl } from 'react-intl';
5
+ import { defineMessages, useIntl } from 'react-intl';
12
6
 
7
+ import { usePrevious } from '@plone/volto/helpers';
13
8
  import { getWorkflow, transitionWorkflow } from '@plone/volto/actions';
14
9
  import { ModalForm } from '@plone/volto/components';
15
10
 
@@ -37,158 +32,96 @@ const messages = defineMessages({
37
32
  },
38
33
  });
39
34
 
40
- /**
41
- * ContentsWorkflowModal class.
42
- * @class ContentsWorkflowModal
43
- * @extends Component
44
- */
45
- class ContentsWorkflowModal extends Component {
46
- /**
47
- * Property types.
48
- * @property {Object} propTypes Property types.
49
- * @static
50
- */
51
- static propTypes = {
52
- getWorkflow: PropTypes.func.isRequired,
53
- transitionWorkflow: PropTypes.func.isRequired,
54
- items: PropTypes.arrayOf(PropTypes.string).isRequired,
55
- request: PropTypes.shape({
56
- loading: PropTypes.bool,
57
- loaded: PropTypes.bool,
58
- }).isRequired,
59
- workflows: PropTypes.arrayOf(
60
- PropTypes.shape({
61
- transition: PropTypes.shape({
62
- '@id': PropTypes.string,
63
- title: PropTypes.string,
64
- }),
65
- }),
66
- ).isRequired,
67
- open: PropTypes.bool.isRequired,
68
- onOk: PropTypes.func.isRequired,
69
- onCancel: PropTypes.func.isRequired,
70
- };
71
-
72
- /**
73
- * Constructor
74
- * @method constructor
75
- * @param {Object} props Component properties
76
- * @constructs ContentsUploadModal
77
- */
78
- constructor(props) {
79
- super(props);
80
- this.onSubmit = this.onSubmit.bind(this);
81
- }
35
+ const ContentsWorkflowModal = (props) => {
36
+ const { onOk, items, open, onCancel } = props;
37
+ const intl = useIntl();
38
+ const dispatch = useDispatch();
39
+ const request = useSelector((state) => state.workflow.transition);
40
+ const workflows = useSelector(
41
+ (state) => state.workflow.multiple,
42
+ shallowEqual,
43
+ );
44
+ const prevrequestloading = usePrevious(request.loading);
82
45
 
83
- componentDidMount() {
84
- this.props.getWorkflow(this.props.items);
85
- }
46
+ useEffect(() => {
47
+ dispatch(getWorkflow(items));
48
+ }, [dispatch, items]);
86
49
 
87
- /**
88
- * Component will receive props
89
- * @method componentWillReceiveProps
90
- * @param {Object} nextProps Next properties
91
- * @returns {undefined}
92
- */
93
- UNSAFE_componentWillReceiveProps(nextProps) {
94
- if (this.props.request.loading && nextProps.request.loaded) {
95
- this.props.onOk();
50
+ useEffect(() => {
51
+ if (prevrequestloading && request.loaded) {
52
+ onOk();
96
53
  }
97
- }
54
+ }, [onOk, prevrequestloading, request.loaded]);
98
55
 
99
- /**
100
- * Submit handler
101
- * @method onSubmit
102
- * @param {string} state New state
103
- * @returns {undefined}
104
- */
105
- onSubmit({ state, include_children }) {
106
- if (!state) {
107
- return;
108
- }
109
-
110
- this.props.transitionWorkflow(
111
- filter(
112
- map(
113
- concat(
114
- ...map(this.props.workflows, (workflow) => workflow.transitions),
56
+ const onSubmit = useCallback(
57
+ ({ state, include_children }) => {
58
+ if (!state) {
59
+ return;
60
+ }
61
+ dispatch(
62
+ transitionWorkflow(
63
+ filter(
64
+ map(
65
+ concat(...map(workflows, (workflow) => workflow.transitions)),
66
+ (item) => item['@id'],
67
+ ),
68
+ (x) => last(x.split('/')) === state,
115
69
  ),
116
- (item) => item['@id'],
70
+ include_children,
117
71
  ),
118
- (x) => last(x.split('/')) === state,
119
- ),
120
- include_children,
121
- );
122
- }
72
+ );
73
+ },
74
+ [dispatch, workflows],
75
+ );
123
76
 
124
- /**
125
- * Render method.
126
- * @method render
127
- * @returns {string} Markup for the component.
128
- */
129
- render() {
130
- return (
131
- this.props.open &&
132
- this.props.workflows.length > 0 && (
133
- <ModalForm
134
- open={this.props.open}
135
- loading={this.props.request.loading}
136
- loadingMessage={this.props.intl.formatMessage(
137
- messages.loadingMessage,
138
- )}
139
- onSubmit={this.onSubmit}
140
- onCancel={this.props.onCancel}
141
- title={this.props.intl.formatMessage(messages.stateTitle)}
142
- schema={{
143
- fieldsets: [
144
- {
145
- id: 'default',
146
- title: this.props.intl.formatMessage(messages.default),
147
- fields: ['state', 'include_children'],
148
- },
149
- ],
150
- properties: {
151
- state: {
152
- description: this.props.intl.formatMessage(
153
- messages.stateDescription,
154
- ),
155
- title: this.props.intl.formatMessage(messages.stateTitle),
156
- type: 'string',
157
- choices: map(
158
- uniqBy(
159
- concat(
160
- ...map(
161
- this.props.workflows,
162
- (workflow) => workflow.transitions,
163
- ),
164
- ),
165
- (x) => x.title,
166
- ),
167
- (y) => [last(y['@id'].split('/')), y.title],
168
- ),
169
- },
170
- include_children: {
171
- title: this.props.intl.formatMessage(
172
- messages.includeChildrenTitle,
77
+ return (
78
+ open &&
79
+ workflows.length > 0 && (
80
+ <ModalForm
81
+ open={open}
82
+ loading={request.loading}
83
+ loadingMessage={intl.formatMessage(messages.loadingMessage)}
84
+ onSubmit={onSubmit}
85
+ onCancel={onCancel}
86
+ title={intl.formatMessage(messages.stateTitle)}
87
+ schema={{
88
+ fieldsets: [
89
+ {
90
+ id: 'default',
91
+ title: intl.formatMessage(messages.default),
92
+ fields: ['state', 'include_children'],
93
+ },
94
+ ],
95
+ properties: {
96
+ state: {
97
+ description: intl.formatMessage(messages.stateDescription),
98
+ title: intl.formatMessage(messages.stateTitle),
99
+ type: 'string',
100
+ choices: map(
101
+ uniqBy(
102
+ concat(...map(workflows, (workflow) => workflow.transitions)),
103
+ (x) => x.title,
173
104
  ),
174
- type: 'boolean',
175
- },
105
+ (y) => [last(y['@id'].split('/')), y.title],
106
+ ),
176
107
  },
177
- required: [],
178
- }}
179
- />
180
- )
181
- );
182
- }
183
- }
108
+ include_children: {
109
+ title: intl.formatMessage(messages.includeChildrenTitle),
110
+ type: 'boolean',
111
+ },
112
+ },
113
+ required: [],
114
+ }}
115
+ />
116
+ )
117
+ );
118
+ };
119
+
120
+ ContentsWorkflowModal.propTypes = {
121
+ items: PropTypes.arrayOf(PropTypes.string).isRequired,
122
+ open: PropTypes.bool.isRequired,
123
+ onOk: PropTypes.func.isRequired,
124
+ onCancel: PropTypes.func.isRequired,
125
+ };
184
126
 
185
- export default compose(
186
- injectIntl,
187
- connect(
188
- (state) => ({
189
- request: state.workflow.transition,
190
- workflows: state.workflow.multiple,
191
- }),
192
- { getWorkflow, transitionWorkflow },
193
- ),
194
- )(ContentsWorkflowModal);
127
+ export default ContentsWorkflowModal;
@@ -185,12 +185,8 @@ class Aliases extends Component {
185
185
  }
186
186
  }
187
187
  if (this.props.aliases.add.loading && nextProps.aliases.add.loaded) {
188
- const {
189
- filterQuery,
190
- filterType,
191
- createdBefore,
192
- itemsPerPage,
193
- } = this.state;
188
+ const { filterQuery, filterType, createdBefore, itemsPerPage } =
189
+ this.state;
194
190
 
195
191
  this.props.getAliases(getBaseUrl(this.props.pathname), {
196
192
  query: filterQuery,
@@ -212,12 +208,8 @@ class Aliases extends Component {
212
208
  }
213
209
  }
214
210
  if (this.props.aliases.remove.loading && nextProps.aliases.remove.loaded) {
215
- const {
216
- filterQuery,
217
- filterType,
218
- createdBefore,
219
- itemsPerPage,
220
- } = this.state;
211
+ const { filterQuery, filterType, createdBefore, itemsPerPage } =
212
+ this.state;
221
213
 
222
214
  this.props.getAliases(getBaseUrl(this.props.pathname), {
223
215
  query: filterQuery,