@plone/volto 17.0.0-alpha.3 → 17.0.0-alpha.30

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 (438) hide show
  1. package/.eslintrc +26 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
  4. package/.yarn/releases/yarn-3.6.3.cjs +874 -0
  5. package/CHANGELOG.md +716 -20
  6. package/CONTRIBUTING.md +5 -1
  7. package/README.md +20 -21
  8. package/addon-registry.js +44 -1
  9. package/create-addons-loader.js +1 -1
  10. package/create-theme-addons-loader.js +79 -0
  11. package/cypress/support/commands.js +70 -14
  12. package/cypress/support/e2e.js +1 -2
  13. package/cypress/support/volto-slate.js +4 -5
  14. package/cypress.config.js +1 -0
  15. package/docker-compose.yml +1 -1
  16. package/locales/ca/LC_MESSAGES/volto.po +422 -53
  17. package/locales/ca.json +1 -1
  18. package/locales/de/LC_MESSAGES/volto.po +442 -73
  19. package/locales/de.json +1 -1
  20. package/locales/en/LC_MESSAGES/volto.po +420 -51
  21. package/locales/en.json +1 -1
  22. package/locales/es/LC_MESSAGES/volto.po +431 -62
  23. package/locales/es.json +1 -1
  24. package/locales/eu/LC_MESSAGES/volto.po +421 -52
  25. package/locales/eu.json +1 -1
  26. package/locales/fi/LC_MESSAGES/volto.po +4985 -0
  27. package/locales/fi.json +1 -1
  28. package/locales/fr/LC_MESSAGES/volto.po +422 -53
  29. package/locales/fr.json +1 -1
  30. package/locales/it/LC_MESSAGES/volto.po +589 -220
  31. package/locales/it.json +1 -1
  32. package/locales/ja/LC_MESSAGES/volto.po +421 -52
  33. package/locales/ja.json +1 -1
  34. package/locales/nl/LC_MESSAGES/volto.po +1072 -691
  35. package/locales/nl.json +1 -1
  36. package/locales/pt/LC_MESSAGES/volto.po +422 -53
  37. package/locales/pt.json +1 -1
  38. package/locales/pt_BR/LC_MESSAGES/volto.po +429 -60
  39. package/locales/pt_BR.json +1 -1
  40. package/locales/ro/LC_MESSAGES/volto.po +422 -53
  41. package/locales/ro.json +1 -1
  42. package/locales/volto.pot +425 -52
  43. package/locales/zh_CN/LC_MESSAGES/volto.po +422 -53
  44. package/locales/zh_CN.json +1 -1
  45. package/package.json +46 -35
  46. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  47. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  48. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  49. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  50. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  51. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  52. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  53. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  54. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  55. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  56. package/packages/volto-slate/package.json +1 -1
  57. package/packages/volto-slate/src/actions/index.js +1 -1
  58. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  59. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  60. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  61. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  62. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  63. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  64. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  65. package/packages/volto-slate/src/editor/config.jsx +5 -4
  66. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  67. package/packages/volto-slate/src/editor/index.js +4 -4
  68. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  69. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  70. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  71. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  72. package/packages/volto-slate/src/editor/render.jsx +77 -8
  73. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  74. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  75. package/packages/volto-slate/src/index.js +2 -2
  76. package/packages/volto-slate/src/utils/blocks.js +7 -0
  77. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  78. package/razzle.config.js +32 -6
  79. package/src/actions/index.js +10 -0
  80. package/src/actions/language/language.js +9 -8
  81. package/src/actions/navroot/navroot.js +16 -0
  82. package/src/actions/navroot/navroot.test.js +15 -0
  83. package/src/actions/querystringsearch/querystringsearch.js +20 -14
  84. package/src/actions/relations/rebuild.js +25 -0
  85. package/src/actions/relations/relations.js +103 -0
  86. package/src/actions/relations/relations.test.js +15 -0
  87. package/src/actions/site/site.js +16 -0
  88. package/src/actions/site/site.test.js +15 -0
  89. package/src/actions/userSession/userSession.js +17 -1
  90. package/src/components/index.js +194 -191
  91. package/src/components/manage/Actions/Actions.jsx +133 -243
  92. package/src/components/manage/Add/Add.jsx +9 -10
  93. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  94. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  95. package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -3
  96. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  97. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  98. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  99. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  100. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  101. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  102. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  103. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  104. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  105. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  106. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  107. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  108. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  109. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  110. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  111. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  112. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  113. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  114. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  115. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  116. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  117. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  118. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  119. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  120. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  121. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  122. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  123. package/src/components/manage/Blocks/Image/schema.js +17 -10
  124. package/src/components/manage/Blocks/Image/utils.js +14 -0
  125. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  126. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  127. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  128. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  129. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  130. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  131. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  132. package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
  133. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  134. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  135. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  136. package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
  137. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +34 -19
  138. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  139. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  140. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  141. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
  142. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +4 -2
  143. package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
  144. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  145. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  146. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  147. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  148. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  149. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  150. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  151. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +93 -46
  152. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  153. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  154. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  155. package/src/components/manage/Blocks/Search/schema.js +29 -14
  156. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  157. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  158. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  159. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  160. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  161. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  162. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  163. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  164. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  165. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  166. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  167. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  168. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  169. package/src/components/manage/Contents/Contents.jsx +319 -139
  170. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  171. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  172. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  173. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  174. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  175. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  176. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  177. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  178. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  179. package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
  180. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
  181. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  182. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  183. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +91 -0
  184. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  185. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +480 -0
  186. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  187. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  188. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  189. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  190. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  191. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  192. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  193. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  194. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  195. package/src/components/manage/Delete/Delete.jsx +96 -171
  196. package/src/components/manage/Diff/DiffField.jsx +25 -1
  197. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  198. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  199. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  200. package/src/components/manage/Form/Form.jsx +7 -6
  201. package/src/components/manage/Form/InlineForm.jsx +39 -9
  202. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  203. package/src/components/manage/Form/InlineFormState.js +8 -0
  204. package/src/components/manage/History/History.jsx +11 -1
  205. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  206. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  207. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  208. package/src/components/manage/Messages/Messages.jsx +32 -99
  209. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  210. package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
  211. package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
  212. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  213. package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
  214. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  215. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  216. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  217. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  218. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  219. package/src/components/manage/TemplateChooser/template.svg +10 -0
  220. package/src/components/manage/Toast/Toast.jsx +2 -2
  221. package/src/components/manage/Toolbar/More.jsx +17 -2
  222. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  223. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  224. package/src/components/manage/Toolbar/Types.jsx +2 -2
  225. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  226. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  227. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  228. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  229. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  230. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  231. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  232. package/src/components/manage/Widgets/DatetimeWidget.jsx +11 -13
  233. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  234. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  235. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  236. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  237. package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
  238. package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
  239. package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
  240. package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
  241. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +10 -12
  242. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
  243. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  244. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  245. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  246. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  247. package/src/components/manage/Widgets/SelectUtils.js +2 -2
  248. package/src/components/manage/Widgets/SelectWidget.jsx +16 -2
  249. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  250. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  251. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  252. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  253. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  254. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  255. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  256. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  257. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  258. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  259. package/src/components/theme/Comments/Comments.jsx +268 -380
  260. package/src/components/theme/Component/Component.jsx +1 -1
  261. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  262. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  263. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  264. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  265. package/src/components/theme/Error/ServerError.jsx +29 -0
  266. package/src/components/theme/Footer/Footer.jsx +2 -13
  267. package/src/components/theme/Header/Header.jsx +37 -63
  268. package/src/components/theme/Header/Header.test.jsx +18 -0
  269. package/src/components/theme/Icon/Icon.jsx +2 -2
  270. package/src/components/theme/Image/Image.jsx +96 -0
  271. package/src/components/theme/Image/Image.test.jsx +125 -0
  272. package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
  273. package/src/components/theme/Login/Login.jsx +160 -242
  274. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  275. package/src/components/theme/Logo/Logo.jsx +35 -26
  276. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  277. package/src/components/theme/Logout/Logout.jsx +36 -83
  278. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
  279. package/src/components/theme/Navigation/NavItem.jsx +4 -2
  280. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  281. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  282. package/src/components/theme/PasswordReset/PasswordReset.jsx +8 -6
  283. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +96 -171
  284. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  285. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  286. package/src/components/theme/Register/Register.jsx +2 -4
  287. package/src/components/theme/Search/SearchTags.jsx +30 -60
  288. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  289. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  290. package/src/components/theme/Sitemap/Sitemap.jsx +25 -12
  291. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  292. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  293. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  294. package/src/components/theme/View/AlbumView.jsx +21 -16
  295. package/src/components/theme/View/DefaultView.jsx +1 -1
  296. package/src/components/theme/View/EventDatesInfo.jsx +2 -1
  297. package/src/components/theme/View/EventView.jsx +36 -25
  298. package/src/components/theme/View/FileView.jsx +23 -18
  299. package/src/components/theme/View/ImageView.jsx +40 -32
  300. package/src/components/theme/View/ImageView.test.jsx +4 -0
  301. package/src/components/theme/View/LinkView.jsx +53 -78
  302. package/src/components/theme/View/ListingView.jsx +36 -28
  303. package/src/components/theme/View/NewsItemView.jsx +16 -17
  304. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  305. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  306. package/src/components/theme/View/SummaryView.jsx +49 -39
  307. package/src/components/theme/View/TabularView.jsx +59 -53
  308. package/src/components/theme/View/View.jsx +2 -0
  309. package/src/components/theme/Widgets/DateWidget.jsx +2 -1
  310. package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
  311. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  312. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  313. package/src/config/Blocks.jsx +46 -0
  314. package/src/config/Components.jsx +3 -1
  315. package/src/config/ControlPanels.js +2 -1
  316. package/src/config/Loadables.jsx +1 -1
  317. package/src/config/NonContentRoutes.jsx +1 -0
  318. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  319. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  320. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  321. package/src/config/RichTextEditor/Styles.jsx +1 -1
  322. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  323. package/src/config/RichTextEditor/index.js +2 -3
  324. package/src/config/Views.jsx +6 -4
  325. package/src/config/Widgets.jsx +4 -0
  326. package/src/config/index.js +38 -2
  327. package/src/config/server.js +2 -0
  328. package/src/constants/ActionTypes.js +8 -0
  329. package/src/constants/Indexes.js +3 -1
  330. package/src/constants/Languages.js +8 -4
  331. package/src/express-middleware/devproxy.js +1 -1
  332. package/src/express-middleware/files.js +11 -9
  333. package/src/express-middleware/images.js +12 -5
  334. package/src/express-middleware/ok.js +16 -0
  335. package/src/express-middleware/robotstxt.js +1 -1
  336. package/src/express-middleware/sitemap.js +37 -5
  337. package/src/express-middleware/static.js +3 -3
  338. package/src/helpers/Api/Api.js +1 -1
  339. package/src/helpers/Blocks/Blocks.js +52 -6
  340. package/src/helpers/Blocks/Blocks.test.js +92 -13
  341. package/src/helpers/Extensions/index.js +2 -1
  342. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  343. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  344. package/src/helpers/FormValidation/FormValidation.js +42 -3
  345. package/src/helpers/FormValidation/FormValidation.test.js +73 -0
  346. package/src/helpers/Html/Html.jsx +5 -9
  347. package/src/helpers/Html/Html.test.jsx +5 -0
  348. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  349. package/src/helpers/MessageLabels/MessageLabels.js +111 -4
  350. package/src/helpers/Robots/Robots.js +24 -6
  351. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  352. package/src/helpers/Site/index.js +21 -0
  353. package/src/helpers/Sitemap/Sitemap.js +44 -2
  354. package/src/helpers/Url/Url.js +30 -4
  355. package/src/helpers/Url/Url.test.js +55 -0
  356. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  357. package/src/helpers/Utils/Utils.js +73 -13
  358. package/src/helpers/Utils/Utils.test.js +17 -4
  359. package/src/helpers/Utils/usePagination.js +67 -14
  360. package/src/helpers/Utils/usePagination.test.js +115 -0
  361. package/src/helpers/index.js +22 -10
  362. package/src/hooks/client/useClient.js +11 -0
  363. package/src/hooks/clipboard/useClipboard.js +26 -0
  364. package/src/hooks/index.js +2 -0
  365. package/src/icons/grid-block.svg +11 -0
  366. package/src/middleware/Api.test.js +54 -0
  367. package/src/middleware/api.js +209 -175
  368. package/src/middleware/blacklistRoutes.js +25 -22
  369. package/src/middleware/index.js +2 -2
  370. package/src/middleware/storeProtectLoadUtils.js +61 -62
  371. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  372. package/src/reducers/actions/actions.js +8 -6
  373. package/src/reducers/actions/actions.test.js +70 -0
  374. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  375. package/src/reducers/content/content.test.js +4 -4
  376. package/src/reducers/index.js +6 -0
  377. package/src/reducers/navigation/navigation.js +6 -6
  378. package/src/reducers/navigation/navigation.test.js +30 -0
  379. package/src/reducers/navroot/navroot.js +79 -0
  380. package/src/reducers/navroot/navroot.test.js +110 -0
  381. package/src/reducers/relations/relations.js +201 -0
  382. package/src/reducers/site/site.js +51 -0
  383. package/src/reducers/site/site.test.js +67 -0
  384. package/src/reducers/types/types.js +1 -1
  385. package/src/reducers/userSession/userSession.js +15 -1
  386. package/src/registry.js +2 -2
  387. package/src/routes.js +14 -0
  388. package/src/server.jsx +37 -23
  389. package/src/start-server.js +2 -2
  390. package/src/storybook.jsx +24 -38
  391. package/test-setup-config.js +12 -1
  392. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  393. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  394. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  395. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  396. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  397. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  398. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  399. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  400. package/theme/themes/pastanaga/extras/contents.less +6 -1
  401. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  402. package/theme/themes/pastanaga/extras/grid.less +427 -0
  403. package/theme/themes/pastanaga/extras/login.less +3 -0
  404. package/theme/themes/pastanaga/extras/main.less +14 -7
  405. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  406. package/theme/themes/pastanaga/extras/search.less +7 -1
  407. package/theme/themes/pastanaga/extras/sidebar.less +9 -4
  408. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  409. package/theme/themes/pastanaga/extras/toc.less +29 -0
  410. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  411. package/theme/themes/pastanaga/extras/userscontrolpanel.less +104 -73
  412. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  413. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  414. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  415. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  416. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  417. package/tsconfig.json +33 -0
  418. package/webpack-plugins/webpack-less-plugin.js +19 -0
  419. package/.changelog.draft +0 -19
  420. package/.editorconfig +0 -36
  421. package/.storybook/main.js +0 -127
  422. package/.storybook/manager.js +0 -15
  423. package/.storybook/preview.js +0 -21
  424. package/.storybook/static/previewImage.svg +0 -48
  425. package/.vale.ini +0 -10
  426. package/.yarnrc.yml +0 -5
  427. package/jsdoc.json +0 -16
  428. package/netlify.toml +0 -5
  429. package/pyvenv.cfg +0 -3
  430. package/share/man/man1/ttx.1 +0 -225
  431. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  432. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  433. package/src/components/theme/Header/Header.md +0 -27
  434. package/styles/Vocab/Base/accept.txt +0 -0
  435. package/styles/Vocab/Base/reject.txt +0 -0
  436. package/styles/Vocab/Plone/accept.txt +0 -8
  437. package/styles/Vocab/Plone/reject.txt +0 -0
  438. package/towncrier.toml +0 -33
@@ -28,13 +28,13 @@ const StyleMenuButton = ({ icon, active, ...props }) => (
28
28
  <ToolbarButton {...props} icon={icon} active={active} />
29
29
  );
30
30
 
31
- const MenuOpts = ({ editor, toSelect, option, ...rest }) => {
31
+ const MenuOpts = ({ editor, toSelect, option, type }) => {
32
32
  const isActive = toSelect.includes(option);
33
33
  return (
34
34
  <Dropdown.Item
35
35
  as="span"
36
36
  active={isActive}
37
- className={cx({ active: isActive })}
37
+ className={cx(`${type}-${option.value}`, { active: isActive })}
38
38
  {...omit(option, ['isBlock'])}
39
39
  data-isblock={option.isBlock}
40
40
  onClick={(event, selItem) => {
@@ -118,7 +118,12 @@ const StylingsButton = (props) => {
118
118
  content={intl.formatMessage(messages.inlineStyle)}
119
119
  />
120
120
  {inlineOpts.map((option, index) => (
121
- <MenuOpts {...menuItemProps} option={option} key={index} />
121
+ <MenuOpts
122
+ {...menuItemProps}
123
+ type="inline-style"
124
+ option={option}
125
+ key={index}
126
+ />
122
127
  ))}
123
128
  </>
124
129
  )}
@@ -129,7 +134,12 @@ const StylingsButton = (props) => {
129
134
  content={intl.formatMessage(messages.paragraphStyle)}
130
135
  />
131
136
  {blockOpts.map((option, index) => (
132
- <MenuOpts {...menuItemProps} option={option} key={index} />
137
+ <MenuOpts
138
+ {...menuItemProps}
139
+ type="block-style"
140
+ option={option}
141
+ key={index}
142
+ />
133
143
  ))}
134
144
  </>
135
145
  )}
@@ -72,19 +72,28 @@ export const toggleInlineStyle = (editor, style) => {
72
72
  };
73
73
 
74
74
  export const isBlockStyleActive = (editor, style) => {
75
+ const keyName = `style-${style}`;
75
76
  const sn = Array.from(
76
77
  Editor.nodes(editor, {
77
- match: (n) => !Editor.isEditor(n) && typeof n.styleName === 'string',
78
- mode: 'highest',
78
+ match: (n) => {
79
+ const isStyle = typeof n.styleName === 'string' || n[keyName];
80
+ return !Editor.isEditor(n) && isStyle;
81
+ },
82
+ mode: 'all',
79
83
  }),
80
84
  );
81
85
 
82
86
  for (const [n] of sn) {
83
- if (n.styleName.split(' ').filter((x) => x === style).length > 0) {
87
+ if (typeof n.styleName === 'string') {
88
+ if (n.styleName.split(' ').filter((x) => x === style).length > 0) {
89
+ return true;
90
+ }
91
+ } else if (
92
+ n[keyName] &&
93
+ keyName.split('-').filter((x) => x === style).length > 0
94
+ )
84
95
  return true;
85
- }
86
96
  }
87
-
88
97
  return false;
89
98
  };
90
99
 
@@ -1,9 +1,19 @@
1
1
  import React from 'react';
2
2
  import { renderToStaticMarkup } from 'react-dom/server';
3
+ import { useLocation } from 'react-router-dom';
4
+ import { toast } from 'react-toastify';
5
+ import { useIntl } from 'react-intl';
6
+ import { useSelector } from 'react-redux';
3
7
  import { Node, Text } from 'slate';
4
8
  import cx from 'classnames';
5
- import { isEmpty, isEqual, omit } from 'lodash';
9
+ import { isEmpty, omit } from 'lodash';
10
+ import { UniversalLink, Toast } from '@plone/volto/components';
11
+ import { messages, addAppURL } from '@plone/volto/helpers';
12
+ import useClipboard from '@plone/volto/hooks/clipboard/useClipboard';
6
13
  import config from '@plone/volto/registry';
14
+ import linkSVG from '@plone/volto/icons/link.svg';
15
+
16
+ import './less/slate.less';
7
17
 
8
18
  const OMITTED = ['editor', 'path'];
9
19
 
@@ -106,13 +116,7 @@ export const serializeNodes = (nodes, getAttributes, extras = {}) => {
106
116
  mode="view"
107
117
  key={path}
108
118
  data-slate-data={node.data ? serializeData(node) : null}
109
- attributes={
110
- isEqual(path, [0])
111
- ? getAttributes
112
- ? getAttributes(node, path)
113
- : null
114
- : null
115
- }
119
+ attributes={getAttributes ? getAttributes(node, path) : null}
116
120
  extras={extras}
117
121
  >
118
122
  {_serializeNodes(Array.from(Node.children(editor, path)))}
@@ -153,3 +157,68 @@ export const serializeNodesToText = (nodes) => {
153
157
 
154
158
  export const serializeNodesToHtml = (nodes) =>
155
159
  renderToStaticMarkup(serializeNodes(nodes));
160
+
161
+ export const renderLinkElement = (tagName) => {
162
+ function LinkElement({
163
+ attributes,
164
+ children,
165
+ mode = 'edit',
166
+ className = null,
167
+ }) {
168
+ const { slate = {} } = config.settings;
169
+ const Tag = tagName;
170
+ const slug = attributes.id || '';
171
+ const location = useLocation();
172
+ const token = useSelector((state) => state.userSession.token);
173
+ const appPathname = addAppURL(location.pathname);
174
+ // eslint-disable-next-line no-unused-vars
175
+ const [copied, copy, setCopied] = useClipboard(
176
+ appPathname.concat(`#${slug}`),
177
+ );
178
+ const intl = useIntl();
179
+ return !token || slate.useLinkedHeadings === false ? (
180
+ <Tag {...attributes} className={className} tabIndex={0}>
181
+ {children}
182
+ </Tag>
183
+ ) : (
184
+ <Tag {...attributes} className={className} tabIndex={0}>
185
+ {children}
186
+ {mode === 'view' && slug && (
187
+ <UniversalLink
188
+ className="anchor"
189
+ aria-hidden="true"
190
+ tabIndex={-1}
191
+ href={`#${slug}`}
192
+ >
193
+ <style>
194
+ {/* Prettify the unstyled flash of the link icon on development */}
195
+ {`
196
+ a.anchor svg {
197
+ height: var(--anchor-svg-height, 24px);
198
+ }
199
+ `}
200
+ </style>
201
+ <svg
202
+ {...linkSVG.attributes}
203
+ dangerouslySetInnerHTML={{ __html: linkSVG.content }}
204
+ height={null}
205
+ onClick={() => {
206
+ copy();
207
+
208
+ toast.info(
209
+ <Toast
210
+ info
211
+ title={intl.formatMessage(messages.success)}
212
+ content={intl.formatMessage(messages.urlClipboardCopy)}
213
+ />,
214
+ );
215
+ }}
216
+ ></svg>
217
+ </UniversalLink>
218
+ )}
219
+ </Tag>
220
+ );
221
+ }
222
+ LinkElement.displayName = `${tagName}LinkElement`;
223
+ return LinkElement;
224
+ };
@@ -3,11 +3,11 @@ import Toolbar from './Toolbar';
3
3
 
4
4
  // A toolbar that conditionally renders itself based on the presense of
5
5
  // children
6
- export default ({ editor, plugins, show }) => {
6
+ export default function SlateContextToolbar({ editor, plugins, show }) {
7
7
  if (!show) {
8
8
  return null;
9
9
  }
10
10
 
11
11
  const components = plugins.map((plug) => plug(editor)).filter((c) => !!c);
12
12
  return components.length ? <Toolbar>{components}</Toolbar> : '';
13
- };
13
+ }
@@ -1,15 +1,15 @@
1
- export BasicToolbar from './BasicToolbar';
2
- export BlockButton from './BlockButton';
3
- export ClearFormattingButton from './ClearFormattingButton';
4
- export ExpandedToolbar from './ExpandedToolbar';
5
- export Expando from './Expando';
6
- export MarkButton from './MarkButton';
7
- export Menu from './Menu';
8
- export Separator from './Separator';
9
- export SlateContextToolbar from './SlateContextToolbar';
10
- export SlateToolbar from './SlateToolbar';
11
- export Toolbar from './Toolbar';
12
- export ToolbarButton from './ToolbarButton';
13
- export MarkElementButton from './MarkElementButton';
14
- export PositionedToolbar from './PositionedToolbar';
15
- export InlineToolbar from './InlineToolbar';
1
+ export { default as BasicToolbar } from './BasicToolbar';
2
+ export { default as BlockButton } from './BlockButton';
3
+ export { default as ClearFormattingButton } from './ClearFormattingButton';
4
+ export { default as ExpandedToolbar } from './ExpandedToolbar';
5
+ export { default as Expando } from './Expando';
6
+ export { default as MarkButton } from './MarkButton';
7
+ export { default as Menu } from './Menu';
8
+ export { default as Separator } from './Separator';
9
+ export { default as SlateContextToolbar } from './SlateContextToolbar';
10
+ export { default as SlateToolbar } from './SlateToolbar';
11
+ export { default as Toolbar } from './Toolbar';
12
+ export { default as ToolbarButton } from './ToolbarButton';
13
+ export { default as MarkElementButton } from './MarkElementButton';
14
+ export { default as PositionedToolbar } from './PositionedToolbar';
15
+ export { default as InlineToolbar } from './InlineToolbar';
@@ -8,7 +8,7 @@ import RichTextWidgetView from './widgets/RichTextWidgetView';
8
8
  import HtmlSlateWidget from './widgets/HtmlSlateWidget';
9
9
  import ObjectByTypeWidget from './widgets/ObjectByTypeWidget';
10
10
 
11
- export default (config) => {
11
+ export default function applyConfig(config) {
12
12
  config = [installSlate, installTextBlock, installTableBlock].reduce(
13
13
  (acc, apply) => apply(acc),
14
14
  config,
@@ -58,4 +58,4 @@ export default (config) => {
58
58
  }
59
59
 
60
60
  return config;
61
- };
61
+ }
@@ -125,6 +125,13 @@ export function createEmptyParagraph() {
125
125
  };
126
126
  }
127
127
 
128
+ export function createParagraph(text) {
129
+ return {
130
+ type: config.settings.slate.defaultBlockType,
131
+ children: [{ text }],
132
+ };
133
+ }
134
+
128
135
  export const isSingleBlockTypeActive = (editor, format) => {
129
136
  const [match] = Editor.nodes(editor, {
130
137
  match: (n) => n.type === format,
@@ -4,13 +4,26 @@
4
4
  */
5
5
 
6
6
  import React from 'react';
7
+ import isUndefined from 'lodash/isUndefined';
8
+ import isString from 'lodash/isString';
7
9
  import { FormFieldWrapper } from '@plone/volto/components';
8
10
  import SlateEditor from '@plone/volto-slate/editor/SlateEditor';
9
11
 
10
- import { createEmptyParagraph } from '../utils/blocks';
12
+ import { createEmptyParagraph, createParagraph } from '../utils/blocks';
11
13
 
12
14
  import './style.css';
13
15
 
16
+ const getValue = (value) => {
17
+ if (isUndefined(value) || !isUndefined(value?.data)) {
18
+ return [createEmptyParagraph()];
19
+ }
20
+ // Previously this was a text field
21
+ if (isString(value)) {
22
+ return [createParagraph(value)];
23
+ }
24
+ return value;
25
+ };
26
+
14
27
  const SlateRichTextWidget = (props) => {
15
28
  const {
16
29
  id,
@@ -42,13 +55,7 @@ const SlateRichTextWidget = (props) => {
42
55
  readOnly={readOnly}
43
56
  id={id}
44
57
  name={id}
45
- value={
46
- typeof value === 'undefined' ||
47
- typeof value?.data !==
48
- 'undefined' /* previously this was a Draft block */
49
- ? [createEmptyParagraph()]
50
- : value
51
- }
58
+ value={getValue(value)}
52
59
  onChange={(newValue) => {
53
60
  onChange(id, newValue);
54
61
  }}
package/razzle.config.js CHANGED
@@ -8,10 +8,12 @@ const fs = require('fs');
8
8
  const RootResolverPlugin = require('./webpack-plugins/webpack-root-resolver');
9
9
  const RelativeResolverPlugin = require('./webpack-plugins/webpack-relative-resolver');
10
10
  const createAddonsLoader = require('./create-addons-loader');
11
+ const createThemeAddonsLoader = require('./create-theme-addons-loader');
11
12
  const AddonConfigurationRegistry = require('./addon-registry');
12
13
  const CircularDependencyPlugin = require('circular-dependency-plugin');
13
14
  const TerserPlugin = require('terser-webpack-plugin');
14
15
  const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
16
+ const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
15
17
 
16
18
  const fileLoaderFinder = makeLoaderFinder('file-loader');
17
19
 
@@ -132,12 +134,9 @@ const defaultModify = ({
132
134
  }
133
135
 
134
136
  config.plugins.unshift(
135
- // restrict moment.js locales to en/de
136
- // see https://github.com/jmblog/how-to-optimize-momentjs-with-webpack for details
137
- new webpack.ContextReplacementPlugin(
138
- /moment[/\\]locale$/,
139
- new RegExp(Object.keys(languages).join('|')),
140
- ),
137
+ // restrict moment.js locales to supported languages
138
+ // see https://momentjs.com/docs/#/use-it/webpack/ for details
139
+ new MomentLocalesPlugin({ localesToKeep: Object.keys(languages) }),
141
140
  new LodashModuleReplacementPlugin({
142
141
  shorthands: true,
143
142
  cloning: true,
@@ -245,6 +244,28 @@ const defaultModify = ({
245
244
  'lodash-es': path.dirname(require.resolve('lodash')),
246
245
  };
247
246
 
247
+ const [
248
+ addonsThemeLoaderVariablesPath,
249
+ addonsThemeLoaderMainPath,
250
+ ] = createThemeAddonsLoader(registry.getCustomThemeAddons());
251
+
252
+ // Automatic Theme Loading
253
+ if (registry.theme) {
254
+ // The themes should be located in `src/theme`
255
+ const themePath = registry.packages[registry.theme].modulePath;
256
+ const themeConfigPath = `${themePath}/theme/theme.config`;
257
+ config.resolve.alias['../../theme.config$'] = themeConfigPath;
258
+ config.resolve.alias['../../theme.config'] = themeConfigPath;
259
+
260
+ // We create an alias for each custom theme insertion point (variables, main)
261
+ config.resolve.alias[
262
+ 'addonsThemeCustomizationsVariables'
263
+ ] = addonsThemeLoaderVariablesPath;
264
+ config.resolve.alias[
265
+ 'addonsThemeCustomizationsMain'
266
+ ] = addonsThemeLoaderMainPath;
267
+ }
268
+
248
269
  config.performance = {
249
270
  maxAssetSize: 10000000,
250
271
  maxEntrypointSize: 10000000,
@@ -318,6 +339,11 @@ const defaultModify = ({
318
339
 
319
340
  if (config.devServer) {
320
341
  config.devServer.static.watch.ignored = /node_modules\/(?!@plone\/volto)/;
342
+ config.snapshot = {
343
+ managedPaths: [
344
+ /^(.+?[\\/]node_modules[\\/](?!(@plone[\\/]volto))(@.+?[\\/])?.+?)[\\/]/,
345
+ ],
346
+ };
321
347
  }
322
348
 
323
349
  return config;
@@ -71,6 +71,13 @@ export {
71
71
  purgeMessages,
72
72
  } from '@plone/volto/actions/messages/messages';
73
73
  export { getNavigation } from '@plone/volto/actions/navigation/navigation';
74
+ export {
75
+ createRelations,
76
+ deleteRelations,
77
+ queryRelations,
78
+ getRelationStats,
79
+ } from '@plone/volto/actions/relations/relations';
80
+ export { rebuildRelations } from '@plone/volto/actions/relations/rebuild';
74
81
  export { listRoles } from '@plone/volto/actions/roles/roles';
75
82
  export {
76
83
  getSchema,
@@ -131,6 +138,7 @@ export {
131
138
  login,
132
139
  loginRenew,
133
140
  logout,
141
+ resetLoginRequest,
134
142
  } from '@plone/volto/actions/userSession/userSession';
135
143
  export {
136
144
  getVocabulary,
@@ -164,3 +172,5 @@ export {
164
172
  } from './workingcopy/workingcopy';
165
173
  export { getUserSchema } from './userschema/userschema';
166
174
  export { getUpgradeInformation, runUpgrade } from './upgrade/upgrade';
175
+ export { getSite } from './site/site';
176
+ export { getNavroot } from './navroot/navroot';
@@ -1,5 +1,9 @@
1
1
  import { updateIntl } from 'react-intl-redux';
2
- import { normalizeLanguageName, getCookieOptions } from '@plone/volto/helpers';
2
+ import {
3
+ toGettextLang,
4
+ toReactIntlLang,
5
+ getCookieOptions,
6
+ } from '@plone/volto/helpers';
3
7
  import Cookies from 'universal-cookie';
4
8
 
5
9
  export function changeLanguageCookies(language, req) {
@@ -7,18 +11,15 @@ export function changeLanguageCookies(language, req) {
7
11
 
8
12
  const cookieOptions = getCookieOptions({
9
13
  secure: req?.protocol?.startsWith('https') ? true : false,
14
+ sameSite: 'strict',
10
15
  });
11
16
 
12
17
  if (!req) {
13
- cookies.set(
14
- 'I18N_LANGUAGE',
15
- normalizeLanguageName(language) || '',
16
- cookieOptions,
17
- );
18
+ cookies.set('I18N_LANGUAGE', toGettextLang(language) || '', cookieOptions);
18
19
  } else {
19
20
  req.universalCookies.set(
20
21
  'I18N_LANGUAGE',
21
- normalizeLanguageName(language) || '',
22
+ toGettextLang(language) || '',
22
23
  cookieOptions,
23
24
  );
24
25
  }
@@ -35,7 +36,7 @@ export function changeLanguage(language, locale, req) {
35
36
  changeLanguageCookies(language, req);
36
37
 
37
38
  return updateIntl({
38
- locale: language,
39
+ locale: toReactIntlLang(language),
39
40
  messages: locale,
40
41
  });
41
42
  }
@@ -0,0 +1,16 @@
1
+ import { GET_NAVROOT } from '@plone/volto/constants/ActionTypes';
2
+
3
+ /**
4
+ * Get the navigation root information.
5
+ * @function getNavroot
6
+ * @returns {Object} navroot
7
+ */
8
+ export function getNavroot(url) {
9
+ return {
10
+ type: GET_NAVROOT,
11
+ request: {
12
+ op: 'get',
13
+ path: `${url}/@navroot`,
14
+ },
15
+ };
16
+ }
@@ -0,0 +1,15 @@
1
+ import { getNavroot } from './navroot';
2
+ import { GET_NAVROOT } from '@plone/volto/constants/ActionTypes';
3
+
4
+ describe('Breadcrumbs action', () => {
5
+ describe('getBreadcrumbs', () => {
6
+ it('should create an action to get the breadcrumbs', () => {
7
+ const url = 'http://localhost';
8
+ const action = getNavroot(url);
9
+
10
+ expect(action.type).toEqual(GET_NAVROOT);
11
+ expect(action.request.op).toEqual('get');
12
+ expect(action.request.path).toEqual(`${url}/@navroot`);
13
+ });
14
+ });
15
+ });
@@ -31,24 +31,30 @@ export function getQueryStringResults(path, data, subrequest, page) {
31
31
  }
32
32
  }
33
33
 
34
+ const query = {
35
+ ...requestData,
36
+ ...(!requestData.b_size && {
37
+ b_size: settings.defaultPageSize,
38
+ }),
39
+ ...(page && {
40
+ b_start: requestData.b_size
41
+ ? data.b_size * (page - 1)
42
+ : settings.defaultPageSize * (page - 1),
43
+ }),
44
+ query: requestData?.query,
45
+ };
46
+
34
47
  return {
35
48
  type: GET_QUERYSTRING_RESULTS,
36
49
  subrequest,
37
50
  request: {
38
- op: 'post',
39
- path: `${path}/@querystring-search`,
40
- data: {
41
- ...requestData,
42
- ...(!requestData.b_size && {
43
- b_size: settings.defaultPageSize,
44
- }),
45
- ...(page && {
46
- b_start: requestData.b_size
47
- ? data.b_size * (page - 1)
48
- : settings.defaultPageSize * (page - 1),
49
- }),
50
- query: requestData?.query,
51
- },
51
+ op: settings.querystringSearchGet ? 'get' : 'post',
52
+ path: `${path}/@querystring-search${
53
+ settings.querystringSearchGet
54
+ ? `?query=${encodeURIComponent(JSON.stringify(query))}`
55
+ : ''
56
+ }`,
57
+ data: settings.querystringSearchGet ? null : query,
52
58
  },
53
59
  };
54
60
  }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Rebuild relations action.
3
+ * @module actions/relations/rebuild
4
+ */
5
+
6
+ import { REBUILD_RELATIONS } from '@plone/volto/constants/ActionTypes';
7
+
8
+ /**
9
+ * Rebuild relation function.
10
+ * @function rebuildRelations
11
+ * @param {Boolean} flush Flush intids
12
+ * @returns {Object} Rebuild relation action.
13
+ */
14
+ export function rebuildRelations(flush = false) {
15
+ let path = '/@relations/rebuild';
16
+ const data = flush === true ? { flush: 1 } : {};
17
+ return {
18
+ type: REBUILD_RELATIONS,
19
+ request: {
20
+ op: 'post',
21
+ path: path,
22
+ data: data,
23
+ },
24
+ };
25
+ }
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Relations actions.
3
+ * @module actions/relations/relations
4
+ */
5
+
6
+ import {
7
+ CREATE_RELATIONS,
8
+ DELETE_RELATIONS,
9
+ LIST_RELATIONS,
10
+ STATS_RELATIONS,
11
+ } from '@plone/volto/constants/ActionTypes';
12
+
13
+ /**
14
+ * Create relation function.
15
+ * @function createRelations
16
+ * @param {Object|Array} content Relation data.
17
+ * @returns {Object} Create relation action.
18
+ */
19
+ export function createRelations(content) {
20
+ return {
21
+ type: CREATE_RELATIONS,
22
+ request: {
23
+ op: 'post',
24
+ path: '/@relations',
25
+ data: {
26
+ items: content,
27
+ },
28
+ },
29
+ };
30
+ }
31
+
32
+ /**
33
+ * Delete relation function.
34
+ * @function deleteRelations
35
+ * @param {string} id Relation id
36
+ * @returns {Object} Delete relation action.
37
+ */
38
+ export function deleteRelations(content) {
39
+ return {
40
+ type: DELETE_RELATIONS,
41
+ request: {
42
+ op: 'del',
43
+ path: `/@relations`,
44
+ data: {
45
+ items: content,
46
+ },
47
+ },
48
+ };
49
+ }
50
+
51
+ /**
52
+ * Query relations
53
+ * @function queryRelations
54
+ * @param {string} relation Name of relation
55
+ * @param {boolean} onlyBroken
56
+ * @returns {Object} List relations action
57
+ */
58
+ export function queryRelations(
59
+ relation = null,
60
+ onlyBroken = false,
61
+ subrequest = null,
62
+ source = null,
63
+ target = null,
64
+ query_source = null,
65
+ query_target = null,
66
+ ) {
67
+ let path = '/@relations';
68
+ var searchParams = new URLSearchParams();
69
+ relation && searchParams.append('relation', relation);
70
+ onlyBroken && searchParams.append('onlyBroken', onlyBroken);
71
+ source && searchParams.append('source', source);
72
+ target && searchParams.append('target', target);
73
+ query_source && searchParams.append('query_source', query_source);
74
+ query_target && searchParams.append('query_target', query_target);
75
+ const searchParamsToString = searchParams.toString();
76
+ if (searchParamsToString) {
77
+ path += `?${searchParamsToString}`;
78
+ }
79
+ return {
80
+ type: LIST_RELATIONS,
81
+ subrequest,
82
+ request: {
83
+ op: 'get',
84
+ path: path,
85
+ },
86
+ };
87
+ }
88
+
89
+ /** Get relation stats
90
+ * @function getRelationStats
91
+ * @returns {Object} Relation stats
92
+ */
93
+
94
+ export function getRelationStats() {
95
+ let path = '/@relations';
96
+ return {
97
+ type: STATS_RELATIONS,
98
+ request: {
99
+ op: 'get',
100
+ path: path,
101
+ },
102
+ };
103
+ }
@@ -0,0 +1,15 @@
1
+ import { queryRelations } from './relations';
2
+ import { LIST_RELATIONS } from '@plone/volto/constants/ActionTypes';
3
+
4
+ describe('Relations action', () => {
5
+ describe('queryRelations', () => {
6
+ it('should create an action to get relations of type "relatedItems"', () => {
7
+ const relation = 'relatedItems';
8
+ const action = queryRelations(relation);
9
+
10
+ expect(action.type).toEqual(LIST_RELATIONS);
11
+ expect(action.request.op).toEqual('get');
12
+ expect(action.request.path).toEqual(`/@relations?relation=${relation}`);
13
+ });
14
+ });
15
+ });