@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
@@ -37,8 +37,7 @@ const messages = defineMessages({
37
37
  defaultMessage: 'Show search button?',
38
38
  },
39
39
  showSearchButtonDescription: {
40
- id:
41
- 'The button presence disables the live search, the query is issued when you press ENTER',
40
+ id: 'The button presence disables the live search, the query is issued when you press ENTER',
42
41
  defaultMessage:
43
42
  'The button presence disables the live search, the query is issued when you press ENTER',
44
43
  },
@@ -83,11 +82,19 @@ const messages = defineMessages({
83
82
  defaultMessage: 'Hide facet?',
84
83
  },
85
84
  hideFacetDescription: {
86
- id:
87
- 'Hidden facets will still filter the results if proper parameters are passed in URLs',
85
+ id: 'Hidden facets will still filter the results if proper parameters are passed in URLs',
88
86
  defaultMessage:
89
87
  'Hidden facets will still filter the results if proper parameters are passed in URLs',
90
88
  },
89
+ advancedFacetTitle: {
90
+ id: 'Advanced facet?',
91
+ defaultMessage: 'Advanced facet?',
92
+ },
93
+ advancedFacetDescription: {
94
+ id: 'Advanced facets are initially hidden and displayed on demand',
95
+ defaultMessage:
96
+ 'Advanced facets are initially hidden and displayed on demand',
97
+ },
91
98
  facetWidget: {
92
99
  id: 'Facet widget',
93
100
  defaultMessage: 'Facet widget',
@@ -131,7 +138,7 @@ const FacetSchema = ({ intl }) => ({
131
138
  {
132
139
  id: 'default',
133
140
  title: 'Default',
134
- fields: ['title', 'field', 'type', 'hidden'],
141
+ fields: ['title', 'field', 'type', 'hidden', 'advanced'],
135
142
  },
136
143
  ],
137
144
  properties: {
@@ -170,17 +177,25 @@ const FacetSchema = ({ intl }) => ({
170
177
  default: false,
171
178
  description: intl.formatMessage(messages.hideFacetDescription),
172
179
  },
180
+ advanced: {
181
+ type: 'boolean',
182
+ title: intl.formatMessage(messages.advancedFacetTitle),
183
+ default: false,
184
+ description: intl.formatMessage(messages.advancedFacetDescription),
185
+ },
173
186
  type: {
174
187
  title: intl.formatMessage(messages.facetWidget),
175
- choices: config.blocks.blocksConfig.search.extensions.facetWidgets.types.map(
176
- ({ id, title }) => [
177
- id,
178
- `${intl.formatMessage({ id: id, defaultMessage: title })}`,
179
- ],
180
- ),
181
- defaultValue: config.blocks.blocksConfig.search.extensions.facetWidgets.types.find(
182
- ({ isDefault }) => isDefault,
183
- ).id,
188
+ choices:
189
+ config.blocks.blocksConfig.search.extensions.facetWidgets.types.map(
190
+ ({ id, title }) => [
191
+ id,
192
+ `${intl.formatMessage({ id: id, defaultMessage: title })}`,
193
+ ],
194
+ ),
195
+ defaultValue:
196
+ config.blocks.blocksConfig.search.extensions.facetWidgets.types.find(
197
+ ({ isDefault }) => isDefault,
198
+ ).id,
184
199
  },
185
200
  },
186
201
  required: ['field'],
@@ -157,9 +157,8 @@ class CellComponent extends Component {
157
157
  const selectionState = this.state.editorState.getSelection();
158
158
  const anchorKey = selectionState.getAnchorKey();
159
159
  const currentContent = this.state.editorState.getCurrentContent();
160
- const currentContentBlock = currentContent.getBlockForKey(
161
- anchorKey,
162
- );
160
+ const currentContentBlock =
161
+ currentContent.getBlockForKey(anchorKey);
163
162
  const blockType = currentContentBlock.getType();
164
163
  if (!includes(this.draftConfig.listBlockTypes, blockType)) {
165
164
  this.props.onSelectBlock(
@@ -24,7 +24,6 @@ const TeaserBody = (props) => {
24
24
  TeaserBody.propTypes = {
25
25
  data: PropTypes.objectOf(PropTypes.any).isRequired,
26
26
  isEditMode: PropTypes.bool,
27
- variation: PropTypes.string,
28
27
  };
29
28
 
30
29
  export default TeaserBody;
@@ -3,8 +3,7 @@ import PropTypes from 'prop-types';
3
3
  import { Message } from 'semantic-ui-react';
4
4
  import { defineMessages, useIntl } from 'react-intl';
5
5
  import imageBlockSVG from '@plone/volto/components/manage/Blocks/Image/block-image.svg';
6
- import { flattenToAppURL, isInternalURL } from '@plone/volto/helpers';
7
- import { getTeaserImageURL } from './utils';
6
+ import { isInternalURL } from '@plone/volto/helpers';
8
7
  import { MaybeWrap } from '@plone/volto/components';
9
8
  import { UniversalLink } from '@plone/volto/components';
10
9
  import cx from 'classnames';
@@ -18,20 +17,14 @@ const messages = defineMessages({
18
17
  },
19
18
  });
20
19
 
21
- const DefaultImage = (props) => <img {...props} alt={props.alt || ''} />;
22
-
23
20
  const TeaserDefaultTemplate = (props) => {
24
21
  const { className, data, isEditMode } = props;
25
22
  const intl = useIntl();
26
23
  const href = data.href?.[0];
27
24
  const image = data.preview_image?.[0];
28
- const align = data?.styles?.align;
29
25
 
30
- const hasImageComponent = config.getComponent('Image').component;
31
- const Image = config.getComponent('Image').component || DefaultImage;
26
+ const Image = config.getComponent('Image').component;
32
27
  const { openExternalLinkInNewTab } = config.settings;
33
- const defaultImageSrc =
34
- href && flattenToAppURL(getTeaserImageURL({ href, image, align }));
35
28
 
36
29
  return (
37
30
  <div className={cx('block teaser', className)}>
@@ -60,9 +53,11 @@ const TeaserDefaultTemplate = (props) => {
60
53
  {(href.hasPreviewImage || href.image_field || image) && (
61
54
  <div className="image-wrapper">
62
55
  <Image
63
- src={hasImageComponent ? href : defaultImageSrc}
56
+ item={image || href}
57
+ imageField={image ? image.image_field : href.image_field}
64
58
  alt=""
65
59
  loading="lazy"
60
+ responsive={true}
66
61
  />
67
62
  </div>
68
63
  )}
@@ -101,3 +101,8 @@ export const TeaserSchema = ({ intl }) => {
101
101
 
102
102
  return schema;
103
103
  };
104
+
105
+ export const gridTeaserDisableStylingSchema = ({ schema, formData, intl }) => {
106
+ schema.fieldsets = schema.fieldsets.filter((item) => item.id !== 'styling');
107
+ return schema;
108
+ };
@@ -275,9 +275,8 @@ export class EditComponent extends Component {
275
275
  const selectionState = this.state.editorState.getSelection();
276
276
  const anchorKey = selectionState.getAnchorKey();
277
277
  const currentContent = this.state.editorState.getCurrentContent();
278
- const currentContentBlock = currentContent.getBlockForKey(
279
- anchorKey,
280
- );
278
+ const currentContentBlock =
279
+ currentContent.getBlockForKey(anchorKey);
281
280
  const blockType = currentContentBlock.getType();
282
281
  if (!includes(this.draftConfig.listBlockTypes, blockType)) {
283
282
  this.props.onSelectBlock(
@@ -1,16 +1,3 @@
1
- /**
2
- * View title/description block.
3
- * @module volto-slate/blocks/Title/TitleBlockView
4
- */
5
-
6
- import React from 'react';
7
- import PropTypes from 'prop-types';
8
-
9
- /**
10
- * View title block component.
11
- * @class View
12
- * @extends Component
13
- */
14
1
  const TitleBlockView = ({ properties, metadata }) => {
15
2
  return (
16
3
  <h1 className="documentFirstHeading">
@@ -19,14 +6,4 @@ const TitleBlockView = ({ properties, metadata }) => {
19
6
  );
20
7
  };
21
8
 
22
- /**
23
- * Property types.
24
- * @property {Object} propTypes Property types.
25
- * @static
26
- */
27
- TitleBlockView.propTypes = {
28
- properties: PropTypes.objectOf(PropTypes.any).isRequired,
29
- metadata: PropTypes.objectOf(PropTypes.any),
30
- };
31
-
32
9
  export default TitleBlockView;
@@ -1,10 +1,25 @@
1
1
  import React from 'react';
2
2
  import renderer from 'react-test-renderer';
3
+ import configureStore from 'redux-mock-store';
4
+ import { Provider } from 'react-intl-redux';
5
+ import { MemoryRouter } from 'react-router-dom';
3
6
  import View from './View';
4
7
 
8
+ const mockStore = configureStore();
9
+
5
10
  test('renders a view title component', () => {
11
+ const store = mockStore({
12
+ intl: {
13
+ locale: 'en',
14
+ messages: {},
15
+ },
16
+ });
6
17
  const component = renderer.create(
7
- <View properties={{ title: 'My Title' }} />,
18
+ <Provider store={store}>
19
+ <MemoryRouter>
20
+ <View properties={{ title: 'My Title' }} id="a123" />
21
+ </MemoryRouter>
22
+ </Provider>,
8
23
  );
9
24
  const json = component.toJSON();
10
25
  expect(json).toMatchSnapshot();
@@ -1,8 +1,37 @@
1
- const TableOfContentsSchema = ({ data }) => {
1
+ import { defineMessages } from 'react-intl';
2
+
3
+ const messages = defineMessages({
4
+ toc: {
5
+ id: 'toc',
6
+ defaultMessage: 'Table of Contents',
7
+ },
8
+ Title: {
9
+ id: 'Title',
10
+ defaultMessage: 'Title',
11
+ },
12
+ HideTitle: {
13
+ id: 'Hide title',
14
+ defaultMessage: 'Hide title',
15
+ },
16
+ Entries: {
17
+ id: 'Entries',
18
+ defaultMessage: 'Entries',
19
+ },
20
+ Ordered: {
21
+ id: 'Ordered',
22
+ defaultMessage: 'Ordered',
23
+ },
24
+ Sticky: {
25
+ id: 'Sticky',
26
+ defaultMessage: 'Sticky',
27
+ },
28
+ });
29
+
30
+ const TableOfContentsSchema = ({ data, intl }) => {
2
31
  const { variation = 'default' } = data;
3
32
 
4
33
  return {
5
- title: 'Table of Contents',
34
+ title: intl.formatMessage(messages.toc),
6
35
  fieldsets: [
7
36
  {
8
37
  id: 'default',
@@ -10,21 +39,21 @@ const TableOfContentsSchema = ({ data }) => {
10
39
  fields: [
11
40
  'title',
12
41
  'hide_title',
13
- ...(variation === 'default' ? ['ordered'] : []),
42
+ ...(variation === 'default' ? ['ordered'] : ['sticky']),
14
43
  'levels',
15
44
  ],
16
45
  },
17
46
  ],
18
47
  properties: {
19
48
  title: {
20
- title: 'Block title',
49
+ title: intl.formatMessage(messages.Title),
21
50
  },
22
51
  hide_title: {
23
- title: 'Hide title',
52
+ title: intl.formatMessage(messages.HideTitle),
24
53
  type: 'boolean',
25
54
  },
26
55
  levels: {
27
- title: 'Entries',
56
+ title: intl.formatMessage(messages.Entries),
28
57
  isMulti: true,
29
58
  choices: [
30
59
  ['h1', 'h1'],
@@ -36,7 +65,11 @@ const TableOfContentsSchema = ({ data }) => {
36
65
  ],
37
66
  },
38
67
  ordered: {
39
- title: 'Ordered',
68
+ title: intl.formatMessage(messages.Ordered),
69
+ type: 'boolean',
70
+ },
71
+ sticky: {
72
+ title: intl.formatMessage(messages.Sticky),
40
73
  type: 'boolean',
41
74
  },
42
75
  },
@@ -16,16 +16,79 @@ import {
16
16
  getBlocksLayoutFieldname,
17
17
  } from '@plone/volto/helpers';
18
18
 
19
+ export const getBlocksTocEntries = (properties, tocData) => {
20
+ const blocksFieldName = getBlocksFieldname(properties);
21
+ const blocksLayoutFieldname = getBlocksLayoutFieldname(properties);
22
+
23
+ const blocks = properties[blocksFieldName];
24
+ const blocks_layout = properties[blocksLayoutFieldname];
25
+
26
+ const levels =
27
+ tocData.levels?.length > 0
28
+ ? tocData.levels.map((l) => parseInt(l.slice(1)))
29
+ : [1, 2, 3, 4, 5, 6];
30
+ let rootLevel = Infinity;
31
+ let blocksFormEntries = [];
32
+ let tocEntries = {};
33
+ let tocEntriesLayout = [];
34
+
35
+ blocks_layout.items.forEach((id) => {
36
+ const block = blocks[id];
37
+ const blockConfig = config.blocks.blocksConfig[block['@type']];
38
+
39
+ if (!block || !blockConfig) {
40
+ return null;
41
+ }
42
+ if (!blockConfig.tocEntries && !blockConfig.tocEntry) {
43
+ return null;
44
+ }
45
+
46
+ const blockTocEntry = blockConfig.tocEntry?.(block, tocData);
47
+
48
+ const blockTocEntries = [
49
+ ...(blockConfig.tocEntries?.(block, tocData) ||
50
+ (blockTocEntry ? [blockTocEntry] : [])),
51
+ ];
52
+
53
+ blocksFormEntries = [...blocksFormEntries, ...blockTocEntries];
54
+
55
+ blockTocEntries.forEach((entry, index) => {
56
+ const i = `${id}-${index}`;
57
+ const level = entry[0];
58
+ const title = entry[1];
59
+ const items = [];
60
+ if (!level || !levels.includes(level)) return;
61
+ tocEntriesLayout.push(i);
62
+ tocEntries[i] = {
63
+ level,
64
+ title: title || block.plaintext,
65
+ items,
66
+ id: i,
67
+ };
68
+ if (level < rootLevel) {
69
+ rootLevel = level;
70
+ }
71
+ });
72
+ });
73
+
74
+ return {
75
+ rootLevel,
76
+ blocksFormEntries,
77
+ tocEntries,
78
+ tocEntriesLayout,
79
+ };
80
+ };
81
+
19
82
  /**
20
83
  * View toc block class.
21
84
  * @class View
22
85
  * @extends Component
23
86
  */
24
87
  const View = (props) => {
25
- const { properties, data } = props;
88
+ const { data } = props;
26
89
  const { variation } = props;
27
- const blocksFieldname = getBlocksFieldname(properties);
28
- const blocksLayoutFieldname = getBlocksLayoutFieldname(properties);
90
+ const metadata = props.metadata || props.properties;
91
+ const blocksFieldname = getBlocksFieldname(metadata);
29
92
  const levels = React.useMemo(
30
93
  () =>
31
94
  data.levels?.length > 0
@@ -34,14 +97,15 @@ const View = (props) => {
34
97
  [data],
35
98
  );
36
99
  const tocEntries = React.useMemo(() => {
37
- let rootLevel = Infinity;
38
100
  let entries = [];
39
101
  let prevEntry = {};
40
- let tocEntries = {};
41
- let tocEntriesLayout = [];
102
+ const { rootLevel, tocEntries, tocEntriesLayout } = getBlocksTocEntries(
103
+ metadata,
104
+ data,
105
+ );
42
106
 
43
- properties[blocksLayoutFieldname].items.forEach((id) => {
44
- const block = properties[blocksFieldname][id];
107
+ tocEntriesLayout.forEach((id) => {
108
+ const block = metadata[blocksFieldname][id];
45
109
  if (typeof block === 'undefined') {
46
110
  return null;
47
111
  }
@@ -50,16 +114,22 @@ const View = (props) => {
50
114
  block,
51
115
  data,
52
116
  );
117
+
53
118
  if (entry) {
54
119
  const level = entry[0];
55
120
  const title = entry[1];
56
121
  const items = [];
122
+ if (!title?.trim() && !block.plaintext?.trim()) return;
57
123
  if (!level || !levels.includes(level)) return;
58
124
  tocEntriesLayout.push(id);
59
- tocEntries[id] = { level, title: title || block.plaintext, items, id };
60
- if (level < rootLevel) {
61
- rootLevel = level;
62
- }
125
+ tocEntries[id] = {
126
+ level,
127
+ title: title || block.plaintext,
128
+ items,
129
+ id,
130
+ override_toc: block.override_toc,
131
+ plaintext: block.plaintext,
132
+ };
63
133
  }
64
134
  });
65
135
 
@@ -91,7 +161,7 @@ const View = (props) => {
91
161
  });
92
162
 
93
163
  return entries;
94
- }, [data, levels, properties, blocksFieldname, blocksLayoutFieldname]);
164
+ }, [data, levels, metadata, blocksFieldname]);
95
165
 
96
166
  const Renderer = variation?.view;
97
167
  return (
@@ -101,7 +171,7 @@ const View = (props) => {
101
171
  )}
102
172
 
103
173
  {Renderer ? (
104
- <Renderer {...props} tocEntries={tocEntries} properties={properties} />
174
+ <Renderer {...props} tocEntries={tocEntries} metadata={metadata} />
105
175
  ) : (
106
176
  <div>View extension not found</div>
107
177
  )}
@@ -8,15 +8,20 @@ import PropTypes from 'prop-types';
8
8
  import { map } from 'lodash';
9
9
  import { List } from 'semantic-ui-react';
10
10
  import { FormattedMessage, injectIntl } from 'react-intl';
11
- import AnchorLink from 'react-anchor-link-smooth-scroll';
11
+ import Slugger from 'github-slugger';
12
+ import { UniversalLink } from '@plone/volto/components';
13
+ import { normalizeString } from '@plone/volto/helpers';
12
14
 
13
15
  const RenderListItems = ({ items, data }) => {
14
16
  return map(items, (item) => {
15
- const { id, level, title } = item;
17
+ const { id, level, title, override_toc, plaintext } = item;
18
+ const slug = override_toc
19
+ ? Slugger.slug(normalizeString(plaintext))
20
+ : Slugger.slug(normalizeString(title)) || id;
16
21
  return (
17
22
  item && (
18
23
  <List.Item key={id} className={`item headline-${level}`} as="li">
19
- <AnchorLink href={`#${id}`}>{title}</AnchorLink>
24
+ <UniversalLink href={`#${slug}`}>{title}</UniversalLink>
20
25
  {item.items?.length > 0 && (
21
26
  <List
22
27
  ordered={data.ordered}
@@ -0,0 +1,44 @@
1
+ import renderer from 'react-test-renderer';
2
+ import configureStore from 'redux-mock-store';
3
+ import { Provider } from 'react-intl-redux';
4
+ import { MemoryRouter } from 'react-router-dom';
5
+ import DefaultTocRenderer from './DefaultTocRenderer';
6
+
7
+ const mockStore = configureStore();
8
+
9
+ const data = { '@type': 'toc', variation: 'default' };
10
+
11
+ const tocEntries = [
12
+ {
13
+ level: 2,
14
+ title: 'Hello this is a sample page',
15
+ items: [
16
+ {
17
+ level: 3,
18
+ title: 'Test level 3',
19
+ items: [],
20
+ id: 'be612682-6df9-4a5e-b3a1-9dec5d82ae14',
21
+ parentId: '3a8bff13-3245-44f6-8a35-e0defef5898e',
22
+ },
23
+ ],
24
+ id: '3a8bff13-3245-44f6-8a35-e0defef5898e',
25
+ },
26
+ ];
27
+
28
+ test('renders a default toc renderer component', () => {
29
+ const store = mockStore({
30
+ intl: {
31
+ locale: 'en',
32
+ messages: {},
33
+ },
34
+ });
35
+ const component = renderer.create(
36
+ <Provider store={store}>
37
+ <MemoryRouter>
38
+ <DefaultTocRenderer data={data} tocEntries={tocEntries} />
39
+ </MemoryRouter>
40
+ </Provider>,
41
+ );
42
+ const json = component.toJSON();
43
+ expect(json).toMatchSnapshot();
44
+ });