@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
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  }
10
10
  ],
11
11
  "license": "MIT",
12
- "version": "19.0.0-alpha.2",
12
+ "version": "19.0.0-alpha.20",
13
13
  "repository": {
14
14
  "type": "git",
15
15
  "url": "git@github.com:plone/volto.git"
@@ -42,58 +42,6 @@
42
42
  }
43
43
  ]
44
44
  },
45
- "jest": {
46
- "transform": {
47
- "^.+\\.js(x)?$": "babel-jest",
48
- "^.+\\.ts(x)?$": "ts-jest",
49
- "^.+\\.(png)$": "jest-file",
50
- "^.+\\.(jpg)$": "jest-file",
51
- "^.+\\.(svg)$": "./jest-svgsystem-transform.js"
52
- },
53
- "moduleNameMapper": {
54
- "@plone/volto/package.json": "<rootDir>/package.json",
55
- "@plone/volto/babel": "<rootDir>/babel.js",
56
- "@plone/volto/(.*)$": "<rootDir>/src/$1",
57
- "@plone/volto-slate/(.*)$": "<rootDir>/../volto-slate/src/$1",
58
- "@plone/registry/addon-registry$": "<rootDir>/node_modules/@plone/registry/dist/addon-registry/addon-registry.js",
59
- "@plone/registry/create-addons-loader$": "<rootDir>/node_modules/@plone/registry/dist/addon-registry/create-addons-loader.js",
60
- "@plone/registry": "<rootDir>/../registry/src",
61
- "@plone/registry/(.*)$": "<rootDir>/../registry/src/$1",
62
- "@plone/volto": "<rootDir>/src/index.js",
63
- "~/config": "<rootDir>/src/config",
64
- "~/../locales/${lang}.json": "<rootDir>/locales/en.json",
65
- "(.*)/locales/(.*)": "<rootDir>/locales/$2",
66
- "load-volto-addons": "<rootDir>/jest-addons-loader.js",
67
- "@package/(.*)$": "<rootDir>/src/$1",
68
- "@root/config": "<rootDir>/jest-addons-loader.js",
69
- "@root/(.*)$": "<rootDir>/src/$1",
70
- "@voltoconfig": "<rootDir>/jest-addons-loader.js",
71
- "\\.(css|less|scss|sass)$": "identity-obj-proxy"
72
- },
73
- "coverageThreshold": {
74
- "global": {
75
- "branches": 10,
76
- "functions": 10,
77
- "lines": 10,
78
- "statements": 10
79
- }
80
- },
81
- "setupFiles": [
82
- "./test-setup-globals.js",
83
- "./test-setup-config.jsx"
84
- ],
85
- "globalSetup": "./global-test-setup.js",
86
- "setupFilesAfterEnv": [
87
- "<rootDir>/jest-setup-afterenv.js"
88
- ],
89
- "globals": {
90
- "__DEV__": true
91
- },
92
- "testMatch": [
93
- "<rootDir>/__tests__/**/?(*.)(spec|test).{js,jsx,mjs,ts,tsx}",
94
- "<rootDir>/../**/?(*.)(spec|test).{js,jsx,mjs,ts,tsx}"
95
- ]
96
- },
97
45
  "stylelint": {
98
46
  "extends": [
99
47
  "stylelint-config-idiomatic-order"
@@ -144,21 +92,26 @@
144
92
  "not dead"
145
93
  ],
146
94
  "engines": {
147
- "node": "^20 || ^22"
95
+ "node": "^22 || ^24"
148
96
  },
149
97
  "dependencies": {
98
+ "@dnd-kit/core": "6.0.8",
99
+ "@dnd-kit/sortable": "7.0.2",
100
+ "@dnd-kit/utilities": "3.2.2",
150
101
  "@loadable/component": "5.14.1",
151
102
  "@loadable/server": "5.14.0",
152
103
  "@redux-devtools/extension": "^3.3.0",
153
104
  "classnames": "2.5.1",
154
105
  "connected-react-router": "6.8.0",
155
- "debug": "4.3.2",
106
+ "debug": "4.3.4",
156
107
  "decorate-component-with-props": "1.2.1",
157
108
  "dependency-graph": "0.10.0",
109
+ "deepmerge": "^4.2.2",
158
110
  "detect-browser": "5.1.0",
159
111
  "diff": "3.5.0",
160
112
  "express": "4.19.2",
161
113
  "filesize": "6",
114
+ "full-icu": "1.4.0",
162
115
  "github-slugger": "1.4.0",
163
116
  "history": "4.10.1",
164
117
  "hoist-non-react-statics": "3.3.2",
@@ -177,11 +130,12 @@
177
130
  "object-assign": "4.1.1",
178
131
  "prepend-http": "2",
179
132
  "pretty-bytes": "5.3.0",
133
+ "prettier": "3.2.5",
180
134
  "prismjs": "1.27.0",
181
135
  "process": "^0.11.10",
182
136
  "promise-file-reader": "1.0.2",
183
137
  "prop-types": "15.7.2",
184
- "query-string": "7.1.0",
138
+ "query-string": "^9.0.0",
185
139
  "rc-time-picker": "3.7.3",
186
140
  "react": "18.2.0",
187
141
  "react-anchor-link-smooth-scroll": "1.0.12",
@@ -225,9 +179,9 @@
225
179
  "semantic-ui-less": "2.4.1",
226
180
  "semantic-ui-react": "2.1.5",
227
181
  "serialize-javascript": "3.1.0",
228
- "slate": "0.100.0",
229
- "slate-hyperscript": "0.100.0",
230
- "slate-react": "0.98.4",
182
+ "slate": "0.118.1",
183
+ "slate-hyperscript": "0.115.0",
184
+ "slate-react": "0.117.4",
231
185
  "superagent": "3.8.2",
232
186
  "tlds": "1.203.1",
233
187
  "undoo": "0.5.0",
@@ -236,26 +190,19 @@
236
190
  "url": "^0.11.3",
237
191
  "use-deep-compare-effect": "1.8.1",
238
192
  "uuid": "^8.3.2",
239
- "@plone/scripts": "4.0.0-alpha.1",
240
- "@plone/registry": "3.0.0-alpha.3",
241
- "@plone/volto-slate": "19.0.0-alpha.2"
193
+ "@plone/components": "4.0.0-alpha.4",
194
+ "@plone/scripts": "4.0.0-alpha.4",
195
+ "@plone/registry": "3.0.0-alpha.8",
196
+ "@plone/volto-slate": "19.0.0-alpha.9"
242
197
  },
243
198
  "devDependencies": {
244
- "@babel/core": "^7.0.0",
245
- "@babel/eslint-parser": "7.22.15",
246
- "@babel/plugin-proposal-export-default-from": "7.18.10",
247
- "@babel/plugin-proposal-export-namespace-from": "7.18.9",
248
- "@babel/plugin-proposal-json-strings": "7.18.6",
249
- "@babel/plugin-proposal-nullish-coalescing-operator": "7.18.6",
250
- "@babel/plugin-proposal-throw-expressions": "7.18.6",
251
- "@babel/plugin-syntax-export-namespace-from": "7.8.3",
252
- "@babel/runtime": "7.20.6",
199
+ "@babel/core": "^7.28.5",
200
+ "@babel/eslint-parser": "^7.28.5",
201
+ "@babel/plugin-proposal-export-default-from": "^7.27.1",
202
+ "@babel/plugin-proposal-throw-expressions": "^7.27.1",
203
+ "@babel/runtime": "^7.28.4",
253
204
  "@babel/types": "7.20.5",
254
- "@dnd-kit/core": "6.0.8",
255
- "@dnd-kit/sortable": "7.0.2",
256
- "@dnd-kit/utilities": "3.2.2",
257
205
  "@fiverr/afterbuild-webpack-plugin": "^1.0.0",
258
- "@jest/globals": "^29.7.0",
259
206
  "@loadable/babel-plugin": "5.13.2",
260
207
  "@loadable/webpack-plugin": "5.15.2",
261
208
  "@sinonjs/fake-timers": "^6.0.1",
@@ -268,19 +215,20 @@
268
215
  "@storybook/react": "^8.0.4",
269
216
  "@storybook/react-webpack5": "^8.0.4",
270
217
  "@storybook/theming": "^8.0.4",
271
- "@testing-library/cypress": "10.0.1",
218
+ "@testing-library/cypress": "10.1.0",
272
219
  "@testing-library/jest-dom": "6.4.2",
273
- "@testing-library/react": "14.2.0",
220
+ "@testing-library/react": "14.3.1",
274
221
  "@testing-library/react-hooks": "8.0.1",
275
222
  "@types/history": "^4.7.11",
276
- "@types/jest": "^29.5.8",
277
223
  "@types/loadable__component": "^5.13.9",
278
224
  "@types/lodash": "^4.14.201",
279
- "@types/node": "^22.13.0",
225
+ "@types/node": "^24",
280
226
  "@types/react": "^18",
281
227
  "@types/react-dom": "^18",
228
+ "@types/react-intl-redux": "^0.1.19",
282
229
  "@types/react-router-dom": "^5.3.3",
283
230
  "@types/react-test-renderer": "18.0.7",
231
+ "@types/redux-mock-store": "^1.5.0",
284
232
  "@types/uuid": "^9.0.2",
285
233
  "@typescript-eslint/eslint-plugin": "^7.7.0",
286
234
  "@typescript-eslint/parser": "^7.7.0",
@@ -293,31 +241,27 @@
293
241
  "babel-plugin-lodash": "3.3.4",
294
242
  "babel-plugin-react-intl": "5.1.17",
295
243
  "babel-plugin-root-import": "6.1.0",
296
- "babel-preset-razzle": "4.2.18",
297
244
  "bundlewatch": "0.3.3",
298
245
  "circular-dependency-plugin": "5.2.2",
299
246
  "css-loader": "5.2.7",
300
- "cypress": "13.13.2",
301
- "cypress-axe": "1.5.0",
247
+ "cypress": "15.5.0",
248
+ "cypress-axe": "1.7.0",
302
249
  "cypress-file-upload": "5.0.8",
303
250
  "deep-freeze": "0.0.1",
304
251
  "eslint": "^8.57.0",
305
- "eslint-config-prettier": "^9.1.0",
252
+ "eslint-config-prettier": "^9.1.2",
306
253
  "eslint-config-react-app": "^7.0.1",
307
254
  "eslint-import-resolver-alias": "^1.1.2",
308
255
  "eslint-import-resolver-babel-plugin-root-import": "^1.1.1",
309
256
  "eslint-import-resolver-typescript": "^3.6.1",
310
257
  "eslint-plugin-import": "^2.29.1",
311
258
  "eslint-plugin-jsx-a11y": "^6.7.1",
259
+ "eslint-plugin-no-only-tests": "^3.3.0",
312
260
  "eslint-plugin-prettier": "^5.1.3",
313
261
  "eslint-plugin-react": "^7.34.1",
314
262
  "eslint-plugin-react-hooks": "^4.6.0",
315
- "full-icu": "1.4.0",
316
263
  "html-webpack-plugin": "5.5.0",
317
264
  "identity-obj-proxy": "3.0.0",
318
- "jest": "26.6.3",
319
- "jest-environment-jsdom": "^26",
320
- "jest-file": "1.0.0",
321
265
  "jiti": "^2.4.2",
322
266
  "jsdom": "^16.7.0",
323
267
  "jsonwebtoken": "9.0.0",
@@ -333,17 +277,17 @@
333
277
  "postcss-loader": "7.0.2",
334
278
  "postcss-overrides": "3.1.4",
335
279
  "postcss-scss": "4.0.6",
336
- "prettier": "3.2.5",
337
- "razzle": "4.2.18",
338
280
  "razzle-dev-utils": "4.2.18",
339
- "razzle-plugin-scss": "4.2.18",
340
281
  "react-docgen-typescript-plugin": "^1.0.5",
341
282
  "react-error-overlay": "6.0.9",
342
283
  "react-is": "^18.2.0",
343
- "release-it": "^17.1.1",
284
+ "release-it": "^19.0.4",
285
+ "resolve-url-loader": "^3.1.2",
286
+ "sass": "1.58.0",
287
+ "sass-loader": "^10.0.3",
344
288
  "semver": "^7.5.4",
345
289
  "start-server-and-test": "1.14.0",
346
- "storybook": "^8.0.4",
290
+ "storybook": "^8.6.15",
347
291
  "style-loader": "3.3.1",
348
292
  "stylelint": "^16.3.1",
349
293
  "stylelint-config-idiomatic-order": "10.0.0",
@@ -353,7 +297,6 @@
353
297
  "svgo-loader": "3.0.3",
354
298
  "terser-webpack-plugin": "5.3.6",
355
299
  "tmp": "0.2.1",
356
- "ts-jest": "^26.4.2",
357
300
  "ts-loader": "9.4.4",
358
301
  "typescript": "^5.7.3",
359
302
  "use-trace-update": "1.3.2",
@@ -363,9 +306,10 @@
363
306
  "webpack-bundle-analyzer": "4.10.1",
364
307
  "webpack-dev-server": "4.11.1",
365
308
  "webpack-node-externals": "3.0.0",
366
- "why": "0.6.2",
309
+ "@plone/babel-preset-razzle": "^1.0.0-alpha.0",
367
310
  "@plone/volto-coresandbox": "1.0.0",
368
- "@plone/types": "2.0.0-alpha.3"
311
+ "@plone/types": "2.0.0-alpha.11",
312
+ "@plone/razzle": "1.0.0-alpha.0"
369
313
  },
370
314
  "volta": {
371
315
  "node": "20.9.0"
@@ -376,10 +320,9 @@
376
320
  "start:coresandbox": "make build-deps && ADDONS=coresandbox razzle start",
377
321
  "build": "make build-deps && razzle build --noninteractive",
378
322
  "build:types": "tsc --project tsconfig.declarations.json",
379
- "vitest": "vitest",
323
+ "test": "vitest",
380
324
  "coverage": "vitest run --coverage",
381
- "test": "razzle test --maxWorkers=50%",
382
- "test:ci": "CI=true NODE_ICU_DATA=node_modules/full-icu razzle test",
325
+ "test:ci": "CI=true NODE_ICU_DATA=node_modules/full-icu vitest run",
383
326
  "test:husky": "CI=true yarn test --bail --findRelatedTests",
384
327
  "start:prod": "NODE_ENV=production node build/server.js",
385
328
  "prettier": "prettier --single-quote --check '{src,cypress}/**/*.{js,jsx,ts,tsx}' --check '*.js'",
@@ -388,8 +331,8 @@
388
331
  "stylelint": "stylelint 'theme/**/*.{css,less}' 'src/**/*.{css,less}'",
389
332
  "stylelint:overrides": "stylelint 'theme/**/*.overrides' 'src/**/*.overrides'",
390
333
  "stylelint:fix": "yarn stylelint --fix && yarn stylelint:overrides --fix",
391
- "lint": "eslint --max-warnings=0 'src/**/*.{js,jsx,ts,tsx,json}'",
392
- "lint:fix": "eslint --fix 'src/**/*.{js,jsx,ts,tsx,json}'",
334
+ "lint": "eslint --max-warnings=0 '{src,cypress}/**/*.{js,jsx,ts,tsx,json}'",
335
+ "lint:fix": "eslint --fix '{src,cypress}/**/*.{js,jsx,ts,tsx,json}'",
393
336
  "lint:husky": "eslint --max-warnings=0 --fix",
394
337
  "i18n": "rm -rf build/messages && NODE_ENV=production i18n",
395
338
  "i18n:ci": "pnpm i18n && git diff -G'^[^\"POT]' --exit-code",
package/razzle.config.js CHANGED
@@ -15,7 +15,6 @@ const {
15
15
  const { AddonRegistry } = require('@plone/registry/addon-registry');
16
16
  const CircularDependencyPlugin = require('circular-dependency-plugin');
17
17
  const TerserPlugin = require('terser-webpack-plugin');
18
- const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
19
18
  const MomentLocalesPlugin = require('moment-locales-webpack-plugin');
20
19
  const AfterBuildPlugin = require('@fiverr/afterbuild-webpack-plugin');
21
20
 
@@ -116,25 +115,11 @@ const defaultModify = ({
116
115
  },
117
116
  });
118
117
 
119
- // This is needed to override Razzle use of the unmaintained CleanCSS
120
- // which does not have support for recently CSS features (container queries).
121
- // Using the default provided (cssnano) by css-minimizer-webpack-plugin
122
- // should be enough see:
123
- // (https://github.com/clean-css/clean-css/discussions/1209)
118
+ // TODO: remove this before merging the Razzle fork into Volto 19
119
+ // @sneridagh: Tried to remove this now that we have forked Razzle
120
+ // but I cannot pinpoint where this comes from, and it seems undefined
121
+ // always.
124
122
  delete options.webpackOptions.terserPluginOptions?.sourceMap;
125
- if (!dev) {
126
- config.optimization = Object.assign({}, config.optimization, {
127
- minimizer: [
128
- new TerserPlugin(options.webpackOptions.terserPluginOptions),
129
- new CssMinimizerPlugin({
130
- sourceMap: options.razzleOptions.enableSourceMaps,
131
- minimizerOptions: {
132
- sourceMap: options.razzleOptions.enableSourceMaps,
133
- },
134
- }),
135
- ],
136
- });
137
- }
138
123
 
139
124
  config.plugins.unshift(
140
125
  // restrict moment.js locales to supported languages
@@ -414,6 +399,22 @@ const defaultModify = ({
414
399
  ]
415
400
  : [];
416
401
 
402
+ // If Volto is served under a subpath,
403
+ // we have to adjust where Webpack assets are served too.
404
+ const subpathPrefix = process.env.RAZZLE_SUBPATH_PREFIX || '';
405
+ if (subpathPrefix) {
406
+ if (target === 'web' && dev) {
407
+ if (config.devServer.devMiddleware) {
408
+ config.devServer.devMiddleware.publicPath = subpathPrefix;
409
+ } else {
410
+ config.devServer.publicPath += `${subpathPrefix.slice(1)}/`;
411
+ }
412
+ }
413
+ const publicPath = config.output.publicPath;
414
+ if (publicPath.indexOf(subpathPrefix) === -1) {
415
+ config.output.publicPath = `${publicPath}${subpathPrefix.slice(1)}/`;
416
+ }
417
+ }
417
418
  return config;
418
419
  };
419
420
 
@@ -423,8 +424,7 @@ const defaultPlugins = [
423
424
  { object: require('./webpack-plugins/webpack-less-plugin')({ registry }) },
424
425
  { object: require('./webpack-plugins/webpack-svg-plugin') },
425
426
  { object: require('./webpack-plugins/webpack-bundle-analyze-plugin') },
426
- { object: require('./jest-extender-plugin') },
427
- 'scss',
427
+ { object: require('./webpack-plugins/webpack-scss-plugin') },
428
428
  ];
429
429
 
430
430
  const plugins = addonExtenders.reduce(
@@ -164,7 +164,6 @@ export function getContent(
164
164
  b_size: settings.defaultPageSize,
165
165
  }
166
166
  : {},
167
- settings.isMultilingual ? { expand: 'translations' } : {},
168
167
  );
169
168
 
170
169
  let qs = Object.keys(query)
@@ -12,6 +12,8 @@ import {
12
12
  SYSTEM_INFORMATION,
13
13
  DATABASE_INFORMATION,
14
14
  } from '@plone/volto/constants/ActionTypes';
15
+ import { getSite } from '@plone/volto/actions/site/site';
16
+
15
17
  /**
16
18
  * Get controlpanel function.
17
19
  * @function getControlpanel
@@ -86,13 +88,17 @@ export function listControlpanels() {
86
88
  * @returns {Object} Update controlpanel action.
87
89
  */
88
90
  export function updateControlpanel(url, data) {
89
- return {
90
- type: UPDATE_CONTROLPANEL,
91
- request: {
92
- op: 'patch',
93
- path: url,
94
- data,
95
- },
91
+ return (dispatch) => {
92
+ dispatch({
93
+ type: UPDATE_CONTROLPANEL,
94
+ request: {
95
+ op: 'patch',
96
+ path: url,
97
+ data,
98
+ },
99
+ }).then(() => {
100
+ dispatch(getSite());
101
+ });
96
102
  };
97
103
  }
98
104
 
@@ -35,12 +35,18 @@ describe('Controlpanels action', () => {
35
35
  it('should create an action to update a controlpanel', () => {
36
36
  const url = 'http://localhost';
37
37
  const data = 'Hello World!';
38
- const action = updateControlpanel(url, data);
39
38
 
40
- expect(action.type).toEqual(UPDATE_CONTROLPANEL);
41
- expect(action.request.op).toEqual('patch');
42
- expect(action.request.path).toEqual(url);
43
- expect(action.request.data).toEqual(data);
39
+ const dispatch = vi.fn().mockResolvedValue();
40
+ updateControlpanel(url, data)(dispatch);
41
+
42
+ expect(dispatch).toHaveBeenCalledWith({
43
+ type: UPDATE_CONTROLPANEL,
44
+ request: {
45
+ op: 'patch',
46
+ path: url,
47
+ data,
48
+ },
49
+ });
44
50
  });
45
51
  });
46
52
  });
@@ -3,7 +3,7 @@
3
3
  * @module actions/users/users
4
4
  */
5
5
 
6
- import { stringify } from 'query-string';
6
+ import qs from 'query-string';
7
7
 
8
8
  import {
9
9
  CREATE_USER,
@@ -92,7 +92,7 @@ export function listUsers(options = {}) {
92
92
 
93
93
  let filterarg =
94
94
  groups_filter.length > 0
95
- ? stringify(
95
+ ? qs.stringify(
96
96
  { 'groups-filter': groups_filter },
97
97
  { arrayFormat: 'colon-list-separator' },
98
98
  )
@@ -8,11 +8,7 @@ import Actions from './Actions';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- vi.mock('@plone/volto/components/manage/Contents', async () => {
12
- return await import(
13
- '@plone/volto/components/manage/Contents/__mocks__/index.vitest.tsx'
14
- );
15
- });
11
+ vi.mock('@plone/volto/components/manage/Contents');
16
12
 
17
13
  describe('Actions', () => {
18
14
  it('renders an actions component', () => {
@@ -223,11 +223,10 @@ class Add extends Component {
223
223
  ? keys(this.props.schema.definitions)
224
224
  : null,
225
225
  '@type': this.props.type,
226
- ...(config.settings.isMultilingual &&
227
- this.props.location?.state?.translationOf && {
228
- translation_of: this.props.location.state.translationOf,
229
- language: this.props.location.state.language,
230
- }),
226
+ ...(this.props.location?.state?.translationOf && {
227
+ translation_of: this.props.location.state.translationOf,
228
+ language: this.props.location.state.language,
229
+ }),
231
230
  });
232
231
  }
233
232
 
@@ -348,7 +347,7 @@ class Add extends Component {
348
347
  <div id="page-add">
349
348
  <Helmet
350
349
  title={this.props.intl.formatMessage(messages.add, {
351
- type: this.props.type,
350
+ type: this.props?.schema?.title || this.props.type,
352
351
  })}
353
352
  />
354
353
  <Form
@@ -110,6 +110,7 @@ const BlockChooser = ({
110
110
  getFormatMessage(block.title)
111
111
  .toLowerCase()
112
112
  .includes(filterValue.toLowerCase()) ||
113
+ block.title.toLowerCase().includes(filterValue.toLowerCase()) ||
113
114
  filterVariations(block)?.length,
114
115
  );
115
116
  }
@@ -7,11 +7,7 @@ import config from '@plone/volto/registry';
7
7
 
8
8
  config.experimental = { addBlockButton: { enabled: false } };
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
- });
10
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
15
11
 
16
12
  beforeAll(async () => {
17
13
  const { __setLoadables } = await import(
@@ -187,6 +187,7 @@ export class Edit extends Component {
187
187
  selected: this.props.selected || this.props.multiSelected,
188
188
  multiSelected: this.props.multiSelected,
189
189
  hovered: this.props.hovered === this.props.id,
190
+ error: !!this.props.blocksErrors?.[this.props.id],
190
191
  })}
191
192
  style={{ outline: 'none' }}
192
193
  ref={this.blockNode}
@@ -21,9 +21,13 @@ import BlockChooserButton from '@plone/volto/components/manage/BlockChooser/Bloc
21
21
  import trashSVG from '@plone/volto/icons/delete.svg';
22
22
 
23
23
  const messages = defineMessages({
24
- delete: {
25
- id: 'delete',
26
- defaultMessage: 'delete',
24
+ delete_block: {
25
+ id: 'delete_block',
26
+ defaultMessage: 'delete {type} block',
27
+ },
28
+ drag_block: {
29
+ id: 'drag_block',
30
+ defaultMessage: 'drag {type} block',
27
31
  },
28
32
  });
29
33
 
@@ -99,6 +103,7 @@ const EditBlockWrapper = (props) => {
99
103
  }}
100
104
  {...draginfo.dragHandleProps}
101
105
  className="drag handle wrapper"
106
+ aria-label={intl.formatMessage(messages.drag_block, { type })}
102
107
  >
103
108
  <Icon name={dragSVG} size="18px" />
104
109
  </div>
@@ -111,7 +116,7 @@ const EditBlockWrapper = (props) => {
111
116
  basic
112
117
  onClick={() => onDeleteBlock(block, true)}
113
118
  className="delete-button"
114
- aria-label={intl.formatMessage(messages.delete)}
119
+ aria-label={intl.formatMessage(messages.delete_block, { type })}
115
120
  >
116
121
  <Icon name={trashSVG} size="18px" />
117
122
  </Button>
@@ -5,11 +5,7 @@ import configureStore from 'redux-mock-store';
5
5
  import config from '@plone/volto/registry';
6
6
  import { Provider } from 'react-intl-redux';
7
7
 
8
- vi.mock('@plone/volto/components/manage/Form', async () => {
9
- return await import(
10
- '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
11
- );
12
- });
8
+ vi.mock('@plone/volto/components/manage/Form');
13
9
 
14
10
  const mockStore = configureStore();
15
11
 
@@ -7,11 +7,7 @@ import Edit from './Edit';
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
- });
10
+ vi.mock('@plone/volto/helpers/Loadable/Loadable');
15
11
 
16
12
  beforeAll(async () => {
17
13
  const { __setLoadables } = await import(
@@ -20,7 +20,11 @@ function Edit(props) {
20
20
 
21
21
  const handleChange = React.useCallback(
22
22
  async (id, image, { title, image_field, image_scales } = {}) => {
23
- const url = image ? image['@id'] || image : '';
23
+ const url = Array.isArray(image)
24
+ ? image?.[0]?.['@id']
25
+ : image
26
+ ? image['@id'] || image
27
+ : '';
24
28
 
25
29
  props.onChangeBlock(props.block, {
26
30
  ...props.data,
@@ -5,11 +5,7 @@ import { Provider } from 'react-intl-redux';
5
5
 
6
6
  import ImageSidebar from './ImageSidebar';
7
7
 
8
- vi.mock('@plone/volto/components/manage/Form', async () => {
9
- return await import(
10
- '@plone/volto/components/manage/Form/__mocks__/index.vitest.tsx'
11
- );
12
- });
8
+ vi.mock('@plone/volto/components/manage/Form');
13
9
 
14
10
  const mockStore = configureStore();
15
11
 
@@ -43,13 +43,13 @@ const Edit = (props) => {
43
43
  {!hasImage && (
44
44
  <Message>
45
45
  <center>
46
- <img src={imageBlockSVG} alt="" />
46
+ <Image src={imageBlockSVG} alt="" />
47
47
  <div className="message-text">{placeholder}</div>
48
48
  </center>
49
49
  </Message>
50
50
  )}
51
51
  {hasImage && hasImageData && (
52
- <img
52
+ <Image
53
53
  className={className}
54
54
  src={`data:${properties.image['content-type']};base64,${properties.image.data}`}
55
55
  width={properties.image.width}
@@ -96,7 +96,7 @@ const LeadImageSidebar = ({
96
96
  <Segment className="sidebar-metadata-container" secondary>
97
97
  {properties.image.filename}
98
98
  {properties.image.data && (
99
- <img
99
+ <Image
100
100
  // TODO understand when this actually happens
101
101
  src={`data:${properties.image['content-type']};base64,${properties.image.data}`}
102
102
  width={properties.image.width}
@@ -6,11 +6,7 @@ import { Provider } from 'react-intl-redux';
6
6
  import LeadImageSidebar from './LeadImageSidebar';
7
7
 
8
8
  vi.mock('@plone/volto/components/manage/Widgets');
9
- vi.mock('@plone/volto/components/manage/Widgets', async () => {
10
- return await import(
11
- '@plone/volto/components/manage/Widgets/__mocks__/index.vitest.tsx'
12
- );
13
- });
9
+ vi.mock('@plone/volto/components/manage/Widgets');
14
10
 
15
11
  const mockStore = configureStore();
16
12