@plone/volto 17.0.0-alpha.9 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. package/.eslintrc +26 -3
  2. package/CHANGELOG.md +457 -5
  3. package/CONTRIBUTING.md +5 -1
  4. package/README.md +12 -9
  5. package/addon-registry.js +10 -1
  6. package/create-addons-loader.js +1 -1
  7. package/cypress/support/commands.js +70 -14
  8. package/cypress/support/e2e.js +1 -2
  9. package/cypress/support/volto-slate.js +4 -5
  10. package/cypress.config.js +1 -0
  11. package/docker-compose.yml +1 -1
  12. package/locales/ca/LC_MESSAGES/volto.po +276 -53
  13. package/locales/ca.json +1 -1
  14. package/locales/de/LC_MESSAGES/volto.po +284 -61
  15. package/locales/de.json +1 -1
  16. package/locales/en/LC_MESSAGES/volto.po +274 -51
  17. package/locales/en.json +1 -1
  18. package/locales/es/LC_MESSAGES/volto.po +313 -90
  19. package/locales/es.json +1 -1
  20. package/locales/eu/LC_MESSAGES/volto.po +275 -52
  21. package/locales/eu.json +1 -1
  22. package/locales/fi/LC_MESSAGES/volto.po +275 -52
  23. package/locales/fi.json +1 -1
  24. package/locales/fr/LC_MESSAGES/volto.po +276 -53
  25. package/locales/fr.json +1 -1
  26. package/locales/it/LC_MESSAGES/volto.po +469 -246
  27. package/locales/it.json +1 -1
  28. package/locales/ja/LC_MESSAGES/volto.po +275 -52
  29. package/locales/ja.json +1 -1
  30. package/locales/nl/LC_MESSAGES/volto.po +276 -53
  31. package/locales/nl.json +1 -1
  32. package/locales/pt/LC_MESSAGES/volto.po +276 -53
  33. package/locales/pt.json +1 -1
  34. package/locales/pt_BR/LC_MESSAGES/volto.po +309 -86
  35. package/locales/pt_BR.json +1 -1
  36. package/locales/ro/LC_MESSAGES/volto.po +276 -53
  37. package/locales/ro.json +1 -1
  38. package/locales/volto.pot +279 -52
  39. package/locales/zh_CN/LC_MESSAGES/volto.po +276 -53
  40. package/locales/zh_CN.json +1 -1
  41. package/package.json +44 -34
  42. package/packages/volto-slate/package.json +1 -1
  43. package/packages/volto-slate/src/actions/index.js +1 -1
  44. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  45. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  46. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  47. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  48. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  49. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  50. package/packages/volto-slate/src/editor/config.jsx +5 -4
  51. package/packages/volto-slate/src/editor/index.js +4 -4
  52. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  53. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  54. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  55. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  56. package/packages/volto-slate/src/editor/render.jsx +77 -8
  57. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  58. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  59. package/packages/volto-slate/src/index.js +2 -2
  60. package/packages/volto-slate/src/utils/blocks.js +7 -0
  61. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  62. package/razzle.config.js +4 -6
  63. package/src/actions/index.js +4 -0
  64. package/src/actions/navroot/navroot.js +16 -0
  65. package/src/actions/navroot/navroot.test.js +15 -0
  66. package/src/actions/relations/rebuild.js +7 -7
  67. package/src/actions/relations/relations.js +17 -0
  68. package/src/actions/site/site.js +16 -0
  69. package/src/actions/site/site.test.js +15 -0
  70. package/src/actions/userSession/userSession.js +17 -1
  71. package/src/components/index.js +194 -192
  72. package/src/components/manage/Actions/Actions.jsx +133 -243
  73. package/src/components/manage/Add/Add.jsx +7 -8
  74. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  75. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  76. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  77. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  78. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  79. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  80. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  81. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  82. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  83. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  84. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  85. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  86. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  87. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  88. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  89. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  90. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  91. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  92. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  93. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  94. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  95. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  96. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  97. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  98. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  99. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  100. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  101. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  102. package/src/components/manage/Blocks/Image/schema.js +17 -10
  103. package/src/components/manage/Blocks/Image/utils.js +14 -0
  104. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  105. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  106. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  107. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  108. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  109. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  110. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  111. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  112. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  113. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  114. package/src/components/manage/Blocks/Listing/getAsyncData.js +3 -5
  115. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +27 -17
  116. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  117. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  118. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  119. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +3 -2
  120. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  121. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  122. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  123. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  124. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  125. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  126. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  127. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +70 -36
  128. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  129. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  130. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  131. package/src/components/manage/Blocks/Search/schema.js +29 -14
  132. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  133. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  134. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  135. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  136. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  137. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  138. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  139. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  140. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  141. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  142. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  143. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  144. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  145. package/src/components/manage/Contents/Contents.jsx +285 -114
  146. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  147. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  148. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  149. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  150. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  151. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  152. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  153. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  154. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  155. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  156. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +38 -13
  157. package/src/components/manage/Controlpanels/Relations/Relations.jsx +5 -5
  158. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +8 -7
  159. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +68 -68
  160. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  161. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  162. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  163. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  164. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  165. package/src/components/manage/Delete/Delete.jsx +96 -171
  166. package/src/components/manage/Diff/DiffField.jsx +25 -1
  167. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  168. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  169. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  170. package/src/components/manage/Form/Form.jsx +7 -6
  171. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  172. package/src/components/manage/History/History.jsx +11 -1
  173. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  174. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  175. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  176. package/src/components/manage/Messages/Messages.jsx +32 -99
  177. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  178. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  179. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  180. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  181. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  182. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  183. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  184. package/src/components/manage/TemplateChooser/template.svg +10 -0
  185. package/src/components/manage/Toast/Toast.jsx +1 -1
  186. package/src/components/manage/Toolbar/More.jsx +17 -2
  187. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  188. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  189. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  190. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  191. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  192. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  193. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  194. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  195. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  196. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  197. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  198. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  199. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  200. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  201. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +3 -10
  202. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  203. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  204. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  205. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  206. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  207. package/src/components/manage/Widgets/SelectWidget.jsx +15 -1
  208. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  209. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  210. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  211. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  212. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  213. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  214. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  215. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  216. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  217. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  218. package/src/components/theme/Comments/Comments.jsx +268 -380
  219. package/src/components/theme/Component/Component.jsx +1 -1
  220. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  221. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  222. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  223. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  224. package/src/components/theme/Error/ServerError.jsx +29 -0
  225. package/src/components/theme/Header/Header.jsx +37 -63
  226. package/src/components/theme/Header/Header.test.jsx +18 -0
  227. package/src/components/theme/Image/Image.jsx +96 -0
  228. package/src/components/theme/Image/Image.test.jsx +125 -0
  229. package/src/components/theme/Login/Login.jsx +160 -243
  230. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  231. package/src/components/theme/Logo/Logo.jsx +35 -27
  232. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  233. package/src/components/theme/Logout/Logout.jsx +36 -83
  234. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  235. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -5
  236. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +95 -170
  237. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  238. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  239. package/src/components/theme/Register/Register.jsx +2 -4
  240. package/src/components/theme/Search/SearchTags.jsx +30 -60
  241. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  242. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  243. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  244. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  245. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  246. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  247. package/src/components/theme/View/AlbumView.jsx +21 -16
  248. package/src/components/theme/View/EventView.jsx +36 -25
  249. package/src/components/theme/View/FileView.jsx +23 -18
  250. package/src/components/theme/View/ImageView.jsx +40 -32
  251. package/src/components/theme/View/ImageView.test.jsx +4 -0
  252. package/src/components/theme/View/LinkView.jsx +53 -78
  253. package/src/components/theme/View/ListingView.jsx +36 -28
  254. package/src/components/theme/View/NewsItemView.jsx +16 -17
  255. package/src/components/theme/View/RenderBlocks.jsx +56 -27
  256. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  257. package/src/components/theme/View/SummaryView.jsx +49 -39
  258. package/src/components/theme/View/TabularView.jsx +59 -53
  259. package/src/components/theme/View/View.jsx +2 -0
  260. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  261. package/src/config/Blocks.jsx +46 -0
  262. package/src/config/Components.jsx +3 -1
  263. package/src/config/ControlPanels.js +0 -1
  264. package/src/config/Loadables.jsx +1 -1
  265. package/src/config/NonContentRoutes.jsx +1 -0
  266. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  267. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  268. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  269. package/src/config/RichTextEditor/Styles.jsx +1 -1
  270. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  271. package/src/config/RichTextEditor/index.js +2 -3
  272. package/src/config/Views.jsx +6 -4
  273. package/src/config/Widgets.jsx +3 -0
  274. package/src/config/index.js +36 -2
  275. package/src/config/server.js +2 -0
  276. package/src/constants/ActionTypes.js +4 -0
  277. package/src/constants/Indexes.js +3 -1
  278. package/src/express-middleware/devproxy.js +1 -1
  279. package/src/express-middleware/files.js +11 -9
  280. package/src/express-middleware/images.js +12 -5
  281. package/src/express-middleware/ok.js +16 -0
  282. package/src/express-middleware/robotstxt.js +1 -1
  283. package/src/express-middleware/sitemap.js +1 -1
  284. package/src/express-middleware/static.js +3 -3
  285. package/src/helpers/Blocks/Blocks.js +52 -6
  286. package/src/helpers/Blocks/Blocks.test.js +92 -13
  287. package/src/helpers/Extensions/index.js +2 -1
  288. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  289. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  290. package/src/helpers/FormValidation/FormValidation.js +37 -7
  291. package/src/helpers/FormValidation/FormValidation.test.js +32 -0
  292. package/src/helpers/Html/Html.jsx +2 -8
  293. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  294. package/src/helpers/MessageLabels/MessageLabels.js +39 -4
  295. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  296. package/src/helpers/Site/index.js +21 -0
  297. package/src/helpers/Url/Url.js +22 -1
  298. package/src/helpers/Url/Url.test.js +41 -0
  299. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  300. package/src/helpers/Utils/Utils.js +35 -0
  301. package/src/helpers/Utils/Utils.test.js +13 -0
  302. package/src/helpers/Utils/usePagination.js +67 -14
  303. package/src/helpers/Utils/usePagination.test.js +115 -0
  304. package/src/helpers/index.js +15 -8
  305. package/src/hooks/client/useClient.js +11 -0
  306. package/src/hooks/clipboard/useClipboard.js +26 -0
  307. package/src/hooks/index.js +2 -0
  308. package/src/icons/grid-block.svg +11 -0
  309. package/src/middleware/api.js +203 -173
  310. package/src/middleware/blacklistRoutes.js +25 -22
  311. package/src/middleware/index.js +2 -2
  312. package/src/middleware/storeProtectLoadUtils.js +61 -62
  313. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  314. package/src/reducers/actions/actions.js +7 -5
  315. package/src/reducers/actions/actions.test.js +70 -0
  316. package/src/reducers/content/content.test.js +4 -4
  317. package/src/reducers/index.js +4 -0
  318. package/src/reducers/navigation/navigation.js +5 -5
  319. package/src/reducers/navigation/navigation.test.js +30 -0
  320. package/src/reducers/navroot/navroot.js +79 -0
  321. package/src/reducers/navroot/navroot.test.js +110 -0
  322. package/src/reducers/relations/relations.js +74 -46
  323. package/src/reducers/site/site.js +51 -0
  324. package/src/reducers/site/site.test.js +67 -0
  325. package/src/reducers/userSession/userSession.js +15 -1
  326. package/src/registry.js +2 -2
  327. package/src/routes.js +9 -0
  328. package/src/server.jsx +9 -0
  329. package/src/start-server.js +2 -2
  330. package/src/storybook.jsx +24 -38
  331. package/test-setup-config.js +11 -1
  332. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  333. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  334. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  335. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  336. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  337. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  338. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  339. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  340. package/theme/themes/pastanaga/extras/contents.less +6 -1
  341. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  342. package/theme/themes/pastanaga/extras/grid.less +427 -0
  343. package/theme/themes/pastanaga/extras/login.less +3 -0
  344. package/theme/themes/pastanaga/extras/main.less +14 -7
  345. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  346. package/theme/themes/pastanaga/extras/search.less +7 -1
  347. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  348. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  349. package/theme/themes/pastanaga/extras/toc.less +29 -0
  350. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  351. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  352. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  353. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  354. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  355. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  356. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  357. package/tsconfig.json +33 -0
  358. package/webpack-plugins/webpack-less-plugin.js +19 -0
  359. package/.yarn/install-state.gz +0 -0
  360. package/.yarn/releases/yarn-3.2.3.cjs +0 -783
  361. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  362. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  363. package/src/components/theme/Header/Header.md +0 -27
@@ -1,15 +1,11 @@
1
- /**
2
- * Search widget component.
3
- * @module components/theme/SearchWidget/SearchWidget
4
- */
5
-
6
- import React, { Component } from 'react';
7
- import { withRouter } from 'react-router-dom';
1
+ import { useState, useEffect } from 'react';
2
+ import { useHistory } from 'react-router-dom';
8
3
  import { Form, Input } from 'semantic-ui-react';
9
- import { compose } from 'redux';
10
- import { PropTypes } from 'prop-types';
11
- import { defineMessages, injectIntl } from 'react-intl';
4
+ import { defineMessages, useIntl } from 'react-intl';
5
+ import { useDispatch, useSelector } from 'react-redux';
12
6
 
7
+ import { getNavroot } from '@plone/volto/actions';
8
+ import { hasApiExpander, getBaseUrl } from '@plone/volto/helpers';
13
9
  import { Icon } from '@plone/volto/components';
14
10
  import zoomSVG from '@plone/volto/icons/zoom.svg';
15
11
 
@@ -24,96 +20,52 @@ const messages = defineMessages({
24
20
  },
25
21
  });
26
22
 
27
- /**
28
- * SearchWidget component class.
29
- * @class SearchWidget
30
- * @extends Component
31
- */
32
- class SearchWidget extends Component {
33
- /**
34
- * Property types.
35
- * @property {Object} propTypes Property types.
36
- * @static
37
- */
38
- static propTypes = {
39
- pathname: PropTypes.string,
40
- };
41
-
42
- /**
43
- * Constructor
44
- * @method constructor
45
- * @param {Object} props Component properties
46
- * @constructs WysiwygEditor
47
- */
48
- constructor(props) {
49
- super(props);
50
- this.onChangeText = this.onChangeText.bind(this);
51
- this.onSubmit = this.onSubmit.bind(this);
52
- this.state = {
53
- text: '',
54
- };
55
- }
56
-
57
- /**
58
- * On change text
59
- * @method onChangeText
60
- * @param {object} event Event object.
61
- * @param {string} value Text value.
62
- * @returns {undefined}
63
- */
64
- onChangeText(event, { value }) {
65
- this.setState({
66
- text: value,
67
- });
68
- }
23
+ const SearchWidget = (props) => {
24
+ const intl = useIntl();
25
+ const dispatch = useDispatch();
69
26
 
70
- /**
71
- * Submit handler
72
- * @method onSubmit
73
- * @param {event} event Event object.
74
- * @returns {undefined}
75
- */
76
- onSubmit(event) {
27
+ const [text, setText] = useState('');
28
+ const history = useHistory();
29
+ const onChangeText = (event, { value }) => {
30
+ setText(value);
31
+ };
32
+ const pathname = props.pathname;
33
+ const onSubmit = (event) => {
77
34
  const path =
78
- this.props.pathname?.length > 0
79
- ? `&path=${encodeURIComponent(this.props.pathname)}`
80
- : '';
81
- this.props.history.push(
82
- `/search?SearchableText=${encodeURIComponent(this.state.text)}${path}`,
83
- );
35
+ pathname?.length > 0 ? `&path=${encodeURIComponent(pathname)}` : '';
36
+
37
+ history.push(`./search?SearchableText=${encodeURIComponent(text)}${path}`);
84
38
  // reset input value
85
- this.setState({
86
- text: '',
87
- });
39
+ setText('');
88
40
  event.preventDefault();
89
- }
41
+ };
42
+
43
+ const navroot = useSelector((state) => state.navroot?.data);
44
+ useEffect(() => {
45
+ if (!hasApiExpander('navroot', getBaseUrl(pathname))) {
46
+ dispatch(getNavroot(getBaseUrl(pathname)));
47
+ }
48
+ }, [dispatch, pathname]);
90
49
 
91
- /**
92
- * Render method.
93
- * @method render
94
- * @returns {string} Markup for the component.
95
- */
96
- render() {
97
- return (
98
- <Form action="/search" onSubmit={this.onSubmit}>
99
- <Form.Field className="searchbox">
100
- <Input
101
- aria-label={this.props.intl.formatMessage(messages.search)}
102
- onChange={this.onChangeText}
103
- name="SearchableText"
104
- value={this.state.text}
105
- transparent
106
- autoComplete="off"
107
- placeholder={this.props.intl.formatMessage(messages.searchSite)}
108
- title={this.props.intl.formatMessage(messages.search)}
109
- />
110
- <button aria-label={this.props.intl.formatMessage(messages.search)}>
111
- <Icon name={zoomSVG} size="18px" />
112
- </button>
113
- </Form.Field>
114
- </Form>
115
- );
116
- }
117
- }
50
+ return (
51
+ <Form action={`${navroot?.navroot?.['@id']}/search`} onSubmit={onSubmit}>
52
+ <Form.Field className="searchbox">
53
+ <Input
54
+ aria-label={intl.formatMessage(messages.search)}
55
+ onChange={onChangeText}
56
+ name="SearchableText"
57
+ value={text}
58
+ transparent
59
+ autoComplete="off"
60
+ placeholder={intl.formatMessage(messages.searchSite)}
61
+ title={intl.formatMessage(messages.search)}
62
+ />
63
+ <button aria-label={intl.formatMessage(messages.search)}>
64
+ <Icon name={zoomSVG} size="18px" />
65
+ </button>
66
+ </Form.Field>
67
+ </Form>
68
+ );
69
+ };
118
70
 
119
- export default compose(withRouter, injectIntl)(SearchWidget);
71
+ export default SearchWidget;
@@ -15,6 +15,14 @@ describe('SearchWidget', () => {
15
15
  locale: 'en',
16
16
  messages: {},
17
17
  },
18
+ navroot: {
19
+ data: {
20
+ '@id': 'http://localhost:3000/@navroot',
21
+ navroot: {
22
+ '@id': 'http://localhost:3000',
23
+ },
24
+ },
25
+ },
18
26
  });
19
27
  const component = renderer.create(
20
28
  <Provider store={store}>
@@ -22,6 +22,13 @@ const messages = defineMessages({
22
22
  defaultMessage: 'Sitemap',
23
23
  },
24
24
  });
25
+
26
+ export function getSitemapPath(pathname = '', lang) {
27
+ const prefix = pathname.replace(/\/sitemap$/gm, '').replace(/^\//, '');
28
+ const path = prefix || lang || '';
29
+ return path;
30
+ }
31
+
25
32
  /**
26
33
  * Sitemap class.
27
34
  * @class Sitemap
@@ -39,11 +46,13 @@ class Sitemap extends Component {
39
46
 
40
47
  componentDidMount() {
41
48
  const { settings } = config;
42
- if (settings.isMultilingual) {
43
- this.props.getNavigation(`${toBackendLang(this.props.lang)}`, 4);
44
- } else {
45
- this.props.getNavigation('', 4);
46
- }
49
+
50
+ const lang = settings.isMultilingual
51
+ ? `${toBackendLang(this.props.lang)}`
52
+ : null;
53
+
54
+ const path = getSitemapPath(this.props.location.pathname, lang);
55
+ this.props.getNavigation(path, 4);
47
56
  }
48
57
 
49
58
  /**
@@ -105,15 +114,17 @@ export default compose(
105
114
  {
106
115
  key: 'navigation',
107
116
  promise: ({ location, store: { dispatch, getState } }) => {
117
+ if (!__SERVER__) return;
108
118
  const { settings } = config;
109
- const lang = getState().intl.locale;
110
- if (settings.isMultilingual) {
111
- return (
112
- __SERVER__ && dispatch(getNavigation(`${toBackendLang(lang)}`, 4))
113
- );
114
- } else {
115
- return __SERVER__ && dispatch(getNavigation('', 4));
116
- }
119
+
120
+ const path = getSitemapPath(
121
+ location.pathname,
122
+ settings.isMultilingual
123
+ ? toBackendLang(getState().intl.locale)
124
+ : null,
125
+ );
126
+
127
+ return dispatch(getNavigation(path, 4));
117
128
  },
118
129
  },
119
130
  ]),
@@ -4,7 +4,7 @@ import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
5
  import { MemoryRouter } from 'react-router-dom';
6
6
 
7
- import { __test__ as Sitemap } from './Sitemap';
7
+ import { __test__ as Sitemap, getSitemapPath } from './Sitemap';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
@@ -46,7 +46,7 @@ describe('Sitemap', () => {
46
46
  const component = renderer.create(
47
47
  <Provider store={store}>
48
48
  <MemoryRouter>
49
- <Sitemap />
49
+ <Sitemap location={{ pathname: '/page-1' }} />
50
50
  </MemoryRouter>
51
51
  </Provider>,
52
52
  );
@@ -54,3 +54,24 @@ describe('Sitemap', () => {
54
54
  expect(json).toMatchSnapshot();
55
55
  });
56
56
  });
57
+
58
+ describe('getSitemapPath', () => {
59
+ it('accepts empty path', () => {
60
+ expect(getSitemapPath('', null)).toBe('');
61
+ });
62
+
63
+ it('accepts a path', () => {
64
+ expect(getSitemapPath('/page-1/sitemap', null)).toBe('page-1');
65
+ });
66
+ it('accepts a path', () => {
67
+ expect(getSitemapPath('/page-1/sitemap', null)).toBe('page-1');
68
+ });
69
+
70
+ it('uses a language as default root', () => {
71
+ expect(getSitemapPath('/', 'de')).toBe('de');
72
+ });
73
+
74
+ it('accepts language-rooted paths', () => {
75
+ expect(getSitemapPath('/de/mission', 'de')).toBe('de/mission');
76
+ });
77
+ });
@@ -0,0 +1,11 @@
1
+ import renderer from 'react-test-renderer';
2
+ import TsTest from './TsTest';
3
+
4
+ describe('Ts test component', () => {
5
+ test('Renders', () => {
6
+ const component = renderer.create(<TsTest text="Test a TS component" />);
7
+ const json = component.toJSON();
8
+
9
+ expect(json).toMatchSnapshot();
10
+ });
11
+ });
@@ -0,0 +1,15 @@
1
+ /**
2
+ * TEST COMPONENT: React TSX component
3
+ * Ensure successful implementation of TSX and validate the functionality with Jest tests
4
+ * Dependencies: jest (version 26.6.3), ts-jest (version ^26.4.2)
5
+ */
6
+
7
+ type TestProps = {
8
+ text: string;
9
+ };
10
+
11
+ const TsTest = ({ text }: TestProps) => {
12
+ return <div>{text}</div>;
13
+ };
14
+
15
+ export default TsTest;
@@ -3,11 +3,16 @@
3
3
  * @module components/theme/View/AlbumView
4
4
  */
5
5
 
6
- import React, { Component } from 'react';
6
+ import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container, GridColumn, Segment } from 'semantic-ui-react';
8
+ import {
9
+ Container as SemanticContainer,
10
+ GridColumn,
11
+ Segment,
12
+ } from 'semantic-ui-react';
9
13
  import { Button, Modal, Grid } from 'semantic-ui-react';
10
- import { Icon, UniversalLink, PreviewImage } from '@plone/volto/components';
14
+ import { Icon, UniversalLink } from '@plone/volto/components';
15
+ import config from '@plone/volto/registry';
11
16
 
12
17
  import openSVG from '@plone/volto/icons/open.svg';
13
18
  import aheadSVG from '@plone/volto/icons/ahead.svg';
@@ -19,7 +24,7 @@ import backSVG from '@plone/volto/icons/back.svg';
19
24
  * @param {Object} content Content object.
20
25
  * @returns {string} Markup of the component.
21
26
  */
22
- class AlbumView extends Component {
27
+ class AlbumView extends React.Component {
23
28
  constructor(props) {
24
29
  super(props);
25
30
 
@@ -56,6 +61,12 @@ class AlbumView extends Component {
56
61
 
57
62
  render() {
58
63
  const { content } = this.props;
64
+ const Container =
65
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
66
+ const PreviewImage = config.getComponent({
67
+ name: 'PreviewImage',
68
+ }).component;
69
+
59
70
  return (
60
71
  <Container className="view-wrapper">
61
72
  <article id="content">
@@ -80,17 +91,16 @@ class AlbumView extends Component {
80
91
  <Segment className="imageborder">
81
92
  <PreviewImage
82
93
  item={item}
83
- alt={
84
- item.image_caption
85
- ? item.image_caption
86
- : item.title
87
- }
94
+ alt={item.image_caption || item.title}
88
95
  onClick={() => {
89
96
  this.setState({
90
97
  openIndex: index,
91
98
  });
92
99
  }}
93
100
  className="ui middle aligned image"
101
+ responsive={true}
102
+ loading="lazy"
103
+ title={item.title}
94
104
  />
95
105
  </Segment>
96
106
  </Grid.Column>
@@ -133,20 +143,15 @@ class AlbumView extends Component {
133
143
  <Modal.Content image>
134
144
  <PreviewImage
135
145
  item={item}
136
- alt={
137
- item.image_caption
138
- ? item.image_caption
139
- : item.title
140
- }
146
+ alt={item.image_caption}
141
147
  onClick={() => {
142
148
  this.setState({
143
149
  openIndex: index,
144
150
  });
145
151
  }}
146
- size="large"
147
152
  className="ui image"
153
+ responsive={true}
148
154
  />
149
-
150
155
  <Modal.Description>
151
156
  <p>{item.description}</p>
152
157
  </Modal.Description>
@@ -6,32 +6,41 @@
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
8
  import { hasBlocksData, flattenHTMLToAppURL } from '@plone/volto/helpers';
9
- import { Image, Grid } from 'semantic-ui-react';
9
+ import { Grid } from 'semantic-ui-react';
10
10
  import RenderBlocks from '@plone/volto/components/theme/View/RenderBlocks';
11
11
  import { EventDetails } from '@plone/volto/components';
12
+ import { Container as SemanticContainer } from 'semantic-ui-react';
13
+ import config from '@plone/volto/registry';
12
14
 
13
- const EventTextfieldView = ({ content }) => (
14
- <React.Fragment>
15
- {content.title && <h1 className="documentFirstHeading">{content.title}</h1>}
16
- {content.description && (
17
- <p className="documentDescription">{content.description}</p>
18
- )}
19
- {content.image && (
20
- <Image
21
- className="document-image"
22
- src={content.image.scales.thumb.download}
23
- floated="right"
24
- />
25
- )}
26
- {content.text && (
27
- <div
28
- dangerouslySetInnerHTML={{
29
- __html: flattenHTMLToAppURL(content.text.data),
30
- }}
31
- />
32
- )}
33
- </React.Fragment>
34
- );
15
+ const EventTextfieldView = ({ content }) => {
16
+ const Image = config.getComponent({ name: 'Image' }).component;
17
+
18
+ return (
19
+ <React.Fragment>
20
+ {content.title && (
21
+ <h1 className="documentFirstHeading">{content.title}</h1>
22
+ )}
23
+ {content.description && (
24
+ <p className="documentDescription">{content.description}</p>
25
+ )}
26
+ {content.image && (
27
+ <Image
28
+ className="document-image ui right floated image"
29
+ item={content}
30
+ imageField="image"
31
+ alt=""
32
+ />
33
+ )}
34
+ {content.text && (
35
+ <div
36
+ dangerouslySetInnerHTML={{
37
+ __html: flattenHTMLToAppURL(content.text.data),
38
+ }}
39
+ />
40
+ )}
41
+ </React.Fragment>
42
+ );
43
+ };
35
44
 
36
45
  /**
37
46
  * EventView view component class.
@@ -41,9 +50,11 @@ const EventTextfieldView = ({ content }) => (
41
50
  */
42
51
  const EventView = (props) => {
43
52
  const { content } = props;
53
+ const Container =
54
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
44
55
 
45
56
  return (
46
- <div id="page-document" className="ui container view-wrapper event-view">
57
+ <Container id="page-document" className="view-wrapper event-view">
47
58
  <Grid>
48
59
  <Grid.Column width={7} className="mobile hidden">
49
60
  {hasBlocksData(content) ? (
@@ -83,7 +94,7 @@ const EventView = (props) => {
83
94
  )}
84
95
  </Grid.Column>
85
96
  </Grid>
86
- </div>
97
+ </Container>
87
98
  );
88
99
  };
89
100
 
@@ -5,9 +5,9 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container } from 'semantic-ui-react';
9
-
8
+ import { Container as SemanticContainer } from 'semantic-ui-react';
10
9
  import { flattenToAppURL } from '@plone/volto/helpers';
10
+ import config from '@plone/volto/registry';
11
11
 
12
12
  /**
13
13
  * File view component class.
@@ -15,22 +15,27 @@ import { flattenToAppURL } from '@plone/volto/helpers';
15
15
  * @params {object} content Content object.
16
16
  * @returns {string} Markup of the component.
17
17
  */
18
- const FileView = ({ content }) => (
19
- <Container className="view-wrapper">
20
- <h1 className="documentFirstHeading">
21
- {content.title}
22
- {content.subtitle && ` - ${content.subtitle}`}
23
- </h1>
24
- {content.description && (
25
- <p className="documentDescription">{content.description}</p>
26
- )}
27
- {content.file?.download && (
28
- <a href={flattenToAppURL(content.file.download)}>
29
- {content.file.filename}
30
- </a>
31
- )}
32
- </Container>
33
- );
18
+ const FileView = ({ content }) => {
19
+ const Container =
20
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
21
+
22
+ return (
23
+ <Container className="view-wrapper">
24
+ <h1 className="documentFirstHeading">
25
+ {content.title}
26
+ {content.subtitle && ` - ${content.subtitle}`}
27
+ </h1>
28
+ {content.description && (
29
+ <p className="documentDescription">{content.description}</p>
30
+ )}
31
+ {content.file?.download && (
32
+ <a href={flattenToAppURL(content.file.download)}>
33
+ {content.file.filename}
34
+ </a>
35
+ )}
36
+ </Container>
37
+ );
38
+ };
34
39
 
35
40
  /**
36
41
  * Property types.
@@ -5,11 +5,11 @@
5
5
 
6
6
  import React from 'react';
7
7
  import PropTypes from 'prop-types';
8
- import { Container } from 'semantic-ui-react';
8
+ import { Container as SemanticContainer } from 'semantic-ui-react';
9
9
  import { FormattedMessage } from 'react-intl';
10
10
  import prettybytes from 'pretty-bytes';
11
-
12
11
  import { flattenToAppURL } from '@plone/volto/helpers';
12
+ import config from '@plone/volto/registry';
13
13
 
14
14
  /**
15
15
  * Image view component class.
@@ -17,37 +17,45 @@ import { flattenToAppURL } from '@plone/volto/helpers';
17
17
  * @params {object} content Content object.
18
18
  * @returns {string} Markup of the component.
19
19
  */
20
- const ImageView = ({ content }) => (
21
- <Container className="view-wrapper">
22
- <h1 className="documentFirstHeading">
23
- {content.title}
24
- {content.subtitle && ` - ${content.subtitle}`}
25
- </h1>
26
- {content.description && (
27
- <p className="documentDescription">{content.description}</p>
28
- )}
29
- {content?.image?.download && (
30
- <a href={flattenToAppURL(content.image.download)}>
31
- <img
32
- alt={content.title}
33
- src={flattenToAppURL(content.image.scales.preview.download)}
34
- />
35
- <figcaption>
36
- <FormattedMessage
37
- id="Size: {size}"
38
- defaultMessage="Size: {size}"
39
- values={{ size: prettybytes(content.image.size) }}
40
- />
41
- &nbsp; &mdash; &nbsp;
42
- <FormattedMessage
43
- id="Click to download full sized image"
44
- defaultMessage="Click to download full sized image"
20
+ const ImageView = ({ content }) => {
21
+ const Image = config.getComponent({ name: 'Image' }).component;
22
+ const Container =
23
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
24
+
25
+ return (
26
+ <Container className="view-wrapper">
27
+ <h1 className="documentFirstHeading">
28
+ {content.title}
29
+ {content.subtitle && ` - ${content.subtitle}`}
30
+ </h1>
31
+ {content.description && (
32
+ <p className="documentDescription">{content.description}</p>
33
+ )}
34
+ {content?.image?.download && (
35
+ <a href={flattenToAppURL(content.image.download)}>
36
+ <Image
37
+ item={content}
38
+ imageField="image"
39
+ alt={content.title}
40
+ responsive={true}
45
41
  />
46
- </figcaption>
47
- </a>
48
- )}
49
- </Container>
50
- );
42
+ <figcaption>
43
+ <FormattedMessage
44
+ id="Size: {size}"
45
+ defaultMessage="Size: {size}"
46
+ values={{ size: prettybytes(content.image.size) }}
47
+ />
48
+ &nbsp; &mdash; &nbsp;
49
+ <FormattedMessage
50
+ id="Click to download full sized image"
51
+ defaultMessage="Click to download full sized image"
52
+ />
53
+ </figcaption>
54
+ </a>
55
+ )}
56
+ </Container>
57
+ );
58
+ };
51
59
 
52
60
  /**
53
61
  * Property types.
@@ -23,9 +23,13 @@ test('renders an image view component', () => {
23
23
  image: {
24
24
  size: 123123,
25
25
  download: 'file:///preview.jpg',
26
+ width: 400,
27
+ height: 400,
26
28
  scales: {
27
29
  preview: {
28
30
  download: 'file:///preview.jpg',
31
+ width: 400,
32
+ height: 400,
29
33
  },
30
34
  },
31
35
  },