@plone/volto 19.0.0-alpha.2 → 19.0.0-alpha.20

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 (366) hide show
  1. package/.eslintignore +1 -0
  2. package/.eslintrc +37 -3
  3. package/CHANGELOG.md +338 -1
  4. package/README.md +20 -16
  5. package/babel.js +1 -3
  6. package/cypress/docker/prefixed-rules.yml +26 -0
  7. package/cypress/docker/prefixed.yml +24 -0
  8. package/cypress/support/commands.js +12 -6
  9. package/cypress/support/guillotina.js +1 -0
  10. package/cypress.config.js +1 -0
  11. package/global-test-setup.js +1 -2
  12. package/locales/af.json +1 -0
  13. package/locales/ar.json +1 -0
  14. package/locales/bg.json +1 -0
  15. package/locales/bn.json +1 -0
  16. package/locales/ca/LC_MESSAGES/volto.po +124 -17
  17. package/locales/ca.json +1 -1
  18. package/locales/cs.json +1 -0
  19. package/locales/cy.json +1 -0
  20. package/locales/da.json +1 -0
  21. package/locales/de/LC_MESSAGES/volto.po +135 -28
  22. package/locales/de.json +1 -1
  23. package/locales/el.json +1 -0
  24. package/locales/en/LC_MESSAGES/volto.po +125 -18
  25. package/locales/en.json +1 -1
  26. package/locales/en_AU.json +1 -0
  27. package/locales/en_GB.json +1 -0
  28. package/locales/eo.json +1 -0
  29. package/locales/es/LC_MESSAGES/volto.po +125 -18
  30. package/locales/es.json +1 -1
  31. package/locales/et.json +1 -0
  32. package/locales/eu/LC_MESSAGES/volto.po +124 -17
  33. package/locales/eu.json +1 -1
  34. package/locales/fa.json +1 -0
  35. package/locales/fi/LC_MESSAGES/volto.po +124 -17
  36. package/locales/fi.json +1 -1
  37. package/locales/fr/LC_MESSAGES/volto.po +125 -18
  38. package/locales/fr.json +1 -1
  39. package/locales/fu.json +1 -0
  40. package/locales/gl.json +1 -0
  41. package/locales/he.json +1 -0
  42. package/locales/hi/LC_MESSAGES/volto.po +128 -21
  43. package/locales/hi.json +1 -1
  44. package/locales/hr.json +1 -0
  45. package/locales/hu.json +1 -0
  46. package/locales/hy.json +1 -0
  47. package/locales/id.json +1 -0
  48. package/locales/it/LC_MESSAGES/volto.po +129 -22
  49. package/locales/it.json +1 -1
  50. package/locales/ja/LC_MESSAGES/volto.po +124 -17
  51. package/locales/ja.json +1 -1
  52. package/locales/ka.json +1 -0
  53. package/locales/kn.json +1 -0
  54. package/locales/ko.json +1 -0
  55. package/locales/lt.json +1 -0
  56. package/locales/lv.json +1 -0
  57. package/locales/mi.json +1 -0
  58. package/locales/mk.json +1 -0
  59. package/locales/my.json +1 -0
  60. package/locales/nb_NO.json +1 -0
  61. package/locales/nl/LC_MESSAGES/volto.po +128 -21
  62. package/locales/nl.json +1 -1
  63. package/locales/nn.json +1 -0
  64. package/locales/pl.json +1 -0
  65. package/locales/pt/LC_MESSAGES/volto.po +124 -17
  66. package/locales/pt.json +1 -1
  67. package/locales/pt_BR/LC_MESSAGES/volto.po +147 -40
  68. package/locales/pt_BR.json +1 -1
  69. package/locales/rm.json +1 -0
  70. package/locales/ro/LC_MESSAGES/volto.po +128 -21
  71. package/locales/ro.json +1 -1
  72. package/locales/ru/LC_MESSAGES/volto.po +128 -21
  73. package/locales/ru.json +1 -1
  74. package/locales/sk.json +1 -0
  75. package/locales/sl.json +1 -0
  76. package/locales/sm.json +1 -0
  77. package/locales/sq.json +1 -0
  78. package/locales/sr.json +1 -0
  79. package/locales/sr@cyrl.json +1 -0
  80. package/locales/sr@latn.json +1 -0
  81. package/locales/sv.json +1 -1
  82. package/locales/ta.json +1 -0
  83. package/locales/te.json +1 -0
  84. package/locales/th.json +1 -0
  85. package/locales/to.json +1 -0
  86. package/locales/tr.json +1 -0
  87. package/locales/uk.json +1 -0
  88. package/locales/vi.json +1 -0
  89. package/locales/volto.pot +125 -18
  90. package/locales/zh_CN/LC_MESSAGES/volto.po +124 -17
  91. package/locales/zh_CN.json +1 -1
  92. package/locales/zh_Hant.json +1 -0
  93. package/locales/zh_Hant_HK.json +1 -0
  94. package/package.json +43 -100
  95. package/razzle.config.js +21 -21
  96. package/src/actions/content/content.js +0 -1
  97. package/src/actions/controlpanels/controlpanels.js +13 -7
  98. package/src/actions/controlpanels/controlpanels.test.js +11 -5
  99. package/src/actions/users/users.js +2 -2
  100. package/src/components/manage/Actions/Actions.test.jsx +1 -5
  101. package/src/components/manage/Add/Add.jsx +5 -6
  102. package/src/components/manage/BlockChooser/BlockChooser.jsx +1 -0
  103. package/src/components/manage/Blocks/Block/BlocksForm.test.jsx +1 -5
  104. package/src/components/manage/Blocks/Block/Edit.jsx +1 -0
  105. package/src/components/manage/Blocks/Block/EditBlockWrapper.jsx +9 -4
  106. package/src/components/manage/Blocks/Block/Settings.test.jsx +1 -5
  107. package/src/components/manage/Blocks/HTML/Edit.test.jsx +1 -5
  108. package/src/components/manage/Blocks/Image/Edit.jsx +5 -1
  109. package/src/components/manage/Blocks/Image/ImageSidebar.test.jsx +1 -5
  110. package/src/components/manage/Blocks/LeadImage/Edit.jsx +2 -2
  111. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +1 -1
  112. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +1 -5
  113. package/src/components/manage/Blocks/Listing/ImageGallery.jsx +6 -4
  114. package/src/components/manage/Blocks/Maps/Edit.jsx +2 -1
  115. package/src/components/manage/Blocks/Maps/MapsSidebar.test.jsx +1 -5
  116. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +21 -4
  117. package/src/components/manage/Blocks/Search/components/DateRangeFacet.test.jsx +1 -6
  118. package/src/components/manage/Blocks/Search/components/SelectFacet.test.jsx +1 -6
  119. package/src/components/manage/Blocks/Teaser/Data.jsx +21 -7
  120. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +1 -1
  121. package/src/components/manage/Blocks/Teaser/schema.js +8 -3
  122. package/src/components/manage/Blocks/Video/Edit.jsx +2 -1
  123. package/src/components/manage/Blocks/Video/VideoSidebar.test.jsx +1 -5
  124. package/src/components/manage/Contents/Contents.jsx +689 -654
  125. package/src/components/manage/Contents/Contents.test.jsx +8 -5
  126. package/src/components/manage/Contents/ContentsBreadcrumbs.Multilingual.test.jsx +18 -5
  127. package/src/components/manage/Contents/ContentsBreadcrumbs.jsx +20 -26
  128. package/src/components/manage/Contents/ContentsBreadcrumbs.test.jsx +14 -0
  129. package/src/components/manage/Contents/ContentsDeleteModal.jsx +258 -206
  130. package/src/components/manage/Contents/ContentsDeleteModal.stories.jsx +26 -8
  131. package/src/components/manage/Contents/ContentsItem.jsx +10 -2
  132. package/src/components/manage/Contents/ContentsPropertiesModal.test.jsx +1 -5
  133. package/src/components/manage/Contents/ContentsRenameModal.test.jsx +1 -5
  134. package/src/components/manage/Contents/ContentsTagsModal.test.jsx +1 -5
  135. package/src/components/manage/Contents/ContentsUploadModal.test.jsx +13 -22
  136. package/src/components/manage/Contents/ContentsWorkflowModal.test.jsx +1 -5
  137. package/src/components/manage/Contents/DropZoneContent.jsx +323 -0
  138. package/src/components/manage/Contents/__mocks__/index.tsx +2 -18
  139. package/src/components/manage/Controlpanels/Aliases.test.jsx +1 -5
  140. package/src/components/manage/Controlpanels/ContentType.jsx +1 -1
  141. package/src/components/manage/Controlpanels/ContentType.test.jsx +1 -5
  142. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +3 -2
  143. package/src/components/manage/Controlpanels/Relations/Relations.jsx +1 -1
  144. package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +1 -5
  145. package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +1 -5
  146. package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +1 -5
  147. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +156 -175
  148. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +575 -630
  149. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +4 -3
  150. package/src/components/manage/Diff/Diff.test.jsx +1 -6
  151. package/src/components/manage/Diff/DiffField.test.jsx +1 -6
  152. package/src/components/manage/Display/Display.test.jsx +2 -11
  153. package/src/components/manage/Edit/Edit.jsx +2 -3
  154. package/src/components/manage/Edit/Edit.test.jsx +1 -5
  155. package/src/components/manage/Form/BlockDataForm.test.jsx +1 -5
  156. package/src/components/manage/Form/Form.test.jsx +1 -5
  157. package/src/components/manage/Form/InlineForm.jsx +2 -2
  158. package/src/components/manage/Form/InlineForm.test.jsx +1 -5
  159. package/src/components/manage/Form/ModalForm.jsx +12 -10
  160. package/src/components/manage/Form/ModalForm.test.jsx +27 -5
  161. package/src/components/manage/Form/__mocks__/index.tsx +9 -27
  162. package/src/components/manage/Multilingual/CompareLanguages.jsx +2 -5
  163. package/src/components/manage/Multilingual/CreateTranslation.jsx +8 -8
  164. package/src/components/manage/Multilingual/ManageTranslations.jsx +4 -2
  165. package/src/components/manage/Multilingual/ManageTranslations.test.jsx +5 -1
  166. package/src/components/manage/Multilingual/TranslationObject.jsx +1 -1
  167. package/src/components/manage/Preferences/ChangePassword.test.jsx +1 -5
  168. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +1 -17
  169. package/src/components/manage/Sidebar/ObjectBrowser.jsx +3 -0
  170. package/src/components/manage/Sidebar/ObjectBrowserBody.jsx +13 -1
  171. package/src/components/manage/Sidebar/ObjectBrowserNav.jsx +2 -1
  172. package/src/components/manage/Sidebar/SidebarPortal.test.tsx +42 -0
  173. package/src/components/manage/Sidebar/SidebarPortal.tsx +48 -0
  174. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +2 -1
  175. package/src/components/manage/Toolbar/More.jsx +4 -1
  176. package/src/components/manage/Toolbar/More.test.jsx +3 -0
  177. package/src/components/manage/Toolbar/PersonalTools.jsx +2 -1
  178. package/src/components/manage/Toolbar/Toolbar.jsx +3 -4
  179. package/src/components/manage/Toolbar/Types.jsx +7 -7
  180. package/src/components/manage/UniversalLink/UniversalLink.tsx +1 -0
  181. package/src/components/manage/Widgets/AlignWidget.stories.jsx +9 -0
  182. package/src/components/manage/Widgets/AlignWidget.test.tsx +95 -0
  183. package/src/components/manage/Widgets/{AlignWidget.jsx → AlignWidget.tsx} +23 -7
  184. package/src/components/manage/Widgets/ArrayWidget.test.jsx +1 -6
  185. package/src/components/manage/Widgets/BlockAlignment.stories.tsx +104 -0
  186. package/src/components/manage/Widgets/BlockAlignment.test.tsx +104 -0
  187. package/src/components/manage/Widgets/BlockAlignment.tsx +88 -0
  188. package/src/components/manage/Widgets/BlockWidth.stories.tsx +69 -0
  189. package/src/components/manage/Widgets/BlockWidth.test.tsx +62 -0
  190. package/src/components/manage/Widgets/BlockWidth.tsx +101 -0
  191. package/src/components/manage/Widgets/ButtonsWidget.stories.jsx +61 -0
  192. package/src/components/manage/Widgets/ButtonsWidget.test.tsx +138 -0
  193. package/src/components/manage/Widgets/ButtonsWidget.tsx +176 -0
  194. package/src/components/manage/Widgets/CheckboxGroupWidget.test.jsx +1 -6
  195. package/src/components/manage/Widgets/DatetimeWidget.jsx +16 -1
  196. package/src/components/manage/Widgets/DatetimeWidget.test.jsx +1 -6
  197. package/src/components/manage/Widgets/FileWidget.jsx +14 -8
  198. package/src/components/manage/Widgets/FormFieldWrapper.jsx +146 -168
  199. package/src/components/manage/Widgets/ImageWidget.jsx +171 -38
  200. package/src/components/manage/Widgets/InternalUrlWidget.jsx +2 -0
  201. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +8 -0
  202. package/src/components/manage/Widgets/ObjectListWidget.test.jsx +2 -11
  203. package/src/components/manage/Widgets/ObjectWidget.test.jsx +1 -5
  204. package/src/components/manage/Widgets/QueryWidget.jsx +137 -9
  205. package/src/components/manage/Widgets/RadioGroupWidget.test.jsx +1 -6
  206. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.test.jsx +1 -6
  207. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +3 -2
  208. package/src/components/manage/Widgets/SchemaWidget.test.jsx +1 -6
  209. package/src/components/manage/Widgets/SchemaWidgetFieldset.test.jsx +1 -6
  210. package/src/components/manage/Widgets/SelectAutoComplete.jsx +29 -12
  211. package/src/components/manage/Widgets/SelectAutoComplete.test.jsx +1 -6
  212. package/src/components/manage/Widgets/SelectWidget.test.jsx +1 -6
  213. package/src/components/manage/Widgets/Size.stories.tsx +69 -0
  214. package/src/components/manage/Widgets/Size.test.tsx +59 -0
  215. package/src/components/manage/Widgets/Size.tsx +78 -0
  216. package/src/components/manage/Widgets/TimeWidget.test.jsx +1 -6
  217. package/src/components/manage/Widgets/TokenWidget.test.jsx +1 -6
  218. package/src/components/manage/Widgets/UrlWidget.jsx +2 -0
  219. package/src/components/manage/Widgets/VocabularyTermsWidget.test.jsx +2 -11
  220. package/src/components/manage/Widgets/__mocks__/index.tsx +33 -51
  221. package/src/components/manage/Widgets/index.tsx +21 -0
  222. package/src/components/manage/Workflow/Workflow.test.jsx +2 -11
  223. package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.jsx +1 -3
  224. package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.test.jsx +0 -4
  225. package/src/components/theme/App/App.jsx +5 -1
  226. package/src/components/theme/App/App.test.jsx +1 -0
  227. package/src/components/theme/Avatar/Avatar.jsx +2 -1
  228. package/src/components/theme/Comments/CommentEditModal.test.jsx +1 -5
  229. package/src/components/theme/Comments/Comments.test.jsx +2 -11
  230. package/src/components/theme/ContactForm/ContactForm.test.jsx +1 -5
  231. package/src/components/theme/FormattedDate/FormattedDate.stories.jsx +20 -2
  232. package/src/components/theme/Image/Image.jsx +11 -8
  233. package/src/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.tsx +7 -0
  234. package/src/components/theme/LanguageSelector/{LanguageSelector.test.jsx → LanguageSelector.test.tsx} +6 -6
  235. package/src/components/theme/LanguageSelector/LanguageSelector.tsx +89 -0
  236. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +0 -5
  237. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +10 -14
  238. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.test.jsx +3 -5
  239. package/src/components/theme/Navigation/NavItem.jsx +1 -5
  240. package/src/components/theme/Navigation/Navigation.Multilingual.test.jsx +0 -5
  241. package/src/components/theme/NotFound/NotFound.jsx +5 -2
  242. package/src/components/theme/NotFound/NotFound.test.jsx +3 -0
  243. package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +1 -5
  244. package/src/components/theme/PreviewImage/PreviewImage.jsx +1 -1
  245. package/src/components/theme/Register/Register.test.jsx +1 -5
  246. package/src/components/theme/RequestTimeout/RequestTimeout.jsx +1 -1
  247. package/src/components/theme/Sitemap/Sitemap.jsx +6 -5
  248. package/src/components/theme/Sitemap/Sitemap.test.jsx +0 -1
  249. package/src/components/theme/Unauthorized/Unauthorized.jsx +5 -2
  250. package/src/components/theme/View/EventDatesInfo.test.jsx +1 -6
  251. package/src/components/theme/View/EventView.test.jsx +1 -6
  252. package/src/components/theme/View/FileView.jsx +9 -1
  253. package/src/components/theme/View/View.jsx +8 -1
  254. package/src/components/theme/Widgets/ImageWidget.jsx +2 -1
  255. package/src/config/ControlPanels.js +1 -0
  256. package/src/config/Widgets.jsx +7 -0
  257. package/src/config/index.js +18 -25
  258. package/src/config/server.js +0 -2
  259. package/src/config/slots.js +19 -0
  260. package/src/express-middleware/devproxy.js +20 -5
  261. package/src/helpers/Api/APIResourceWithAuth.js +8 -3
  262. package/src/helpers/Api/Api.js +7 -4
  263. package/src/helpers/AsyncConnect/ssr.js +4 -1
  264. package/src/helpers/Content/Content.js +23 -0
  265. package/src/helpers/Content/Content.test.js +39 -0
  266. package/src/helpers/Content/withClientSideContent.jsx +35 -0
  267. package/src/helpers/Extensions/withBlockSchemaEnhancer.jsx +4 -1
  268. package/src/helpers/Html/Html.jsx +13 -7
  269. package/src/helpers/LanguageMap/LanguageMap.js +115 -8
  270. package/src/helpers/Loadable/__mocks__/Loadable.jsx +7 -22
  271. package/src/helpers/MessageLabels/MessageLabels.js +5 -0
  272. package/src/helpers/Sitemap/Sitemap.js +4 -4
  273. package/src/helpers/Url/Url.js +33 -2
  274. package/src/helpers/Url/Url.test.js +62 -0
  275. package/src/hooks/user/useUser.js +1 -1
  276. package/src/internalChecks.test.ts +11 -0
  277. package/src/middleware/Api.test.js +4 -0
  278. package/src/middleware/api.js +82 -28
  279. package/src/middleware/storeProtectLoadUtils.test.js +3 -3
  280. package/src/reducers/content/content.js +3 -18
  281. package/src/reducers/diff/diff.js +5 -1
  282. package/src/reducers/diff/diff.test.js +60 -4
  283. package/src/reducers/querystring/querystring.js +8 -1
  284. package/src/routes.js +4 -2
  285. package/src/server.jsx +45 -14
  286. package/src/start-client.jsx +9 -6
  287. package/src/start-server.js +9 -3
  288. package/test-addons-loader.js +3 -0
  289. package/test-setup-config.jsx +0 -2
  290. package/test-setup-globals.js +30 -2
  291. package/theme/themes/pastanaga/extras/blocks.less +26 -0
  292. package/theme/themes/pastanaga/extras/contents.less +80 -5
  293. package/theme/themes/pastanaga/extras/main.less +17 -2
  294. package/theme/themes/pastanaga/extras/widgets.less +79 -0
  295. package/tsconfig.declarations.json +1 -1
  296. package/tsconfig.json +4 -5
  297. package/types/components/manage/Blocks/Teaser/schema.d.ts +1 -0
  298. package/types/components/manage/Contents/DropZoneContent.d.ts +2 -0
  299. package/types/components/manage/Contents/__mocks__/index.d.ts +2 -2
  300. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
  301. package/types/components/manage/Controlpanels/Users/RenderUsers.d.ts +18 -2
  302. package/types/components/manage/Controlpanels/Users/UsersControlpanel.d.ts +6 -2
  303. package/types/components/manage/Controlpanels/index.d.ts +2 -2
  304. package/types/components/manage/Form/__mocks__/index.d.ts +8 -8
  305. package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
  306. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
  307. package/types/components/manage/Sidebar/SidebarPortal.d.ts +7 -15
  308. package/types/components/manage/Widgets/AlignWidget.d.ts +8 -10
  309. package/types/components/manage/Widgets/AlignWidget.stories.d.ts +1 -0
  310. package/types/components/manage/Widgets/BlockAlignment.d.ts +7 -0
  311. package/types/components/manage/Widgets/BlockAlignment.stories.d.ts +8 -0
  312. package/types/components/manage/Widgets/BlockWidth.d.ts +7 -0
  313. package/types/components/manage/Widgets/BlockWidth.stories.d.ts +6 -0
  314. package/types/components/manage/Widgets/ButtonsWidget.d.ts +48 -1
  315. package/types/components/manage/Widgets/ButtonsWidget.stories.d.ts +3 -0
  316. package/types/components/manage/Widgets/FormFieldWrapper.d.ts +28 -5
  317. package/types/components/manage/Widgets/ImageWidget.d.ts +41 -1
  318. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
  319. package/types/components/manage/Widgets/ObjectBrowserWidget.d.ts +2 -0
  320. package/types/components/manage/Widgets/QueryWidget.d.ts +5 -2
  321. package/types/components/manage/Widgets/RecurrenceWidget/Utils.d.ts +12 -18
  322. package/types/components/manage/Widgets/Size.d.ts +7 -0
  323. package/types/components/manage/Widgets/Size.stories.d.ts +6 -0
  324. package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
  325. package/types/components/manage/Widgets/__mocks__/index.d.ts +33 -33
  326. package/types/components/manage/Widgets/index.d.ts +11 -6
  327. package/types/components/theme/FormattedDate/FormattedDate.stories.d.ts +1 -1
  328. package/types/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.d.ts +3 -0
  329. package/types/components/theme/LanguageSelector/LanguageSelector.d.ts +3 -10
  330. package/types/components/theme/Unauthorized/Unauthorized.d.ts +2 -2
  331. package/types/config/Widgets.d.ts +6 -0
  332. package/types/config/slots.d.ts +7 -0
  333. package/types/helpers/Content/Content.d.ts +7 -0
  334. package/types/helpers/Content/withClientSideContent.d.ts +1 -0
  335. package/types/helpers/Extensions/withBlockSchemaEnhancer.d.ts +4 -5
  336. package/types/helpers/Helmet/Helmet.d.ts +1 -1
  337. package/types/helpers/LanguageMap/LanguageMap.d.ts +428 -4
  338. package/types/helpers/Loadable/__mocks__/Loadable.d.ts +2 -2
  339. package/types/helpers/MessageLabels/MessageLabels.d.ts +68 -62
  340. package/types/helpers/Url/Url.d.ts +14 -0
  341. package/types/helpers/Url/bulkFlattenToAppURL.d.ts +5 -0
  342. package/types/middleware/api.d.ts +6 -9
  343. package/types/reducers/index.d.ts +1 -0
  344. package/types/start-client.d.ts +0 -1
  345. package/vitest.config.mjs +4 -4
  346. package/webpack-plugins/webpack-scss-plugin.js +172 -0
  347. package/jest-addons-loader.js +0 -3
  348. package/jest-extender-plugin.js +0 -39
  349. package/jest-setup-afterenv.js +0 -2
  350. package/jest-svgsystem-transform.js +0 -10
  351. package/package-why.json +0 -34
  352. package/patches/patchit.sh +0 -2
  353. package/patches/razzle-jest.patch +0 -10
  354. package/src/actions/content/content.multilingual.test.js +0 -17
  355. package/src/components/manage/Contents/__mocks__/index.vitest.tsx +0 -5
  356. package/src/components/manage/Form/__mocks__/index.vitest.tsx +0 -73
  357. package/src/components/manage/Sidebar/SidebarPortal.jsx +0 -47
  358. package/src/components/manage/Sidebar/SidebarPortal.test.jsx +0 -26
  359. package/src/components/manage/Widgets/AlignWidget.test.jsx +0 -59
  360. package/src/components/manage/Widgets/ButtonsWidget.jsx +0 -41
  361. package/src/components/manage/Widgets/ButtonsWidget.test.jsx +0 -70
  362. package/src/components/manage/Widgets/__mocks__/index.vitest.tsx +0 -41
  363. package/src/components/theme/LanguageSelector/LanguageSelector.jsx +0 -77
  364. package/src/helpers/Loadable/__mocks__/Loadable.vitest.jsx +0 -39
  365. package/test-setup-globals-vitest.js +0 -46
  366. package/theme/themes/pastanaga/extras/utils.less +0 -63
@@ -5,12 +5,7 @@ import { Provider } from 'react-intl-redux';
5
5
  import { waitFor } from '@testing-library/react';
6
6
  import RecurrenceWidget from './RecurrenceWidget';
7
7
 
8
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
9
- return await import(
10
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
11
- );
12
- });
13
-
8
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
14
9
  beforeAll(async () => {
15
10
  const { __setLoadables } = await import(
16
11
  '@plone/volto/helpers/Loadable/Loadable'
@@ -82,10 +82,11 @@ describe('RegistryImageWidget', () => {
82
82
  const dropzone = container.querySelector('.file-widget-dropzone');
83
83
  const preview = container.querySelector('.image-preview');
84
84
  const filename = container.querySelector('.field-file-name');
85
+ const img = container.querySelector('img[src*="logo"]');
85
86
 
86
- return dropzone && preview && filename;
87
+ return dropzone && preview && filename && img && img.complete;
87
88
  },
88
- { timeout: 1000 },
89
+ { timeout: 2000 },
89
90
  );
90
91
 
91
92
  expect(container).toMatchSnapshot();
@@ -5,12 +5,7 @@ import { Provider } from 'react-intl-redux';
5
5
 
6
6
  import SchemaWidget from './SchemaWidget';
7
7
 
8
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
9
- return await import(
10
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
11
- );
12
- });
13
-
8
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
14
9
  beforeAll(async () => {
15
10
  const { __setLoadables } = await import(
16
11
  '@plone/volto/helpers/Loadable/Loadable'
@@ -3,12 +3,7 @@ import { DragDropContext, Droppable } from 'react-beautiful-dnd';
3
3
  import { render } from '@testing-library/react';
4
4
  import SchemaWidgetFieldsetComponent from './SchemaWidgetFieldset';
5
5
 
6
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
7
- return await import(
8
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
9
- );
10
- });
11
-
6
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
12
7
  beforeAll(async () => {
13
8
  const { __setLoadables } = await import(
14
9
  '@plone/volto/helpers/Loadable/Loadable'
@@ -105,6 +105,7 @@ class SelectAutoComplete extends Component {
105
105
  error: [],
106
106
  choices: [],
107
107
  value: null,
108
+ isMulti: true,
108
109
  };
109
110
 
110
111
  /**
@@ -127,10 +128,16 @@ class SelectAutoComplete extends Component {
127
128
  componentDidMount() {
128
129
  const { id, lang, value, choices } = this.props;
129
130
  if (value && value?.length > 0) {
130
- const tokensQuery = convertValueToVocabQuery(
131
- normalizeValue(choices, value, this.props.intl),
132
- );
133
-
131
+ let tokensQuery;
132
+ if (typeof value === 'string') {
133
+ tokensQuery = convertValueToVocabQuery(
134
+ normalizeValue(choices, [value], this.props.intl),
135
+ );
136
+ } else {
137
+ tokensQuery = convertValueToVocabQuery(
138
+ normalizeValue(choices, value, this.props.intl),
139
+ );
140
+ }
134
141
  this.props.getVocabularyTokenTitle({
135
142
  vocabNameOrURL: this.props.vocabBaseUrl,
136
143
  subrequest: `widget-${id}-${lang}`,
@@ -160,13 +167,22 @@ class SelectAutoComplete extends Component {
160
167
  * @returns {undefined}
161
168
  */
162
169
  handleChange(selectedOption) {
163
- this.props.onChange(
164
- this.props.id,
165
- selectedOption ? selectedOption.map((item) => item.value) : null,
166
- );
167
- this.setState((state) => ({
168
- termsPairsCache: [...state.termsPairsCache, ...selectedOption],
169
- }));
170
+ if (!Array.isArray(selectedOption)) {
171
+ this.props.onChange(this.props.id, selectedOption?.value || null);
172
+ if (selectedOption) {
173
+ this.setState((state) => ({
174
+ termsPairsCache: [...state.termsPairsCache, selectedOption],
175
+ }));
176
+ }
177
+ } else {
178
+ this.props.onChange(
179
+ this.props.id,
180
+ selectedOption ? selectedOption.map((item) => item.value) : null,
181
+ );
182
+ this.setState((state) => ({
183
+ termsPairsCache: [...state.termsPairsCache, ...selectedOption],
184
+ }));
185
+ }
170
186
  }
171
187
 
172
188
  timeoutRef = React.createRef();
@@ -251,7 +267,8 @@ class SelectAutoComplete extends Component {
251
267
  this.props.intl.formatMessage(messages.select)
252
268
  }
253
269
  onChange={this.handleChange}
254
- isMulti
270
+ isMulti={this.props.isMulti}
271
+ isClearable={!this.props.isMulti}
255
272
  />
256
273
  </FormFieldWrapper>
257
274
  );
@@ -6,12 +6,7 @@ import SelectAutoComplete from './SelectAutoComplete';
6
6
 
7
7
  const mockStore = configureStore();
8
8
 
9
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
10
- return await import(
11
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
12
- );
13
- });
14
-
9
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
15
10
  beforeAll(async () => {
16
11
  const { __setLoadables } = await import(
17
12
  '@plone/volto/helpers/Loadable/Loadable'
@@ -6,12 +6,7 @@ import SelectWidget from './SelectWidget';
6
6
 
7
7
  const mockStore = configureStore();
8
8
 
9
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
10
- return await import(
11
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
12
- );
13
- });
14
-
9
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
15
10
  beforeAll(async () => {
16
11
  const { __setLoadables } = await import(
17
12
  '@plone/volto/helpers/Loadable/Loadable'
@@ -0,0 +1,69 @@
1
+ import React from 'react';
2
+ import type { Meta, StoryFn, StoryObj } from '@storybook/react';
3
+
4
+ import Size from './Size';
5
+ import type { ButtonsWidgetProps } from './ButtonsWidget';
6
+ import {
7
+ RealStoreWrapper as Wrapper,
8
+ FormUndoWrapper,
9
+ } from '@plone/volto/storybook';
10
+
11
+ const meta: Meta<typeof Size> = {
12
+ title: 'Edit Widgets/Size',
13
+ component: Size,
14
+ decorators: [
15
+ (Story) => (
16
+ <div className="ui segment form attached" style={{ width: '400px' }}>
17
+ <h4>Size widget</h4>
18
+ <Story />
19
+ </div>
20
+ ),
21
+ ],
22
+ };
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<typeof Size>;
27
+
28
+ type TemplateParameters = {
29
+ initialValue?: ButtonsWidgetProps['value'];
30
+ };
31
+
32
+ const Template: StoryFn<typeof Size> = (args, context) => {
33
+ const { initialValue } =
34
+ (context.parameters as TemplateParameters | undefined) ?? {};
35
+ const { value: _ignoredValue, onChange: argsOnChange, ...restArgs } = args;
36
+
37
+ return (
38
+ <Wrapper location={{ pathname: '/folder2/folder21/doc212' }}>
39
+ <FormUndoWrapper
40
+ initialState={{ value: initialValue ?? _ignoredValue }}
41
+ showControls
42
+ >
43
+ {({ state, onChange }) => (
44
+ <div className="ui segment form attached" style={{ width: '400px' }}>
45
+ <Size
46
+ {...(restArgs as ButtonsWidgetProps)}
47
+ value={state.value}
48
+ onChange={(id, nextValue) => {
49
+ argsOnChange?.(id, nextValue);
50
+ onChange({ value: nextValue });
51
+ }}
52
+ />
53
+ <pre>Value: {JSON.stringify(state.value, null, 2)}</pre>
54
+ </div>
55
+ )}
56
+ </FormUndoWrapper>
57
+ </Wrapper>
58
+ );
59
+ };
60
+
61
+ export const DefaultSize: Story = {
62
+ render: Template,
63
+ args: {
64
+ id: 'size',
65
+ title: 'Size',
66
+ block: 'block',
67
+ fieldSet: 'default',
68
+ },
69
+ };
@@ -0,0 +1,59 @@
1
+ import React from 'react';
2
+ import { describe, it, expect, vi } from 'vitest';
3
+ import { render, screen, fireEvent } from '@testing-library/react';
4
+ import configureStore from 'redux-mock-store';
5
+ import { Provider } from 'react-intl-redux';
6
+
7
+ import Size from './Size';
8
+ import type { ButtonsWidgetProps } from './ButtonsWidget';
9
+
10
+ const mockStore = configureStore();
11
+
12
+ const renderWidget = (props: Partial<ButtonsWidgetProps> = {}) => {
13
+ const onChange = props.onChange ?? vi.fn();
14
+ const widgetProps: ButtonsWidgetProps = {
15
+ id: 'size',
16
+ title: 'Size',
17
+ fieldSet: 'default',
18
+ onChange,
19
+ value: undefined,
20
+ default: undefined,
21
+ disabled: false,
22
+ isDisabled: false,
23
+ ...props,
24
+ };
25
+
26
+ return {
27
+ onChange,
28
+ ...render(
29
+ <Provider
30
+ store={mockStore({
31
+ intl: {
32
+ locale: 'en',
33
+ messages: {},
34
+ },
35
+ })}
36
+ >
37
+ <Size {...widgetProps} />
38
+ </Provider>,
39
+ ),
40
+ };
41
+ };
42
+
43
+ describe('Size widget', () => {
44
+ it('renders the default size options', () => {
45
+ renderWidget();
46
+
47
+ expect(screen.getByRole('radio', { name: 'Small' })).toBeInTheDocument();
48
+ expect(screen.getByRole('radio', { name: 'Medium' })).toBeInTheDocument();
49
+ expect(screen.getByRole('radio', { name: 'Large' })).toBeInTheDocument();
50
+ });
51
+
52
+ it('returns the selected size name', () => {
53
+ const { onChange } = renderWidget();
54
+
55
+ fireEvent.click(screen.getByRole('radio', { name: 'Medium' }));
56
+
57
+ expect(onChange).toHaveBeenCalledWith('size', 'm');
58
+ });
59
+ });
@@ -0,0 +1,78 @@
1
+ import { defineMessages, useIntl } from 'react-intl';
2
+ import ButtonsWidget, {
3
+ type ActionInfo,
4
+ type ButtonsWidgetProps,
5
+ } from './ButtonsWidget';
6
+ import type { IntlShape } from 'react-intl';
7
+ import type { StyleDefinition } from '@plone/types';
8
+
9
+ const messages = defineMessages({
10
+ s: {
11
+ id: 'Small',
12
+ defaultMessage: 'Small',
13
+ },
14
+ m: {
15
+ id: 'Medium',
16
+ defaultMessage: 'Medium',
17
+ },
18
+ l: {
19
+ id: 'Large',
20
+ defaultMessage: 'Large',
21
+ },
22
+ });
23
+
24
+ export const defaultActionsInfo = ({
25
+ intl,
26
+ }: {
27
+ intl: IntlShape;
28
+ }): Record<string, ActionInfo> => ({
29
+ s: ['S', intl.formatMessage(messages.s)],
30
+ m: ['M', intl.formatMessage(messages.m)],
31
+ l: ['L', intl.formatMessage(messages.l)],
32
+ });
33
+
34
+ const DEFAULT_ACTIONS: StyleDefinition[] = [
35
+ {
36
+ name: 's',
37
+ label: 'Small',
38
+ style: undefined,
39
+ },
40
+ {
41
+ name: 'm',
42
+ label: 'Medium',
43
+ style: undefined,
44
+ },
45
+ {
46
+ name: 'l',
47
+ label: 'Large',
48
+ style: undefined,
49
+ },
50
+ ];
51
+
52
+ const SizeWidget = (props: ButtonsWidgetProps) => {
53
+ const intl = useIntl();
54
+
55
+ const { actions = DEFAULT_ACTIONS, actionsInfoMap, filterActions } = props;
56
+ const filteredActions =
57
+ filterActions && filterActions.length > 0
58
+ ? actions.filter((action) => {
59
+ const actionName = typeof action === 'string' ? action : action.name;
60
+ return filterActions.includes(actionName);
61
+ })
62
+ : actions;
63
+
64
+ const actionsInfo = {
65
+ ...defaultActionsInfo({ intl }),
66
+ ...actionsInfoMap,
67
+ };
68
+
69
+ return (
70
+ <ButtonsWidget
71
+ {...props}
72
+ actions={filteredActions}
73
+ actionsInfoMap={actionsInfo}
74
+ />
75
+ );
76
+ };
77
+
78
+ export default SizeWidget;
@@ -6,12 +6,7 @@ import { waitFor, render, screen } from '@testing-library/react';
6
6
 
7
7
  const mockStore = configureStore();
8
8
 
9
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
10
- return await import(
11
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
12
- );
13
- });
14
-
9
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
15
10
  beforeAll(async () => {
16
11
  const { __setLoadables } = await import(
17
12
  '@plone/volto/helpers/Loadable/Loadable'
@@ -7,12 +7,7 @@ import TokenWidget from './TokenWidget';
7
7
 
8
8
  const mockStore = configureStore();
9
9
 
10
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
11
- return await import(
12
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
13
- );
14
- });
15
-
10
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
16
11
  beforeAll(async () => {
17
12
  const { __setLoadables } = await import(
18
13
  '@plone/volto/helpers/Loadable/Loadable'
@@ -105,6 +105,7 @@ export const UrlWidget = (props) => {
105
105
  {value?.length > 0 ? (
106
106
  <Button.Group>
107
107
  <Button
108
+ type="button"
108
109
  basic
109
110
  className="cancel"
110
111
  aria-label="clearUrlBrowser"
@@ -120,6 +121,7 @@ export const UrlWidget = (props) => {
120
121
  ) : (
121
122
  <Button.Group>
122
123
  <Button
124
+ type="button"
123
125
  basic
124
126
  icon
125
127
  aria-label="openUrlBrowser"
@@ -4,17 +4,8 @@ import configureStore from 'redux-mock-store';
4
4
  import { Provider } from 'react-intl-redux';
5
5
  import VocabularyTermsWidget from './VocabularyTermsWidget';
6
6
 
7
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
8
- return await import(
9
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
10
- );
11
- });
12
- vi.mock('@plone/volto/components/manage/Form', async () => {
13
- return await import(
14
- '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
15
- );
16
- });
17
-
7
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
8
+ vi.mock('@plone/volto/components/manage/Form');
18
9
  beforeAll(async () => {
19
10
  const { __setLoadables } = await import(
20
11
  '@plone/volto/helpers/Loadable/Loadable'
@@ -1,59 +1,41 @@
1
- /* TODO: When the Volto Team removes Jest configuration support from Volto core, update this file with the Vitest version of the mock.
2
- Then, in the tests, we need to replace:
3
-
4
- vi.mock('@plone/volto/components/manage/Widgets', async () => {
5
- return await import(
6
- '@plone/volto/components/manage/Widgets/__mocks__/index.vitest.tsx'
7
- );
8
- });
9
-
10
- with the following:
11
-
12
- vi.mock('@plone/volto/components/manage/Widgets');
13
-
14
- Finally, remove this comment.
15
- */
16
-
17
- export const AlignWidget = jest.fn(() => <div id="AlignWidget" />);
18
- export const ButtonsWidget = jest.fn(() => <div id="ButtonsWidget" />);
19
- export const ArrayWidget = jest.fn(() => <div id="ArrayWidget" />);
20
- export const CheckboxWidget = jest.fn(() => <div id="CheckboxWidget" />);
21
- export const FileWidget = jest.fn(() => <div id="FileWidget" />);
22
- export const IdWidget = jest.fn(() => <div id="IdWidget" />);
23
- export const PasswordWidget = jest.fn(() => <div id="PasswordWidget" />);
24
- export const QueryWidget = jest.fn(() => <div id="QueryWidget" />);
25
- export const QuerySortOnWidget = jest.fn(() => <div id="QuerySortOnWidget" />);
26
- export const QuerystringWidget = jest.fn(() => <div id="QuerystringWidget" />);
27
- export const SchemaWidget = jest.fn(() => <div id="SchemaWidget" />);
28
- export const SelectWidget = jest.fn(() => <div id="SelectWidget" />);
29
- export const TextareaWidget = jest.fn(() => <div id="TextareaWidget" />);
30
- export const TextWidget = jest.fn(() => <div id="TextWidget" />);
31
- export const TokenWidget = jest.fn(() => <div id="TokenWidget" />);
32
- export const WysiwygWidget = jest.fn(() => <div id="WysiwygWidget" />);
33
- export const UrlWidget = jest.fn(() => <div id="UrlWidget" />);
34
- export const InternalUrlWidget = jest.fn(() => <div id="InternalUrlWidget" />);
35
- export const EmailWidget = jest.fn(() => <div id="EmailWidget" />);
36
- export const NumberWidget = jest.fn(() => <div id="NumberWidget" />);
37
- export const ImageSizeWidget = jest.fn(() => <div id="ImageSizeWidget" />);
38
- export const RegistryImageWidget = jest.fn(() => (
1
+ export const AlignWidget = vi.fn(() => <div id="AlignWidget" />);
2
+ export const ButtonsWidget = vi.fn(() => <div id="ButtonsWidget" />);
3
+ export const ArrayWidget = vi.fn(() => <div id="ArrayWidget" />);
4
+ export const CheckboxWidget = vi.fn(() => <div id="CheckboxWidget" />);
5
+ export const FileWidget = vi.fn(() => <div id="FileWidget" />);
6
+ export const IdWidget = vi.fn(() => <div id="IdWidget" />);
7
+ export const PasswordWidget = vi.fn(() => <div id="PasswordWidget" />);
8
+ export const QueryWidget = vi.fn(() => <div id="QueryWidget" />);
9
+ export const QuerySortOnWidget = vi.fn(() => <div id="QuerySortOnWidget" />);
10
+ export const QuerystringWidget = vi.fn(() => <div id="QuerystringWidget" />);
11
+ export const SchemaWidget = vi.fn(() => <div id="SchemaWidget" />);
12
+ export const SelectWidget = vi.fn(() => <div id="SelectWidget" />);
13
+ export const TextareaWidget = vi.fn(() => <div id="TextareaWidget" />);
14
+ export const TextWidget = vi.fn(() => <div id="TextWidget" />);
15
+ export const TokenWidget = vi.fn(() => <div id="TokenWidget" />);
16
+ export const WysiwygWidget = vi.fn(() => <div id="WysiwygWidget" />);
17
+ export const UrlWidget = vi.fn(() => <div id="UrlWidget" />);
18
+ export const InternalUrlWidget = vi.fn(() => <div id="InternalUrlWidget" />);
19
+ export const EmailWidget = vi.fn(() => <div id="EmailWidget" />);
20
+ export const NumberWidget = vi.fn(() => <div id="NumberWidget" />);
21
+ export const ImageSizeWidget = vi.fn(() => <div id="ImageSizeWidget" />);
22
+ export const RegistryImageWidget = vi.fn(() => (
39
23
  <div id="RegistryImageWidget" />
40
24
  ));
41
- export const ReferenceWidget = jest.fn(() => <div id="ReferenceWidget" />);
42
- export const ObjectBrowserWidget = jest.fn(() => (
25
+ export const ReferenceWidget = vi.fn(() => <div id="ReferenceWidget" />);
26
+ export const ObjectBrowserWidget = vi.fn(() => (
43
27
  <div id="ObjectBrowserWidget" />
44
28
  ));
45
- export const ObjectWidget = jest.fn(() => <div id="ObjectWidget" />);
46
- export const ObjectListWidget = jest.fn(() => <div id="ObjectListWidget" />);
47
- export const VocabularyTermsWidget = jest.fn(() => (
29
+ export const ObjectWidget = vi.fn(() => <div id="ObjectWidget" />);
30
+ export const ObjectListWidget = vi.fn(() => <div id="ObjectListWidget" />);
31
+ export const VocabularyTermsWidget = vi.fn(() => (
48
32
  <div id="VocabularyTermsWidget" />
49
33
  ));
50
- export const SelectMetadataWidget = jest.fn(() => (
34
+ export const SelectMetadataWidget = vi.fn(() => (
51
35
  <div id="SelectMetadataWidget" />
52
36
  ));
53
- export const SelectAutoComplete = jest.fn(() => (
54
- <div id="SelectAutoComplete" />
55
- ));
56
- export const ColorPickerWidget = jest.fn(() => <div id="ColorPickerWidget" />);
57
- export const DatetimeWidget = jest.fn(() => <div id="DatetimeWidget" />);
58
- export const RecurrenceWidget = jest.fn(() => <div id="RecurrenceWidget" />);
59
- export const FormFieldWrapper = jest.fn(() => <div id="FormFieldWrapper" />);
37
+ export const SelectAutoComplete = vi.fn(() => <div id="SelectAutoComplete" />);
38
+ export const ColorPickerWidget = vi.fn(() => <div id="ColorPickerWidget" />);
39
+ export const DatetimeWidget = vi.fn(() => <div id="DatetimeWidget" />);
40
+ export const RecurrenceWidget = vi.fn(() => <div id="RecurrenceWidget" />);
41
+ export const FormFieldWrapper = vi.fn(() => <div id="FormFieldWrapper" />);
@@ -265,3 +265,24 @@ export const FormFieldWrapper = loadable(
265
265
  /* webpackChunkName: "Widgets" */ '@plone/volto/components/manage/Widgets/FormFieldWrapper'
266
266
  ),
267
267
  );
268
+
269
+ export const Size = loadable(
270
+ () =>
271
+ import(
272
+ /* webpackChunkName: "Widgets" */ '@plone/volto/components/manage/Widgets/Size'
273
+ ),
274
+ );
275
+
276
+ export const BlockAlignment = loadable(
277
+ () =>
278
+ import(
279
+ /* webpackChunkName: "Widgets" */ '@plone/volto/components/manage/Widgets/BlockAlignment'
280
+ ),
281
+ );
282
+
283
+ export const BlockWidth = loadable(
284
+ () =>
285
+ import(
286
+ /* webpackChunkName: "Widgets" */ '@plone/volto/components/manage/Widgets/BlockWidth'
287
+ ),
288
+ );
@@ -7,17 +7,8 @@ import Workflow from './Workflow';
7
7
 
8
8
  const mockStore = configureStore();
9
9
 
10
- vi.mock('@plone/volto/components/manage/Widgets', async () => {
11
- return await import(
12
- '@plone/volto/components/manage/Widgets/__mocks__/index.vitest.tsx'
13
- );
14
- });
15
- vi.mock('@plone/volto/helpers/Loadable/Loadable', async () => {
16
- return await import(
17
- '@plone/volto/helpers/Loadable/__mocks__/Loadable.vitest.jsx'
18
- );
19
- });
20
-
10
+ vi.mock('@plone/volto/components/manage/Widgets');
11
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
21
12
  beforeAll(async () => {
22
13
  const { __setLoadables } = await import(
23
14
  '@plone/volto/helpers/Loadable/Loadable'
@@ -1,4 +1,3 @@
1
- import config from '@plone/volto/registry';
2
1
  import Helmet from '@plone/volto/helpers/Helmet/Helmet';
3
2
  import { flattenToAppURL, toPublicURL } from '@plone/volto/helpers/Url/Url';
4
3
 
@@ -6,8 +5,7 @@ const AlternateHrefLangs = (props) => {
6
5
  const { content } = props;
7
6
  return (
8
7
  <Helmet>
9
- {config.settings.isMultilingual &&
10
- content['@components']?.translations?.items &&
8
+ {content['@components']?.translations?.items &&
11
9
  [
12
10
  ...content['@components']?.translations?.items,
13
11
  { '@id': content['@id'], language: content.language.token },
@@ -13,7 +13,6 @@ const mockStore = configureStore();
13
13
  describe('AlternateHrefLangs', () => {
14
14
  beforeEach(() => {});
15
15
  it('non multilingual site, renders nothing', () => {
16
- config.settings.isMultilingual = false;
17
16
  const content = {
18
17
  '@id': '/',
19
18
  '@components': {},
@@ -38,7 +37,6 @@ describe('AlternateHrefLangs', () => {
38
37
 
39
38
  it('multilingual site, with some translations', () => {
40
39
  config.settings.publicURL = 'https://plone.org';
41
- config.settings.isMultilingual = true;
42
40
  config.settings.supportedLanguages = ['en', 'es', 'eu'];
43
41
 
44
42
  const content = {
@@ -85,7 +83,6 @@ describe('AlternateHrefLangs', () => {
85
83
 
86
84
  it('multilingual site, with all available translations', () => {
87
85
  config.settings.publicURL = 'https://plone.org';
88
- config.settings.isMultilingual = true;
89
86
  config.settings.supportedLanguages = ['en', 'es', 'eu'];
90
87
  const store = mockStore({
91
88
  intl: {
@@ -139,7 +136,6 @@ describe('AlternateHrefLangs', () => {
139
136
 
140
137
  it('multilingual site, with all available translations - with server URL', () => {
141
138
  config.settings.publicURL = 'https://plone.org';
142
- config.settings.isMultilingual = true;
143
139
  config.settings.supportedLanguages = ['en', 'es', 'eu'];
144
140
  const store = mockStore({
145
141
  intl: {
@@ -45,6 +45,7 @@ import MultilingualRedirector from '@plone/volto/components/theme/MultilingualRe
45
45
  import WorkingCopyToastsFactory from '@plone/volto/components/manage/WorkingCopyToastsFactory/WorkingCopyToastsFactory';
46
46
  import LockingToastsFactory from '@plone/volto/components/manage/LockingToastsFactory/LockingToastsFactory';
47
47
  import RouteAnnouncer from '@plone/volto/components/theme/RouteAnnouncer/RouteAnnouncer';
48
+ import SlotRenderer from '@plone/volto/components/theme/SlotRenderer/SlotRenderer';
48
49
 
49
50
  /**
50
51
  * @export
@@ -159,6 +160,7 @@ export class App extends Component {
159
160
  'public-ui': !isCmsUI,
160
161
  })}
161
162
  />
163
+ <SlotRenderer name="aboveApp" content={this.props.content} />
162
164
  <SkipLinks />
163
165
  <Header pathname={path} />
164
166
  <Breadcrumbs pathname={path} />
@@ -235,7 +237,9 @@ export const fetchContent = async ({ store, location }) => {
235
237
 
236
238
  const visitor = ([id, data]) => {
237
239
  const blockType = data['@type'];
238
- const { getAsyncData } = blocksConfig[blockType];
240
+ const block = blocksConfig[blockType];
241
+ if (!block) return;
242
+ const { getAsyncData } = block;
239
243
  if (getAsyncData) {
240
244
  const p = getAsyncData({
241
245
  store,
@@ -51,6 +51,7 @@ describe('App', () => {
51
51
  locale: 'en',
52
52
  messages: {},
53
53
  },
54
+ site: { data: {} },
54
55
  });
55
56
  const component = renderer.create(
56
57
  <Provider store={store}>