@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,21 +1,14 @@
1
- /**
2
- * Delete container.
3
- * @module components/manage/Delete/Delete
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import PropTypes from 'prop-types';
8
- import { Helmet } from '@plone/volto/helpers';
9
- import { connect } from 'react-redux';
10
- import { compose } from 'redux';
11
- import { withRouter } from 'react-router-dom';
1
+ import { useEffect, useState } from 'react';
2
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
3
+ import { useHistory, useLocation } from 'react-router-dom';
12
4
  import { Portal } from 'react-portal';
13
5
  import { Button, Container, List, Segment } from 'semantic-ui-react';
14
- import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
6
+ import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
15
7
  import qs from 'query-string';
16
8
 
17
- import { deleteContent, getContent } from '@plone/volto/actions';
18
9
  import { Toolbar } from '@plone/volto/components';
10
+ import { Helmet, usePrevious } from '@plone/volto/helpers';
11
+ import { deleteContent, getContent } from '@plone/volto/actions';
19
12
 
20
13
  const messages = defineMessages({
21
14
  delete: {
@@ -32,172 +25,104 @@ const messages = defineMessages({
32
25
  },
33
26
  });
34
27
 
35
- /**
36
- * Delete container class.
37
- * @class Delete
38
- * @extends Component
39
- */
40
- class Delete extends Component {
41
- /**
42
- * Property types.
43
- * @property {Object} propTypes Property types.
44
- * @static
45
- */
46
- static propTypes = {
47
- deleteContent: PropTypes.func.isRequired,
48
- getContent: PropTypes.func.isRequired,
49
- deleteRequest: PropTypes.shape({
50
- loading: PropTypes.bool,
51
- loaded: PropTypes.bool,
52
- }).isRequired,
53
- pathname: PropTypes.string.isRequired,
54
- content: PropTypes.shape({
55
- title: PropTypes.string,
56
- }),
57
- returnUrl: PropTypes.string,
58
- };
28
+ const Delete = () => {
29
+ const dispatch = useDispatch();
30
+ const intl = useIntl();
31
+ const [isClient, setisClient] = useState(false);
32
+ const { pathname, search } = useLocation();
33
+ const history = useHistory();
34
+ const deleteRequest = useSelector((state) => state.content?.delete);
35
+ const content = useSelector((state) => state.content?.data, shallowEqual);
59
36
 
60
- /**
61
- * Default properties
62
- * @property {Object} defaultProps Default properties.
63
- * @static
64
- */
65
- static defaultProps = {
66
- content: null,
67
- returnUrl: null,
68
- };
37
+ const prevdeleteRequestLoading = usePrevious(deleteRequest.loading);
38
+ const returnUrl = qs.parse(search).return_url;
69
39
 
70
- /**
71
- * Constructor
72
- * @method constructor
73
- * @param {Object} props Component properties
74
- * @constructs WysiwygEditor
75
- */
76
- constructor(props) {
77
- super(props);
78
- this.onCancel = this.onCancel.bind(this);
79
- this.onSubmit = this.onSubmit.bind(this);
80
- this.state = { isClient: false };
81
- }
40
+ useEffect(() => {
41
+ setisClient(true);
42
+ }, []);
43
+
44
+ useEffect(() => {
45
+ dispatch(getContent(pathname.split('/delete')[0]));
46
+ }, [dispatch, pathname]);
82
47
 
83
- /**
84
- * Component will receive props
85
- * @method componentWillReceiveProps
86
- * @param {Object} nextProps Next properties
87
- * @returns {undefined}
88
- */
89
- UNSAFE_componentWillReceiveProps(nextProps) {
90
- if (this.props.deleteRequest.loading && nextProps.deleteRequest.loaded) {
91
- this.props.history.push(
92
- this.props.returnUrl ||
93
- this.props.pathname.replace('/delete', '').replace(/\/[^/]*$/, ''),
48
+ useEffect(() => {
49
+ if (prevdeleteRequestLoading && deleteRequest.loaded) {
50
+ history.push(
51
+ returnUrl || pathname.replace('/delete', '').replace(/\/[^/]*$/, ''),
94
52
  );
95
53
  }
96
- }
97
-
98
- /**
99
- * Component did mount
100
- * @method componentDidMount
101
- * @returns {undefined}
102
- */
103
- componentDidMount() {
104
- this.props.getContent(this.props.pathname.split('/delete')[0]);
105
- this.setState({ isClient: true });
106
- }
54
+ }, [
55
+ history,
56
+ pathname,
57
+ returnUrl,
58
+ prevdeleteRequestLoading,
59
+ deleteRequest.loaded,
60
+ ]);
107
61
 
108
- /**
109
- * Submit handler
110
- * @method onSubmit
111
- * @returns {undefined}
112
- */
113
- onSubmit() {
114
- this.props.deleteContent(this.props.pathname.replace('/delete', ''));
115
- }
62
+ const onSubmit = () => {
63
+ dispatch(deleteContent(pathname.replace('/delete', '')));
64
+ };
116
65
 
117
- /**
118
- * Cancel handler
119
- * @method onCancel
120
- * @returns {undefined}
121
- */
122
- onCancel() {
123
- this.props.history.push(this.props.pathname.replace('/delete', ''));
124
- }
66
+ const onCancel = () => {
67
+ history.push(pathname.replace('/delete', ''));
68
+ };
125
69
 
126
- /**
127
- * Render method.
128
- * @method render
129
- * @returns {string} Markup for the component.
130
- */
131
- render() {
132
- if (this.props.content) {
133
- return (
134
- <div id="page-delete">
135
- <Helmet title={this.props.intl.formatMessage(messages.delete)} />
136
- <Container>
137
- <Segment.Group raised>
138
- <Segment className="primary">
139
- <FormattedMessage
140
- id="Do you really want to delete this item?"
141
- defaultMessage="Do you really want to delete this item?"
142
- />
143
- </Segment>
144
- <Segment attached>
145
- <List bulleted>
146
- <List.Item>{this.props.content.title}</List.Item>
147
- </List>
148
- </Segment>
149
- <Segment className="actions" clearing>
150
- <Button
151
- basic
152
- circular
153
- primary
154
- floated="right"
155
- icon="arrow right"
156
- aria-label={this.props.intl.formatMessage(messages.ok)}
157
- title={this.props.intl.formatMessage(messages.ok)}
158
- size="big"
159
- onClick={this.onSubmit}
160
- />
161
- <Button
162
- basic
163
- circular
164
- secondary
165
- icon="remove"
166
- aria-label={this.props.intl.formatMessage(messages.cancel)}
167
- title={this.props.intl.formatMessage(messages.cancel)}
168
- floated="right"
169
- size="big"
170
- onClick={this.onCancel}
171
- />
172
- </Segment>
173
- </Segment.Group>
174
- </Container>
175
- {this.state.isClient && (
176
- <Portal node={document.getElementById('toolbar')}>
177
- <Toolbar
178
- pathname={this.props.pathname}
179
- hideDefaultViewButtons
180
- inner={<span />}
70
+ if (content) {
71
+ return (
72
+ <div id="page-delete">
73
+ <Helmet title={intl.formatMessage(messages.delete)} />
74
+ <Container>
75
+ <Segment.Group raised>
76
+ <Segment className="primary">
77
+ <FormattedMessage
78
+ id="Do you really want to delete this item?"
79
+ defaultMessage="Do you really want to delete this item?"
181
80
  />
182
- </Portal>
183
- )}
184
- </div>
185
- );
186
- }
187
- return <div />;
81
+ </Segment>
82
+ <Segment attached>
83
+ <List bulleted>
84
+ <List.Item>{content.title}</List.Item>
85
+ </List>
86
+ </Segment>
87
+ <Segment className="actions" clearing>
88
+ <Button
89
+ basic
90
+ circular
91
+ primary
92
+ floated="right"
93
+ icon="arrow right"
94
+ aria-label={intl.formatMessage(messages.ok)}
95
+ title={intl.formatMessage(messages.ok)}
96
+ size="big"
97
+ onClick={onSubmit}
98
+ />
99
+ <Button
100
+ basic
101
+ circular
102
+ secondary
103
+ icon="remove"
104
+ aria-label={intl.formatMessage(messages.cancel)}
105
+ title={intl.formatMessage(messages.cancel)}
106
+ floated="right"
107
+ size="big"
108
+ onClick={onCancel}
109
+ />
110
+ </Segment>
111
+ </Segment.Group>
112
+ </Container>
113
+ {isClient && (
114
+ <Portal node={document.getElementById('toolbar')}>
115
+ <Toolbar
116
+ pathname={pathname}
117
+ hideDefaultViewButtons
118
+ inner={<span />}
119
+ />
120
+ </Portal>
121
+ )}
122
+ </div>
123
+ );
188
124
  }
189
- }
125
+ return <div />;
126
+ };
190
127
 
191
- export default compose(
192
- withRouter,
193
- injectIntl,
194
- connect(
195
- (state, props) => ({
196
- content: state.content.data,
197
- deleteRequest: state.content.delete,
198
- pathname: props.location.pathname,
199
- returnUrl: qs.parse(props.location.search).return_url,
200
- }),
201
- { deleteContent, getContent },
202
- ),
203
- )(Delete);
128
+ export default Delete;
@@ -17,6 +17,7 @@ import { useSelector } from 'react-redux';
17
17
  import { Api } from '@plone/volto/helpers';
18
18
  import configureStore from '@plone/volto/store';
19
19
  import { DefaultView } from '@plone/volto/components/';
20
+ import { serializeNodes } from '@plone/volto-slate/editor/render';
20
21
 
21
22
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
22
23
 
@@ -69,7 +70,7 @@ const DiffField = ({
69
70
  .replace('\u202F', ' '),
70
71
  );
71
72
  break;
72
- case 'json':
73
+ case 'json': {
73
74
  const api = new Api();
74
75
  const history = createBrowserHistory();
75
76
  const store = configureStore(window.__data, history, api);
@@ -90,6 +91,29 @@ const DiffField = ({
90
91
  ),
91
92
  );
92
93
  break;
94
+ }
95
+ case 'slate': {
96
+ const api = new Api();
97
+ const history = createBrowserHistory();
98
+ const store = configureStore(window.__data, history, api);
99
+ parts = diffWords(
100
+ ReactDOMServer.renderToStaticMarkup(
101
+ <Provider store={store}>
102
+ <ConnectedRouter history={history}>
103
+ {serializeNodes(one)}
104
+ </ConnectedRouter>
105
+ </Provider>,
106
+ ),
107
+ ReactDOMServer.renderToStaticMarkup(
108
+ <Provider store={store}>
109
+ <ConnectedRouter history={history}>
110
+ {serializeNodes(two)}
111
+ </ConnectedRouter>
112
+ </Provider>,
113
+ ),
114
+ );
115
+ break;
116
+ }
93
117
  case 'textarea':
94
118
  default:
95
119
  parts = diffWords(one, two);
@@ -53,6 +53,7 @@ const DragDropList = (props) => {
53
53
  const {
54
54
  childList,
55
55
  children,
56
+ direction = 'vertical',
56
57
  onMoveItem,
57
58
  as = 'div',
58
59
  style,
@@ -128,6 +129,7 @@ const DragDropList = (props) => {
128
129
  >
129
130
  <Droppable
130
131
  droppableId={uid}
132
+ direction={direction}
131
133
  renderClone={(provided, snapshot, rubric) => {
132
134
  const index = rubric.source.index;
133
135
  return children({
@@ -160,19 +162,22 @@ const DragDropList = (props) => {
160
162
  </Draggable>
161
163
  ))}
162
164
  {provided.placeholder}
163
- {!isEmpty(placeholderProps) && snapshot.isDraggingOver && (
164
- <div
165
- style={{
166
- position: 'absolute',
167
- top: placeholderProps.clientY,
168
- left: placeholderProps.clientX,
169
- height: placeholderProps.clientHeight,
170
- background: '#eee',
171
- width: placeholderProps.clientWidth,
172
- borderRadius: '3px',
173
- }}
174
- />
175
- )}
165
+ {/* TODO: Fix the ghost problem if horizontal dnd is present */}
166
+ {direction !== 'horizontal' &&
167
+ !isEmpty(placeholderProps) &&
168
+ snapshot.isDraggingOver && (
169
+ <div
170
+ style={{
171
+ position: 'absolute',
172
+ top: placeholderProps.clientY,
173
+ left: placeholderProps.clientX,
174
+ height: placeholderProps.clientHeight,
175
+ background: '#eee',
176
+ width: placeholderProps.clientWidth,
177
+ borderRadius: '3px',
178
+ }}
179
+ />
180
+ )}
176
181
  </AsDomComponent>
177
182
  )}
178
183
  </Droppable>
@@ -5,7 +5,7 @@ import { withVariationSchemaEnhancer } from '@plone/volto/helpers';
5
5
  const EnhancedBlockDataForm = withVariationSchemaEnhancer(InlineForm);
6
6
 
7
7
  export default function BlockDataForm(props) {
8
- const { onChangeBlock, block } = props;
8
+ const { onChangeBlock, block, applySchemaEnhancers = true } = props;
9
9
 
10
10
  if (!onChangeBlock) {
11
11
  // eslint-disable-next-line no-console
@@ -19,8 +19,9 @@ export default function BlockDataForm(props) {
19
19
  [block, onChangeBlock],
20
20
  );
21
21
 
22
+ const Form = applySchemaEnhancers ? EnhancedBlockDataForm : InlineForm;
22
23
  return (
23
- <EnhancedBlockDataForm
24
+ <Form
24
25
  {...props}
25
26
  onChangeFormData={onChangeBlock ? onChangeFormData : undefined}
26
27
  />
@@ -8,23 +8,25 @@ import { Provider } from 'react-intl-redux';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- const withStateManagement = (Component) => ({ ...props }) => {
12
- const [formData, onChangeFormData] = React.useState(props.formData || {});
13
- const onChangeField = (id, value) => {
14
- onChangeFormData({ ...formData, [id]: value });
15
- };
11
+ const withStateManagement =
12
+ (Component) =>
13
+ ({ ...props }) => {
14
+ const [formData, onChangeFormData] = React.useState(props.formData || {});
15
+ const onChangeField = (id, value) => {
16
+ onChangeFormData({ ...formData, [id]: value });
17
+ };
16
18
 
17
- // NOTE: onChangeBlock here is not "really" implemented
19
+ // NOTE: onChangeBlock here is not "really" implemented
18
20
 
19
- return (
20
- <Component
21
- {...props}
22
- onChangeField={onChangeField}
23
- onChangeBlock={(block, data) => onChangeFormData(data)}
24
- formData={formData}
25
- />
26
- );
27
- };
21
+ return (
22
+ <Component
23
+ {...props}
24
+ onChangeField={onChangeField}
25
+ onChangeBlock={(block, data) => onChangeFormData(data)}
26
+ formData={formData}
27
+ />
28
+ );
29
+ };
28
30
 
29
31
  beforeAll(() => {
30
32
  config.widgets = {
@@ -72,7 +74,7 @@ beforeAll(() => {
72
74
  });
73
75
 
74
76
  describe('BlockDataForm', () => {
75
- it('should does not add variations to schema when unneeded', () => {
77
+ it('should not add variations to schema when unneeded', () => {
76
78
  const WrappedBlockDataForm = withStateManagement(BlockDataForm);
77
79
  const store = mockStore({
78
80
  intl: {
@@ -103,7 +105,7 @@ describe('BlockDataForm', () => {
103
105
  expect(testSchema.fieldsets[0].fields).toStrictEqual([]);
104
106
  });
105
107
 
106
- it('should does not add variations when only one variation', () => {
108
+ it('should not add variations when only one variation', () => {
107
109
  const WrappedBlockDataForm = withStateManagement(BlockDataForm);
108
110
  const store = mockStore({
109
111
  intl: {
@@ -164,4 +166,36 @@ describe('BlockDataForm', () => {
164
166
  // schema is cloned, not mutated in place
165
167
  expect(testSchema.fieldsets[0].fields).toStrictEqual([]);
166
168
  });
169
+
170
+ it('should not add variations to schema when explicitly disabled', () => {
171
+ const WrappedBlockDataForm = withStateManagement(BlockDataForm);
172
+ const store = mockStore({
173
+ intl: {
174
+ locale: 'en',
175
+ messages: {},
176
+ },
177
+ });
178
+ const testSchema = {
179
+ fieldsets: [{ title: 'Default', id: 'default', fields: [] }],
180
+ properties: {},
181
+ required: [],
182
+ };
183
+ const formData = {
184
+ '@type': 'testBlock',
185
+ };
186
+ const { container } = render(
187
+ <Provider store={store}>
188
+ <WrappedBlockDataForm
189
+ formData={formData}
190
+ schema={testSchema}
191
+ onChangeField={(id, value) => {}}
192
+ applySchemaEnhancers={false}
193
+ />
194
+ </Provider>,
195
+ );
196
+ expect(container).toMatchSnapshot();
197
+
198
+ // schema is cloned, not mutated in place
199
+ expect(testSchema.fieldsets[0].fields).toStrictEqual([]);
200
+ });
167
201
  });
@@ -31,7 +31,7 @@ import { Portal } from 'react-portal';
31
31
  import { connect } from 'react-redux';
32
32
  import {
33
33
  Button,
34
- Container,
34
+ Container as SemanticContainer,
35
35
  Form as UiForm,
36
36
  Message,
37
37
  Segment,
@@ -229,9 +229,8 @@ class Form extends Component {
229
229
  let activeIndex = 0;
230
230
 
231
231
  if (requestError && prevProps.requestError !== requestError) {
232
- errors = FormValidation.giveServerErrorsToCorrespondingFields(
233
- requestError,
234
- );
232
+ errors =
233
+ FormValidation.giveServerErrorsToCorrespondingFields(requestError);
235
234
  activeIndex = FormValidation.showFirstTabWithErrors({
236
235
  errors,
237
236
  schema: this.props.schema,
@@ -545,12 +544,14 @@ class Form extends Component {
545
544
  const { schema: originalSchema, onCancel, onSubmit } = this.props;
546
545
  const { formData } = this.state;
547
546
  const schema = this.removeBlocksLayoutFields(originalSchema);
547
+ const Container =
548
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
548
549
 
549
550
  return this.props.visual ? (
550
551
  // Removing this from SSR is important, since react-beautiful-dnd supports SSR,
551
552
  // but draftJS don't like it much and the hydration gets messed up
552
553
  this.state.isClient && (
553
- <div className="ui container">
554
+ <Container>
554
555
  <BlocksToolbar
555
556
  formData={this.state.formData}
556
557
  selectedBlock={this.state.selected}
@@ -639,7 +640,7 @@ class Form extends Component {
639
640
  </UiForm>
640
641
  </Portal>
641
642
  )}
642
- </div>
643
+ </Container>
643
644
  )
644
645
  ) : (
645
646
  <Container>
@@ -19,22 +19,24 @@ function NewBaseWidget(name) {
19
19
  );
20
20
  }
21
21
 
22
- const withStateManagement = (Component) => ({ ...props }) => {
23
- const [formData, onChangeFormData] = React.useState(props.formData || {});
24
- const onChangeField = (id, value) => {
25
- onChangeFormData({ ...formData, [id]: value });
22
+ const withStateManagement =
23
+ (Component) =>
24
+ ({ ...props }) => {
25
+ const [formData, onChangeFormData] = React.useState(props.formData || {});
26
+ const onChangeField = (id, value) => {
27
+ onChangeFormData({ ...formData, [id]: value });
28
+ };
29
+
30
+ return (
31
+ <Component
32
+ {...props}
33
+ onChangeField={onChangeField}
34
+ onChangeFormData={onChangeFormData}
35
+ formData={formData}
36
+ />
37
+ );
26
38
  };
27
39
 
28
- return (
29
- <Component
30
- {...props}
31
- onChangeField={onChangeField}
32
- onChangeFormData={onChangeFormData}
33
- formData={formData}
34
- />
35
- );
36
- };
37
-
38
40
  beforeAll(() => {
39
41
  config.widgets.default = NewBaseWidget('default');
40
42
  config.widgets.type.boolean = NewBaseWidget('boolean');
@@ -9,7 +9,13 @@ import { Helmet } from '@plone/volto/helpers';
9
9
  import { Link } from 'react-router-dom';
10
10
  import { connect } from 'react-redux';
11
11
  import { compose } from 'redux';
12
- import { Container, Dropdown, Icon, Segment, Table } from 'semantic-ui-react';
12
+ import {
13
+ Container as SemanticContainer,
14
+ Dropdown,
15
+ Icon,
16
+ Segment,
17
+ Table,
18
+ } from 'semantic-ui-react';
13
19
  import { concat, map, reverse, find } from 'lodash';
14
20
  import { Portal } from 'react-portal';
15
21
  import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
@@ -24,6 +30,7 @@ import {
24
30
  } from '@plone/volto/components';
25
31
  import { getHistory, revertHistory, listActions } from '@plone/volto/actions';
26
32
  import { getBaseUrl } from '@plone/volto/helpers';
33
+ import config from '@plone/volto/registry';
27
34
 
28
35
  import backSVG from '@plone/volto/icons/back.svg';
29
36
 
@@ -147,6 +154,9 @@ class History extends Component {
147
154
  });
148
155
  const entries = this.processHistoryEntries();
149
156
 
157
+ const Container =
158
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
159
+
150
160
  return !historyAction ? (
151
161
  <>
152
162
  {this.props.token ? (