@plone/volto 18.0.0-alpha.13 → 18.0.0-alpha.14

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 (296) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/locales/ca/LC_MESSAGES/volto.po +6 -0
  3. package/locales/ca.json +1 -1
  4. package/locales/de/LC_MESSAGES/volto.po +6 -0
  5. package/locales/de.json +1 -1
  6. package/locales/en/LC_MESSAGES/volto.po +6 -0
  7. package/locales/en.json +1 -1
  8. package/locales/es/LC_MESSAGES/volto.po +6 -0
  9. package/locales/es.json +1 -1
  10. package/locales/eu/LC_MESSAGES/volto.po +6 -0
  11. package/locales/eu.json +1 -1
  12. package/locales/fi/LC_MESSAGES/volto.po +6 -0
  13. package/locales/fi.json +1 -1
  14. package/locales/fr/LC_MESSAGES/volto.po +6 -0
  15. package/locales/fr.json +1 -1
  16. package/locales/it/LC_MESSAGES/volto.po +6 -0
  17. package/locales/it.json +1 -1
  18. package/locales/ja/LC_MESSAGES/volto.po +6 -0
  19. package/locales/ja.json +1 -1
  20. package/locales/nl/LC_MESSAGES/volto.po +6 -0
  21. package/locales/nl.json +1 -1
  22. package/locales/pt/LC_MESSAGES/volto.po +6 -0
  23. package/locales/pt.json +1 -1
  24. package/locales/pt_BR/LC_MESSAGES/volto.po +6 -0
  25. package/locales/pt_BR.json +1 -1
  26. package/locales/ro/LC_MESSAGES/volto.po +6 -0
  27. package/locales/ro.json +1 -1
  28. package/locales/volto.pot +7 -1
  29. package/locales/zh_CN/LC_MESSAGES/volto.po +6 -0
  30. package/locales/zh_CN.json +1 -1
  31. package/package.json +8 -7
  32. package/src/components/manage/Form/Form.jsx +138 -120
  33. package/src/components/manage/Form/Form.test.jsx +7 -0
  34. package/src/components/manage/Preferences/ChangePassword.test.jsx +7 -0
  35. package/src/components/manage/Preferences/PersonalInformation.test.jsx +14 -0
  36. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +7 -0
  37. package/src/components/manage/Toolbar/Toolbar.jsx +35 -2
  38. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  39. package/src/components/theme/Comments/Comments.test.jsx +7 -0
  40. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +3 -1
  41. package/src/components/theme/Logo/Logo.jsx +18 -12
  42. package/src/components/theme/Logo/Logo.test.jsx +4 -1
  43. package/src/components/theme/PasswordReset/PasswordReset.test.jsx +7 -0
  44. package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +7 -0
  45. package/src/components/theme/Register/Register.test.jsx +7 -0
  46. package/src/components/theme/SlotRenderer/SlotRenderer.test.jsx +56 -0
  47. package/src/components/theme/SlotRenderer/SlotRenderer.tsx +54 -0
  48. package/src/components/theme/View/View.jsx +3 -0
  49. package/src/components/theme/View/View.test.jsx +3 -0
  50. package/src/config/index.js +3 -1
  51. package/src/helpers/Blocks/Blocks.js +5 -2
  52. package/src/helpers/Slots/index.tsx +12 -0
  53. package/src/helpers/index.js +1 -0
  54. package/test-setup-config.js +1 -0
  55. package/theme/themes/pastanaga/extras/toolbar.less +4 -4
  56. package/tsconfig.declarations.json +1 -0
  57. package/types/components/manage/Actions/Actions.d.ts +1 -1
  58. package/types/components/manage/AnchorPlugin/components/Link/index.d.ts +1 -1
  59. package/types/components/manage/BlockChooser/BlockChooserButton.d.ts +2 -2
  60. package/types/components/manage/BlockChooser/BlockChooserSearch.d.ts +1 -1
  61. package/types/components/manage/Blocks/Block/BlocksForm.d.ts +1 -1
  62. package/types/components/manage/Blocks/Block/DefaultEdit.d.ts +1 -1
  63. package/types/components/manage/Blocks/Block/DefaultView.d.ts +1 -1
  64. package/types/components/manage/Blocks/Block/Style.d.ts +1 -1
  65. package/types/components/manage/Blocks/Container/Data.d.ts +1 -1
  66. package/types/components/manage/Blocks/Container/Edit.d.ts +1 -1
  67. package/types/components/manage/Blocks/Container/EditBlockWrapper.d.ts +1 -1
  68. package/types/components/manage/Blocks/Container/NewBlockAddButton.d.ts +1 -1
  69. package/types/components/manage/Blocks/Container/SimpleContainerToolbar.d.ts +1 -1
  70. package/types/components/manage/Blocks/Description/Edit.d.ts +1 -1
  71. package/types/components/manage/Blocks/Description/View.d.ts +1 -1
  72. package/types/components/manage/Blocks/Grid/Edit.d.ts +1 -1
  73. package/types/components/manage/Blocks/Grid/View.d.ts +1 -1
  74. package/types/components/manage/Blocks/HTML/View.d.ts +1 -1
  75. package/types/components/manage/Blocks/HeroImageLeft/Data.d.ts +1 -1
  76. package/types/components/manage/Blocks/HeroImageLeft/View.d.ts +1 -1
  77. package/types/components/manage/Blocks/Image/ImageSidebar.d.ts +1 -1
  78. package/types/components/manage/Blocks/Image/View.d.ts +2 -2
  79. package/types/components/manage/Blocks/Image/schema.d.ts +1 -1
  80. package/types/components/manage/Blocks/LeadImage/View.d.ts +1 -1
  81. package/types/components/manage/Blocks/Listing/DefaultNoResultsComponent.d.ts +1 -1
  82. package/types/components/manage/Blocks/Listing/DefaultTemplate.d.ts +1 -1
  83. package/types/components/manage/Blocks/Listing/Edit.d.ts +1 -1
  84. package/types/components/manage/Blocks/Listing/GalleryNoResultsComponent.d.ts +1 -1
  85. package/types/components/manage/Blocks/Listing/ImageGallery.d.ts +1 -1
  86. package/types/components/manage/Blocks/Listing/ListingData.d.ts +1 -1
  87. package/types/components/manage/Blocks/Listing/SummaryTemplate.d.ts +1 -1
  88. package/types/components/manage/Blocks/Listing/View.d.ts +1 -1
  89. package/types/components/manage/Blocks/Maps/Edit.d.ts +1 -1
  90. package/types/components/manage/Blocks/Maps/MapsSidebar.d.ts +1 -1
  91. package/types/components/manage/Blocks/Search/SearchBlockEdit.d.ts +1 -1
  92. package/types/components/manage/Blocks/Search/SearchBlockView.d.ts +2 -2
  93. package/types/components/manage/Blocks/Search/components/CheckboxFacet.d.ts +1 -1
  94. package/types/components/manage/Blocks/Search/components/DateRangeFacetFilterListEntry.d.ts +1 -1
  95. package/types/components/manage/Blocks/Search/components/Facets.d.ts +1 -1
  96. package/types/components/manage/Blocks/Search/components/FilterList.d.ts +1 -1
  97. package/types/components/manage/Blocks/Search/components/SearchDetails.d.ts +1 -1
  98. package/types/components/manage/Blocks/Search/components/SearchInput.d.ts +1 -1
  99. package/types/components/manage/Blocks/Search/components/SelectFacetFilterListEntry.d.ts +1 -1
  100. package/types/components/manage/Blocks/Search/components/ToggleFacet.d.ts +1 -1
  101. package/types/components/manage/Blocks/Search/components/ToggleFacetFilterListEntry.d.ts +1 -1
  102. package/types/components/manage/Blocks/Search/hocs/withQueryString.d.ts +1 -1
  103. package/types/components/manage/Blocks/Search/hocs/withSearch.d.ts +1 -1
  104. package/types/components/manage/Blocks/Search/layout/LeftColumnFacets.d.ts +1 -1
  105. package/types/components/manage/Blocks/Search/layout/RightColumnFacets.d.ts +1 -1
  106. package/types/components/manage/Blocks/Search/layout/TopSideFacets.d.ts +1 -1
  107. package/types/components/manage/Blocks/Search/utils.d.ts +2 -2
  108. package/types/components/manage/Blocks/Search/widgets/SelectMetadataField.d.ts +1 -1
  109. package/types/components/manage/Blocks/Table/Cell.d.ts +1 -1
  110. package/types/components/manage/Blocks/Table/View.d.ts +1 -1
  111. package/types/components/manage/Blocks/Teaser/Body.d.ts +1 -1
  112. package/types/components/manage/Blocks/Teaser/Data.d.ts +1 -1
  113. package/types/components/manage/Blocks/Teaser/DefaultBody.d.ts +1 -1
  114. package/types/components/manage/Blocks/Teaser/Edit.d.ts +1 -1
  115. package/types/components/manage/Blocks/Teaser/View.d.ts +1 -1
  116. package/types/components/manage/Blocks/Text/Edit.d.ts +1 -1
  117. package/types/components/manage/Blocks/Title/Edit.d.ts +1 -1
  118. package/types/components/manage/Blocks/Title/View.d.ts +1 -1
  119. package/types/components/manage/Blocks/ToC/Edit.d.ts +1 -1
  120. package/types/components/manage/Blocks/Video/Body.d.ts +1 -1
  121. package/types/components/manage/Blocks/Video/VideoSidebar.d.ts +1 -1
  122. package/types/components/manage/Blocks/Video/View.d.ts +1 -1
  123. package/types/components/manage/Contents/ContentsBreadcrumbs.d.ts +1 -1
  124. package/types/components/manage/Contents/ContentsBreadcrumbsHomeItem.d.ts +1 -1
  125. package/types/components/manage/Contents/ContentsBreadcrumbsRootItem.d.ts +1 -1
  126. package/types/components/manage/Contents/ContentsPropertiesModal.d.ts +1 -1
  127. package/types/components/manage/Contents/ContentsRenameModal.d.ts +1 -1
  128. package/types/components/manage/Contents/ContentsRenameModal.stories.d.ts +1 -1
  129. package/types/components/manage/Contents/ContentsTagsModal.d.ts +1 -1
  130. package/types/components/manage/Contents/ContentsTagsModal.stories.d.ts +1 -1
  131. package/types/components/manage/Contents/ContentsWorkflowModal.d.ts +1 -1
  132. package/types/components/manage/Contents/circle.d.ts +1 -1
  133. package/types/components/manage/Controlpanels/Relations/BrokenRelations.d.ts +1 -1
  134. package/types/components/manage/Controlpanels/Relations/Relations.d.ts +1 -1
  135. package/types/components/manage/Controlpanels/Relations/RelationsListing.d.ts +1 -1
  136. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +3 -5
  137. package/types/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.d.ts +1 -1
  138. package/types/components/manage/Controlpanels/Users/UserGroupMembershipListing.d.ts +1 -1
  139. package/types/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.d.ts +1 -1
  140. package/types/components/manage/Controlpanels/VersionOverview.d.ts +1 -1
  141. package/types/components/manage/Delete/Delete.d.ts +1 -1
  142. package/types/components/manage/Form/BlockDataForm.d.ts +1 -1
  143. package/types/components/manage/Form/BlocksToolbar.d.ts +1 -1
  144. package/types/components/manage/Form/UndoToolbar.d.ts +1 -1
  145. package/types/components/manage/LinkDetectionPlugin/link-detection-plugin.d.ts +1 -1
  146. package/types/components/manage/LinkMore/LinkMore.d.ts +1 -1
  147. package/types/components/manage/LinksToItem/LinksToItem.d.ts +1 -1
  148. package/types/components/manage/Messages/Messages.d.ts +1 -1
  149. package/types/components/manage/Multilingual/CreateTranslation.d.ts +1 -1
  150. package/types/components/manage/Multilingual/ManageTranslations.d.ts +3 -5
  151. package/types/components/manage/Multilingual/TranslationObject.d.ts +1 -1
  152. package/types/components/manage/Pluggable/Pluggable.stories.d.ts +4 -4
  153. package/types/components/manage/Pluggable/index.d.ts +21 -3
  154. package/types/components/manage/Sidebar/AlignBlock.d.ts +1 -1
  155. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +3 -5
  156. package/types/components/manage/Sidebar/ObjectBrowserNav.d.ts +1 -1
  157. package/types/components/manage/Sidebar/SidebarPopup.d.ts +1 -1
  158. package/types/components/manage/Sidebar/SidebarPortal.d.ts +2 -1
  159. package/types/components/manage/TemplateChooser/TemplateChooser.d.ts +1 -1
  160. package/types/components/manage/TextLineEdit/TextLineEdit.d.ts +1 -1
  161. package/types/components/manage/TextLineEdit/TextLineEdit.stories.d.ts +1 -1
  162. package/types/components/manage/Toast/Toast.d.ts +1 -1
  163. package/types/components/manage/Toolbar/PersonalTools.d.ts +1 -1
  164. package/types/components/manage/Toolbar/StandardWrapper.d.ts +1 -1
  165. package/types/components/manage/Toolbar/Stats.d.ts +1 -1
  166. package/types/components/manage/UniversalLink/UniversalLink.d.ts +1 -1
  167. package/types/components/manage/Widgets/AlignWidget.d.ts +1 -1
  168. package/types/components/manage/Widgets/AlignWidget.stories.d.ts +1 -1
  169. package/types/components/manage/Widgets/ArrayWidget.stories.d.ts +1 -1
  170. package/types/components/manage/Widgets/ButtonsWidget.d.ts +1 -1
  171. package/types/components/manage/Widgets/ButtonsWidget.stories.d.ts +1 -1
  172. package/types/components/manage/Widgets/CheckboxWidget.stories.d.ts +1 -1
  173. package/types/components/manage/Widgets/ColorPickerWidget.d.ts +1 -2
  174. package/types/components/manage/Widgets/DatetimeWidget.d.ts +1 -1
  175. package/types/components/manage/Widgets/DatetimeWidget.stories.d.ts +1 -1
  176. package/types/components/manage/Widgets/EmailWidget.d.ts +1 -1
  177. package/types/components/manage/Widgets/EmailWidget.stories.d.ts +1 -1
  178. package/types/components/manage/Widgets/FileWidget.stories.d.ts +1 -1
  179. package/types/components/manage/Widgets/FormFieldWrapper.stories.d.ts +1 -1
  180. package/types/components/manage/Widgets/IdWidget.stories.d.ts +1 -1
  181. package/types/components/manage/Widgets/ImageSizeWidget.stories.d.ts +1 -1
  182. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +4 -6
  183. package/types/components/manage/Widgets/InternalUrlWidget.stories.d.ts +1 -1
  184. package/types/components/manage/Widgets/NumberWidget.stories.d.ts +1 -1
  185. package/types/components/manage/Widgets/ObjectBrowserWidget.d.ts +1 -1
  186. package/types/components/manage/Widgets/ObjectBrowserWidget.stories.d.ts +7 -7
  187. package/types/components/manage/Widgets/ObjectListWidget.d.ts +1 -1
  188. package/types/components/manage/Widgets/ObjectListWidget.stories.d.ts +2 -2
  189. package/types/components/manage/Widgets/ObjectWidget.d.ts +1 -1
  190. package/types/components/manage/Widgets/ObjectWidget.stories.d.ts +1 -1
  191. package/types/components/manage/Widgets/PasswordWidget.stories.d.ts +1 -1
  192. package/types/components/manage/Widgets/QueryWidget.stories.d.ts +1 -1
  193. package/types/components/manage/Widgets/QuerystringWidget.d.ts +1 -1
  194. package/types/components/manage/Widgets/RecurrenceWidget/ByMonthDayField.d.ts +16 -2
  195. package/types/components/manage/Widgets/RecurrenceWidget/ByMonthField.d.ts +20 -2
  196. package/types/components/manage/Widgets/RecurrenceWidget/ByYearField.d.ts +22 -2
  197. package/types/components/manage/Widgets/RecurrenceWidget/EndField.d.ts +16 -2
  198. package/types/components/manage/Widgets/SelectAutocompleteWidget.stories.d.ts +1 -1
  199. package/types/components/manage/Widgets/SelectStyling.d.ts +1 -1
  200. package/types/components/manage/Widgets/SelectWidget.stories.d.ts +1 -1
  201. package/types/components/manage/Widgets/TextWidget.stories.d.ts +1 -1
  202. package/types/components/manage/Widgets/TextareaWidget.stories.d.ts +1 -1
  203. package/types/components/manage/Widgets/TokenWidget.stories.d.ts +1 -1
  204. package/types/components/manage/Widgets/UrlWidget.d.ts +4 -6
  205. package/types/components/manage/Widgets/UrlWidget.stories.d.ts +1 -1
  206. package/types/components/manage/Widgets/VocabularyTermsWidget.d.ts +1 -1
  207. package/types/components/manage/Widgets/VocabularyTermsWidget.stories.d.ts +1 -1
  208. package/types/components/manage/Widgets/WysiwygWidget.d.ts +1 -1
  209. package/types/components/manage/Widgets/WysiwygWidget.stories.d.ts +1 -1
  210. package/types/components/manage/Widgets/story.d.ts +1 -1
  211. package/types/components/theme/Anontools/Anontools.d.ts +1 -1
  212. package/types/components/theme/AppExtras/AppExtras.d.ts +1 -1
  213. package/types/components/theme/Avatar/Avatar.d.ts +1 -1
  214. package/types/components/theme/Breadcrumbs/Breadcrumbs.d.ts +1 -1
  215. package/types/components/theme/Comments/Comment.stories.d.ts +1 -1
  216. package/types/components/theme/Comments/CommentEditModal.d.ts +1 -1
  217. package/types/components/theme/Comments/CommentEditModal.stories.d.ts +1 -1
  218. package/types/components/theme/Component/Component.d.ts +1 -1
  219. package/types/components/theme/ConnectionRefused/ConnectionRefused.d.ts +1 -1
  220. package/types/components/theme/ContactForm/ContactForm.d.ts +1 -1
  221. package/types/components/theme/ContactForm/ContactForm.stories.d.ts +1 -1
  222. package/types/components/theme/ContentMetadataTags/ContentMetadataTags.d.ts +1 -1
  223. package/types/components/theme/Error/ErrorBoundary.d.ts +1 -0
  224. package/types/components/theme/Error/ServerError.d.ts +1 -1
  225. package/types/components/theme/EventDetails/EventDetails.d.ts +1 -1
  226. package/types/components/theme/EventDetails/EventDetails.stories.d.ts +1 -1
  227. package/types/components/theme/Forbidden/Forbidden.d.ts +1 -1
  228. package/types/components/theme/FormattedDate/FormattedDate.d.ts +1 -1
  229. package/types/components/theme/FormattedDate/FormattedDate.stories.d.ts +1 -1
  230. package/types/components/theme/FormattedDate/FormattedRelativeDate.d.ts +1 -1
  231. package/types/components/theme/FormattedDate/FormattedRelativeDate.stories.d.ts +1 -1
  232. package/types/components/theme/Header/Header.d.ts +1 -1
  233. package/types/components/theme/Header/Header.stories.d.ts +1 -1
  234. package/types/components/theme/Image/Image.d.ts +1 -1
  235. package/types/components/theme/LanguageSelector/LanguageSelector.d.ts +1 -1
  236. package/types/components/theme/Login/Login.d.ts +1 -1
  237. package/types/components/theme/Login/Login.stories.d.ts +1 -1
  238. package/types/components/theme/Logo/Logo.stories.d.ts +1 -1
  239. package/types/components/theme/Logout/Logout.d.ts +1 -1
  240. package/types/components/theme/MultilingualRedirector/MultilingualRedirector.d.ts +1 -1
  241. package/types/components/theme/Navigation/ContextNavigation.d.ts +1 -1
  242. package/types/components/theme/Navigation/ContextNavigation.stories.d.ts +2 -2
  243. package/types/components/theme/Navigation/NavItem.d.ts +1 -1
  244. package/types/components/theme/Navigation/NavItems.d.ts +1 -1
  245. package/types/components/theme/Navigation/Navigation.d.ts +1 -1
  246. package/types/components/theme/Navigation/withContentNavigation.d.ts +1 -1
  247. package/types/components/theme/NotFound/NotFound.d.ts +1 -1
  248. package/types/components/theme/OutdatedBrowser/OutdatedBrowser.d.ts +1 -1
  249. package/types/components/theme/PasswordReset/RequestPasswordReset.d.ts +1 -1
  250. package/types/components/theme/Popup/Popup.d.ts +1 -1
  251. package/types/components/theme/PreviewImage/PreviewImage.d.ts +1 -1
  252. package/types/components/theme/Search/SearchTags.d.ts +1 -1
  253. package/types/components/theme/SearchWidget/SearchWidget.d.ts +1 -1
  254. package/types/components/theme/SearchWidget/SearchWidget.stories.d.ts +1 -1
  255. package/types/components/theme/SkipLinks/SkipLinks.d.ts +1 -1
  256. package/types/components/theme/SlotRenderer/SlotRenderer.d.ts +7 -0
  257. package/types/components/theme/SlotRenderer/SlotRenderer.test.d.ts +1 -0
  258. package/types/components/theme/TsTest/TsTest.d.ts +1 -2
  259. package/types/components/theme/Unauthorized/Unauthorized.d.ts +1 -1
  260. package/types/components/theme/View/AlbumView.d.ts +1 -1
  261. package/types/components/theme/View/EventDatesInfo.d.ts +1 -1
  262. package/types/components/theme/View/LinkView.d.ts +1 -1
  263. package/types/components/theme/View/RenderBlocks.d.ts +1 -1
  264. package/types/components/theme/Widgets/ArrayWidget.d.ts +1 -1
  265. package/types/components/theme/Widgets/BooleanWidget.d.ts +14 -2
  266. package/types/components/theme/Widgets/DateWidget.d.ts +1 -1
  267. package/types/components/theme/Widgets/DatetimeWidget.d.ts +1 -1
  268. package/types/components/theme/Widgets/DescriptionWidget.d.ts +1 -1
  269. package/types/components/theme/Widgets/EmailWidget.d.ts +1 -1
  270. package/types/components/theme/Widgets/FileWidget.d.ts +1 -1
  271. package/types/components/theme/Widgets/ImageWidget.d.ts +1 -1
  272. package/types/components/theme/Widgets/PasswordWidget.d.ts +1 -1
  273. package/types/components/theme/Widgets/RelationWidget.d.ts +1 -1
  274. package/types/components/theme/Widgets/RelationsWidget.d.ts +1 -1
  275. package/types/components/theme/Widgets/RichTextWidget.d.ts +1 -1
  276. package/types/components/theme/Widgets/SelectWidget.d.ts +1 -1
  277. package/types/components/theme/Widgets/TextWidget.d.ts +1 -1
  278. package/types/components/theme/Widgets/TitleWidget.d.ts +1 -1
  279. package/types/components/theme/Widgets/TokenWidget.d.ts +1 -1
  280. package/types/components/theme/Widgets/UrlWidget.d.ts +1 -1
  281. package/types/config/Blocks.d.ts +1 -1
  282. package/types/config/RichTextEditor/ToHTML.d.ts +10 -10
  283. package/types/config/Views.d.ts +5 -5
  284. package/types/helpers/AsyncConnect/AsyncConnect.d.ts +2 -2
  285. package/types/helpers/Extensions/withBlockExtensions.d.ts +1 -1
  286. package/types/helpers/Extensions/withBlockSchemaEnhancer.d.ts +3 -3
  287. package/types/helpers/Helmet/Helmet.d.ts +6 -10
  288. package/types/helpers/LanguageMap/LanguageMap.d.ts +878 -1
  289. package/types/helpers/Slots/index.d.ts +7 -0
  290. package/types/helpers/Utils/Date.d.ts +2 -2
  291. package/types/helpers/Utils/UseDetectClickOutside.stories.d.ts +2 -2
  292. package/types/helpers/Utils/Utils.d.ts +1 -1
  293. package/types/helpers/index.d.ts +1 -0
  294. package/types/reducers/blocksClipboard/blocksClipboard.d.ts +1 -1
  295. package/types/routes.d.ts +3 -3
  296. package/types/storybook.d.ts +3 -3
@@ -28,6 +28,13 @@ describe('ChangePassword', () => {
28
28
  loading: false,
29
29
  },
30
30
  },
31
+ content: {
32
+ data: {},
33
+ create: {
34
+ loading: false,
35
+ loaded: true,
36
+ },
37
+ },
31
38
  });
32
39
  const component = renderer.create(
33
40
  <Provider store={store}>
@@ -42,6 +42,13 @@ describe('PersonalInformation', () => {
42
42
  locale: 'en',
43
43
  messages: {},
44
44
  },
45
+ content: {
46
+ data: {},
47
+ create: {
48
+ loading: false,
49
+ loaded: true,
50
+ },
51
+ },
45
52
  });
46
53
  const component = renderer.create(
47
54
  <Provider store={store}>
@@ -76,6 +83,13 @@ describe('PersonalInformation', () => {
76
83
  locale: 'en',
77
84
  messages: {},
78
85
  },
86
+ content: {
87
+ data: {},
88
+ create: {
89
+ loading: false,
90
+ loaded: true,
91
+ },
92
+ },
79
93
  });
80
94
  const component = renderer.create(
81
95
  <Provider store={store}>
@@ -31,6 +31,13 @@ describe('PersonalPreferences', () => {
31
31
  itemsTotal: 1,
32
32
  },
33
33
  },
34
+ content: {
35
+ data: {},
36
+ create: {
37
+ loading: false,
38
+ loaded: true,
39
+ },
40
+ },
34
41
  });
35
42
  const { container } = render(
36
43
  <Provider store={store}>
@@ -181,7 +181,9 @@ class Toolbar extends Component {
181
181
  types: [],
182
182
  };
183
183
 
184
+ toolbarRef = React.createRef();
184
185
  toolbarWindow = React.createRef();
186
+ buttonRef = React.createRef();
185
187
 
186
188
  constructor(props) {
187
189
  super(props);
@@ -262,8 +264,9 @@ class Toolbar extends Component {
262
264
  );
263
265
  };
264
266
 
265
- closeMenu = () =>
267
+ closeMenu = () => {
266
268
  this.setState(() => ({ showMenu: false, loadedComponents: [] }));
269
+ };
267
270
 
268
271
  loadComponent = (type) => {
269
272
  const { loadedComponents } = this.state;
@@ -285,6 +288,15 @@ class Toolbar extends Component {
285
288
  }));
286
289
  };
287
290
 
291
+ toggleButtonPressed = (e) => {
292
+ const target = e.target;
293
+ const button =
294
+ target.tagName === 'BUTTON'
295
+ ? target
296
+ : this.findAncestor(e.target, 'button');
297
+ this.buttonRef.current = button;
298
+ };
299
+
288
300
  toggleMenu = (e, selector) => {
289
301
  if (this.state.showMenu) {
290
302
  this.closeMenu();
@@ -310,11 +322,29 @@ class Toolbar extends Component {
310
322
  menuStyle: { top: 0 },
311
323
  }));
312
324
  }
325
+ this.toggleButtonPressed(e);
313
326
  this.loadComponent(selector);
314
327
  };
315
328
 
329
+ findAncestor = (el, sel) => {
330
+ while (
331
+ (el = el.parentElement) &&
332
+ !(el.matches || el.matchesSelector).call(el, sel)
333
+ );
334
+ return el;
335
+ };
336
+
316
337
  handleClickOutside = (e) => {
338
+ const target = e.target;
317
339
  if (this.pusher && doesNodeContainClick(this.pusher, e)) return;
340
+
341
+ // if the click is on the same button, do not close the menu as it
342
+ // may be handled by the toggleMenu action
343
+ const button =
344
+ doesNodeContainClick(this.toolbarRef.current, e) &&
345
+ this.findAncestor(target, 'button');
346
+ if (button && button === this.buttonRef.current) return;
347
+
318
348
  this.closeMenu();
319
349
  };
320
350
 
@@ -427,7 +457,10 @@ class Toolbar extends Component {
427
457
  )}
428
458
  </div>
429
459
  </div>
430
- <div className={this.state.expanded ? 'toolbar expanded' : 'toolbar'}>
460
+ <div
461
+ className={this.state.expanded ? 'toolbar expanded' : 'toolbar'}
462
+ ref={this.toolbarRef}
463
+ >
431
464
  <div className="toolbar-body">
432
465
  <div className="toolbar-actions">
433
466
  {this.props.hideDefaultViewButtons && this.props.inner && (
@@ -306,7 +306,9 @@ class ArrayWidget extends Component {
306
306
  useDragHandle
307
307
  // react-sortable-hoc props:
308
308
  axis="xy"
309
- onSortEnd={this.onSortEnd}
309
+ onSortEnd={(sortProp) => {
310
+ this.onSortEnd(selectedOption, sortProp);
311
+ }}
310
312
  menuShouldScrollIntoView={false}
311
313
  distance={4}
312
314
  // small fix for https://github.com/clauderic/react-sortable-hoc/pull/352:
@@ -57,6 +57,13 @@ describe('Comments', () => {
57
57
  locale: 'en',
58
58
  messages: {},
59
59
  },
60
+ content: {
61
+ data: {},
62
+ create: {
63
+ loading: false,
64
+ loaded: true,
65
+ },
66
+ },
60
67
  });
61
68
  const component = renderer.create(
62
69
  <Provider store={store}>
@@ -30,7 +30,7 @@ describe('Multilingual Logo', () => {
30
30
  },
31
31
  },
32
32
  site: {
33
- data: {},
33
+ data: { 'plone.site_title': 'Plone Site' },
34
34
  },
35
35
  });
36
36
  const component = renderer.create(
@@ -95,6 +95,7 @@ describe('Multilingual Logo', () => {
95
95
  data: {
96
96
  'plone.site_logo':
97
97
  'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
98
+ 'plone.site_title': 'Plone Site',
98
99
  },
99
100
  },
100
101
  });
@@ -128,6 +129,7 @@ describe('Multilingual Logo', () => {
128
129
  data: {
129
130
  'plone.site_logo':
130
131
  'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
132
+ 'plone.site_title': 'Plone Site',
131
133
  },
132
134
  },
133
135
  });
@@ -2,9 +2,9 @@
2
2
  * Logo component.
3
3
  * @module components/theme/Logo/Logo
4
4
  */
5
+ import { defineMessages, useIntl } from 'react-intl';
5
6
  import { useEffect } from 'react';
6
7
  import { Image } from 'semantic-ui-react';
7
- import { ConditionalLink } from '@plone/volto/components';
8
8
  import LogoImage from '@plone/volto/components/theme/Logo/Logo.svg';
9
9
  import { useSelector, useDispatch } from 'react-redux';
10
10
  import { useLocation } from 'react-router-dom';
@@ -26,6 +26,18 @@ const Logo = () => {
26
26
  const site = useSelector((state) => state.site.data);
27
27
  const navroot = useSelector((state) => state.navroot.data);
28
28
  const dispatch = useDispatch();
29
+ const intl = useIntl();
30
+
31
+ const messages = defineMessages({
32
+ home: {
33
+ id: 'Home',
34
+ defaultMessage: 'Home',
35
+ },
36
+ logoOf: {
37
+ id: 'Logo of',
38
+ defaultMessage: 'Logo of',
39
+ },
40
+ });
29
41
 
30
42
  useEffect(() => {
31
43
  if (pathname && !hasApiExpander('navroot', getBaseUrl(pathname))) {
@@ -34,26 +46,20 @@ const Logo = () => {
34
46
  }, [dispatch, pathname]);
35
47
 
36
48
  const navRootPath = flattenToAppURL(navroot?.navroot?.['@id']) || '/';
37
- const currentURLIsNavRoot = pathname !== navRootPath;
38
49
 
39
50
  return (
40
- <ConditionalLink
41
- href={navRootPath}
42
- title={navroot?.navroot?.title}
43
- // In case that the content returns 404, there is no information about the portal
44
- // then render the link anyways to get out of the Unauthorized page
45
- condition={!navroot || currentURLIsNavRoot}
46
- >
51
+ <a href={navRootPath} aria-label={intl.formatMessage(messages.home)}>
47
52
  <Image
48
53
  src={
49
54
  site['plone.site_logo']
50
55
  ? flattenToAppURL(site['plone.site_logo'])
51
56
  : LogoImage
52
57
  }
53
- alt={navroot?.navroot?.title}
54
- title={navroot?.navroot?.title}
58
+ alt={
59
+ intl.formatMessage(messages.logoOf) + ' ' + site['plone.site_title']
60
+ }
55
61
  />
56
- </ConditionalLink>
62
+ </a>
57
63
  );
58
64
  };
59
65
 
@@ -31,7 +31,7 @@ describe('Logo', () => {
31
31
  },
32
32
  },
33
33
  site: {
34
- data: {},
34
+ data: { 'plone.site_title': 'Plone Site' },
35
35
  },
36
36
  });
37
37
  const component = renderer.create(
@@ -63,6 +63,7 @@ describe('Logo', () => {
63
63
  data: {
64
64
  'plone.site_logo':
65
65
  'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
66
+ 'plone.site_title': 'Plone Site',
66
67
  },
67
68
  },
68
69
  });
@@ -101,6 +102,7 @@ describe('Logo', () => {
101
102
  data: {
102
103
  'plone.site_logo':
103
104
  'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
105
+ 'plone.site_title': 'Plone Site',
104
106
  },
105
107
  },
106
108
  });
@@ -134,6 +136,7 @@ describe('Logo', () => {
134
136
  data: {
135
137
  'plone.site_logo':
136
138
  'http://localhost:3000/@@site-logo/logo.cab945d8.svg',
139
+ 'plone.site_title': 'Plone Site',
137
140
  },
138
141
  },
139
142
  });
@@ -22,6 +22,13 @@ describe('PasswordReset', () => {
22
22
  locale: 'en',
23
23
  messages: {},
24
24
  },
25
+ content: {
26
+ data: {},
27
+ create: {
28
+ loading: false,
29
+ loaded: true,
30
+ },
31
+ },
25
32
  });
26
33
  const component = renderer.create(
27
34
  <Provider store={store}>
@@ -22,6 +22,13 @@ describe('RequestPasswordReset', () => {
22
22
  locale: 'en',
23
23
  messages: {},
24
24
  },
25
+ content: {
26
+ data: {},
27
+ create: {
28
+ loading: false,
29
+ loaded: true,
30
+ },
31
+ },
25
32
  });
26
33
  const component = renderer.create(
27
34
  <Provider store={store}>
@@ -22,6 +22,13 @@ describe('Register', () => {
22
22
  locale: 'en',
23
23
  messages: {},
24
24
  },
25
+ content: {
26
+ data: {},
27
+ create: {
28
+ loading: false,
29
+ loaded: true,
30
+ },
31
+ },
25
32
  });
26
33
  const component = renderer.create(
27
34
  <Provider store={store}>
@@ -0,0 +1,56 @@
1
+ import React from 'react';
2
+ import '@testing-library/jest-dom/extend-expect';
3
+ import { render } from '@testing-library/react';
4
+ import { MemoryRouter } from 'react-router-dom';
5
+ import SlotRenderer from './SlotRenderer';
6
+ import config from '@plone/volto/registry';
7
+
8
+ describe('SlotRenderer Component', () => {
9
+ const RouteConditionTrue = () => () => true;
10
+ const RouteConditionFalse = () => () => false;
11
+ const ContentTypeConditionTrue = () => () => true;
12
+ const ContentTypeConditionFalse = () => () => false;
13
+
14
+ test('renders a SlotRenderer component for the aboveContentTitle with two slots in the root', () => {
15
+ config.registerSlotComponent({
16
+ slot: 'toolbar',
17
+ name: 'save',
18
+ component: (props) => <div className="slot-component-true" />,
19
+ predicates: [RouteConditionTrue()],
20
+ });
21
+
22
+ config.registerSlotComponent({
23
+ slot: 'toolbar',
24
+ name: 'save',
25
+ component: (props) => <div className="slot-component-false" />,
26
+ predicates: [RouteConditionFalse(), ContentTypeConditionFalse()],
27
+ });
28
+
29
+ config.registerSlotComponent({
30
+ slot: 'toolbar',
31
+ name: 'edit',
32
+ component: (props) => <div className="slot-component-false" />,
33
+ predicates: [RouteConditionFalse()],
34
+ });
35
+
36
+ config.registerSlotComponent({
37
+ slot: 'toolbar',
38
+ name: 'edit',
39
+ component: (props) => (
40
+ <aside className="slot-component-true-predicates" />
41
+ ),
42
+ predicates: [RouteConditionTrue(), ContentTypeConditionTrue()],
43
+ });
44
+
45
+ const { container } = render(
46
+ <MemoryRouter initialEntries={[{ pathname: '/' }]}>
47
+ <SlotRenderer name="toolbar" content={{}} />
48
+ </MemoryRouter>,
49
+ );
50
+
51
+ const divSlot = container.querySelector('div');
52
+ expect(divSlot).toHaveClass('slot-component-true');
53
+ const asideSlot = container.querySelector('aside');
54
+ expect(asideSlot).toHaveClass('slot-component-true-predicates');
55
+ });
56
+ });
@@ -0,0 +1,54 @@
1
+ import { useLocation } from 'react-router-dom';
2
+ import config from '@plone/volto/registry';
3
+
4
+ import type { Content } from '@plone/types';
5
+
6
+ /*
7
+ Usage:
8
+ <SlotRenderer name="aboveContent" content={content} route={} />
9
+ */
10
+
11
+ const SlotRenderer = ({
12
+ name,
13
+ content,
14
+ navRoot,
15
+ }: {
16
+ name: string;
17
+ content: Content;
18
+ navRoot?: Content;
19
+ }) => {
20
+ const pathname = useLocation().pathname;
21
+
22
+ let slots = config.getSlot(name, {
23
+ content,
24
+ pathname,
25
+ // This is to cover the use case while adding a new content and we don't have
26
+ // have the navRoot information in the initial content. This will be
27
+ // useful for SlotRenderers rendered in the `Add` route.
28
+ navRoot: content?.['@components']?.navroot?.navroot || navRoot,
29
+ });
30
+
31
+ if (!slots) {
32
+ return null;
33
+ }
34
+
35
+ return (
36
+ <>
37
+ {slots.map(
38
+ ({
39
+ component,
40
+ name,
41
+ }: {
42
+ component: React.ComponentType<any>;
43
+ name: string;
44
+ }) => {
45
+ // ^^ Weird compilation issue for Jest tests, that forced to re-declare the type above
46
+ const SlotComponent = component;
47
+ return <SlotComponent key={name} />;
48
+ },
49
+ )}
50
+ </>
51
+ );
52
+ };
53
+
54
+ export default SlotRenderer;
@@ -28,6 +28,7 @@ import {
28
28
  } from '@plone/volto/helpers';
29
29
 
30
30
  import config from '@plone/volto/registry';
31
+ import SlotRenderer from '../SlotRenderer/SlotRenderer';
31
32
 
32
33
  /**
33
34
  * View container class.
@@ -244,6 +245,7 @@ class View extends Component {
244
245
  : null
245
246
  }
246
247
  />
248
+ <SlotRenderer name="aboveContent" content={this.props.content} />
247
249
  <RenderedView
248
250
  key={this.props.content['@id']}
249
251
  content={this.props.content}
@@ -251,6 +253,7 @@ class View extends Component {
251
253
  token={this.props.token}
252
254
  history={this.props.history}
253
255
  />
256
+ <SlotRenderer name="belowContent" content={this.props.content} />
254
257
  {config.settings.showTags &&
255
258
  this.props.content.subjects &&
256
259
  this.props.content.subjects.length > 0 && (
@@ -33,6 +33,9 @@ jest.mock('../SocialSharing/SocialSharing', () =>
33
33
  );
34
34
  jest.mock('../Comments/Comments', () => jest.fn(() => <div id="Comments" />));
35
35
  jest.mock('../Tags/Tags', () => jest.fn(() => <div id="Tags" />));
36
+ jest.mock('../SlotRenderer/SlotRenderer', () =>
37
+ jest.fn(() => <div id="SlotRenderer" />),
38
+ );
36
39
  jest.mock('../ContentMetadataTags/ContentMetadataTags', () =>
37
40
  jest.fn(() => <div id="ContentMetadataTags" />),
38
41
  );
@@ -75,7 +75,7 @@ let config = {
75
75
  okRoute: '/ok',
76
76
  apiPath,
77
77
  apiExpanders: [
78
- // Added here for documentation purposes, addded at the end because it
78
+ // Added here for documentation purposes, added at the end because it
79
79
  // depends on a value of this object.
80
80
  // Add the following expanders for only issuing a single request.
81
81
  // https://6.docs.plone.org/volto/configuration/settings-reference.html#term-apiExpanders
@@ -223,6 +223,7 @@ let config = {
223
223
  },
224
224
  addonRoutes: [],
225
225
  addonReducers: {},
226
+ slots: {},
226
227
  components,
227
228
  };
228
229
 
@@ -250,5 +251,6 @@ ConfigRegistry.widgets = config.widgets;
250
251
  ConfigRegistry.addonRoutes = config.addonRoutes;
251
252
  ConfigRegistry.addonReducers = config.addonReducers;
252
253
  ConfigRegistry.components = config.components;
254
+ ConfigRegistry.slots = config.slots;
253
255
 
254
256
  applyAddonConfiguration(ConfigRegistry);
@@ -701,10 +701,13 @@ export function findBlocks(blocks, types, result = []) {
701
701
 
702
702
  Object.keys(blocks).forEach((blockId) => {
703
703
  const block = blocks[blockId];
704
+ // check blocks from data as well since some add-ons use that
705
+ // such as @eeacms/volto-tabs-block
706
+ const child_blocks = block.blocks || block.data?.blocks;
704
707
  if (types.includes(block['@type'])) {
705
708
  result.push(blockId);
706
- } else if (containerBlockTypes.includes(block['@type']) || block.blocks) {
707
- findBlocks(block.blocks, types, result);
709
+ } else if (containerBlockTypes.includes(block['@type']) || child_blocks) {
710
+ findBlocks(child_blocks, types, result);
708
711
  }
709
712
  });
710
713
 
@@ -0,0 +1,12 @@
1
+ import type { Content } from '@plone/types';
2
+ import { matchPath } from 'react-router-dom';
3
+
4
+ export function RouteCondition(path: string, exact?: boolean) {
5
+ return ({ pathname }: { pathname: string }) =>
6
+ Boolean(matchPath(pathname, { path, exact }));
7
+ }
8
+
9
+ export function ContentTypeCondition(contentType: string[]) {
10
+ return ({ content }: { content: Content }) =>
11
+ contentType.includes(content?.['@type']);
12
+ }
@@ -129,3 +129,4 @@ export {
129
129
  getWorkflowOptions,
130
130
  } from './Workflows/Workflows';
131
131
  export { getSiteAsyncPropExtender } from './Site';
132
+ export { ContentTypeCondition } from './Slots';
@@ -188,3 +188,4 @@ config.set('experimental', {
188
188
  enabled: false,
189
189
  },
190
190
  });
191
+ config.set('slots', {});
@@ -184,8 +184,8 @@ body:not(.has-sidebar):not(.has-sidebar-collapsed) {
184
184
  background: transparent;
185
185
  text-align: initial;
186
186
 
187
- &:focus {
188
- outline: none;
187
+ &:focus-visible {
188
+ outline: 1px auto;
189
189
  }
190
190
 
191
191
  &.ui {
@@ -291,8 +291,8 @@ body:not(.has-sidebar):not(.has-sidebar-collapsed) {
291
291
  cursor: pointer;
292
292
  text-align: initial;
293
293
 
294
- &:focus {
295
- outline: none;
294
+ &:focus-visible {
295
+ outline: 1px auto;
296
296
  }
297
297
  }
298
298
  }
@@ -1,5 +1,6 @@
1
1
  {
2
2
  "compilerOptions": {
3
+ "lib": ["DOM", "DOM.Iterable", "ESNext"],
3
4
  "allowJs": true,
4
5
  "declaration": true,
5
6
  "emitDeclarationOnly": true,
@@ -1,5 +1,5 @@
1
1
  export default Actions;
2
- declare function Actions(props: any): JSX.Element;
2
+ declare function Actions(props: any): import("react/jsx-runtime").JSX.Element;
3
3
  declare namespace Actions {
4
4
  namespace propTypes {
5
5
  let pathname: any;
@@ -5,7 +5,7 @@ declare function Link({ children, className, entityKey, getEditorState, target }
5
5
  entityKey: any;
6
6
  getEditorState: any;
7
7
  target: any;
8
- }): JSX.Element;
8
+ }): import("react/jsx-runtime").JSX.Element;
9
9
  declare namespace Link {
10
10
  export { propTypes };
11
11
  export namespace defaultProps {
@@ -1,3 +1,3 @@
1
- export function ButtonComponent(props: any): JSX.Element;
1
+ export function ButtonComponent(props: any): import("react/jsx-runtime").JSX.Element;
2
2
  export default BlockChooserButton;
3
- declare function BlockChooserButton(props: any): JSX.Element;
3
+ declare function BlockChooserButton(props: any): import("react/jsx-runtime").JSX.Element;
@@ -2,4 +2,4 @@ export default BlockChooserSearch;
2
2
  declare function BlockChooserSearch({ onChange, searchValue }: {
3
3
  onChange: any;
4
4
  searchValue: any;
5
- }): JSX.Element;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export default BlocksForm;
2
- declare function BlocksForm(props: any): JSX.Element;
2
+ declare function BlocksForm(props: any): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export default DefaultBlockEdit;
2
- declare function DefaultBlockEdit(props: any): JSX.Element;
2
+ declare function DefaultBlockEdit(props: any): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export default DefaultBlockView;
2
- declare function DefaultBlockView(props: any): JSX.Element;
2
+ declare function DefaultBlockView(props: any): import("react/jsx-runtime").JSX.Element;
@@ -2,4 +2,4 @@ export default function Style({ data, detached, children }: {
2
2
  data: any;
3
3
  detached: any;
4
4
  children: any;
5
- }): JSX.Element;
5
+ }): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export default ContainerData;
2
- declare function ContainerData(props: any): JSX.Element;
2
+ declare function ContainerData(props: any): import("react/jsx-runtime").JSX.Element;
@@ -1,5 +1,5 @@
1
1
  export default ContainerBlockEdit;
2
- declare function ContainerBlockEdit(props: any): JSX.Element;
2
+ declare function ContainerBlockEdit(props: any): import("react/jsx-runtime").JSX.Element;
3
3
  declare namespace ContainerBlockEdit {
4
4
  namespace propTypes {
5
5
  let block: any;
@@ -1,2 +1,2 @@
1
1
  export default EditBlockWrapper;
2
- declare function EditBlockWrapper(props: any): JSX.Element;
2
+ declare function EditBlockWrapper(props: any): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export default NewBlockAddButton;
2
- declare function NewBlockAddButton(props: any): JSX.Element;
2
+ declare function NewBlockAddButton(props: any): import("react/jsx-runtime").JSX.Element;
@@ -1,2 +1,2 @@
1
1
  export default SimpleContainerToolbar;
2
- declare function SimpleContainerToolbar(props: any): JSX.Element;
2
+ declare function SimpleContainerToolbar(props: any): import("react/jsx-runtime").JSX.Element;
@@ -1,4 +1,4 @@
1
- export function DescriptionBlockEdit(props: any): JSX.Element;
1
+ export function DescriptionBlockEdit(props: any): import("react/jsx-runtime").JSX.Element;
2
2
  export namespace DescriptionBlockEdit {
3
3
  namespace propTypes {
4
4
  let properties: any;