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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (502) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +37 -6
  3. package/CHANGELOG.md +534 -2
  4. package/README.md +23 -21
  5. package/babel.js +1 -9
  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/LC_MESSAGES/volto.po +5500 -0
  13. package/locales/af.json +1 -1
  14. package/locales/ar/LC_MESSAGES/volto.po +5500 -0
  15. package/locales/ar.json +1 -1
  16. package/locales/bg/LC_MESSAGES/volto.po +5500 -0
  17. package/locales/bg.json +1 -1
  18. package/locales/bn/LC_MESSAGES/volto.po +5500 -0
  19. package/locales/bn.json +1 -1
  20. package/locales/ca/LC_MESSAGES/volto.po +559 -349
  21. package/locales/ca.json +1 -1
  22. package/locales/cs/LC_MESSAGES/volto.po +5500 -0
  23. package/locales/cs.json +1 -1
  24. package/locales/cy/LC_MESSAGES/volto.po +5500 -0
  25. package/locales/cy.json +1 -1
  26. package/locales/da/LC_MESSAGES/volto.po +5500 -0
  27. package/locales/da.json +1 -1
  28. package/locales/de/LC_MESSAGES/volto.po +232 -21
  29. package/locales/de.json +1 -1
  30. package/locales/el/LC_MESSAGES/volto.po +5500 -0
  31. package/locales/el.json +1 -1
  32. package/locales/en/LC_MESSAGES/volto.po +226 -11
  33. package/locales/en.json +1 -1
  34. package/locales/en_AU/LC_MESSAGES/volto.po +5500 -0
  35. package/locales/en_AU.json +1 -1
  36. package/locales/en_GB/LC_MESSAGES/volto.po +5500 -0
  37. package/locales/en_GB.json +1 -1
  38. package/locales/eo/LC_MESSAGES/volto.po +5500 -0
  39. package/locales/eo.json +1 -1
  40. package/locales/es/LC_MESSAGES/volto.po +321 -111
  41. package/locales/es.json +1 -1
  42. package/locales/et/LC_MESSAGES/volto.po +5500 -0
  43. package/locales/et.json +1 -1
  44. package/locales/eu/LC_MESSAGES/volto.po +404 -194
  45. package/locales/eu.json +1 -1
  46. package/locales/fa/LC_MESSAGES/volto.po +5500 -0
  47. package/locales/fa.json +1 -1
  48. package/locales/fi/LC_MESSAGES/volto.po +221 -11
  49. package/locales/fi.json +1 -1
  50. package/locales/fr/LC_MESSAGES/volto.po +220 -10
  51. package/locales/fr.json +1 -1
  52. package/locales/fu/LC_MESSAGES/volto.po +5500 -0
  53. package/locales/fu.json +1 -1
  54. package/locales/gl/LC_MESSAGES/volto.po +5501 -0
  55. package/locales/gl.json +1 -1
  56. package/locales/he/LC_MESSAGES/volto.po +5500 -0
  57. package/locales/he.json +1 -1
  58. package/locales/hi/LC_MESSAGES/volto.po +225 -10
  59. package/locales/hi.json +1 -1
  60. package/locales/hr/LC_MESSAGES/volto.po +5500 -0
  61. package/locales/hr.json +1 -1
  62. package/locales/hu/LC_MESSAGES/volto.po +5500 -0
  63. package/locales/hu.json +1 -1
  64. package/locales/hy/LC_MESSAGES/volto.po +5500 -0
  65. package/locales/hy.json +1 -1
  66. package/locales/id/LC_MESSAGES/volto.po +5500 -0
  67. package/locales/id.json +1 -1
  68. package/locales/it/LC_MESSAGES/volto.po +239 -24
  69. package/locales/it.json +1 -1
  70. package/locales/ja/LC_MESSAGES/volto.po +264 -53
  71. package/locales/ja.json +1 -1
  72. package/locales/ka/LC_MESSAGES/volto.po +5500 -0
  73. package/locales/ka.json +1 -1
  74. package/locales/kn/LC_MESSAGES/volto.po +5500 -0
  75. package/locales/kn.json +1 -1
  76. package/locales/ko/LC_MESSAGES/volto.po +5500 -0
  77. package/locales/ko.json +1 -1
  78. package/locales/lt/LC_MESSAGES/volto.po +5500 -0
  79. package/locales/lt.json +1 -1
  80. package/locales/lv/LC_MESSAGES/volto.po +5500 -0
  81. package/locales/lv.json +1 -1
  82. package/locales/mi/LC_MESSAGES/volto.po +5500 -0
  83. package/locales/mi.json +1 -1
  84. package/locales/mk/LC_MESSAGES/volto.po +5500 -0
  85. package/locales/mk.json +1 -1
  86. package/locales/my/LC_MESSAGES/volto.po +5500 -0
  87. package/locales/my.json +1 -1
  88. package/locales/nb_NO/LC_MESSAGES/volto.po +5500 -0
  89. package/locales/nb_NO.json +1 -1
  90. package/locales/nl/LC_MESSAGES/volto.po +243 -32
  91. package/locales/nl.json +1 -1
  92. package/locales/nn/LC_MESSAGES/volto.po +5500 -0
  93. package/locales/nn.json +1 -1
  94. package/locales/pl/LC_MESSAGES/volto.po +5500 -0
  95. package/locales/pl.json +1 -1
  96. package/locales/pt/LC_MESSAGES/volto.po +869 -659
  97. package/locales/pt.json +1 -1
  98. package/locales/pt_BR/LC_MESSAGES/volto.po +229 -19
  99. package/locales/pt_BR.json +1 -1
  100. package/locales/rm/LC_MESSAGES/volto.po +5500 -0
  101. package/locales/rm.json +1 -1
  102. package/locales/ro/LC_MESSAGES/volto.po +252 -42
  103. package/locales/ro.json +1 -1
  104. package/locales/ru/LC_MESSAGES/volto.po +220 -10
  105. package/locales/ru.json +1 -1
  106. package/locales/sk/LC_MESSAGES/volto.po +5500 -0
  107. package/locales/sk.json +1 -1
  108. package/locales/sl/LC_MESSAGES/volto.po +5500 -0
  109. package/locales/sl.json +1 -1
  110. package/locales/sm/LC_MESSAGES/volto.po +5500 -0
  111. package/locales/sm.json +1 -1
  112. package/locales/sq/LC_MESSAGES/volto.po +5500 -0
  113. package/locales/sq.json +1 -1
  114. package/locales/sr/LC_MESSAGES/volto.po +5500 -0
  115. package/locales/sr.json +1 -1
  116. package/locales/sr@cyrl/LC_MESSAGES/volto.po +5500 -0
  117. package/locales/sr@cyrl.json +1 -1
  118. package/locales/sr@latn/LC_MESSAGES/volto.po +5500 -0
  119. package/locales/sr@latn.json +1 -1
  120. package/locales/sv/LC_MESSAGES/volto.po +5500 -0
  121. package/locales/sv.json +1 -1
  122. package/locales/ta/LC_MESSAGES/volto.po +5501 -0
  123. package/locales/ta.json +1 -1
  124. package/locales/te/LC_MESSAGES/volto.po +5500 -0
  125. package/locales/te.json +1 -1
  126. package/locales/th/LC_MESSAGES/volto.po +5500 -0
  127. package/locales/th.json +1 -1
  128. package/locales/to/LC_MESSAGES/volto.po +5500 -0
  129. package/locales/to.json +1 -1
  130. package/locales/tr/LC_MESSAGES/volto.po +5501 -0
  131. package/locales/tr.json +1 -1
  132. package/locales/uk/LC_MESSAGES/volto.po +5500 -0
  133. package/locales/uk.json +1 -1
  134. package/locales/vi/LC_MESSAGES/volto.po +5500 -0
  135. package/locales/vi.json +1 -1
  136. package/locales/volto.pot +220 -10
  137. package/locales/zh_CN/LC_MESSAGES/volto.po +221 -10
  138. package/locales/zh_CN.json +1 -1
  139. package/locales/zh_Hant/LC_MESSAGES/volto.po +5500 -0
  140. package/locales/zh_Hant.json +1 -1
  141. package/locales/zh_Hant_HK/LC_MESSAGES/volto.po +5500 -0
  142. package/locales/zh_Hant_HK.json +1 -1
  143. package/package.json +72 -146
  144. package/razzle.config.js +32 -25
  145. package/src/actions/blockTypes/blockTypes.ts +24 -0
  146. package/src/components/manage/Actions/Actions.test.jsx +1 -5
  147. package/src/components/manage/Add/Add.jsx +15 -10
  148. package/src/components/manage/BlockChooser/BlockChooser.jsx +1 -0
  149. package/src/components/manage/Blocks/Block/BlocksForm.jsx +10 -7
  150. package/src/components/manage/Blocks/Block/BlocksForm.test.jsx +3 -14
  151. package/src/components/manage/Blocks/Block/EditBlockWrapper.jsx +9 -4
  152. package/src/components/manage/Blocks/Block/Order/Item.jsx +27 -13
  153. package/src/components/manage/Blocks/Block/Order/Item.test.jsx +90 -0
  154. package/src/components/manage/Blocks/Block/Order/Order.jsx +116 -67
  155. package/src/components/manage/Blocks/Block/Order/utilities.js +28 -11
  156. package/src/components/manage/Blocks/Block/Settings.test.jsx +1 -5
  157. package/src/components/manage/Blocks/Grid/View.jsx +14 -11
  158. package/src/components/manage/Blocks/Grid/context.js +3 -0
  159. package/src/components/manage/Blocks/HTML/Edit.test.jsx +1 -5
  160. package/src/components/manage/Blocks/Image/Edit.jsx +5 -1
  161. package/src/components/manage/Blocks/Image/ImageSidebar.test.jsx +2 -5
  162. package/src/components/manage/Blocks/LeadImage/Edit.jsx +2 -2
  163. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +1 -1
  164. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +2 -5
  165. package/src/components/manage/Blocks/Listing/Edit.jsx +1 -0
  166. package/src/components/manage/Blocks/Listing/ImageGallery.jsx +6 -4
  167. package/src/components/manage/Blocks/Listing/ListingBody.jsx +4 -0
  168. package/src/components/manage/Blocks/Maps/Edit.jsx +2 -1
  169. package/src/components/manage/Blocks/Maps/MapsSidebar.test.jsx +1 -5
  170. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +21 -4
  171. package/src/components/manage/Blocks/Search/components/DateRangeFacet.test.jsx +1 -6
  172. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +22 -1
  173. package/src/components/manage/Blocks/Search/components/SelectFacet.test.jsx +1 -6
  174. package/src/components/manage/Blocks/Search/components/SortOn.jsx +8 -2
  175. package/src/components/manage/Blocks/Search/components/ToggleFacet.jsx +14 -0
  176. package/src/components/manage/Blocks/Teaser/Data.jsx +21 -7
  177. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +11 -3
  178. package/src/components/manage/Blocks/Teaser/View.jsx +0 -1
  179. package/src/components/manage/Blocks/Teaser/utils.js +13 -0
  180. package/src/components/manage/Blocks/Teaser/utils.test.js +34 -0
  181. package/src/components/manage/Blocks/Title/Edit.jsx +5 -0
  182. package/src/components/manage/Blocks/Video/Body.jsx +69 -43
  183. package/src/components/manage/Blocks/Video/Body.test.jsx +122 -5
  184. package/src/components/manage/Blocks/Video/Edit.jsx +22 -3
  185. package/src/components/manage/Blocks/Video/Edit.test.jsx +6 -0
  186. package/src/components/manage/Blocks/Video/VideoSidebar.test.jsx +1 -5
  187. package/src/components/manage/Blocks/Video/View.jsx +1 -0
  188. package/src/components/manage/Blocks/Video/View.test.jsx +29 -15
  189. package/src/components/manage/Blocks/Video/schema.js +14 -1
  190. package/src/components/manage/Contents/Contents.jsx +697 -659
  191. package/src/components/manage/Contents/Contents.test.jsx +1 -5
  192. package/src/components/manage/Contents/ContentsBreadcrumbs.jsx +6 -5
  193. package/src/components/manage/Contents/ContentsItem.jsx +1 -1
  194. package/src/components/manage/Contents/ContentsPropertiesModal.test.jsx +1 -5
  195. package/src/components/manage/Contents/ContentsRenameModal.test.jsx +1 -5
  196. package/src/components/manage/Contents/ContentsTagsModal.test.jsx +1 -5
  197. package/src/components/manage/Contents/ContentsWorkflowModal.test.jsx +1 -5
  198. package/src/components/manage/Contents/DropZoneContent.jsx +338 -0
  199. package/src/components/manage/Contents/__mocks__/index.tsx +2 -18
  200. package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +7 -0
  201. package/src/components/manage/Controlpanels/Aliases.test.jsx +1 -5
  202. package/src/components/manage/Controlpanels/BlockType.tsx +166 -0
  203. package/src/components/manage/Controlpanels/BlockTypes.tsx +145 -0
  204. package/src/components/manage/Controlpanels/ContentType.jsx +1 -1
  205. package/src/components/manage/Controlpanels/ContentType.test.jsx +1 -5
  206. package/src/components/manage/Controlpanels/ContentTypeSchema.jsx +1 -1
  207. package/src/components/manage/Controlpanels/Controlpanels.jsx +28 -5
  208. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +10 -0
  209. package/src/components/manage/Controlpanels/DatabaseInformation.jsx +9 -0
  210. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +3 -2
  211. package/src/components/manage/Controlpanels/ModerateComments.jsx +8 -0
  212. package/src/components/manage/Controlpanels/Relations/Relations.jsx +1 -1
  213. package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +1 -5
  214. package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +1 -5
  215. package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +1 -5
  216. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +156 -175
  217. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.test.jsx +3 -0
  218. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +575 -631
  219. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +58 -11
  220. package/src/components/manage/Diff/Diff.jsx +201 -298
  221. package/src/components/manage/Diff/Diff.test.jsx +1 -6
  222. package/src/components/manage/Diff/DiffField.test.jsx +1 -6
  223. package/src/components/manage/Display/Display.test.jsx +2 -11
  224. package/src/components/manage/Edit/Edit.test.jsx +1 -5
  225. package/src/components/manage/Form/BlockDataForm.test.jsx +1 -5
  226. package/src/components/manage/Form/Form.jsx +3 -3
  227. package/src/components/manage/Form/Form.test.jsx +1 -5
  228. package/src/components/manage/Form/InlineForm.jsx +2 -2
  229. package/src/components/manage/Form/InlineForm.test.jsx +1 -5
  230. package/src/components/manage/Form/ModalForm.jsx +12 -10
  231. package/src/components/manage/Form/ModalForm.test.jsx +27 -5
  232. package/src/components/manage/Form/__mocks__/index.tsx +9 -27
  233. package/src/components/manage/Multilingual/CompareLanguages.jsx +6 -6
  234. package/src/components/manage/Multilingual/CreateTranslation.jsx +16 -13
  235. package/src/components/manage/Multilingual/ManageTranslations.jsx +5 -5
  236. package/src/components/manage/Multilingual/TranslationObject.jsx +11 -8
  237. package/src/components/manage/Preferences/ChangePassword.test.jsx +1 -5
  238. package/src/components/manage/Preferences/PersonalPreferences.jsx +8 -5
  239. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +1 -17
  240. package/src/components/manage/Sharing/Sharing.jsx +21 -15
  241. package/src/components/manage/Sidebar/ObjectBrowser.jsx +3 -0
  242. package/src/components/manage/Sidebar/ObjectBrowserBody.jsx +18 -2
  243. package/src/components/manage/Sidebar/ObjectBrowserNav.jsx +2 -1
  244. package/src/components/manage/Sidebar/SidebarPortal.test.tsx +42 -0
  245. package/src/components/manage/Sidebar/SidebarPortal.tsx +48 -0
  246. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +2 -1
  247. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +1 -0
  248. package/src/components/manage/Toast/Toast.jsx +32 -0
  249. package/src/components/manage/Toast/Toast.test.jsx +9 -5
  250. package/src/components/manage/Toolbar/PersonalTools.jsx +2 -1
  251. package/src/components/manage/Toolbar/PersonalTools.test.jsx +15 -0
  252. package/src/components/manage/Toolbar/Toolbar.jsx +14 -4
  253. package/src/components/manage/Toolbar/Types.crash.test.jsx +48 -0
  254. package/src/components/manage/Toolbar/Types.jsx +6 -4
  255. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +16 -0
  256. package/src/components/manage/UniversalLink/UniversalLink.tsx +2 -0
  257. package/src/components/manage/Widgets/AlignWidget.stories.jsx +9 -0
  258. package/src/components/manage/Widgets/AlignWidget.test.tsx +95 -0
  259. package/src/components/manage/Widgets/{AlignWidget.jsx → AlignWidget.tsx} +23 -7
  260. package/src/components/manage/Widgets/ArrayWidget.test.jsx +1 -6
  261. package/src/components/manage/Widgets/BlockAlignment.stories.tsx +104 -0
  262. package/src/components/manage/Widgets/BlockAlignment.test.tsx +104 -0
  263. package/src/components/manage/Widgets/BlockAlignment.tsx +88 -0
  264. package/src/components/manage/Widgets/BlockWidth.stories.tsx +69 -0
  265. package/src/components/manage/Widgets/BlockWidth.test.tsx +62 -0
  266. package/src/components/manage/Widgets/BlockWidth.tsx +101 -0
  267. package/src/components/manage/Widgets/ButtonsWidget.stories.jsx +61 -0
  268. package/src/components/manage/Widgets/ButtonsWidget.test.tsx +138 -0
  269. package/src/components/manage/Widgets/ButtonsWidget.tsx +195 -0
  270. package/src/components/manage/Widgets/CheckboxGroupWidget.test.jsx +1 -6
  271. package/src/components/manage/Widgets/DatetimeWidget.jsx +102 -53
  272. package/src/components/manage/Widgets/DatetimeWidget.test.jsx +56 -6
  273. package/src/components/manage/Widgets/FileWidget.jsx +21 -8
  274. package/src/components/manage/Widgets/FormFieldWrapper.jsx +146 -168
  275. package/src/components/manage/Widgets/ImageWidget.jsx +177 -38
  276. package/src/components/manage/Widgets/InternalUrlWidget.jsx +2 -0
  277. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +8 -0
  278. package/src/components/manage/Widgets/ObjectListWidget.test.jsx +2 -11
  279. package/src/components/manage/Widgets/ObjectWidget.test.jsx +1 -5
  280. package/src/components/manage/Widgets/QueryWidget.jsx +137 -9
  281. package/src/components/manage/Widgets/RadioGroupWidget.test.jsx +1 -6
  282. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.test.jsx +1 -6
  283. package/src/components/manage/Widgets/RegistryImageWidget.jsx +1 -1
  284. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +4 -2
  285. package/src/components/manage/Widgets/SchemaWidget.test.jsx +1 -6
  286. package/src/components/manage/Widgets/SchemaWidgetFieldset.test.jsx +1 -6
  287. package/src/components/manage/Widgets/SelectAutoComplete.jsx +29 -12
  288. package/src/components/manage/Widgets/SelectAutoComplete.test.jsx +1 -6
  289. package/src/components/manage/Widgets/SelectWidget.test.jsx +1 -6
  290. package/src/components/manage/Widgets/Size.stories.tsx +69 -0
  291. package/src/components/manage/Widgets/Size.test.tsx +59 -0
  292. package/src/components/manage/Widgets/Size.tsx +78 -0
  293. package/src/components/manage/Widgets/TimeWidget.test.jsx +1 -6
  294. package/src/components/manage/Widgets/TokenWidget.test.jsx +1 -6
  295. package/src/components/manage/Widgets/UrlWidget.jsx +49 -18
  296. package/src/components/manage/Widgets/VocabularyTermsWidget.test.jsx +2 -11
  297. package/src/components/manage/Widgets/__mocks__/index.tsx +33 -51
  298. package/src/components/manage/Widgets/index.tsx +21 -0
  299. package/src/components/manage/Workflow/Workflow.test.jsx +2 -11
  300. package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.jsx +1 -0
  301. package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.test.jsx +30 -0
  302. package/src/components/theme/App/App.jsx +5 -1
  303. package/src/components/theme/Avatar/Avatar.jsx +2 -1
  304. package/src/components/theme/Comments/CommentEditModal.test.jsx +1 -5
  305. package/src/components/theme/Comments/Comments.test.jsx +2 -11
  306. package/src/components/theme/ConnectionRefused/ConnectionRefused.jsx +3 -2
  307. package/src/components/theme/ContactForm/ContactForm.test.jsx +1 -5
  308. package/src/components/theme/Image/Image.jsx +25 -13
  309. package/src/components/theme/Image/Image.test.jsx +247 -146
  310. package/src/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.tsx +7 -0
  311. package/src/components/theme/LanguageSelector/LanguageSelector.tsx +89 -0
  312. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +42 -12
  313. package/src/components/theme/PasswordReset/PasswordReset.jsx +108 -191
  314. package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +1 -5
  315. package/src/components/theme/PreviewImage/PreviewImage.jsx +1 -1
  316. package/src/components/theme/Register/Register.test.jsx +1 -5
  317. package/src/components/theme/RequestTimeout/RequestTimeout.jsx +1 -1
  318. package/src/components/theme/Sitemap/Sitemap.stories.jsx +82 -0
  319. package/src/components/theme/SlotRenderer/SlotRenderer.tsx +12 -6
  320. package/src/components/theme/Unauthorized/Unauthorized.jsx +35 -25
  321. package/src/components/theme/Unauthorized/Unauthorized.test.jsx +28 -1
  322. package/src/components/theme/VideoEmbed/VideoEmbed.jsx +100 -0
  323. package/src/components/theme/View/EventDatesInfo.test.jsx +1 -6
  324. package/src/components/theme/View/EventView.stories.jsx +89 -0
  325. package/src/components/theme/View/EventView.test.jsx +1 -6
  326. package/src/components/theme/View/FileView.stories.jsx +50 -0
  327. package/src/components/theme/View/ImageView.jsx +2 -1
  328. package/src/components/theme/View/ImageView.test.jsx +3 -0
  329. package/src/components/theme/View/LinkView.stories.jsx +57 -0
  330. package/src/components/theme/View/ListingView.stories.jsx +70 -0
  331. package/src/components/theme/View/NewsItemView.stories.jsx +58 -0
  332. package/src/components/theme/View/RenderBlocks.jsx +8 -10
  333. package/src/components/theme/View/RenderBlocks.stories.jsx +112 -0
  334. package/src/components/theme/View/RenderBlocks.test.jsx +14 -4
  335. package/src/components/theme/View/SummaryView.stories.jsx +71 -0
  336. package/src/components/theme/View/TabularView.stories.jsx +66 -0
  337. package/src/components/theme/View/View.jsx +8 -1
  338. package/src/components/theme/Widgets/ImageWidget.jsx +2 -1
  339. package/src/components/theme/Widgets/ImageWidget.test.jsx +31 -11
  340. package/src/config/Blocks.jsx +3 -0
  341. package/src/config/ControlPanels.js +3 -0
  342. package/src/config/Widgets.jsx +7 -0
  343. package/src/config/index.js +19 -12
  344. package/src/config/server.js +0 -2
  345. package/src/config/slots.js +19 -0
  346. package/src/config/validation.ts +8 -0
  347. package/src/constants/ActionTypes.js +1 -0
  348. package/src/express-middleware/devproxy.js +22 -5
  349. package/src/express-middleware/files.js +1 -0
  350. package/src/express-middleware/files.test.js +59 -0
  351. package/src/express-middleware/images.js +1 -0
  352. package/src/express-middleware/images.test.js +50 -0
  353. package/src/helpers/Api/APIResourceWithAuth.js +8 -3
  354. package/src/helpers/Api/Api.js +7 -4
  355. package/src/helpers/AsyncConnect/ssr.js +4 -1
  356. package/src/helpers/AuthToken/AuthToken.js +1 -6
  357. package/src/helpers/Blocks/Blocks.js +113 -28
  358. package/src/helpers/Blocks/Blocks.test.js +100 -0
  359. package/src/helpers/Content/Content.js +23 -0
  360. package/src/helpers/Content/Content.test.js +39 -0
  361. package/src/helpers/Content/withClientSideContent.jsx +35 -0
  362. package/src/helpers/Extensions/withBlockSchemaEnhancer.jsx +4 -1
  363. package/src/helpers/FormValidation/FormValidation.test.js +31 -0
  364. package/src/helpers/FormValidation/validators.ts +52 -6
  365. package/src/helpers/Html/Html.jsx +13 -4
  366. package/src/helpers/Loadable/__mocks__/Loadable.jsx +7 -22
  367. package/src/helpers/MessageLabels/MessageLabels.js +10 -0
  368. package/src/helpers/Sitemap/Sitemap.js +4 -4
  369. package/src/helpers/Url/Url.js +33 -2
  370. package/src/helpers/Url/Url.test.js +62 -0
  371. package/src/helpers/Utils/Utils.jsx +17 -0
  372. package/src/helpers/Utils/Utils.test.jsx +39 -0
  373. package/src/hooks/user/useUser.js +1 -1
  374. package/src/internalChecks.test.ts +11 -0
  375. package/src/middleware/api.js +17 -8
  376. package/src/middleware/storeProtectLoadUtils.test.js +3 -3
  377. package/src/reducers/blockTypes/blockTypes.js +38 -0
  378. package/src/reducers/content/content.js +3 -18
  379. package/src/reducers/diff/diff.js +5 -1
  380. package/src/reducers/diff/diff.test.js +60 -4
  381. package/src/reducers/index.js +2 -0
  382. package/src/reducers/querystring/querystring.js +8 -1
  383. package/src/reducers/users/users.js +1 -1
  384. package/src/routes.js +13 -1
  385. package/src/server.jsx +47 -13
  386. package/src/start-client.jsx +9 -2
  387. package/src/start-server.js +9 -3
  388. package/test-addons-loader.js +3 -0
  389. package/test-setup-globals.js +56 -2
  390. package/theme/themes/default/elements/segment.variables +9 -16
  391. package/theme/themes/pastanaga/collections/form.overrides +1 -1
  392. package/theme/themes/pastanaga/elements/segment.variables +1 -4
  393. package/theme/themes/pastanaga/extras/block-types.less +17 -0
  394. package/theme/themes/pastanaga/extras/blocks.less +19 -0
  395. package/theme/themes/pastanaga/extras/contents.less +75 -0
  396. package/theme/themes/pastanaga/extras/main.less +20 -4
  397. package/theme/themes/pastanaga/extras/toolbar.less +10 -5
  398. package/theme/themes/pastanaga/extras/videoembed.less +22 -0
  399. package/theme/themes/pastanaga/extras/widgets.less +79 -0
  400. package/tsconfig.declarations.json +1 -1
  401. package/tsconfig.json +4 -5
  402. package/types/actions/blockTypes/blockTypes.d.ts +7 -0
  403. package/types/components/index.d.ts +1 -1
  404. package/types/components/manage/Blocks/Block/Order/Item.test.d.ts +1 -0
  405. package/types/components/manage/Blocks/Block/Order/utilities.d.ts +2 -1
  406. package/types/components/manage/Blocks/Grid/context.d.ts +1 -0
  407. package/types/components/manage/Blocks/Teaser/utils.d.ts +5 -0
  408. package/types/components/manage/Blocks/Video/Body.d.ts +4 -2
  409. package/types/components/manage/Blocks/Video/schema.d.ts +4 -0
  410. package/types/components/manage/Contents/DropZoneContent.d.ts +2 -0
  411. package/types/components/manage/Contents/__mocks__/index.d.ts +2 -2
  412. package/types/components/manage/Controlpanels/BlockType.d.ts +7 -0
  413. package/types/components/manage/Controlpanels/BlockTypes.d.ts +7 -0
  414. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
  415. package/types/components/manage/Controlpanels/Users/RenderUsers.d.ts +18 -2
  416. package/types/components/manage/Controlpanels/Users/UsersControlpanel.d.ts +6 -2
  417. package/types/components/manage/Controlpanels/index.d.ts +2 -2
  418. package/types/components/manage/Diff/Diff.d.ts +7 -2
  419. package/types/components/manage/Form/__mocks__/index.d.ts +8 -8
  420. package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
  421. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
  422. package/types/components/manage/Sidebar/SidebarPortal.d.ts +7 -15
  423. package/types/components/manage/Toolbar/Types.crash.test.d.ts +1 -0
  424. package/types/components/manage/Widgets/AlignWidget.d.ts +8 -10
  425. package/types/components/manage/Widgets/AlignWidget.stories.d.ts +1 -0
  426. package/types/components/manage/Widgets/BlockAlignment.d.ts +7 -0
  427. package/types/components/manage/Widgets/BlockAlignment.stories.d.ts +8 -0
  428. package/types/components/manage/Widgets/BlockWidth.d.ts +7 -0
  429. package/types/components/manage/Widgets/BlockWidth.stories.d.ts +6 -0
  430. package/types/components/manage/Widgets/ButtonsWidget.d.ts +48 -1
  431. package/types/components/manage/Widgets/ButtonsWidget.stories.d.ts +3 -0
  432. package/types/components/manage/Widgets/FormFieldWrapper.d.ts +28 -5
  433. package/types/components/manage/Widgets/ImageWidget.d.ts +41 -1
  434. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
  435. package/types/components/manage/Widgets/ObjectBrowserWidget.d.ts +2 -0
  436. package/types/components/manage/Widgets/QueryWidget.d.ts +5 -2
  437. package/types/components/manage/Widgets/RecurrenceWidget/Utils.d.ts +12 -18
  438. package/types/components/manage/Widgets/Size.d.ts +7 -0
  439. package/types/components/manage/Widgets/Size.stories.d.ts +6 -0
  440. package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
  441. package/types/components/manage/Widgets/__mocks__/index.d.ts +33 -33
  442. package/types/components/manage/Widgets/index.d.ts +11 -6
  443. package/types/components/theme/ConnectionRefused/ConnectionRefused.d.ts +2 -2
  444. package/types/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.d.ts +3 -0
  445. package/types/components/theme/LanguageSelector/LanguageSelector.d.ts +3 -10
  446. package/types/components/theme/PasswordReset/PasswordReset.d.ts +6 -2
  447. package/types/components/theme/Sitemap/Sitemap.stories.d.ts +13 -0
  448. package/types/components/theme/SlotRenderer/SlotRenderer.d.ts +4 -5
  449. package/types/components/theme/Unauthorized/Unauthorized.d.ts +2 -2
  450. package/types/components/theme/VideoEmbed/VideoEmbed.d.ts +2 -0
  451. package/types/components/theme/View/EventView.stories.d.ts +19 -0
  452. package/types/components/theme/View/FileView.stories.d.ts +18 -0
  453. package/types/components/theme/View/LinkView.stories.d.ts +18 -0
  454. package/types/components/theme/View/ListingView.stories.d.ts +24 -0
  455. package/types/components/theme/View/NewsItemView.stories.d.ts +23 -0
  456. package/types/components/theme/View/RenderBlocks.stories.d.ts +23 -0
  457. package/types/components/theme/View/SummaryView.stories.d.ts +23 -0
  458. package/types/components/theme/View/TabularView.stories.d.ts +23 -0
  459. package/types/config/ControlPanels.d.ts +1 -0
  460. package/types/config/Views.d.ts +1 -1
  461. package/types/config/Widgets.d.ts +6 -0
  462. package/types/config/slots.d.ts +7 -0
  463. package/types/constants/ActionTypes.d.ts +1 -0
  464. package/types/helpers/Blocks/Blocks.d.ts +4 -0
  465. package/types/helpers/Content/Content.d.ts +7 -0
  466. package/types/helpers/Content/withClientSideContent.d.ts +1 -0
  467. package/types/helpers/Extensions/withBlockSchemaEnhancer.d.ts +4 -5
  468. package/types/helpers/FormValidation/validators.d.ts +18 -1
  469. package/types/helpers/Helmet/Helmet.d.ts +1 -1
  470. package/types/helpers/Loadable/__mocks__/Loadable.d.ts +2 -2
  471. package/types/helpers/MessageLabels/MessageLabels.d.ts +105 -93
  472. package/types/helpers/Url/Url.d.ts +14 -0
  473. package/types/helpers/Url/bulkFlattenToAppURL.d.ts +5 -0
  474. package/types/helpers/Utils/Utils.d.ts +1 -0
  475. package/types/reducers/blockTypes/blockTypes.d.ts +16 -0
  476. package/types/reducers/index.d.ts +3 -0
  477. package/types/routes.d.ts +7 -5
  478. package/types/start-client.d.ts +0 -1
  479. package/vitest.config.mjs +84 -42
  480. package/webpack-plugins/webpack-less-plugin.js +1 -1
  481. package/webpack-plugins/webpack-scss-plugin.js +172 -0
  482. package/cypress/downloads/downloads.html +0 -0
  483. package/jest-addons-loader.js +0 -3
  484. package/jest-extender-plugin.js +0 -39
  485. package/jest-setup-afterenv.js +0 -2
  486. package/jest-svgsystem-transform.js +0 -10
  487. package/package-why.json +0 -34
  488. package/patches/patchit.sh +0 -2
  489. package/patches/razzle-jest.patch +0 -10
  490. package/src/components/manage/Contents/__mocks__/index.vitest.tsx +0 -5
  491. package/src/components/manage/Form/__mocks__/index.vitest.tsx +0 -73
  492. package/src/components/manage/Sidebar/SidebarPortal.jsx +0 -47
  493. package/src/components/manage/Sidebar/SidebarPortal.test.jsx +0 -26
  494. package/src/components/manage/Widgets/AlignWidget.test.jsx +0 -59
  495. package/src/components/manage/Widgets/ButtonsWidget.jsx +0 -41
  496. package/src/components/manage/Widgets/ButtonsWidget.test.jsx +0 -70
  497. package/src/components/manage/Widgets/__mocks__/index.vitest.tsx +0 -41
  498. package/src/components/theme/LanguageSelector/LanguageSelector.jsx +0 -79
  499. package/src/helpers/Loadable/__mocks__/Loadable.vitest.jsx +0 -39
  500. package/test-setup-globals-vitest.js +0 -46
  501. package/theme/themes/pastanaga/extras/utils.less +0 -63
  502. /package/src/components/theme/LanguageSelector/{LanguageSelector.test.jsx → LanguageSelector.test.tsx} +0 -0
@@ -100,6 +100,7 @@ export const InternalUrlWidget = (props) => {
100
100
  {value?.length > 0 ? (
101
101
  <Button.Group>
102
102
  <Button
103
+ type="button"
103
104
  basic
104
105
  className="cancel"
105
106
  aria-label="clearUrlBrowser"
@@ -115,6 +116,7 @@ export const InternalUrlWidget = (props) => {
115
116
  ) : (
116
117
  <Button.Group>
117
118
  <Button
119
+ type="button"
118
120
  basic
119
121
  icon
120
122
  aria-label="openUrlBrowser"
@@ -82,6 +82,7 @@ export class ObjectBrowserWidgetComponent extends Component {
82
82
  openObjectBrowser: PropTypes.func.isRequired,
83
83
  allowExternals: PropTypes.bool,
84
84
  placeholder: PropTypes.string,
85
+ onlyFolderishSelectable: PropTypes.bool,
85
86
  };
86
87
 
87
88
  /**
@@ -98,6 +99,7 @@ export class ObjectBrowserWidgetComponent extends Component {
98
99
  return: 'multiple',
99
100
  initialPath: '',
100
101
  allowExternals: false,
102
+ onlyFolderishSelectable: false,
101
103
  };
102
104
 
103
105
  state = {
@@ -315,6 +317,9 @@ export class ObjectBrowserWidgetComponent extends Component {
315
317
  maximumSelectionSize:
316
318
  this.props.widgetOptions?.pattern_options?.maximumSelectionSize ||
317
319
  this.props.maximumSelectionSize,
320
+ onlyFolderishSelectable:
321
+ this.props.widgetOptions?.pattern_options?.onlyFolderishSelectable ||
322
+ this.props.onlyFolderishSelectable,
318
323
  });
319
324
  };
320
325
 
@@ -399,6 +404,7 @@ export class ObjectBrowserWidgetComponent extends Component {
399
404
  {this.state.manualLinkInput && isEmpty(items) && (
400
405
  <Button.Group>
401
406
  <Button
407
+ type="button"
402
408
  basic
403
409
  className="cancel"
404
410
  onClick={(e) => {
@@ -409,6 +415,7 @@ export class ObjectBrowserWidgetComponent extends Component {
409
415
  <Icon name={clearSVG} size="18px" color="#e40166" />
410
416
  </Button>
411
417
  <Button
418
+ type="button"
412
419
  basic
413
420
  primary
414
421
  disabled={!this.state.validURL}
@@ -423,6 +430,7 @@ export class ObjectBrowserWidgetComponent extends Component {
423
430
  )}
424
431
  {!this.state.manualLinkInput && (
425
432
  <Button
433
+ type="button"
426
434
  aria-label={this.props.intl.formatMessage(
427
435
  messages.openObjectBrowser,
428
436
  )}
@@ -4,17 +4,8 @@ import { render } from '@testing-library/react';
4
4
  import configureStore from 'redux-mock-store';
5
5
  import ObjectListWidget from './ObjectListWidget';
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'
@@ -5,11 +5,7 @@ import { Provider } from 'react-intl-redux';
5
5
  import { render, fireEvent } from '@testing-library/react';
6
6
  import ObjectWidget from './ObjectWidget';
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
 
@@ -15,8 +15,12 @@ import groupBy from 'lodash/groupBy';
15
15
  import isEmpty from 'lodash/isEmpty';
16
16
  import map from 'lodash/map';
17
17
  import { defineMessages, injectIntl } from 'react-intl';
18
+ import { withRouter } from 'react-router';
18
19
  import { getQuerystring } from '@plone/volto/actions/querystring/querystring';
20
+ import { getQueryStringResults } from '@plone/volto/actions/querystringsearch/querystringsearch';
19
21
  import Icon from '@plone/volto/components/theme/Icon/Icon';
22
+ import ObjectBrowserWidget from '@plone/volto/components/manage/Widgets/ObjectBrowserWidget';
23
+ import NumberWidget from '@plone/volto/components/manage/Widgets/NumberWidget';
20
24
  import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
21
25
  import cx from 'classnames';
22
26
  import config from '@plone/volto/registry';
@@ -43,8 +47,27 @@ const messages = defineMessages({
43
47
  id: 'querystring-widget-select',
44
48
  defaultMessage: 'Select…',
45
49
  },
50
+ currentPath: {
51
+ id: 'query-widget-currentPath',
52
+ defaultMessage: 'Current path (./)',
53
+ },
54
+ parentPath: {
55
+ id: 'query-widget-parentPath',
56
+ defaultMessage: 'Parent path (../)',
57
+ },
46
58
  });
47
59
 
60
+ const parseUidDepth = (val) => {
61
+ if (typeof val !== 'string') return { uid: '', depth: 1 };
62
+ const lastSep = String(val).lastIndexOf('::');
63
+ if (lastSep !== -1) {
64
+ const uid = val.substring(0, lastSep);
65
+ const parsed = parseInt(val.substring(lastSep + 2), 10);
66
+ return { uid, depth: Number.isNaN(parsed) ? 1 : parsed };
67
+ }
68
+ return { uid: val, depth: 1 };
69
+ };
70
+
48
71
  /**
49
72
  * Widget for a querystring value, to define a catalog search criteria.
50
73
  */
@@ -97,6 +120,7 @@ export class QuerystringWidgetComponent extends Component {
97
120
  };
98
121
  this.onChangeValue = this.onChangeValue.bind(this);
99
122
  this.getWidget = this.getWidget.bind(this);
123
+ this.loadReferenceWidgetItem = this.loadReferenceWidgetItem.bind(this);
100
124
  }
101
125
 
102
126
  /**
@@ -111,6 +135,27 @@ export class QuerystringWidgetComponent extends Component {
111
135
  this.props.getQuerystring();
112
136
  }
113
137
 
138
+ loadReferenceWidgetItem(v) {
139
+ const loading =
140
+ this.props.reference[`${v}_query_reference`]?.loading ?? false;
141
+ if (!loading && v?.length > 0) {
142
+ this.props.getQueryStringResults(
143
+ '/',
144
+ {
145
+ b_size: 1,
146
+ query: [
147
+ {
148
+ i: 'path',
149
+ o: 'plone.app.querystring.operation.string.absolutePath',
150
+ v: v + '::0',
151
+ },
152
+ ],
153
+ },
154
+ v + '_query_reference',
155
+ );
156
+ }
157
+ }
158
+
114
159
  /**
115
160
  * Get correct widget
116
161
  * @method getWidget
@@ -118,15 +163,16 @@ export class QuerystringWidgetComponent extends Component {
118
163
  * @param {number} index Row index.
119
164
  * @returns {Object} Widget.
120
165
  */
121
- getWidget(row, index, Select) {
166
+ getWidget(row, index, Select, intl) {
122
167
  const props = {
123
168
  fluid: true,
124
169
  value: row.v,
125
170
  onChange: (data) => this.onChangeValue(index, data.target.value),
126
171
  };
127
172
  const values = this.props.indexes[row.i].values;
173
+ const operator = this.props.indexes[row.i].operators[row.o];
128
174
 
129
- switch (this.props.indexes[row.i].operators[row.o].widget) {
175
+ switch (operator.widget) {
130
176
  case null:
131
177
  return <span />;
132
178
  case 'DateWidget':
@@ -217,13 +263,93 @@ export class QuerystringWidgetComponent extends Component {
217
263
  </Form.Field>
218
264
  );
219
265
  case 'ReferenceWidget':
266
+ const { uid: uidValue, depth: depthValue } = parseUidDepth(props.value);
267
+ if (!this.props.reference[`${uidValue}_query_reference`]) {
268
+ this.loadReferenceWidgetItem(uidValue);
269
+ }
270
+ const referenceItem = this.props.reference[
271
+ `${uidValue}_query_reference`
272
+ ]
273
+ ? this.props.reference[`${uidValue}_query_reference`].items[0]
274
+ : null;
275
+ return (
276
+ <div className="location-object-browser">
277
+ <Form.Field className="object-browser-field">
278
+ <ObjectBrowserWidget
279
+ id={`query-reference-widget-${index}`}
280
+ mode="link"
281
+ onChange={(id, data) => {
282
+ const itemSelected = data.length > 0 ? data[0] : {};
283
+ const uid = itemSelected.UID ?? '';
284
+ this.onChangeValue(index, uid ? `${uid}::${depthValue}` : '');
285
+ this.loadReferenceWidgetItem(uid);
286
+ }}
287
+ value={uidValue && this.props.reference ? [referenceItem] : []}
288
+ wrapped={false}
289
+ onlyFolderishSelectable={true}
290
+ allowExternals={true}
291
+ />
292
+ </Form.Field>
293
+
294
+ {uidValue && (
295
+ <Form.Field className="reference-widget-depth">
296
+ <NumberWidget
297
+ title={intl.formatMessage({
298
+ id: 'Depth',
299
+ defaultMessage: 'Depth',
300
+ })}
301
+ min={1}
302
+ step={1}
303
+ value={depthValue}
304
+ onChange={(id, value) => {
305
+ const newDepth = parseInt(value, 10) || 1;
306
+ const curUid = uidValue || '';
307
+ this.onChangeValue(index, `${curUid}::${newDepth}`);
308
+ }}
309
+ />
310
+ </Form.Field>
311
+ )}
312
+ </div>
313
+ );
314
+ case 'RelativePathWidget':
315
+ const relativePathOptions = [
316
+ {
317
+ label: intl.formatMessage(messages.currentPath),
318
+ value: './',
319
+ },
320
+ {
321
+ label: intl.formatMessage(messages.parentPath),
322
+ value: '../',
323
+ },
324
+ ];
325
+ return (
326
+ <Form.Field style={{ flex: '1 0 auto', maxWidth: '92%' }}>
327
+ <Select
328
+ {...props}
329
+ className="react-select-container"
330
+ classNamePrefix="react-select"
331
+ options={relativePathOptions}
332
+ styles={customSelectStyles}
333
+ placeholder={this.props.intl.formatMessage(messages.select)}
334
+ theme={selectTheme}
335
+ components={{ DropdownIndicator, Option }}
336
+ onChange={(data) => {
337
+ this.onChangeValue(index, data.value);
338
+ }}
339
+ isMulti={false}
340
+ value={
341
+ relativePathOptions.filter((p) => p.value === props.value)?.[0]
342
+ }
343
+ />
344
+ </Form.Field>
345
+ );
220
346
  default:
221
347
  // if (row.o === 'plone.app.querystring.operation.string.relativePath') {
222
348
  // props.onChange = data => this.onChangeValue(index, data.target.value);
223
349
  // }
224
350
  return (
225
351
  <Form.Field style={{ flex: '1 0 auto' }}>
226
- <Input {...props} />
352
+ <Input {...props} description={operator.description} />
227
353
  </Form.Field>
228
354
  );
229
355
  }
@@ -334,7 +460,7 @@ export class QuerystringWidgetComponent extends Component {
334
460
  value: row.i,
335
461
  label: indexes[row.i]?.title,
336
462
  }}
337
- onChange={(data) =>
463
+ onChange={(data) => {
338
464
  onChange(
339
465
  id,
340
466
  map(value, (curRow, curIndex) =>
@@ -346,8 +472,8 @@ export class QuerystringWidgetComponent extends Component {
346
472
  }
347
473
  : curRow,
348
474
  ),
349
- )
350
- }
475
+ );
476
+ }}
351
477
  />
352
478
  </Form.Field>
353
479
  <Form.Field style={{ flex: '1 0 auto' }}>
@@ -408,7 +534,7 @@ export class QuerystringWidgetComponent extends Component {
408
534
  </Button>
409
535
  )}
410
536
  </div>
411
- {this.getWidget(row, index, Select)}
537
+ {this.getWidget(row, index, Select, intl)}
412
538
  {this.props.indexes[row.i].operators[row.o].widget && (
413
539
  <Button
414
540
  onClick={(event) => {
@@ -500,10 +626,12 @@ export class QuerystringWidgetComponent extends Component {
500
626
  export default compose(
501
627
  injectIntl,
502
628
  injectLazyLibs(['reactSelect']),
629
+ withRouter,
503
630
  connect(
504
- (state) => ({
631
+ (state, props) => ({
505
632
  indexes: state.querystring.indexes,
633
+ reference: state.querystringsearch.subrequests,
506
634
  }),
507
- { getQuerystring },
635
+ { getQuerystring, getQueryStringResults },
508
636
  ),
509
637
  )(QuerystringWidgetComponent);
@@ -7,12 +7,7 @@ import RadioGroupWidget from './RadioGroupWidget';
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'
@@ -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'
@@ -99,7 +99,7 @@ const RegistryImageWidget = (props) => {
99
99
 
100
100
  readAsDataURL(file).then((data) => {
101
101
  const fields = data.match(/^data:(.*);(.*),(.*)$/);
102
- onChange(id, `filenameb64:${btoa(file.name)};datab64:${fields[3]}}`);
102
+ onChange(id, `filenameb64:${btoa(file.name)};datab64:${fields[3]}`);
103
103
  });
104
104
 
105
105
  let reader = new FileReader();
@@ -20,6 +20,7 @@ const createStore = () =>
20
20
  locale: 'en',
21
21
  messages: {},
22
22
  },
23
+ site: { data: { 'plone.image_scales': { preview: {}, listing: {} } } },
23
24
  });
24
25
 
25
26
  describe('RegistryImageWidget', () => {
@@ -82,10 +83,11 @@ describe('RegistryImageWidget', () => {
82
83
  const dropzone = container.querySelector('.file-widget-dropzone');
83
84
  const preview = container.querySelector('.image-preview');
84
85
  const filename = container.querySelector('.field-file-name');
86
+ const img = container.querySelector('img[src*="logo"]');
85
87
 
86
- return dropzone && preview && filename;
88
+ return dropzone && preview && filename && img && img.complete;
87
89
  },
88
- { timeout: 1000 },
90
+ { timeout: 2000 },
89
91
  );
90
92
 
91
93
  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
+ });