@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
@@ -90,14 +90,14 @@ test('Provides path to blocks', () => {
90
90
  expect(container).toMatchSnapshot();
91
91
  });
92
92
 
93
- test('Renders invalid blocks', () => {
93
+ test('Filters out invalid blocks', () => {
94
94
  const store = mockStore({
95
95
  intl: {
96
96
  locale: 'en',
97
97
  messages: {},
98
98
  },
99
99
  });
100
- const { queryAllByText } = render(
100
+ const { queryAllByText, queryByText } = render(
101
101
  <Provider store={store}>
102
102
  <RenderBlocks
103
103
  blocksConfig={{
@@ -113,7 +113,14 @@ test('Renders invalid blocks', () => {
113
113
  }}
114
114
  content={{
115
115
  blocks_layout: {
116
- items: ['MISSING-YOU-1', 'a', 'MISSING-YOU-2'],
116
+ items: [
117
+ 'MISSING-YOU-1',
118
+ 'a',
119
+ 'MISSING-YOU-2',
120
+ null,
121
+ undefined,
122
+ 'undefined',
123
+ ],
117
124
  },
118
125
  blocks: {
119
126
  a: {
@@ -126,7 +133,10 @@ test('Renders invalid blocks', () => {
126
133
  />
127
134
  </Provider>,
128
135
  );
136
+ // Invalid blocks (missing from blocks object or invalid IDs) are filtered out and not rendered
129
137
  expect(
130
138
  queryAllByText('Invalid block - Will be removed on saving'),
131
- ).toHaveLength(2);
139
+ ).toHaveLength(0);
140
+ // Only valid blocks are rendered
141
+ expect(queryByText('id: a - text: bar - path: /foo')).not.toBeNull();
132
142
  });
@@ -0,0 +1,71 @@
1
+ import { injectIntl } from 'react-intl';
2
+ import React from 'react';
3
+ import SummaryViewComponent from './SummaryView';
4
+ import { RealStoreWrapper as Wrapper } from '@plone/volto/storybook';
5
+
6
+ const IntlSummaryViewComponent = injectIntl(SummaryViewComponent);
7
+
8
+ function StoryComponent(args) {
9
+ return (
10
+ <Wrapper
11
+ customStore={{
12
+ intl: {
13
+ locale: 'en',
14
+ messages: {},
15
+ },
16
+ }}
17
+ >
18
+ <div id="toolbar" style={{ display: 'none' }} />
19
+ <IntlSummaryViewComponent
20
+ content={{
21
+ ...args,
22
+ }}
23
+ />
24
+ </Wrapper>
25
+ );
26
+ }
27
+
28
+ export const Default = StoryComponent.bind({});
29
+ Default.args = {
30
+ title: 'Hello World!',
31
+ description: 'Hi',
32
+ items: [
33
+ {
34
+ title: 'My item',
35
+ description: 'My item description',
36
+ url: '/item',
37
+ image: {
38
+ scales: {
39
+ thumb: {
40
+ download: 'file:///preview.jpg',
41
+ },
42
+ },
43
+ },
44
+ image_caption: 'My image caption',
45
+ '@type': 'News Item',
46
+ },
47
+ ],
48
+ };
49
+ export default {
50
+ title: 'Public components/View/SummaryView',
51
+ component: SummaryViewComponent,
52
+ decorators: [
53
+ (Story) => (
54
+ <div className="ui segment form attached" style={{ width: '900px' }}>
55
+ <Story />
56
+ </div>
57
+ ),
58
+ ],
59
+
60
+ argTypes: {
61
+ title: {
62
+ description: 'Title of the page listed',
63
+ },
64
+ description: {
65
+ description: 'Description of the page',
66
+ },
67
+ items: {
68
+ description: 'Content in the page',
69
+ },
70
+ },
71
+ };
@@ -0,0 +1,66 @@
1
+ import { injectIntl } from 'react-intl';
2
+ import React from 'react';
3
+ import TabularViewComponent from './TabularView';
4
+ import { RealStoreWrapper as Wrapper } from '@plone/volto/storybook';
5
+
6
+ const IntlTabularViewComponent = injectIntl(TabularViewComponent);
7
+
8
+ function StoryComponent(args) {
9
+ return (
10
+ <Wrapper
11
+ customStore={{
12
+ intl: {
13
+ locale: 'en',
14
+ messages: {},
15
+ },
16
+ }}
17
+ >
18
+ <div id="toolbar" style={{ display: 'none' }} />
19
+ <IntlTabularViewComponent
20
+ content={{
21
+ ...args,
22
+ }}
23
+ />
24
+ </Wrapper>
25
+ );
26
+ }
27
+
28
+ export const Default = StoryComponent.bind({});
29
+ Default.args = {
30
+ title: 'Hello World!',
31
+ description: 'Hi',
32
+ items: [
33
+ {
34
+ title: 'My item 1',
35
+ description: 'My item description 1',
36
+ url: '/item1',
37
+ },
38
+ {
39
+ title: 'My item 2',
40
+ description: 'My item description 2',
41
+ url: '/item2',
42
+ },
43
+ ],
44
+ };
45
+ export default {
46
+ title: 'Public components/View/TabularView',
47
+ component: TabularViewComponent,
48
+ decorators: [
49
+ (Story) => (
50
+ <div className="ui segment form attached" style={{ width: '900px' }}>
51
+ <Story />
52
+ </div>
53
+ ),
54
+ ],
55
+ argTypes: {
56
+ title: {
57
+ description: 'Title of the page listed',
58
+ },
59
+ description: {
60
+ description: 'Description of the page',
61
+ },
62
+ items: {
63
+ description: 'Row items of the page',
64
+ },
65
+ },
66
+ };
@@ -222,6 +222,13 @@ class View extends Component {
222
222
  }
223
223
  return (
224
224
  <div id="view">
225
+ <BodyClass
226
+ className={
227
+ FoundView.displayName
228
+ ? `view-${this.cleanViewName(FoundView.displayName)}`
229
+ : null
230
+ }
231
+ />
225
232
  <FoundView {...this.props} />
226
233
  </div>
227
234
  );
@@ -246,7 +253,7 @@ class View extends Component {
246
253
  />
247
254
  <SlotRenderer name="aboveContent" content={this.props.content} />
248
255
  <RenderedView
249
- key={this.props.content['@id']}
256
+ key={flattenToAppURL(this.props.content['@id'])}
250
257
  content={this.props.content}
251
258
  location={this.props.location}
252
259
  token={this.props.token}
@@ -1,6 +1,7 @@
1
1
  import React from 'react';
2
2
  import cx from 'classnames';
3
3
  import { flattenToAppURL } from '@plone/volto/helpers/Url/Url';
4
+ import Image from '@plone/volto/components/theme/Image/Image';
4
5
 
5
6
  const niceBytes = (bytes) => {
6
7
  bytes = Number(bytes);
@@ -18,7 +19,7 @@ const niceBytes = (bytes) => {
18
19
  const ImageWidget = ({ value, className }) =>
19
20
  value ? (
20
21
  <span className={cx(className, 'image', 'widget')}>
21
- <img
22
+ <Image
22
23
  src={
23
24
  value.data
24
25
  ? `data:${value['content-type']};base64,${value.data}`
@@ -1,17 +1,35 @@
1
1
  import React from 'react';
2
2
  import renderer from 'react-test-renderer';
3
3
  import ImageWidget from './ImageWidget';
4
+ import { Provider } from 'react-intl-redux';
5
+ import configureStore from 'redux-mock-store';
6
+
7
+ const mockStore = configureStore();
4
8
 
5
9
  describe('ImageWidget', () => {
10
+ const store = mockStore({
11
+ intl: { locale: 'en', messages: {} },
12
+ site: { data: { 'plone.image_scales': { preview: {}, listing: {} } } },
13
+ });
14
+
6
15
  it('renders an empty image view widget component', () => {
7
- const component = renderer.create(<ImageWidget />);
16
+ const component = renderer.create(
17
+ <Provider store={store}>
18
+ <ImageWidget />
19
+ </Provider>,
20
+ );
8
21
  const json = component.toJSON();
9
22
  expect(json).toMatchSnapshot();
10
23
  });
11
24
 
12
25
  it('renders an image view widget component', () => {
13
26
  const component = renderer.create(
14
- <ImageWidget className="metadata" value={{ download: '/foo-bar.png' }} />,
27
+ <Provider store={store}>
28
+ <ImageWidget
29
+ className="metadata"
30
+ value={{ download: '/foo-bar.png' }}
31
+ />
32
+ </Provider>,
15
33
  );
16
34
  const json = component.toJSON();
17
35
  expect(json).toMatchSnapshot();
@@ -19,15 +37,17 @@ describe('ImageWidget', () => {
19
37
 
20
38
  it('renders an image view widget component with children', () => {
21
39
  const component = renderer.create(
22
- <ImageWidget
23
- className="metadata"
24
- value={{
25
- download: '/foo-bar.png',
26
- file_name: 'foo-bar.png',
27
- }}
28
- >
29
- {(child) => <strong>{child}</strong>}
30
- </ImageWidget>,
40
+ <Provider store={store}>
41
+ <ImageWidget
42
+ className="metadata"
43
+ value={{
44
+ download: '/foo-bar.png',
45
+ file_name: 'foo-bar.png',
46
+ }}
47
+ >
48
+ {(child) => <strong>{child}</strong>}
49
+ </ImageWidget>
50
+ </Provider>,
31
51
  );
32
52
  const json = component.toJSON();
33
53
  expect(json).toMatchSnapshot();
@@ -68,6 +68,7 @@ import {
68
68
  import getListingBlockAsyncData from '@plone/volto/components/manage/Blocks/Listing/getAsyncData';
69
69
  import { getImageBlockSizes } from '@plone/volto/components/manage/Blocks/Image/utils';
70
70
  import { getLeadImageBlockSizes } from '@plone/volto/components/manage/Blocks/LeadImage/utils';
71
+ import { getTeaserBlockSizes } from '@plone/volto/components/manage/Blocks/Teaser/utils';
71
72
 
72
73
  // block sidebar schemas (not the Dexterity Layout block settings schemas)
73
74
  import ListingBlockSchema from '@plone/volto/components/manage/Blocks/Listing/schema';
@@ -351,6 +352,7 @@ const blocksConfig = {
351
352
  restricted: false,
352
353
  mostUsed: true,
353
354
  sidebarTab: 1,
355
+ allowedPeertubeInstances: [],
354
356
  },
355
357
  toc: {
356
358
  id: 'toc',
@@ -506,6 +508,7 @@ const blocksConfig = {
506
508
  sidebarTab: 1,
507
509
  blockSchema: TeaserSchema,
508
510
  dataAdapter: TeaserBlockDataAdapter,
511
+ getSizes: getTeaserBlockSizes,
509
512
  variations: [
510
513
  {
511
514
  id: 'default',
@@ -19,6 +19,7 @@ import rulesSVG from '@plone/volto/icons/content-existing.svg';
19
19
  import undoControlPanelSVG from '@plone/volto/icons/undo-control-panel.svg';
20
20
  import linkSVG from '@plone/volto/icons/link.svg';
21
21
  import relationsSVG from '@plone/volto/icons/ahead.svg';
22
+ import contentListingSVG from '@plone/volto/icons/content-listing.svg';
22
23
  import config from '@plone/volto/registry';
23
24
 
24
25
  export const controlPanelsIcons = {
@@ -43,6 +44,7 @@ export const controlPanelsIcons = {
43
44
  undo: undoControlPanelSVG,
44
45
  aliases: linkSVG,
45
46
  relations: relationsSVG,
47
+ 'block-types': contentListingSVG,
46
48
  };
47
49
 
48
50
  export const filterControlPanels = (controlpanels = []) => {
@@ -77,6 +79,7 @@ export const unwantedControlPanelsFields = {
77
79
  'exposeDCMetaTags',
78
80
  'enable_sitemap',
79
81
  'webstats_js',
82
+ 'webstats_head_js',
80
83
  ],
81
84
  editing: ['available_editors', 'default_editor', 'ext_editor'],
82
85
  imaging: [
@@ -35,6 +35,9 @@ import {
35
35
  RecurrenceWidget,
36
36
  RadioGroupWidget,
37
37
  CheckboxGroupWidget,
38
+ Size,
39
+ BlockAlignment,
40
+ BlockWidth,
38
41
  } from '@plone/volto/components/manage/Widgets';
39
42
 
40
43
  import ArrayViewWidget from '@plone/volto/components/theme/Widgets/ArrayWidget';
@@ -102,6 +105,10 @@ export const widgetMapping = {
102
105
  hidden: HiddenWidget,
103
106
  radio_group: RadioGroupWidget,
104
107
  checkbox_group: CheckboxGroupWidget,
108
+ // SemanticUI Free widgets
109
+ blockAlignment: BlockAlignment,
110
+ blockWidth: BlockWidth,
111
+ size: Size,
105
112
  },
106
113
  vocabulary: {
107
114
  'plone.app.vocabularies.Catalog': ObjectBrowserWidget,
@@ -30,10 +30,6 @@ import languages from '@plone/volto/constants/Languages.cjs';
30
30
  const host = process.env.HOST || 'localhost';
31
31
  const port = process.env.PORT || '3000';
32
32
 
33
- const apiPath =
34
- process.env.RAZZLE_API_PATH ||
35
- (__DEVELOPMENT__ ? `http://${host}:${port}` : '');
36
-
37
33
  const getServerURL = (url) => {
38
34
  if (!url) return;
39
35
  const apiPathURL = parseUrl(url);
@@ -46,12 +42,14 @@ const getServerURL = (url) => {
46
42
  // if RAZZLE_PUBLIC_URL is present, use it
47
43
  // if in DEV, use the host/port combination by default
48
44
  // if in PROD, assume it's RAZZLE_API_PATH server name (no /api or alikes) or fallback
49
- // to DEV settings if RAZZLE_API_PATH is not present
45
+ // to DEV settings if RAZZLE_API_PATH is not present.
46
+ // Finally, add the subpath, if there is one.
50
47
  const publicURL =
51
- process.env.RAZZLE_PUBLIC_URL ||
52
- (__DEVELOPMENT__
53
- ? `http://${host}:${port}`
54
- : getServerURL(process.env.RAZZLE_API_PATH) || `http://${host}:${port}`);
48
+ (process.env.RAZZLE_PUBLIC_URL ||
49
+ (__DEVELOPMENT__
50
+ ? `http://${host}:${port}`
51
+ : getServerURL(process.env.RAZZLE_API_PATH) ||
52
+ `http://${host}:${port}`)) + (process.env.RAZZLE_SUBPATH_PREFIX || '');
55
53
 
56
54
  const serverConfig =
57
55
  typeof __SERVER__ !== 'undefined' && __SERVER__
@@ -65,7 +63,10 @@ let config = {
65
63
  // The URL Volto is going to be served (see sensible defaults above)
66
64
  publicURL,
67
65
  okRoute: '/ok',
68
- apiPath,
66
+ // Base URL for API requests from the browser.
67
+ // If not explicitly set, use the publicURL (seamless mode) --
68
+ // but in that case it will be updated in server.jsx for each request.
69
+ apiPath: process.env.RAZZLE_API_PATH || publicURL,
69
70
  apiExpanders: [
70
71
  // Added here for documentation purposes, added at the end because it
71
72
  // depends on a value of this object.
@@ -99,6 +100,7 @@ let config = {
99
100
  // apiPath: process.env.RAZZLE_API_PATH || 'http://localhost:8081/db/web', // for guillotina
100
101
  actions_raising_api_errors: ['GET_CONTENT', 'UPDATE_CONTENT'],
101
102
  internalApiPath: process.env.RAZZLE_INTERNAL_API_PATH || undefined,
103
+ subpathPrefix: process.env.RAZZLE_SUBPATH_PREFIX || '',
102
104
  websockets: process.env.RAZZLE_WEBSOCKETS || false,
103
105
  // TODO: legacyTraverse to be removed when the use of the legacy traverse is deprecated.
104
106
  legacyTraverse: process.env.RAZZLE_LEGACY_TRAVERSE || false,
@@ -119,7 +121,7 @@ let config = {
119
121
  defaultBlockType: 'slate',
120
122
  verticalFormTabs: false,
121
123
  useEmailAsLogin: false,
122
- persistentReducers: ['blocksClipboard'],
124
+ persistentReducers: ['blocksClipboard.cut', 'blocksClipboard.copy'],
123
125
  initialReducersBlacklist: [], // reducers in this list won't be hydrated in windows.__data
124
126
  asyncPropsExtenders: [getSiteAsyncPropExtender], // per route asyncConnect customizers
125
127
  contentIcons: contentIcons,
@@ -141,7 +143,7 @@ let config = {
141
143
  serverConfig,
142
144
  storeExtenders: [],
143
145
  showTags: true,
144
- showRelatedItems: false,
146
+ showRelatedItems: true,
145
147
  controlpanels: [],
146
148
  controlPanelsIcons,
147
149
  filterControlPanels,
@@ -177,6 +179,11 @@ let config = {
177
179
  includeSiteTitle: false,
178
180
  titleAndSiteTitleSeparator: '-',
179
181
  },
182
+ layout: {
183
+ // used to set `sizes` for images
184
+ tabletBreakpoint: 768,
185
+ defaultContainerWidth: 1200,
186
+ },
180
187
  },
181
188
  experimental: {
182
189
  addBlockButton: {
@@ -1,7 +1,6 @@
1
1
  import imagesMiddleware from '@plone/volto/express-middleware/images';
2
2
  import filesMiddleware from '@plone/volto/express-middleware/files';
3
3
  import robotstxtMiddleware from '@plone/volto/express-middleware/robotstxt';
4
- import okMiddleware from '@plone/volto/express-middleware/ok';
5
4
  import sitemapMiddleware from '@plone/volto/express-middleware/sitemap';
6
5
  import staticsMiddleware from '@plone/volto/express-middleware/static';
7
6
  import devProxyMiddleware from '@plone/volto/express-middleware/devproxy';
@@ -12,7 +11,6 @@ const settings = {
12
11
  filesMiddleware(),
13
12
  imagesMiddleware(),
14
13
  robotstxtMiddleware(),
15
- okMiddleware(),
16
14
  sitemapMiddleware(),
17
15
  staticsMiddleware(),
18
16
  ],
@@ -1,7 +1,26 @@
1
+ import loadable from '@loadable/component';
1
2
  import RelatedItems from '@plone/volto/components/theme/RelatedItems/RelatedItems';
2
3
  import Tags from '@plone/volto/components/theme/Tags/Tags';
4
+ import { isCmsUi } from '@plone/volto/helpers/Url/Url';
5
+
6
+ const InjectPloneComponentsCSS = loadable(
7
+ () =>
8
+ import(
9
+ '@plone/volto/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS'
10
+ ),
11
+ { fallback: null },
12
+ );
13
+
14
+ const onlyCMSUI = ({ location }) => isCmsUi(location?.pathname);
3
15
 
4
16
  const slots = {
17
+ aboveApp: [
18
+ {
19
+ name: 'plone-components-css',
20
+ component: InjectPloneComponentsCSS,
21
+ predicates: [onlyCMSUI],
22
+ },
23
+ ],
5
24
  belowContent: [
6
25
  {
7
26
  name: 'tags',
@@ -16,6 +16,7 @@ import {
16
16
  endEventDateRangeValidator,
17
17
  patternValidator,
18
18
  defaultLanguageControlPanelValidator,
19
+ sizeValidator,
19
20
  } from '@plone/volto/helpers/FormValidation/validators';
20
21
 
21
22
  const registerValidators = (config: ConfigType) => {
@@ -33,6 +34,13 @@ const registerValidators = (config: ConfigType) => {
33
34
  method: maxLengthValidator,
34
35
  });
35
36
 
37
+ config.registerUtility({
38
+ name: 'size',
39
+ type: 'validator',
40
+ dependencies: { fieldType: 'object' },
41
+ method: sizeValidator,
42
+ });
43
+
36
44
  config.registerUtility({
37
45
  name: 'pattern',
38
46
  type: 'validator',
@@ -148,3 +148,4 @@ export const GET_NAVROOT = 'GET_NAVROOT';
148
148
  export const SET_FORM_DATA = 'SET_FORM_DATA';
149
149
  export const SET_UI_STATE = 'SET_UI_STATE';
150
150
  export const UPDATE_UPLOADED_FILES = 'UPDATE_UPLOADED_FILES';
151
+ export const GET_BLOCKTYPES_INDEX = 'GET_BLOCKTYPES_INDEX';
@@ -10,8 +10,16 @@ import querystring from 'querystring';
10
10
  import { parse as parseUrl } from 'url';
11
11
 
12
12
  const filter = function (pathname, req) {
13
- // This is the proxy to the API in case the accept header is 'application/json'
14
- return config.settings.devProxyToApiPath && pathname.startsWith('/++api++');
13
+ // Check if pathname is defined, there are some corner cases that pathname is null
14
+ if (pathname) {
15
+ // This is the proxy to the API in case the accept header is 'application/json'
16
+ return (
17
+ config.settings.devProxyToApiPath &&
18
+ pathname.startsWith(`${config.settings.subpathPrefix}/++api++`)
19
+ );
20
+ } else {
21
+ return false;
22
+ }
15
23
  };
16
24
 
17
25
  let _env = null;
@@ -73,17 +81,26 @@ export default function devProxyMiddleware() {
73
81
  },
74
82
  pathRewrite: (path, req) => {
75
83
  const { apiPathURL, instancePath } = getEnv();
84
+ const vhSubpath = config.settings.subpathPrefix
85
+ ? config.settings.subpathPrefix
86
+ .split('/')
87
+ .filter(Boolean)
88
+ .map((part) => '/_vh_' + part)
89
+ .join('')
90
+ : '';
91
+ const port =
92
+ apiPathURL.port || (apiPathURL.protocol === 'https:' ? 443 : 80);
76
93
  const target =
77
94
  config.settings.proxyRewriteTarget ||
78
95
  `/VirtualHostBase/${apiPathURL.protocol.slice(0, -1)}/${
79
96
  apiPathURL.hostname
80
- }:${apiPathURL.port}${instancePath}/++api++/VirtualHostRoot`;
97
+ }:${port}${instancePath}/++api++/VirtualHostRoot${vhSubpath}`;
81
98
 
82
- return `${target}${path.replace('/++api++', '')}`;
99
+ return `${target}${path.replace(`${config.settings.subpathPrefix}/++api++`, '')}`;
83
100
  },
101
+ changeOrigin: true,
84
102
  logLevel: process.env.DEBUG_HPM ? 'debug' : 'silent',
85
103
  ...(process.env.RAZZLE_DEV_PROXY_INSECURE && {
86
- changeOrigin: true,
87
104
  secure: false,
88
105
  }),
89
106
  });
@@ -3,6 +3,7 @@ import { getAPIResourceWithAuth } from '@plone/volto/helpers/Api/APIResourceWith
3
3
 
4
4
  const HEADERS = [
5
5
  'accept-ranges',
6
+ 'cache-status',
6
7
  'cache-control',
7
8
  'content-disposition',
8
9
  'content-range',
@@ -0,0 +1,59 @@
1
+ import filesMiddleware from './files';
2
+ import { getAPIResourceWithAuth } from '@plone/volto/helpers/Api/APIResourceWithAuth';
3
+
4
+ vi.mock('@plone/volto/helpers/Api/APIResourceWithAuth', () => ({
5
+ getAPIResourceWithAuth: vi.fn(),
6
+ }));
7
+
8
+ describe('files middleware', () => {
9
+ it('handles requests containing @@download and forwards headers/body', async () => {
10
+ getAPIResourceWithAuth.mockResolvedValue({
11
+ headers: {
12
+ 'content-type': 'text/plain',
13
+ 'cache-status': 'Souin; hit; ttl=664',
14
+ },
15
+ body: 'OK',
16
+ get(name) {
17
+ return this.headers[name];
18
+ },
19
+ statusCode: 200,
20
+ });
21
+
22
+ const mw = filesMiddleware();
23
+ const layer = mw.stack.find(
24
+ (l) => l.regexp && l.regexp.source.includes('@@download'),
25
+ );
26
+ expect(layer).toBeTruthy();
27
+
28
+ const req = {
29
+ path: '/some/@@download',
30
+ method: 'GET',
31
+ app: { locals: {} },
32
+ };
33
+ const res = {
34
+ headers: {},
35
+ set(name, val) {
36
+ this.headers[name] = val;
37
+ },
38
+ status(code) {
39
+ this.statusCode = code;
40
+ return this;
41
+ },
42
+ send(body) {
43
+ this.body = body;
44
+ },
45
+ };
46
+
47
+ // invoke the middleware handler for that layer
48
+ layer.handle(req, res, (err) => {
49
+ if (err) throw err;
50
+ });
51
+
52
+ await new Promise(process.nextTick);
53
+
54
+ expect(res.body).toBe('OK');
55
+ expect(res.statusCode).toBe(200);
56
+ expect(res.headers['content-type']).toBe('text/plain');
57
+ expect(res.headers['cache-status']).toBe('Souin; hit; ttl=664');
58
+ });
59
+ });
@@ -4,6 +4,7 @@ import { getAPIResourceWithAuth } from '@plone/volto/helpers/Api/APIResourceWith
4
4
  const HEADERS = [
5
5
  'content-type',
6
6
  'content-disposition',
7
+ 'cache-status',
7
8
  'cache-control',
8
9
  'x-sendfile',
9
10
  'x-accel-redirect',