@plone/volto 19.0.0-alpha.9 → 19.0.0

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 (527) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc +26 -15
  3. package/AGENTS.md +47 -0
  4. package/CHANGELOG.md +525 -12
  5. package/README.md +22 -19
  6. package/babel.js +1 -9
  7. package/cypress/support/guillotina.js +1 -0
  8. package/cypress.config.js +1 -0
  9. package/global-test-setup.js +1 -2
  10. package/locales/af/LC_MESSAGES/volto.po +5516 -0
  11. package/locales/af.json +1 -1
  12. package/locales/ar/LC_MESSAGES/volto.po +5516 -0
  13. package/locales/ar.json +1 -1
  14. package/locales/bg/LC_MESSAGES/volto.po +5516 -0
  15. package/locales/bg.json +1 -1
  16. package/locales/bn/LC_MESSAGES/volto.po +5516 -0
  17. package/locales/bn.json +1 -1
  18. package/locales/ca/LC_MESSAGES/volto.po +546 -354
  19. package/locales/ca.json +1 -1
  20. package/locales/cs/LC_MESSAGES/volto.po +5516 -0
  21. package/locales/cs.json +1 -1
  22. package/locales/cy/LC_MESSAGES/volto.po +5516 -0
  23. package/locales/cy.json +1 -1
  24. package/locales/da/LC_MESSAGES/volto.po +5516 -0
  25. package/locales/da.json +1 -1
  26. package/locales/de/LC_MESSAGES/volto.po +217 -24
  27. package/locales/de.json +1 -1
  28. package/locales/el/LC_MESSAGES/volto.po +5516 -0
  29. package/locales/el.json +1 -1
  30. package/locales/en/LC_MESSAGES/volto.po +206 -10
  31. package/locales/en.json +1 -1
  32. package/locales/en_AU/LC_MESSAGES/volto.po +5516 -0
  33. package/locales/en_AU.json +1 -1
  34. package/locales/en_GB/LC_MESSAGES/volto.po +5516 -0
  35. package/locales/en_GB.json +1 -1
  36. package/locales/eo/LC_MESSAGES/volto.po +5516 -0
  37. package/locales/eo.json +1 -1
  38. package/locales/es/LC_MESSAGES/volto.po +331 -140
  39. package/locales/es.json +1 -1
  40. package/locales/et/LC_MESSAGES/volto.po +5516 -0
  41. package/locales/et.json +1 -1
  42. package/locales/eu/LC_MESSAGES/volto.po +408 -217
  43. package/locales/eu.json +1 -1
  44. package/locales/fa/LC_MESSAGES/volto.po +5516 -0
  45. package/locales/fa.json +1 -1
  46. package/locales/fi/LC_MESSAGES/volto.po +207 -15
  47. package/locales/fi.json +1 -1
  48. package/locales/fr/LC_MESSAGES/volto.po +364 -173
  49. package/locales/fr.json +1 -1
  50. package/locales/fu/LC_MESSAGES/volto.po +5516 -0
  51. package/locales/fu.json +1 -1
  52. package/locales/gl/LC_MESSAGES/volto.po +5516 -0
  53. package/locales/gl.json +1 -1
  54. package/locales/he/LC_MESSAGES/volto.po +5516 -0
  55. package/locales/he.json +1 -1
  56. package/locales/hi/LC_MESSAGES/volto.po +215 -18
  57. package/locales/hi.json +1 -1
  58. package/locales/hr/LC_MESSAGES/volto.po +5516 -0
  59. package/locales/hr.json +1 -1
  60. package/locales/hu/LC_MESSAGES/volto.po +5516 -0
  61. package/locales/hu.json +1 -1
  62. package/locales/hy/LC_MESSAGES/volto.po +5516 -0
  63. package/locales/hy.json +1 -1
  64. package/locales/id/LC_MESSAGES/volto.po +5516 -0
  65. package/locales/id.json +1 -1
  66. package/locales/it/LC_MESSAGES/volto.po +231 -34
  67. package/locales/it.json +1 -1
  68. package/locales/ja/LC_MESSAGES/volto.po +249 -56
  69. package/locales/ja.json +1 -1
  70. package/locales/ka/LC_MESSAGES/volto.po +5516 -0
  71. package/locales/ka.json +1 -1
  72. package/locales/kn/LC_MESSAGES/volto.po +5516 -0
  73. package/locales/kn.json +1 -1
  74. package/locales/ko/LC_MESSAGES/volto.po +5516 -0
  75. package/locales/ko.json +1 -1
  76. package/locales/lt/LC_MESSAGES/volto.po +5516 -0
  77. package/locales/lt.json +1 -1
  78. package/locales/lv/LC_MESSAGES/volto.po +5516 -0
  79. package/locales/lv.json +1 -1
  80. package/locales/mi/LC_MESSAGES/volto.po +5516 -0
  81. package/locales/mi.json +1 -1
  82. package/locales/mk/LC_MESSAGES/volto.po +5516 -0
  83. package/locales/mk.json +1 -1
  84. package/locales/my/LC_MESSAGES/volto.po +5516 -0
  85. package/locales/my.json +1 -1
  86. package/locales/nb_NO/LC_MESSAGES/volto.po +5516 -0
  87. package/locales/nb_NO.json +1 -1
  88. package/locales/nl/LC_MESSAGES/volto.po +259 -66
  89. package/locales/nl.json +1 -1
  90. package/locales/nn/LC_MESSAGES/volto.po +5516 -0
  91. package/locales/nn.json +1 -1
  92. package/locales/pl/LC_MESSAGES/volto.po +5516 -0
  93. package/locales/pl.json +1 -1
  94. package/locales/pt/LC_MESSAGES/volto.po +858 -666
  95. package/locales/pt.json +1 -1
  96. package/locales/pt_BR/LC_MESSAGES/volto.po +211 -20
  97. package/locales/pt_BR.json +1 -1
  98. package/locales/rm/LC_MESSAGES/volto.po +5516 -0
  99. package/locales/rm.json +1 -1
  100. package/locales/ro/LC_MESSAGES/volto.po +243 -52
  101. package/locales/ro.json +1 -1
  102. package/locales/ru/LC_MESSAGES/volto.po +206 -14
  103. package/locales/ru.json +1 -1
  104. package/locales/sk/LC_MESSAGES/volto.po +5516 -0
  105. package/locales/sk.json +1 -1
  106. package/locales/sl/LC_MESSAGES/volto.po +5516 -0
  107. package/locales/sl.json +1 -1
  108. package/locales/sm/LC_MESSAGES/volto.po +5516 -0
  109. package/locales/sm.json +1 -1
  110. package/locales/sq/LC_MESSAGES/volto.po +5516 -0
  111. package/locales/sq.json +1 -1
  112. package/locales/sr/LC_MESSAGES/volto.po +5516 -0
  113. package/locales/sr.json +1 -1
  114. package/locales/sr@cyrl/LC_MESSAGES/volto.po +5516 -0
  115. package/locales/sr@cyrl.json +1 -1
  116. package/locales/sr@latn/LC_MESSAGES/volto.po +5516 -0
  117. package/locales/sr@latn.json +1 -1
  118. package/locales/sv/LC_MESSAGES/volto.po +5516 -0
  119. package/locales/sv.json +1 -1
  120. package/locales/ta/LC_MESSAGES/volto.po +5516 -0
  121. package/locales/ta.json +1 -1
  122. package/locales/te/LC_MESSAGES/volto.po +5516 -0
  123. package/locales/te.json +1 -1
  124. package/locales/th/LC_MESSAGES/volto.po +5516 -0
  125. package/locales/th.json +1 -1
  126. package/locales/to/LC_MESSAGES/volto.po +5516 -0
  127. package/locales/to.json +1 -1
  128. package/locales/tr/LC_MESSAGES/volto.po +5516 -0
  129. package/locales/tr.json +1 -1
  130. package/locales/uk/LC_MESSAGES/volto.po +5516 -0
  131. package/locales/uk.json +1 -1
  132. package/locales/vi/LC_MESSAGES/volto.po +5516 -0
  133. package/locales/vi.json +1 -1
  134. package/locales/volto.pot +200 -9
  135. package/locales/zh_CN/LC_MESSAGES/volto.po +206 -14
  136. package/locales/zh_CN.json +1 -1
  137. package/locales/zh_Hant/LC_MESSAGES/volto.po +5516 -0
  138. package/locales/zh_Hant.json +1 -1
  139. package/locales/zh_Hant_HK/LC_MESSAGES/volto.po +5516 -0
  140. package/locales/zh_Hant_HK.json +1 -1
  141. package/package.json +69 -146
  142. package/razzle.config.js +16 -25
  143. package/src/actions/blockTypes/blockTypes.ts +24 -0
  144. package/src/actions/controlpanels/controlpanels.js +7 -12
  145. package/src/actions/controlpanels/controlpanels.test.js +2 -3
  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/Add/Add.test.jsx +10 -3
  149. package/src/components/manage/Aliases/Aliases.test.jsx +5 -2
  150. package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -10
  151. package/src/components/manage/Blocks/Block/BlocksForm.jsx +10 -7
  152. package/src/components/manage/Blocks/Block/BlocksForm.test.jsx +3 -14
  153. package/src/components/manage/Blocks/Block/Edit.jsx +19 -10
  154. package/src/components/manage/Blocks/Block/Order/Item.jsx +33 -14
  155. package/src/components/manage/Blocks/Block/Order/Item.test.jsx +90 -0
  156. package/src/components/manage/Blocks/Block/Order/Order.jsx +116 -67
  157. package/src/components/manage/Blocks/Block/Order/utilities.js +28 -11
  158. package/src/components/manage/Blocks/Block/Settings.test.jsx +1 -5
  159. package/src/components/manage/Blocks/Grid/View.jsx +14 -11
  160. package/src/components/manage/Blocks/Grid/context.js +3 -0
  161. package/src/components/manage/Blocks/HTML/Edit.test.jsx +1 -5
  162. package/src/components/manage/Blocks/Image/ImageSidebar.test.jsx +2 -5
  163. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +2 -5
  164. package/src/components/manage/Blocks/Listing/Edit.jsx +1 -0
  165. package/src/components/manage/Blocks/Listing/ListingBody.jsx +4 -0
  166. package/src/components/manage/Blocks/Maps/MapsSidebar.test.jsx +1 -5
  167. package/src/components/manage/Blocks/Search/components/DateRangeFacet.test.jsx +1 -6
  168. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +22 -1
  169. package/src/components/manage/Blocks/Search/components/SelectFacet.test.jsx +1 -6
  170. package/src/components/manage/Blocks/Search/components/SortOn.jsx +8 -2
  171. package/src/components/manage/Blocks/Search/components/ToggleFacet.jsx +14 -0
  172. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +10 -2
  173. package/src/components/manage/Blocks/Teaser/View.jsx +0 -1
  174. package/src/components/manage/Blocks/Teaser/utils.js +13 -0
  175. package/src/components/manage/Blocks/Teaser/utils.test.js +34 -0
  176. package/src/components/manage/Blocks/Title/Edit.jsx +5 -0
  177. package/src/components/manage/Blocks/Video/Body.jsx +69 -43
  178. package/src/components/manage/Blocks/Video/Body.test.jsx +122 -5
  179. package/src/components/manage/Blocks/Video/Edit.jsx +20 -2
  180. package/src/components/manage/Blocks/Video/Edit.test.jsx +6 -0
  181. package/src/components/manage/Blocks/Video/VideoSidebar.test.jsx +1 -5
  182. package/src/components/manage/Blocks/Video/View.jsx +1 -0
  183. package/src/components/manage/Blocks/Video/View.test.jsx +29 -15
  184. package/src/components/manage/Blocks/Video/schema.js +14 -1
  185. package/src/components/manage/Contents/Contents.jsx +854 -747
  186. package/src/components/manage/Contents/Contents.test.jsx +9 -10
  187. package/src/components/manage/Contents/ContentsBreadcrumbs.jsx +4 -3
  188. package/src/components/manage/Contents/ContentsIndexHeader.jsx +47 -81
  189. package/src/components/manage/Contents/ContentsIndexHeader.test.jsx +10 -3
  190. package/src/components/manage/Contents/ContentsItem.jsx +226 -278
  191. package/src/components/manage/Contents/ContentsItem.test.jsx +10 -6
  192. package/src/components/manage/Contents/ContentsPropertiesModal.test.jsx +1 -5
  193. package/src/components/manage/Contents/ContentsRenameModal.test.jsx +1 -5
  194. package/src/components/manage/Contents/ContentsTagsModal.test.jsx +1 -5
  195. package/src/components/manage/Contents/ContentsWorkflowModal.test.jsx +1 -5
  196. package/src/components/manage/Contents/DropZoneContent.jsx +339 -0
  197. package/src/components/manage/Contents/__mocks__/index.tsx +2 -18
  198. package/src/components/manage/Controlpanels/AddonsControlpanel.jsx +7 -0
  199. package/src/components/manage/Controlpanels/AddonsControlpanel.test.jsx +7 -4
  200. package/src/components/manage/Controlpanels/Aliases.test.jsx +8 -9
  201. package/src/components/manage/Controlpanels/BlockType.tsx +165 -0
  202. package/src/components/manage/Controlpanels/BlockTypes.tsx +145 -0
  203. package/src/components/manage/Controlpanels/ContentType.jsx +131 -222
  204. package/src/components/manage/Controlpanels/ContentType.test.jsx +13 -14
  205. package/src/components/manage/Controlpanels/ContentTypeLayout.test.jsx +12 -9
  206. package/src/components/manage/Controlpanels/ContentTypeSchema.jsx +1 -1
  207. package/src/components/manage/Controlpanels/ContentTypes.jsx +9 -2
  208. package/src/components/manage/Controlpanels/ContentTypes.test.jsx +7 -4
  209. package/src/components/manage/Controlpanels/Controlpanel.jsx +122 -218
  210. package/src/components/manage/Controlpanels/Controlpanel.test.jsx +8 -33
  211. package/src/components/manage/Controlpanels/Controlpanels.jsx +28 -5
  212. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +23 -8
  213. package/src/components/manage/Controlpanels/DatabaseInformation.jsx +9 -0
  214. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.test.jsx +7 -4
  215. package/src/components/manage/Controlpanels/ModerateComments.jsx +8 -0
  216. package/src/components/manage/Controlpanels/ModerateComments.test.jsx +7 -4
  217. package/src/components/manage/Controlpanels/Relations/Relations.jsx +1 -1
  218. package/src/components/manage/Controlpanels/Rules/AddRule.test.jsx +8 -9
  219. package/src/components/manage/Controlpanels/Rules/ConfigureRule.test.jsx +9 -6
  220. package/src/components/manage/Controlpanels/Rules/EditRule.test.jsx +8 -9
  221. package/src/components/manage/Controlpanels/Rules/Rules.test.jsx +7 -4
  222. package/src/components/manage/Controlpanels/UndoControlpanel.test.jsx +8 -9
  223. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.test.jsx +10 -4
  224. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +628 -631
  225. package/src/components/manage/Controlpanels/Users/UsersControlpanel.ssr.test.jsx +624 -0
  226. package/src/components/manage/Controlpanels/Users/UsersControlpanel.test.jsx +70 -10
  227. package/src/components/manage/Delete/Delete.test.jsx +13 -8
  228. package/src/components/manage/Diff/Diff.jsx +201 -298
  229. package/src/components/manage/Diff/Diff.test.jsx +8 -10
  230. package/src/components/manage/Diff/DiffField.test.jsx +1 -6
  231. package/src/components/manage/Display/Display.test.jsx +2 -11
  232. package/src/components/manage/Edit/Edit.test.jsx +12 -11
  233. package/src/components/manage/Form/BlockDataForm.test.jsx +1 -5
  234. package/src/components/manage/Form/Field.jsx +1 -69
  235. package/src/components/manage/Form/Form.jsx +17 -4
  236. package/src/components/manage/Form/Form.test.jsx +130 -5
  237. package/src/components/manage/Form/InlineForm.test.jsx +1 -5
  238. package/src/components/manage/Form/ModalForm.jsx +175 -97
  239. package/src/components/manage/Form/ModalForm.test.jsx +27 -5
  240. package/src/components/manage/Form/__mocks__/index.tsx +9 -27
  241. package/src/components/manage/History/History.test.jsx +15 -8
  242. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +7 -4
  243. package/src/components/manage/Multilingual/CompareLanguages.jsx +6 -6
  244. package/src/components/manage/Multilingual/CreateTranslation.jsx +16 -13
  245. package/src/components/manage/Multilingual/ManageTranslations.jsx +5 -5
  246. package/src/components/manage/Multilingual/ManageTranslations.test.jsx +15 -12
  247. package/src/components/manage/Multilingual/TranslationObject.jsx +11 -8
  248. package/src/components/manage/Preferences/ChangePassword.test.jsx +8 -9
  249. package/src/components/manage/Preferences/PersonalPreferences.jsx +8 -5
  250. package/src/components/manage/Preferences/PersonalPreferences.test.jsx +10 -23
  251. package/src/components/manage/Rules/Rules.test.jsx +5 -2
  252. package/src/components/manage/Sharing/Sharing.jsx +21 -15
  253. package/src/components/manage/Sharing/Sharing.test.jsx +9 -6
  254. package/src/components/manage/Sidebar/ObjectBrowser.jsx +10 -0
  255. package/src/components/manage/Sidebar/ObjectBrowserBody.jsx +25 -5
  256. package/src/components/manage/Sidebar/ObjectBrowserBody.test.jsx +52 -0
  257. package/src/components/manage/Sidebar/Sidebar.jsx +2 -0
  258. package/src/components/manage/Sidebar/Sidebar.test.jsx +4 -1
  259. package/src/components/manage/Sidebar/SidebarPortal.test.tsx +42 -0
  260. package/src/components/manage/Sidebar/SidebarPortal.tsx +48 -0
  261. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +1 -0
  262. package/src/components/manage/Toast/Toast.jsx +32 -0
  263. package/src/components/manage/Toast/Toast.test.jsx +9 -5
  264. package/src/components/manage/Toolbar/PersonalTools.test.jsx +15 -0
  265. package/src/components/manage/Toolbar/Toolbar.jsx +103 -11
  266. package/src/components/manage/Toolbar/Toolbar.test.jsx +15 -10
  267. package/src/components/manage/Toolbar/Types.crash.test.jsx +48 -0
  268. package/src/components/manage/Toolbar/Types.jsx +6 -4
  269. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +16 -0
  270. package/src/components/manage/UniversalLink/UniversalLink.tsx +1 -0
  271. package/src/components/manage/Widgets/AlignWidget.stories.jsx +9 -0
  272. package/src/components/manage/Widgets/AlignWidget.test.tsx +95 -0
  273. package/src/components/manage/Widgets/{AlignWidget.jsx → AlignWidget.tsx} +23 -7
  274. package/src/components/manage/Widgets/ArrayWidget.jsx +111 -88
  275. package/src/components/manage/Widgets/ArrayWidget.test.jsx +1 -12
  276. package/src/components/manage/Widgets/BlockAlignment.stories.tsx +104 -0
  277. package/src/components/manage/Widgets/BlockAlignment.test.tsx +104 -0
  278. package/src/components/manage/Widgets/BlockAlignment.tsx +88 -0
  279. package/src/components/manage/Widgets/BlockWidth.stories.tsx +69 -0
  280. package/src/components/manage/Widgets/BlockWidth.test.tsx +62 -0
  281. package/src/components/manage/Widgets/BlockWidth.tsx +101 -0
  282. package/src/components/manage/Widgets/ButtonsWidget.stories.jsx +61 -0
  283. package/src/components/manage/Widgets/ButtonsWidget.test.tsx +138 -0
  284. package/src/components/manage/Widgets/ButtonsWidget.tsx +195 -0
  285. package/src/components/manage/Widgets/CheckboxGroupWidget.test.jsx +1 -6
  286. package/src/components/manage/Widgets/DatetimeWidget.jsx +98 -54
  287. package/src/components/manage/Widgets/DatetimeWidget.test.jsx +56 -6
  288. package/src/components/manage/Widgets/FileWidget.jsx +7 -0
  289. package/src/components/manage/Widgets/FormFieldWrapper.jsx +143 -163
  290. package/src/components/manage/Widgets/ImageWidget.jsx +18 -5
  291. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +6 -0
  292. package/src/components/manage/Widgets/ObjectListWidget.test.jsx +2 -11
  293. package/src/components/manage/Widgets/ObjectWidget.test.jsx +1 -5
  294. package/src/components/manage/Widgets/QueryWidget.jsx +137 -9
  295. package/src/components/manage/Widgets/QuerystringWidget.test.jsx +3 -1
  296. package/src/components/manage/Widgets/RadioGroupWidget.test.jsx +1 -6
  297. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.test.jsx +1 -6
  298. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +56 -50
  299. package/src/components/manage/Widgets/RegistryImageWidget.jsx +1 -1
  300. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +1 -0
  301. package/src/components/manage/Widgets/SchemaWidget.test.jsx +1 -6
  302. package/src/components/manage/Widgets/SchemaWidgetFieldset.test.jsx +1 -6
  303. package/src/components/manage/Widgets/SelectAutoComplete.test.jsx +1 -6
  304. package/src/components/manage/Widgets/SelectStyling.jsx +52 -20
  305. package/src/components/manage/Widgets/SelectWidget.test.jsx +1 -6
  306. package/src/components/manage/Widgets/Size.stories.tsx +69 -0
  307. package/src/components/manage/Widgets/Size.test.tsx +59 -0
  308. package/src/components/manage/Widgets/Size.tsx +78 -0
  309. package/src/components/manage/Widgets/TextWidget.jsx +4 -0
  310. package/src/components/manage/Widgets/TimeWidget.test.jsx +1 -6
  311. package/src/components/manage/Widgets/TokenWidget.jsx +142 -186
  312. package/src/components/manage/Widgets/TokenWidget.test.jsx +1 -6
  313. package/src/components/manage/Widgets/UrlWidget.jsx +47 -18
  314. package/src/components/manage/Widgets/VocabularyTermsWidget.test.jsx +2 -11
  315. package/src/components/manage/Widgets/__mocks__/index.tsx +33 -51
  316. package/src/components/manage/Widgets/index.tsx +21 -0
  317. package/src/components/manage/Workflow/Workflow.test.jsx +2 -11
  318. package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.jsx +1 -0
  319. package/src/components/theme/AlternateHrefLangs/AlternateHrefLangs.test.jsx +30 -0
  320. package/src/components/theme/App/App.jsx +5 -1
  321. package/src/components/theme/App/App.test.jsx +13 -10
  322. package/src/components/theme/Comments/CommentEditModal.test.jsx +1 -5
  323. package/src/components/theme/Comments/Comments.test.jsx +2 -11
  324. package/src/components/theme/ConnectionRefused/ConnectionRefused.jsx +3 -2
  325. package/src/components/theme/ContactForm/ContactForm.test.jsx +14 -13
  326. package/src/components/theme/Image/Image.jsx +14 -5
  327. package/src/components/theme/Image/Image.test.jsx +247 -146
  328. package/src/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.tsx +7 -0
  329. package/src/components/theme/LanguageSelector/LanguageSelector.tsx +3 -3
  330. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +42 -12
  331. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.test.jsx +6 -3
  332. package/src/components/theme/PasswordReset/PasswordReset.jsx +108 -191
  333. package/src/components/theme/PasswordReset/RequestPasswordReset.test.jsx +1 -5
  334. package/src/components/theme/Register/Register.test.jsx +1 -5
  335. package/src/components/theme/Search/Search.jsx +230 -327
  336. package/src/components/theme/Search/Search.test.jsx +14 -14
  337. package/src/components/theme/Sitemap/Sitemap.jsx +22 -30
  338. package/src/components/theme/Sitemap/Sitemap.stories.jsx +82 -0
  339. package/src/components/theme/Sitemap/Sitemap.test.jsx +18 -0
  340. package/src/components/theme/SlotRenderer/SlotRenderer.tsx +12 -6
  341. package/src/components/theme/Unauthorized/Unauthorized.jsx +27 -24
  342. package/src/components/theme/Unauthorized/Unauthorized.test.jsx +31 -2
  343. package/src/components/theme/VideoEmbed/VideoEmbed.jsx +100 -0
  344. package/src/components/theme/View/EventDatesInfo.test.jsx +1 -6
  345. package/src/components/theme/View/EventView.stories.jsx +89 -0
  346. package/src/components/theme/View/EventView.test.jsx +1 -6
  347. package/src/components/theme/View/FileView.stories.jsx +50 -0
  348. package/src/components/theme/View/ImageView.jsx +2 -1
  349. package/src/components/theme/View/ImageView.test.jsx +3 -0
  350. package/src/components/theme/View/LinkView.stories.jsx +57 -0
  351. package/src/components/theme/View/ListingView.stories.jsx +70 -0
  352. package/src/components/theme/View/NewsItemView.stories.jsx +58 -0
  353. package/src/components/theme/View/RenderBlocks.jsx +8 -10
  354. package/src/components/theme/View/RenderBlocks.stories.jsx +112 -0
  355. package/src/components/theme/View/RenderBlocks.test.jsx +14 -4
  356. package/src/components/theme/View/SummaryView.stories.jsx +71 -0
  357. package/src/components/theme/View/TabularView.stories.jsx +66 -0
  358. package/src/components/theme/View/View.jsx +8 -1
  359. package/src/components/theme/View/View.test.jsx +37 -24
  360. package/src/components/theme/Widgets/DateWidget.jsx +4 -5
  361. package/src/components/theme/Widgets/DatetimeWidget.jsx +4 -5
  362. package/src/components/theme/Widgets/ImageWidget.test.jsx +31 -11
  363. package/src/components/theme/Widgets/RichTextWidget.jsx +1 -1
  364. package/src/config/Blocks.jsx +3 -0
  365. package/src/config/ControlPanels.js +2 -0
  366. package/src/config/Loadables.jsx +1 -5
  367. package/src/config/Widgets.jsx +7 -0
  368. package/src/config/index.js +10 -1
  369. package/src/config/slots.js +19 -0
  370. package/src/config/validation.ts +8 -0
  371. package/src/constants/ActionTypes.js +1 -0
  372. package/src/express-middleware/devproxy.js +3 -1
  373. package/src/express-middleware/files.js +1 -0
  374. package/src/express-middleware/files.test.js +59 -0
  375. package/src/express-middleware/images.js +1 -0
  376. package/src/express-middleware/images.test.js +50 -0
  377. package/src/helpers/Api/Api.js +2 -2
  378. package/src/helpers/AuthToken/AuthToken.js +1 -6
  379. package/src/helpers/Blocks/Blocks.js +113 -28
  380. package/src/helpers/Blocks/Blocks.test.js +100 -0
  381. package/src/helpers/Content/Content.js +23 -0
  382. package/src/helpers/Content/Content.test.js +39 -0
  383. package/src/helpers/Extensions/withBlockSchemaEnhancer.jsx +4 -1
  384. package/src/helpers/FormValidation/FormValidation.test.js +31 -0
  385. package/src/helpers/FormValidation/validators.ts +52 -6
  386. package/src/helpers/I18n/I18n.test.ts +44 -0
  387. package/src/helpers/I18n/I18n.ts +31 -0
  388. package/src/helpers/Loadable/__mocks__/Loadable.jsx +7 -22
  389. package/src/helpers/MessageLabels/MessageLabels.js +5 -0
  390. package/src/helpers/Robots/Robots.js +1 -1
  391. package/src/helpers/Robots/Robots.test.js +34 -0
  392. package/src/helpers/Url/Url.js +1 -0
  393. package/src/helpers/Utils/Date.js +26 -1
  394. package/src/helpers/Utils/Date.test.js +237 -0
  395. package/src/helpers/Utils/Utils.jsx +17 -0
  396. package/src/helpers/Utils/Utils.test.jsx +39 -0
  397. package/src/helpers/Utils/withSaveAsDraft.jsx +33 -9
  398. package/src/helpers/index.js +1 -0
  399. package/src/hooks/user/useUser.js +1 -1
  400. package/src/internalChecks.test.ts +11 -0
  401. package/src/middleware/api.js +14 -5
  402. package/src/reducers/blockTypes/blockTypes.js +38 -0
  403. package/src/reducers/content/content.js +3 -18
  404. package/src/reducers/diff/diff.js +5 -1
  405. package/src/reducers/diff/diff.test.js +60 -4
  406. package/src/reducers/index.js +2 -0
  407. package/src/reducers/querystring/querystring.js +8 -1
  408. package/src/reducers/users/users.js +1 -1
  409. package/src/routes.js +10 -0
  410. package/src/server.jsx +14 -6
  411. package/src/start-client.jsx +21 -3
  412. package/test-addons-loader.js +3 -0
  413. package/test-setup-globals.js +56 -2
  414. package/theme/themes/default/elements/segment.variables +9 -16
  415. package/theme/themes/default/globals/site.variables +3 -3
  416. package/theme/themes/pastanaga/collections/form.overrides +22 -1
  417. package/theme/themes/pastanaga/elements/button.overrides +30 -3
  418. package/theme/themes/pastanaga/elements/segment.variables +1 -4
  419. package/theme/themes/pastanaga/extras/block-types.less +17 -0
  420. package/theme/themes/pastanaga/extras/contents.less +63 -4
  421. package/theme/themes/pastanaga/extras/main.less +16 -4
  422. package/theme/themes/pastanaga/extras/toolbar.less +10 -5
  423. package/theme/themes/pastanaga/extras/videoembed.less +22 -0
  424. package/theme/themes/pastanaga/extras/widgets.less +79 -0
  425. package/theme/themes/pastanaga/globals/site.variables +0 -3
  426. package/tsconfig.declarations.json +1 -1
  427. package/tsconfig.json +1 -1
  428. package/types/actions/blockTypes/blockTypes.d.ts +7 -0
  429. package/types/components/index.d.ts +1 -1
  430. package/types/components/manage/Blocks/Block/Order/Item.test.d.ts +1 -0
  431. package/types/components/manage/Blocks/Block/Order/utilities.d.ts +2 -1
  432. package/types/components/manage/Blocks/Grid/context.d.ts +1 -0
  433. package/types/components/manage/Blocks/Teaser/utils.d.ts +5 -0
  434. package/types/components/manage/Blocks/Video/Body.d.ts +4 -2
  435. package/types/components/manage/Blocks/Video/schema.d.ts +4 -0
  436. package/types/components/manage/Contents/Contents.d.ts +1 -1
  437. package/types/components/manage/Contents/ContentsIndexHeader.d.ts +6 -11
  438. package/types/components/manage/Contents/ContentsItem.d.ts +3 -10
  439. package/types/components/manage/Contents/DropZoneContent.d.ts +2 -0
  440. package/types/components/manage/Contents/__mocks__/index.d.ts +2 -2
  441. package/types/components/manage/Controlpanels/BlockType.d.ts +7 -0
  442. package/types/components/manage/Controlpanels/BlockTypes.d.ts +7 -0
  443. package/types/components/manage/Controlpanels/ContentType.d.ts +2 -2
  444. package/types/components/manage/Controlpanels/Controlpanel.d.ts +2 -5
  445. package/types/components/manage/Controlpanels/Relations/RelationsMatrix.d.ts +1 -1
  446. package/types/components/manage/Controlpanels/Users/UsersControlpanel.ssr.test.d.ts +1 -0
  447. package/types/components/manage/Controlpanels/index.d.ts +2 -2
  448. package/types/components/manage/Diff/Diff.d.ts +7 -2
  449. package/types/components/manage/Form/__mocks__/index.d.ts +8 -8
  450. package/types/components/manage/Multilingual/ManageTranslations.d.ts +1 -1
  451. package/types/components/manage/Sidebar/ObjectBrowser.d.ts +1 -1
  452. package/types/components/manage/Sidebar/ObjectBrowserBody.test.d.ts +1 -0
  453. package/types/components/manage/Sidebar/SidebarPortal.d.ts +7 -15
  454. package/types/components/manage/Toolbar/Types.crash.test.d.ts +1 -0
  455. package/types/components/manage/Widgets/AlignWidget.d.ts +8 -10
  456. package/types/components/manage/Widgets/AlignWidget.stories.d.ts +1 -0
  457. package/types/components/manage/Widgets/BlockAlignment.d.ts +7 -0
  458. package/types/components/manage/Widgets/BlockAlignment.stories.d.ts +8 -0
  459. package/types/components/manage/Widgets/BlockWidth.d.ts +7 -0
  460. package/types/components/manage/Widgets/BlockWidth.stories.d.ts +6 -0
  461. package/types/components/manage/Widgets/ButtonsWidget.d.ts +48 -1
  462. package/types/components/manage/Widgets/ButtonsWidget.stories.d.ts +3 -0
  463. package/types/components/manage/Widgets/FormFieldWrapper.d.ts +28 -5
  464. package/types/components/manage/Widgets/ImageWidget.d.ts +1 -1
  465. package/types/components/manage/Widgets/InternalUrlWidget.d.ts +1 -1
  466. package/types/components/manage/Widgets/ObjectBrowserWidget.d.ts +2 -0
  467. package/types/components/manage/Widgets/QueryWidget.d.ts +5 -2
  468. package/types/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.d.ts +22 -5
  469. package/types/components/manage/Widgets/SelectStyling.d.ts +1 -0
  470. package/types/components/manage/Widgets/Size.d.ts +7 -0
  471. package/types/components/manage/Widgets/Size.stories.d.ts +6 -0
  472. package/types/components/manage/Widgets/UrlWidget.d.ts +1 -1
  473. package/types/components/manage/Widgets/__mocks__/index.d.ts +33 -33
  474. package/types/components/manage/Widgets/index.d.ts +11 -6
  475. package/types/components/theme/ConnectionRefused/ConnectionRefused.d.ts +2 -2
  476. package/types/components/theme/InjectPloneComponentsCSS/InjectPloneComponentsCSS.d.ts +3 -0
  477. package/types/components/theme/PasswordReset/PasswordReset.d.ts +6 -2
  478. package/types/components/theme/Search/Search.d.ts +1 -1
  479. package/types/components/theme/Sitemap/Sitemap.stories.d.ts +13 -0
  480. package/types/components/theme/SlotRenderer/SlotRenderer.d.ts +4 -5
  481. package/types/components/theme/Unauthorized/Unauthorized.d.ts +2 -2
  482. package/types/components/theme/VideoEmbed/VideoEmbed.d.ts +2 -0
  483. package/types/components/theme/View/EventView.stories.d.ts +19 -0
  484. package/types/components/theme/View/FileView.stories.d.ts +18 -0
  485. package/types/components/theme/View/LinkView.stories.d.ts +18 -0
  486. package/types/components/theme/View/ListingView.stories.d.ts +24 -0
  487. package/types/components/theme/View/NewsItemView.stories.d.ts +23 -0
  488. package/types/components/theme/View/RenderBlocks.stories.d.ts +23 -0
  489. package/types/components/theme/View/SummaryView.stories.d.ts +23 -0
  490. package/types/components/theme/View/TabularView.stories.d.ts +23 -0
  491. package/types/config/ControlPanels.d.ts +1 -0
  492. package/types/config/Views.d.ts +1 -1
  493. package/types/config/Widgets.d.ts +6 -0
  494. package/types/config/slots.d.ts +7 -0
  495. package/types/constants/ActionTypes.d.ts +1 -0
  496. package/types/helpers/Blocks/Blocks.d.ts +4 -0
  497. package/types/helpers/Content/Content.d.ts +7 -0
  498. package/types/helpers/Extensions/withBlockSchemaEnhancer.d.ts +4 -5
  499. package/types/helpers/FormValidation/validators.d.ts +18 -1
  500. package/types/helpers/I18n/I18n.d.ts +20 -0
  501. package/types/helpers/Loadable/__mocks__/Loadable.d.ts +2 -2
  502. package/types/helpers/MessageLabels/MessageLabels.d.ts +100 -94
  503. package/types/helpers/Utils/Utils.d.ts +1 -0
  504. package/types/helpers/index.d.ts +1 -0
  505. package/types/reducers/blockTypes/blockTypes.d.ts +16 -0
  506. package/types/reducers/index.d.ts +2 -0
  507. package/types/routes.d.ts +7 -5
  508. package/vitest.config.mjs +84 -42
  509. package/webpack-plugins/webpack-less-plugin.js +1 -1
  510. package/webpack-plugins/webpack-scss-plugin.js +172 -0
  511. package/jest-addons-loader.js +0 -3
  512. package/jest-extender-plugin.js +0 -39
  513. package/jest-setup-afterenv.js +0 -2
  514. package/jest-svgsystem-transform.js +0 -10
  515. package/patches/patchit.sh +0 -2
  516. package/patches/razzle-jest.patch +0 -10
  517. package/src/components/manage/Contents/__mocks__/index.vitest.tsx +0 -5
  518. package/src/components/manage/Form/__mocks__/index.vitest.tsx +0 -73
  519. package/src/components/manage/Sidebar/SidebarPortal.jsx +0 -47
  520. package/src/components/manage/Sidebar/SidebarPortal.test.jsx +0 -26
  521. package/src/components/manage/Widgets/AlignWidget.test.jsx +0 -59
  522. package/src/components/manage/Widgets/ButtonsWidget.jsx +0 -41
  523. package/src/components/manage/Widgets/ButtonsWidget.test.jsx +0 -70
  524. package/src/components/manage/Widgets/__mocks__/index.vitest.tsx +0 -41
  525. package/src/helpers/Loadable/__mocks__/Loadable.vitest.jsx +0 -39
  526. package/test-setup-globals-vitest.js +0 -46
  527. package/theme/themes/pastanaga/extras/utils.less +0 -63
@@ -1,8 +1,3 @@
1
- /**
2
- * Contents component.
3
- * @module components/manage/Contents/Contents
4
- */
5
-
6
1
  import React, { Component } from 'react';
7
2
  import PropTypes from 'prop-types';
8
3
  import { connect } from 'react-redux';
@@ -90,6 +85,7 @@ import sortUpSVG from '@plone/volto/icons/sort-up.svg';
90
85
  import downKeySVG from '@plone/volto/icons/down-key.svg';
91
86
  import moreSVG from '@plone/volto/icons/more.svg';
92
87
  import clearSVG from '@plone/volto/icons/clear.svg';
88
+ import DropzoneContent from './DropZoneContent';
93
89
 
94
90
  const messages = defineMessages({
95
91
  back: {
@@ -418,6 +414,7 @@ class Contents extends Component {
418
414
  isClient: false,
419
415
  };
420
416
  this.filterTimeout = null;
417
+ this.dragA11yRef = React.createRef();
421
418
  }
422
419
 
423
420
  /**
@@ -503,11 +500,17 @@ class Contents extends Component {
503
500
  }
504
501
 
505
502
  if (this.props.deleteRequest.loading && nextProps.deleteRequest.error) {
503
+ const deleteErrorMessageTitle = this.props.intl.formatMessage(
504
+ messages.deleteError,
505
+ );
506
+ const deleteErrorMessageContent =
507
+ nextProps.deleteRequest.error?.response?.body?.message ||
508
+ deleteErrorMessageTitle;
506
509
  this.props.toastify.toast.error(
507
510
  <Toast
508
511
  error
509
- title={this.props.intl.formatMessage(messages.deleteError)}
510
- content={this.props.intl.formatMessage(messages.deleteError)}
512
+ title={deleteErrorMessageTitle}
513
+ content={deleteErrorMessageContent}
511
514
  />,
512
515
  );
513
516
  }
@@ -689,16 +692,14 @@ class Contents extends Component {
689
692
  * @returns {undefined}
690
693
  */
691
694
  onOrderIndex(index, delta) {
695
+ const nextIndex = {
696
+ ...this.state.index,
697
+ order: move(this.state.index.order, index, index + delta),
698
+ };
692
699
  this.setState({
693
- index: {
694
- ...this.state.index,
695
- order: move(this.state.index.order, index, index + delta),
696
- },
700
+ index: nextIndex,
697
701
  });
698
- this.props.updateColumnsContent(
699
- getBaseUrl(this.props.pathname),
700
- this.state.index,
701
- );
702
+ this.props.updateColumnsContent(getBaseUrl(this.props.pathname), nextIndex);
702
703
  }
703
704
 
704
705
  /**
@@ -723,6 +724,81 @@ class Contents extends Component {
723
724
  }
724
725
  }
725
726
 
727
+ onDragStart = ({ active }) => {
728
+ this.dragSnapshot = {
729
+ type: active?.data?.current?.type,
730
+ items: this.state.items,
731
+ indexOrder: this.state.index.order,
732
+ };
733
+ };
734
+
735
+ onDragOver = ({ active, over }) => {
736
+ const activeType = active?.data?.current?.type;
737
+ const overType = over?.data?.current?.type;
738
+ if (!over || active.id === over.id || activeType !== overType) {
739
+ return;
740
+ }
741
+ if (activeType === 'item') {
742
+ const oldIndex = this.state.items.findIndex(
743
+ (item) => item['@id'] === active.id,
744
+ );
745
+ const newIndex = this.state.items.findIndex(
746
+ (item) => item['@id'] === over.id,
747
+ );
748
+ if (oldIndex !== -1 && newIndex !== -1 && oldIndex !== newIndex) {
749
+ this.onOrderItem(active.id, oldIndex, newIndex - oldIndex, false);
750
+ }
751
+ }
752
+ if (activeType === 'index') {
753
+ const activeIndexId = active.data.current.indexId;
754
+ const overIndexId = over.data.current.indexId;
755
+ const oldIndex = this.state.index.order.indexOf(activeIndexId);
756
+ const newIndex = this.state.index.order.indexOf(overIndexId);
757
+ if (oldIndex !== -1 && newIndex !== -1 && oldIndex !== newIndex) {
758
+ this.onOrderIndex(oldIndex, newIndex - oldIndex);
759
+ }
760
+ }
761
+ };
762
+
763
+ onDragEnd = ({ active, over }) => {
764
+ const activeType = active?.data?.current?.type;
765
+
766
+ if (!over || activeType !== over?.data?.current?.type) {
767
+ this.onDragCancel();
768
+ return;
769
+ }
770
+
771
+ if (activeType === 'item') {
772
+ const startOrder = this.dragSnapshot.items.findIndex(
773
+ (item) => item['@id'] === active.id,
774
+ );
775
+ const endOrder = this.state.items.findIndex(
776
+ (item) => item['@id'] === active.id,
777
+ );
778
+
779
+ if (startOrder !== endOrder && endOrder !== -1) {
780
+ this.onOrderItem(active.id, startOrder, endOrder - startOrder, true);
781
+ }
782
+ }
783
+
784
+ this.dragSnapshot = null;
785
+ };
786
+
787
+ onDragCancel = () => {
788
+ if (!this.dragSnapshot) {
789
+ return;
790
+ }
791
+
792
+ this.setState({
793
+ items: this.dragSnapshot.items,
794
+ index: {
795
+ ...this.state.index,
796
+ order: this.dragSnapshot.indexOrder,
797
+ },
798
+ });
799
+ this.dragSnapshot = null;
800
+ };
801
+
726
802
  /**
727
803
  * On sort items
728
804
  * @method onSortItems
@@ -1125,6 +1201,17 @@ class Contents extends Component {
1125
1201
  const selected = this.state.selected.length > 0;
1126
1202
  const filteredItems = this.state.filteredItems || this.state.selected;
1127
1203
  const path = getBaseUrl(this.props.pathname);
1204
+ const { DndContext, closestCenter } = this.props.dndKitCore;
1205
+ const {
1206
+ restrictToHorizontalAxis,
1207
+ restrictToVerticalAxis,
1208
+ restrictToParentElement,
1209
+ } = this.props.dndKitModifiers;
1210
+ const {
1211
+ SortableContext,
1212
+ verticalListSortingStrategy,
1213
+ horizontalListSortingStrategy,
1214
+ } = this.props.dndKitSortable;
1128
1215
  const folderContentsAction = find(this.props.objectActions, {
1129
1216
  id: 'folderContents',
1130
1217
  });
@@ -1138,6 +1225,9 @@ class Contents extends Component {
1138
1225
 
1139
1226
  const Container =
1140
1227
  config.getComponent({ name: 'Container' }).component || SemanticContainer;
1228
+ const visibleIndexIds = this.state.index.order.filter(
1229
+ (index) => this.state.index.values[index].selected,
1230
+ );
1141
1231
 
1142
1232
  return this.props.token && this.props.objectActions?.length > 0 ? (
1143
1233
  <>
@@ -1153,699 +1243,768 @@ class Contents extends Component {
1153
1243
  {this.props.intl.formatMessage(messages.loading)}
1154
1244
  </Loader>
1155
1245
  </Dimmer>
1156
-
1157
1246
  <Helmet
1158
1247
  title={this.props.intl.formatMessage(messages.contents)}
1159
1248
  />
1160
- <div className="container">
1161
- <article id="content">
1162
- <ContentsDeleteModal
1163
- open={this.state.showDelete}
1164
- onCancel={this.onDeleteCancel}
1165
- onOk={this.onDeleteOk}
1166
- items={this.state.items}
1167
- itemsToDelete={this.state.itemsToDelete}
1168
- hasMultiplePages={
1169
- Math.ceil(this.props.total / this.state.pageSize) > 1
1170
- }
1171
- />
1172
- <ContentsUploadModal
1173
- open={this.state.showUpload}
1174
- onCancel={this.onUploadCancel}
1175
- onOk={this.onUploadOk}
1176
- pathname={getBaseUrl(this.props.pathname)}
1177
- />
1178
- <ContentsRenameModal
1179
- open={this.state.showRename}
1180
- onCancel={this.onRenameCancel}
1181
- onOk={this.onRenameOk}
1182
- items={map(this.state.selected, (item) => ({
1183
- url: item,
1184
- title: this.getFieldById(item, 'title'),
1185
- id: this.getFieldById(item, 'id'),
1186
- }))}
1187
- />
1188
- <ContentsTagsModal
1189
- open={this.state.showTags}
1190
- onCancel={this.onTagsCancel}
1191
- onOk={this.onTagsOk}
1192
- items={map(this.state.selected, (item) => ({
1193
- url: item,
1194
- subjects: this.getFieldById(item, 'Subject'),
1195
- }))}
1196
- />
1197
- <ContentsPropertiesModal
1198
- open={this.state.showProperties}
1199
- onCancel={this.onPropertiesCancel}
1200
- onOk={this.onPropertiesOk}
1201
- items={this.state.selected}
1202
- values={map(this.state.selected, (id) =>
1203
- find(this.state.items, { '@id': id }),
1204
- ).filter((item) => item)}
1205
- />
1206
- {this.state.showWorkflow && (
1207
- <ContentsWorkflowModal
1208
- open={this.state.showWorkflow}
1209
- onCancel={this.onWorkflowCancel}
1210
- onOk={this.onWorkflowOk}
1249
+ <DropzoneContent
1250
+ onOk={this.onUploadOk}
1251
+ onCancel={this.onUploadCancel}
1252
+ pathname={getBaseUrl(this.props.pathname)}
1253
+ >
1254
+ <div className="container">
1255
+ <article id="content">
1256
+ <ContentsDeleteModal
1257
+ open={this.state.showDelete}
1258
+ onCancel={this.onDeleteCancel}
1259
+ onOk={this.onDeleteOk}
1260
+ items={this.state.items}
1261
+ itemsToDelete={this.state.itemsToDelete}
1262
+ hasMultiplePages={
1263
+ Math.ceil(this.props.total / this.state.pageSize) > 1
1264
+ }
1265
+ />
1266
+ <ContentsUploadModal
1267
+ open={this.state.showUpload}
1268
+ onCancel={this.onUploadCancel}
1269
+ onOk={this.onUploadOk}
1270
+ pathname={getBaseUrl(this.props.pathname)}
1271
+ />
1272
+ <ContentsRenameModal
1273
+ open={this.state.showRename}
1274
+ onCancel={this.onRenameCancel}
1275
+ onOk={this.onRenameOk}
1276
+ items={map(this.state.selected, (item) => ({
1277
+ url: item,
1278
+ title: this.getFieldById(item, 'title'),
1279
+ id: this.getFieldById(item, 'id'),
1280
+ }))}
1281
+ />
1282
+ <ContentsTagsModal
1283
+ open={this.state.showTags}
1284
+ onCancel={this.onTagsCancel}
1285
+ onOk={this.onTagsOk}
1286
+ items={map(this.state.selected, (item) => ({
1287
+ url: item,
1288
+ subjects: this.getFieldById(item, 'Subject'),
1289
+ }))}
1290
+ />
1291
+ <ContentsPropertiesModal
1292
+ open={this.state.showProperties}
1293
+ onCancel={this.onPropertiesCancel}
1294
+ onOk={this.onPropertiesOk}
1211
1295
  items={this.state.selected}
1296
+ values={map(this.state.selected, (id) =>
1297
+ find(this.state.items, { '@id': id }),
1298
+ ).filter((item) => item)}
1212
1299
  />
1213
- )}
1214
- <section id="content-core">
1215
- <Segment.Group raised>
1216
- <Menu secondary attached className="top-menu">
1217
- <Menu.Menu className="top-menu-menu">
1218
- <Popup
1219
- trigger={
1220
- <Menu.Item
1221
- icon
1222
- as={Button}
1223
- onClick={this.upload}
1224
- className="upload"
1225
- aria-controls="contents-table-wrapper"
1226
- aria-label={this.props.intl.formatMessage(
1227
- messages.filter,
1228
- )}
1229
- >
1230
- <Icon
1231
- name={uploadSVG}
1232
- color="#007eb1"
1233
- size="24px"
1300
+ {this.state.showWorkflow && (
1301
+ <ContentsWorkflowModal
1302
+ open={this.state.showWorkflow}
1303
+ onCancel={this.onWorkflowCancel}
1304
+ onOk={this.onWorkflowOk}
1305
+ items={this.state.selected}
1306
+ />
1307
+ )}
1308
+ <section id="content-core">
1309
+ <Segment.Group raised>
1310
+ <Menu secondary attached className="top-menu">
1311
+ <Menu.Menu className="top-menu-menu">
1312
+ <Popup
1313
+ trigger={
1314
+ <Menu.Item
1315
+ icon
1316
+ as={Button}
1317
+ onClick={this.upload}
1234
1318
  className="upload"
1235
- />
1236
- </Menu.Item>
1237
- }
1238
- position="top center"
1239
- content={this.props.intl.formatMessage(
1240
- messages.upload,
1241
- )}
1242
- size="mini"
1243
- />
1244
- </Menu.Menu>
1245
- <Menu.Menu className="top-menu-menu">
1246
- <Popup
1247
- trigger={
1248
- <Menu.Item
1249
- icon
1250
- as={Button}
1251
- onClick={this.rename}
1252
- disabled={!selected}
1253
- aria-label={this.props.intl.formatMessage(
1254
- messages.rename,
1255
- )}
1256
- >
1257
- <Icon
1258
- name={renameSVG}
1259
- color={selected ? '#826a6a' : 'grey'}
1260
- size="24px"
1261
- className="rename"
1262
- />
1263
- </Menu.Item>
1264
- }
1265
- position="top center"
1266
- content={this.props.intl.formatMessage(
1267
- messages.rename,
1268
- )}
1269
- size="mini"
1270
- />
1271
- <Popup
1272
- trigger={
1273
- <Menu.Item
1274
- icon
1275
- as={Button}
1276
- onClick={this.workflow}
1277
- disabled={!selected}
1278
- aria-label={this.props.intl.formatMessage(
1279
- messages.state,
1280
- )}
1281
- >
1282
- <Icon
1283
- name={semaphoreSVG}
1284
- color={selected ? '#826a6a' : 'grey'}
1285
- size="24px"
1286
- className="semaphore"
1287
- />
1288
- </Menu.Item>
1289
- }
1290
- position="top center"
1291
- content={this.props.intl.formatMessage(
1292
- messages.state,
1293
- )}
1294
- size="mini"
1295
- />
1296
- <Popup
1297
- trigger={
1298
- <Menu.Item
1299
- icon
1300
- as={Button}
1301
- onClick={this.tags}
1302
- disabled={!selected}
1303
- aria-label={this.props.intl.formatMessage(
1304
- messages.tags,
1305
- )}
1306
- >
1307
- <Icon
1308
- name={tagSVG}
1309
- color={selected ? '#826a6a' : 'grey'}
1310
- size="24px"
1311
- className="tag"
1312
- />
1313
- </Menu.Item>
1314
- }
1315
- position="top center"
1316
- content={this.props.intl.formatMessage(
1317
- messages.tags,
1318
- )}
1319
- size="mini"
1320
- />
1321
-
1322
- <Popup
1323
- trigger={
1324
- <Menu.Item
1325
- icon
1326
- as={Button}
1327
- onClick={this.properties}
1328
- disabled={!selected}
1329
- aria-label={this.props.intl.formatMessage(
1330
- messages.properties,
1331
- )}
1332
- >
1333
- <Icon
1334
- name={propertiesSVG}
1335
- color={selected ? '#826a6a' : 'grey'}
1336
- size="24px"
1337
- className="properties"
1338
- />
1339
- </Menu.Item>
1340
- }
1341
- position="top center"
1342
- content={this.props.intl.formatMessage(
1343
- messages.properties,
1344
- )}
1345
- size="mini"
1346
- />
1347
- </Menu.Menu>
1348
- <Menu.Menu className="top-menu-menu">
1349
- <Popup
1350
- trigger={
1351
- <Menu.Item
1352
- icon
1353
- as={Button}
1354
- onClick={this.cut}
1355
- disabled={!selected}
1356
- aria-label={this.props.intl.formatMessage(
1357
- messages.cut,
1358
- )}
1359
- >
1360
- <Icon
1361
- name={cutSVG}
1362
- color={selected ? '#826a6a' : 'grey'}
1363
- size="24px"
1364
- className="cut"
1365
- />
1366
- </Menu.Item>
1367
- }
1368
- position="top center"
1369
- content={this.props.intl.formatMessage(
1370
- messages.cut,
1371
- )}
1372
- size="mini"
1373
- />
1374
- <Popup
1375
- trigger={
1376
- <Menu.Item
1377
- icon
1378
- as={Button}
1379
- onClick={this.copy}
1380
- disabled={!selected}
1381
- aria-label={this.props.intl.formatMessage(
1382
- messages.copy,
1383
- )}
1384
- >
1385
- <Icon
1386
- name={copySVG}
1387
- color={selected ? '#826a6a' : 'grey'}
1388
- size="24px"
1389
- className="copy"
1390
- />
1391
- </Menu.Item>
1392
- }
1393
- position="top center"
1394
- content={this.props.intl.formatMessage(
1395
- messages.copy,
1396
- )}
1397
- size="mini"
1398
- />
1399
-
1400
- <Popup
1401
- trigger={
1402
- <Menu.Item
1403
- icon
1404
- as={Button}
1405
- onClick={this.paste}
1406
- disabled={!this.props.action}
1407
- aria-label={this.props.intl.formatMessage(
1408
- messages.paste,
1409
- )}
1410
- >
1411
- <Icon
1412
- name={pasteSVG}
1413
- color={selected ? '#826a6a' : 'grey'}
1414
- size="24px"
1415
- className="paste"
1416
- />
1417
- </Menu.Item>
1418
- }
1419
- position="top center"
1420
- content={this.props.intl.formatMessage(
1421
- messages.paste,
1422
- )}
1423
- size="mini"
1424
- />
1319
+ aria-controls="contents-table-wrapper"
1320
+ aria-label={this.props.intl.formatMessage(
1321
+ messages.filter,
1322
+ )}
1323
+ >
1324
+ <Icon
1325
+ name={uploadSVG}
1326
+ color="#007eb1"
1327
+ size="24px"
1328
+ className="upload"
1329
+ />
1330
+ </Menu.Item>
1331
+ }
1332
+ position="top center"
1333
+ content={this.props.intl.formatMessage(
1334
+ messages.upload,
1335
+ )}
1336
+ size="mini"
1337
+ />
1338
+ </Menu.Menu>
1339
+ <Menu.Menu className="top-menu-menu">
1340
+ <Popup
1341
+ trigger={
1342
+ <Menu.Item
1343
+ icon
1344
+ as={Button}
1345
+ onClick={this.rename}
1346
+ disabled={!selected}
1347
+ aria-label={this.props.intl.formatMessage(
1348
+ messages.rename,
1349
+ )}
1350
+ >
1351
+ <Icon
1352
+ name={renameSVG}
1353
+ color={selected ? '#826a6a' : 'grey'}
1354
+ size="24px"
1355
+ className="rename"
1356
+ />
1357
+ </Menu.Item>
1358
+ }
1359
+ position="top center"
1360
+ content={this.props.intl.formatMessage(
1361
+ messages.rename,
1362
+ )}
1363
+ size="mini"
1364
+ />
1365
+ <Popup
1366
+ trigger={
1367
+ <Menu.Item
1368
+ icon
1369
+ as={Button}
1370
+ onClick={this.workflow}
1371
+ disabled={!selected}
1372
+ aria-label={this.props.intl.formatMessage(
1373
+ messages.state,
1374
+ )}
1375
+ >
1376
+ <Icon
1377
+ name={semaphoreSVG}
1378
+ color={selected ? '#826a6a' : 'grey'}
1379
+ size="24px"
1380
+ className="semaphore"
1381
+ />
1382
+ </Menu.Item>
1383
+ }
1384
+ position="top center"
1385
+ content={this.props.intl.formatMessage(
1386
+ messages.state,
1387
+ )}
1388
+ size="mini"
1389
+ />
1390
+ <Popup
1391
+ trigger={
1392
+ <Menu.Item
1393
+ icon
1394
+ as={Button}
1395
+ onClick={this.tags}
1396
+ disabled={!selected}
1397
+ aria-label={this.props.intl.formatMessage(
1398
+ messages.tags,
1399
+ )}
1400
+ >
1401
+ <Icon
1402
+ name={tagSVG}
1403
+ color={selected ? '#826a6a' : 'grey'}
1404
+ size="24px"
1405
+ className="tag"
1406
+ />
1407
+ </Menu.Item>
1408
+ }
1409
+ position="top center"
1410
+ content={this.props.intl.formatMessage(
1411
+ messages.tags,
1412
+ )}
1413
+ size="mini"
1414
+ />
1425
1415
 
1426
- <Popup
1427
- trigger={
1428
- <Menu.Item
1429
- icon
1430
- as={Button}
1431
- onClick={this.delete}
1432
- disabled={!selected}
1433
- aria-label={this.props.intl.formatMessage(
1434
- messages.delete,
1435
- )}
1436
- >
1437
- <Icon
1438
- name={deleteSVG}
1439
- color={selected ? '#e40166' : 'grey'}
1440
- size="24px"
1441
- className="delete"
1442
- />
1443
- </Menu.Item>
1444
- }
1445
- position="top center"
1446
- content={this.props.intl.formatMessage(
1447
- messages.delete,
1448
- )}
1449
- size="mini"
1450
- />
1451
- </Menu.Menu>
1452
- <Menu.Menu
1453
- position="right"
1454
- className="top-menu-searchbox"
1455
- >
1456
- <div className="ui right aligned category search item">
1457
- <Input
1458
- type="text"
1459
- transparent
1460
- placeholder={this.props.intl.formatMessage(
1461
- messages.filter,
1416
+ <Popup
1417
+ trigger={
1418
+ <Menu.Item
1419
+ icon
1420
+ as={Button}
1421
+ onClick={this.properties}
1422
+ disabled={!selected}
1423
+ aria-label={this.props.intl.formatMessage(
1424
+ messages.properties,
1425
+ )}
1426
+ >
1427
+ <Icon
1428
+ name={propertiesSVG}
1429
+ color={selected ? '#826a6a' : 'grey'}
1430
+ size="24px"
1431
+ className="properties"
1432
+ />
1433
+ </Menu.Item>
1434
+ }
1435
+ position="top center"
1436
+ content={this.props.intl.formatMessage(
1437
+ messages.properties,
1462
1438
  )}
1463
- size="small"
1464
- value={this.state.filter}
1465
- onChange={this.onChangeFilter}
1439
+ size="mini"
1466
1440
  />
1467
- {this.state.filter && (
1468
- <Button
1469
- className="icon icon-container"
1470
- onClick={() => {
1471
- this.onChangeFilter('', { value: '' });
1472
- }}
1473
- >
1474
- <Icon
1475
- name={clearSVG}
1476
- size="30px"
1477
- color="#e40166"
1478
- />
1479
- </Button>
1480
- )}
1481
- <Icon
1482
- name={zoomSVG}
1483
- size="30px"
1484
- color="#007eb1"
1485
- className="zoom"
1486
- style={{ flexShrink: '0' }}
1441
+ </Menu.Menu>
1442
+ <Menu.Menu className="top-menu-menu">
1443
+ <Popup
1444
+ trigger={
1445
+ <Menu.Item
1446
+ icon
1447
+ as={Button}
1448
+ onClick={this.cut}
1449
+ disabled={!selected}
1450
+ aria-label={this.props.intl.formatMessage(
1451
+ messages.cut,
1452
+ )}
1453
+ >
1454
+ <Icon
1455
+ name={cutSVG}
1456
+ color={selected ? '#826a6a' : 'grey'}
1457
+ size="24px"
1458
+ className="cut"
1459
+ />
1460
+ </Menu.Item>
1461
+ }
1462
+ position="top center"
1463
+ content={this.props.intl.formatMessage(
1464
+ messages.cut,
1465
+ )}
1466
+ size="mini"
1487
1467
  />
1488
- <div className="results" />
1489
- </div>
1490
- </Menu.Menu>
1491
- </Menu>
1492
- <Segment
1493
- secondary
1494
- attached
1495
- className="contents-breadcrumbs"
1496
- >
1497
- <ContentsBreadcrumbs items={this.props.breadcrumbs} />
1498
- <Dropdown
1499
- item
1500
- upward={false}
1501
- icon={
1502
- <Icon name={moreSVG} size="24px" color="#826a6a" />
1503
- }
1504
- className="right floating selectIndex"
1505
- >
1506
- <Dropdown.Menu className="left">
1507
- <Dropdown.Header
1468
+ <Popup
1469
+ trigger={
1470
+ <Menu.Item
1471
+ icon
1472
+ as={Button}
1473
+ onClick={this.copy}
1474
+ disabled={!selected}
1475
+ aria-label={this.props.intl.formatMessage(
1476
+ messages.copy,
1477
+ )}
1478
+ >
1479
+ <Icon
1480
+ name={copySVG}
1481
+ color={selected ? '#826a6a' : 'grey'}
1482
+ size="24px"
1483
+ className="copy"
1484
+ />
1485
+ </Menu.Item>
1486
+ }
1487
+ position="top center"
1508
1488
  content={this.props.intl.formatMessage(
1509
- messages.selectColumns,
1489
+ messages.copy,
1510
1490
  )}
1491
+ size="mini"
1511
1492
  />
1512
- <Dropdown.Menu scrolling>
1513
- {map(
1514
- filter(
1515
- this.state.index.order,
1516
- (index) => index !== 'sortable_title',
1517
- ),
1518
- (index) => (
1519
- <Dropdown.Item
1520
- key={index}
1521
- value={index}
1522
- onClick={this.onSelectIndex}
1523
- className="iconAlign"
1524
- >
1525
- {this.state.index.values[index].selected ? (
1526
- <Icon
1527
- name={checkboxCheckedSVG}
1528
- size="24px"
1529
- color="#007eb1"
1530
- className={
1531
- this.state.index.values[index].label
1532
- }
1533
- />
1534
- ) : (
1535
- <Icon
1536
- name={checkboxUncheckedSVG}
1537
- className={
1538
- this.state.index.values[index].label
1539
- }
1540
- size="24px"
1541
- />
1542
- )}
1543
- <span>
1544
- {' '}
1545
- {this.props.intl.formatMessage({
1546
- id: this.state.index.values[index]
1547
- .label,
1548
- defaultMessage:
1549
- this.state.index.values[index].label,
1550
- })}
1551
- </span>
1552
- </Dropdown.Item>
1553
- ),
1493
+
1494
+ <Popup
1495
+ trigger={
1496
+ <Menu.Item
1497
+ icon
1498
+ as={Button}
1499
+ onClick={this.paste}
1500
+ disabled={!this.props.action}
1501
+ aria-label={this.props.intl.formatMessage(
1502
+ messages.paste,
1503
+ )}
1504
+ >
1505
+ <Icon
1506
+ name={pasteSVG}
1507
+ color={selected ? '#826a6a' : 'grey'}
1508
+ size="24px"
1509
+ className="paste"
1510
+ />
1511
+ </Menu.Item>
1512
+ }
1513
+ position="top center"
1514
+ content={this.props.intl.formatMessage(
1515
+ messages.paste,
1554
1516
  )}
1555
- </Dropdown.Menu>
1556
- </Dropdown.Menu>
1557
- </Dropdown>
1558
- </Segment>
1559
- <div
1560
- id="contents-table-wrapper"
1561
- className="contents-table-wrapper"
1562
- role="region"
1563
- >
1564
- <span
1565
- aria-live="polite"
1566
- className="search-feedback"
1567
- role="status"
1568
- >
1569
- {`${this.props.intl.formatMessage(
1570
- messages.resultCount,
1571
- )}: ${this.props.total || 0}`}
1572
- </span>
1573
- <Table selectable compact singleLine attached>
1574
- <Table.Header>
1575
- <Table.Row>
1576
- <Table.HeaderCell>
1577
- <Popup
1578
- menu={true}
1579
- position="bottom left"
1580
- flowing={true}
1581
- basic={true}
1582
- on="click"
1583
- popper={{
1584
- className: 'dropdown-popup',
1517
+ size="mini"
1518
+ />
1519
+
1520
+ <Popup
1521
+ trigger={
1522
+ <Menu.Item
1523
+ icon
1524
+ as={Button}
1525
+ onClick={this.delete}
1526
+ disabled={!selected}
1527
+ aria-label={this.props.intl.formatMessage(
1528
+ messages.delete,
1529
+ )}
1530
+ >
1531
+ <Icon
1532
+ name={deleteSVG}
1533
+ color={selected ? '#e40166' : 'grey'}
1534
+ size="24px"
1535
+ className="delete"
1536
+ />
1537
+ </Menu.Item>
1538
+ }
1539
+ position="top center"
1540
+ content={this.props.intl.formatMessage(
1541
+ messages.delete,
1542
+ )}
1543
+ size="mini"
1544
+ />
1545
+ </Menu.Menu>
1546
+ <Menu.Menu
1547
+ position="right"
1548
+ className="top-menu-searchbox"
1549
+ >
1550
+ <div className="ui right aligned category search item">
1551
+ <Input
1552
+ type="text"
1553
+ transparent
1554
+ placeholder={this.props.intl.formatMessage(
1555
+ messages.filter,
1556
+ )}
1557
+ size="small"
1558
+ value={this.state.filter}
1559
+ onChange={this.onChangeFilter}
1560
+ />
1561
+ {this.state.filter && (
1562
+ <Button
1563
+ className="icon icon-container"
1564
+ onClick={() => {
1565
+ this.onChangeFilter('', { value: '' });
1585
1566
  }}
1586
- trigger={
1587
- <Icon
1588
- name={configurationSVG}
1589
- size="24px"
1590
- color="#826a6a"
1591
- className="dropdown-popup-trigger configuration-svg"
1592
- />
1593
- }
1594
1567
  >
1595
- <Menu vertical borderless fluid>
1596
- <Menu.Header
1597
- content={this.props.intl.formatMessage(
1598
- messages.rearrangeBy,
1568
+ <Icon
1569
+ name={clearSVG}
1570
+ size="30px"
1571
+ color="#e40166"
1572
+ />
1573
+ </Button>
1574
+ )}
1575
+ <Icon
1576
+ name={zoomSVG}
1577
+ size="30px"
1578
+ color="#007eb1"
1579
+ className="zoom"
1580
+ style={{ flexShrink: '0' }}
1581
+ />
1582
+ <div className="results" />
1583
+ </div>
1584
+ </Menu.Menu>
1585
+ </Menu>
1586
+ <Segment
1587
+ secondary
1588
+ attached
1589
+ className="contents-breadcrumbs"
1590
+ >
1591
+ <ContentsBreadcrumbs items={this.props.breadcrumbs} />
1592
+ <Dropdown
1593
+ item
1594
+ upward={false}
1595
+ icon={
1596
+ <Icon
1597
+ name={moreSVG}
1598
+ size="24px"
1599
+ color="#826a6a"
1600
+ />
1601
+ }
1602
+ className="right floating selectIndex"
1603
+ >
1604
+ <Dropdown.Menu className="left">
1605
+ <Dropdown.Header
1606
+ content={this.props.intl.formatMessage(
1607
+ messages.selectColumns,
1608
+ )}
1609
+ />
1610
+ <Dropdown.Menu scrolling>
1611
+ {map(
1612
+ filter(
1613
+ this.state.index.order,
1614
+ (index) => index !== 'sortable_title',
1615
+ ),
1616
+ (index) => (
1617
+ <Dropdown.Item
1618
+ key={index}
1619
+ value={index}
1620
+ onClick={this.onSelectIndex}
1621
+ className="iconAlign"
1622
+ >
1623
+ {this.state.index.values[index]
1624
+ .selected ? (
1625
+ <Icon
1626
+ name={checkboxCheckedSVG}
1627
+ size="24px"
1628
+ color="#007eb1"
1629
+ className={
1630
+ this.state.index.values[index].label
1631
+ }
1632
+ />
1633
+ ) : (
1634
+ <Icon
1635
+ name={checkboxUncheckedSVG}
1636
+ className={
1637
+ this.state.index.values[index].label
1638
+ }
1639
+ size="24px"
1640
+ />
1599
1641
  )}
1600
- />
1601
- {map(
1602
- [
1603
- 'id',
1604
- 'sortable_title',
1605
- 'EffectiveDate',
1606
- 'CreationDate',
1607
- 'ModificationDate',
1608
- 'portal_type',
1609
- ],
1610
- (index) => (
1611
- <Dropdown
1612
- key={index}
1613
- item
1614
- simple
1615
- className={`sort_${index} icon-align`}
1642
+ <span>
1643
+ {' '}
1644
+ {this.props.intl.formatMessage({
1645
+ id: this.state.index.values[index]
1646
+ .label,
1647
+ defaultMessage:
1648
+ this.state.index.values[index]
1649
+ .label,
1650
+ })}
1651
+ </span>
1652
+ </Dropdown.Item>
1653
+ ),
1654
+ )}
1655
+ </Dropdown.Menu>
1656
+ </Dropdown.Menu>
1657
+ </Dropdown>
1658
+ </Segment>
1659
+ <div
1660
+ id="contents-table-wrapper"
1661
+ className="contents-table-wrapper"
1662
+ role="region"
1663
+ >
1664
+ <span
1665
+ aria-live="polite"
1666
+ className="search-feedback"
1667
+ role="status"
1668
+ >
1669
+ {`${this.props.intl.formatMessage(
1670
+ messages.resultCount,
1671
+ )}: ${this.props.total || 0}`}
1672
+ </span>
1673
+ <div ref={this.dragA11yRef} />
1674
+ <Table selectable compact singleLine attached>
1675
+ <Table.Header>
1676
+ <DndContext
1677
+ collisionDetection={closestCenter}
1678
+ onDragStart={this.onDragStart}
1679
+ onDragOver={this.onDragOver}
1680
+ onDragEnd={this.onDragEnd}
1681
+ onDragCancel={this.onDragCancel}
1682
+ modifiers={[
1683
+ restrictToHorizontalAxis,
1684
+ restrictToParentElement,
1685
+ ]}
1686
+ accessibility={{
1687
+ container: this.dragA11yRef.current,
1688
+ }}
1689
+ >
1690
+ <Table.Row>
1691
+ <Table.HeaderCell>
1692
+ <Popup
1693
+ menu={true}
1694
+ position="bottom left"
1695
+ flowing={true}
1696
+ basic={true}
1697
+ on="click"
1698
+ popper={{
1699
+ className: 'dropdown-popup',
1700
+ }}
1701
+ trigger={
1702
+ <Icon
1703
+ name={configurationSVG}
1704
+ size="24px"
1705
+ color="#826a6a"
1706
+ className="dropdown-popup-trigger configuration-svg"
1707
+ />
1708
+ }
1709
+ >
1710
+ <Menu vertical borderless fluid>
1711
+ <Menu.Header
1712
+ content={this.props.intl.formatMessage(
1713
+ messages.rearrangeBy,
1714
+ )}
1715
+ />
1716
+ {map(
1717
+ [
1718
+ 'id',
1719
+ 'sortable_title',
1720
+ 'EffectiveDate',
1721
+ 'CreationDate',
1722
+ 'ModificationDate',
1723
+ 'portal_type',
1724
+ ],
1725
+ (index) => (
1726
+ <Dropdown
1727
+ key={index}
1728
+ item
1729
+ simple
1730
+ className={`sort_${index} icon-align`}
1731
+ icon={
1732
+ <Icon
1733
+ name={downKeySVG}
1734
+ size="24px"
1735
+ className="left"
1736
+ />
1737
+ }
1738
+ text={this.props.intl.formatMessage(
1739
+ {
1740
+ id: Indexes[index].label,
1741
+ },
1742
+ )}
1743
+ >
1744
+ <Dropdown.Menu>
1745
+ <Dropdown.Item
1746
+ onClick={this.onSortItems}
1747
+ value={`${Indexes[index].sort_on}|ascending`}
1748
+ className={`sort_${Indexes[index].sort_on}_ascending icon-align`}
1749
+ >
1750
+ <Icon
1751
+ name={sortDownSVG}
1752
+ size="24px"
1753
+ />{' '}
1754
+ <FormattedMessage
1755
+ id="Ascending"
1756
+ defaultMessage="Ascending"
1757
+ />
1758
+ </Dropdown.Item>
1759
+ <Dropdown.Item
1760
+ onClick={this.onSortItems}
1761
+ value={`${Indexes[index].sort_on}|descending`}
1762
+ className={`sort_${Indexes[index].sort_on}_descending icon-align`}
1763
+ >
1764
+ <Icon
1765
+ name={sortUpSVG}
1766
+ size="24px"
1767
+ />{' '}
1768
+ <FormattedMessage
1769
+ id="Descending"
1770
+ defaultMessage="Descending"
1771
+ />
1772
+ </Dropdown.Item>
1773
+ </Dropdown.Menu>
1774
+ </Dropdown>
1775
+ ),
1776
+ )}
1777
+ </Menu>
1778
+ </Popup>
1779
+ </Table.HeaderCell>
1780
+ <Table.HeaderCell>
1781
+ <Popup
1782
+ menu={true}
1783
+ position="bottom left"
1784
+ flowing={true}
1785
+ basic={true}
1786
+ on="click"
1787
+ popper={{
1788
+ className: 'dropdown-popup',
1789
+ }}
1790
+ trigger={
1791
+ <Icon
1792
+ name={
1793
+ this.state.selected.length === 0
1794
+ ? checkboxUncheckedSVG
1795
+ : this.state.selected.length ===
1796
+ this.state.items.length
1797
+ ? checkboxCheckedSVG
1798
+ : checkboxIndeterminateSVG
1799
+ }
1800
+ color={
1801
+ this.state.selected.length > 0
1802
+ ? '#007eb1'
1803
+ : '#826a6a'
1804
+ }
1805
+ className="dropdown-popup-trigger"
1806
+ size="24px"
1807
+ />
1808
+ }
1809
+ >
1810
+ <Menu vertical borderless fluid>
1811
+ <Menu.Header
1812
+ content={this.props.intl.formatMessage(
1813
+ messages.select,
1814
+ )}
1815
+ />
1816
+ <Menu.Item onClick={this.onSelectAll}>
1817
+ <Icon
1818
+ name={checkboxCheckedSVG}
1819
+ color="#007eb1"
1820
+ size="24px"
1821
+ />{' '}
1822
+ <FormattedMessage
1823
+ id="All"
1824
+ defaultMessage="All"
1825
+ />
1826
+ </Menu.Item>
1827
+ <Menu.Item onClick={this.onSelectNone}>
1828
+ <Icon
1829
+ name={checkboxUncheckedSVG}
1830
+ size="24px"
1831
+ />{' '}
1832
+ <FormattedMessage
1833
+ id="None"
1834
+ defaultMessage="None"
1835
+ />
1836
+ </Menu.Item>
1837
+ <Divider />
1838
+ <Menu.Header
1839
+ content={this.props.intl.formatMessage(
1840
+ messages.selected,
1841
+ {
1842
+ count: this.state.selected.length,
1843
+ },
1844
+ )}
1845
+ />
1846
+ <Input
1616
1847
  icon={
1617
- <Icon
1618
- name={downKeySVG}
1619
- size="24px"
1620
- className="left"
1621
- />
1848
+ <Icon name={zoomSVG} size="24px" />
1622
1849
  }
1623
- text={this.props.intl.formatMessage({
1624
- id: Indexes[index].label,
1625
- })}
1626
- >
1627
- <Dropdown.Menu>
1628
- <Dropdown.Item
1629
- onClick={this.onSortItems}
1630
- value={`${Indexes[index].sort_on}|ascending`}
1631
- className={`sort_${Indexes[index].sort_on}_ascending icon-align`}
1632
- >
1633
- <Icon
1634
- name={sortDownSVG}
1635
- size="24px"
1636
- />{' '}
1637
- <FormattedMessage
1638
- id="Ascending"
1639
- defaultMessage="Ascending"
1640
- />
1641
- </Dropdown.Item>
1642
- <Dropdown.Item
1643
- onClick={this.onSortItems}
1644
- value={`${Indexes[index].sort_on}|descending`}
1645
- className={`sort_${Indexes[index].sort_on}_descending icon-align`}
1850
+ iconPosition="left"
1851
+ className="item search"
1852
+ placeholder={this.props.intl.formatMessage(
1853
+ messages.filter,
1854
+ )}
1855
+ value={
1856
+ this.state.selectedMenuFilter || ''
1857
+ }
1858
+ onChange={this.onChangeSelected}
1859
+ onClick={(e) => {
1860
+ e.preventDefault();
1861
+ e.stopPropagation();
1862
+ }}
1863
+ />
1864
+ <Menu.Menu scrolling>
1865
+ {map(filteredItems, (item) => (
1866
+ <Menu.Item
1867
+ key={item}
1868
+ value={item}
1869
+ onClick={this.onDeselect}
1646
1870
  >
1647
1871
  <Icon
1648
- name={sortUpSVG}
1872
+ name={deleteSVG}
1873
+ color="#e40166"
1649
1874
  size="24px"
1650
1875
  />{' '}
1651
- <FormattedMessage
1652
- id="Descending"
1653
- defaultMessage="Descending"
1654
- />
1655
- </Dropdown.Item>
1656
- </Dropdown.Menu>
1657
- </Dropdown>
1658
- ),
1876
+ {this.getFieldById(item, 'title')}
1877
+ </Menu.Item>
1878
+ ))}
1879
+ </Menu.Menu>
1880
+ </Menu>
1881
+ </Popup>
1882
+ </Table.HeaderCell>
1883
+ <Table.HeaderCell
1884
+ width={Math.ceil(
1885
+ 16 / this.state.index.selectedCount,
1659
1886
  )}
1660
- </Menu>
1661
- </Popup>
1662
- </Table.HeaderCell>
1663
- <Table.HeaderCell>
1664
- <Popup
1665
- menu={true}
1666
- position="bottom left"
1667
- flowing={true}
1668
- basic={true}
1669
- on="click"
1670
- popper={{
1671
- className: 'dropdown-popup',
1672
- }}
1673
- trigger={
1674
- <Icon
1675
- name={
1676
- this.state.selected.length === 0
1677
- ? checkboxUncheckedSVG
1678
- : this.state.selected.length ===
1679
- this.state.items.length
1680
- ? checkboxCheckedSVG
1681
- : checkboxIndeterminateSVG
1682
- }
1683
- color={
1684
- this.state.selected.length > 0
1685
- ? '#007eb1'
1686
- : '#826a6a'
1687
- }
1688
- className="dropdown-popup-trigger"
1689
- size="24px"
1690
- />
1691
- }
1692
- >
1693
- <Menu vertical borderless fluid>
1694
- <Menu.Header
1695
- content={this.props.intl.formatMessage(
1696
- messages.select,
1697
- )}
1698
- />
1699
- <Menu.Item onClick={this.onSelectAll}>
1700
- <Icon
1701
- name={checkboxCheckedSVG}
1702
- color="#007eb1"
1703
- size="24px"
1704
- />{' '}
1705
- <FormattedMessage
1706
- id="All"
1707
- defaultMessage="All"
1708
- />
1709
- </Menu.Item>
1710
- <Menu.Item onClick={this.onSelectNone}>
1711
- <Icon
1712
- name={checkboxUncheckedSVG}
1713
- size="24px"
1714
- />{' '}
1715
- <FormattedMessage
1716
- id="None"
1717
- defaultMessage="None"
1718
- />
1719
- </Menu.Item>
1720
- <Divider />
1721
- <Menu.Header
1722
- content={this.props.intl.formatMessage(
1723
- messages.selected,
1724
- {
1725
- count: this.state.selected.length,
1726
- },
1727
- )}
1887
+ >
1888
+ <FormattedMessage
1889
+ id="Title"
1890
+ defaultMessage="Title"
1728
1891
  />
1729
- <Input
1730
- icon={<Icon name={zoomSVG} size="24px" />}
1731
- iconPosition="left"
1732
- className="item search"
1733
- placeholder={this.props.intl.formatMessage(
1734
- messages.filter,
1735
- )}
1736
- value={
1737
- this.state.selectedMenuFilter || ''
1738
- }
1739
- onChange={this.onChangeSelected}
1740
- onClick={(e) => {
1741
- e.preventDefault();
1742
- e.stopPropagation();
1743
- }}
1892
+ </Table.HeaderCell>
1893
+ <SortableContext
1894
+ items={visibleIndexIds.map(
1895
+ (index) => `index:${index}`,
1896
+ )}
1897
+ strategy={horizontalListSortingStrategy}
1898
+ >
1899
+ {map(
1900
+ this.state.index.order,
1901
+ (index) =>
1902
+ this.state.index.values[index]
1903
+ .selected && (
1904
+ <ContentsIndexHeader
1905
+ key={index}
1906
+ id={index}
1907
+ width={Math.ceil(
1908
+ 16 /
1909
+ this.state.index.selectedCount,
1910
+ )}
1911
+ label={
1912
+ this.state.index.values[index]
1913
+ .label
1914
+ }
1915
+ />
1916
+ ),
1917
+ )}
1918
+ </SortableContext>
1919
+ <Table.HeaderCell textAlign="right">
1920
+ <FormattedMessage
1921
+ id="Actions"
1922
+ defaultMessage="Actions"
1744
1923
  />
1745
- <Menu.Menu scrolling>
1746
- {map(filteredItems, (item) => (
1747
- <Menu.Item
1748
- key={item}
1749
- value={item}
1750
- onClick={this.onDeselect}
1751
- >
1752
- <Icon
1753
- name={deleteSVG}
1754
- color="#e40166"
1755
- size="24px"
1756
- />{' '}
1757
- {this.getFieldById(item, 'title')}
1758
- </Menu.Item>
1759
- ))}
1760
- </Menu.Menu>
1761
- </Menu>
1762
- </Popup>
1763
- </Table.HeaderCell>
1764
- <Table.HeaderCell
1765
- width={Math.ceil(
1766
- 16 / this.state.index.selectedCount,
1767
- )}
1924
+ </Table.HeaderCell>
1925
+ </Table.Row>
1926
+ </DndContext>
1927
+ </Table.Header>
1928
+ <Table.Body>
1929
+ <DndContext
1930
+ collisionDetection={closestCenter}
1931
+ onDragStart={this.onDragStart}
1932
+ onDragOver={this.onDragOver}
1933
+ onDragEnd={this.onDragEnd}
1934
+ onDragCancel={this.onDragCancel}
1935
+ modifiers={[
1936
+ restrictToVerticalAxis,
1937
+ restrictToParentElement,
1938
+ ]}
1939
+ accessibility={{
1940
+ container: this.dragA11yRef.current,
1941
+ }}
1768
1942
  >
1769
- <FormattedMessage
1770
- id="Title"
1771
- defaultMessage="Title"
1772
- />
1773
- </Table.HeaderCell>
1774
- {map(
1775
- this.state.index.order,
1776
- (index, order) =>
1777
- this.state.index.values[index].selected && (
1778
- <ContentsIndexHeader
1779
- key={index}
1780
- width={Math.ceil(
1781
- 16 / this.state.index.selectedCount,
1782
- )}
1783
- label={
1784
- this.state.index.values[index].label
1785
- }
1943
+ <SortableContext
1944
+ items={this.state.items.map(
1945
+ (item) => item['@id'],
1946
+ )}
1947
+ strategy={verticalListSortingStrategy}
1948
+ >
1949
+ {this.state.items.map((item, order) => (
1950
+ <ContentsItem
1951
+ key={item['@id']}
1952
+ item={item}
1786
1953
  order={order}
1787
- onOrderIndex={this.onOrderIndex}
1954
+ selected={
1955
+ indexOf(
1956
+ this.state.selected,
1957
+ item['@id'],
1958
+ ) !== -1
1959
+ }
1960
+ onClick={this.onSelect}
1961
+ indexes={filter(
1962
+ map(
1963
+ this.state.index.order,
1964
+ (index) => ({
1965
+ id: index,
1966
+ type: this.state.index.values[index]
1967
+ .type,
1968
+ }),
1969
+ ),
1970
+ (index) =>
1971
+ this.state.index.values[index.id]
1972
+ .selected,
1973
+ )}
1974
+ onCut={this.cut}
1975
+ onCopy={this.copy}
1976
+ onDelete={this.delete}
1977
+ onOrderItem={this.onOrderItem}
1978
+ onMoveToTop={this.onMoveToTop}
1979
+ onMoveToBottom={this.onMoveToBottom}
1788
1980
  />
1789
- ),
1790
- )}
1791
- <Table.HeaderCell textAlign="right">
1792
- <FormattedMessage
1793
- id="Actions"
1794
- defaultMessage="Actions"
1795
- />
1796
- </Table.HeaderCell>
1797
- </Table.Row>
1798
- </Table.Header>
1799
- <Table.Body>
1800
- {this.state.items.map((item, order) => (
1801
- <ContentsItem
1802
- key={item['@id']}
1803
- item={item}
1804
- order={order}
1805
- selected={
1806
- indexOf(this.state.selected, item['@id']) !==
1807
- -1
1808
- }
1809
- onClick={this.onSelect}
1810
- indexes={filter(
1811
- map(this.state.index.order, (index) => ({
1812
- id: index,
1813
- type: this.state.index.values[index].type,
1814
- })),
1815
- (index) =>
1816
- this.state.index.values[index.id].selected,
1817
- )}
1818
- onCut={this.cut}
1819
- onCopy={this.copy}
1820
- onDelete={this.delete}
1821
- onOrderItem={this.onOrderItem}
1822
- onMoveToTop={this.onMoveToTop}
1823
- onMoveToBottom={this.onMoveToBottom}
1824
- />
1825
- ))}
1826
- </Table.Body>
1827
- </Table>
1828
- </div>
1829
-
1830
- <div className="contents-pagination">
1831
- <Pagination
1832
- current={this.state.currentPage}
1833
- total={Math.ceil(
1834
- this.props.total / this.state.pageSize,
1835
- )}
1836
- pageSize={this.state.pageSize}
1837
- pageSizes={[
1838
- 50,
1839
- this.props.intl.formatMessage(messages.all),
1840
- ]}
1841
- onChangePage={this.onChangePage}
1842
- onChangePageSize={this.onChangePageSize}
1843
- />
1844
- </div>
1845
- </Segment.Group>
1846
- </section>
1847
- </article>
1848
- </div>
1981
+ ))}
1982
+ </SortableContext>
1983
+ </DndContext>
1984
+ </Table.Body>
1985
+ </Table>
1986
+ </div>
1987
+
1988
+ <div className="contents-pagination">
1989
+ <Pagination
1990
+ current={this.state.currentPage}
1991
+ total={Math.ceil(
1992
+ this.props.total / this.state.pageSize,
1993
+ )}
1994
+ pageSize={this.state.pageSize}
1995
+ pageSizes={[
1996
+ 50,
1997
+ this.props.intl.formatMessage(messages.all),
1998
+ ]}
1999
+ onChangePage={this.onChangePage}
2000
+ onChangePageSize={this.onChangePageSize}
2001
+ />
2002
+ </div>
2003
+ </Segment.Group>
2004
+ </section>
2005
+ </article>
2006
+ </div>
2007
+ </DropzoneContent>
1849
2008
  {this.state.isClient &&
1850
2009
  createPortal(
1851
2010
  <Toolbar
@@ -1880,25 +2039,14 @@ class Contents extends Component {
1880
2039
  }
1881
2040
  }
1882
2041
 
1883
- let dndContext;
1884
-
1885
- const DragDropConnector = (props) => {
1886
- const { DragDropContext } = props.reactDnd;
1887
- const HTML5Backend = props.reactDndHtml5Backend.default;
1888
-
1889
- const DndConnectedContents = React.useMemo(() => {
1890
- if (!dndContext) {
1891
- dndContext = DragDropContext(HTML5Backend);
1892
- }
1893
- return dndContext(Contents);
1894
- }, [DragDropContext, HTML5Backend]);
1895
-
1896
- return <DndConnectedContents {...props} />;
1897
- };
1898
-
1899
- export const __test__ = compose(
2042
+ export const ContentsComponent = compose(
1900
2043
  injectIntl,
1901
- injectLazyLibs(['toastify', 'reactDnd']),
2044
+ injectLazyLibs([
2045
+ 'toastify',
2046
+ 'dndKitCore',
2047
+ 'dndKitModifiers',
2048
+ 'dndKitSortable',
2049
+ ]),
1902
2050
  connect(
1903
2051
  (store, props) => {
1904
2052
  return {
@@ -1938,53 +2086,12 @@ export const __test__ = compose(
1938
2086
  ),
1939
2087
  )(Contents);
1940
2088
 
1941
- export default compose(
1942
- injectIntl,
1943
- connect(
1944
- (store, props) => {
1945
- return {
1946
- token: store.userSession.token,
1947
- items: store.search.items,
1948
- sort: store.content.update.sort,
1949
- index: store.content.updatecolumns.idx,
1950
- breadcrumbs: store.breadcrumbs.items,
1951
- total: store.search.total,
1952
- searchRequest: {
1953
- loading: store.search.loading,
1954
- loaded: store.search.loaded,
1955
- },
1956
- pathname: props.location.pathname,
1957
- action: store.clipboard.action,
1958
- source: store.clipboard.source,
1959
- clipboardRequest: store.clipboard.request,
1960
- deleteRequest: store.content.delete,
1961
- updateRequest: store.content.update,
1962
- objectActions: store.actions.actions.object,
1963
- orderRequest: store.content.order,
1964
- };
1965
- },
1966
- {
1967
- searchContent,
1968
- cut,
1969
- copy,
1970
- copyContent,
1971
- deleteContent,
1972
- listActions,
1973
- moveContent,
1974
- orderContent,
1975
- sortContent,
1976
- updateColumnsContent,
1977
- getContent,
1978
- },
1979
- ),
1980
- asyncConnect([
1981
- {
1982
- key: 'actions',
1983
- // Dispatch async/await to make the operation synchronous, otherwise it returns
1984
- // before the promise is resolved
1985
- promise: async ({ location, store: { dispatch } }) =>
1986
- await dispatch(listActions(getBaseUrl(location.pathname))),
1987
- },
1988
- ]),
1989
- injectLazyLibs(['toastify', 'reactDnd', 'reactDndHtml5Backend']),
1990
- )(DragDropConnector);
2089
+ export default asyncConnect([
2090
+ {
2091
+ key: 'actions',
2092
+ // Dispatch async/await to make the operation synchronous, otherwise it returns
2093
+ // before the promise is resolved
2094
+ promise: async ({ location, store: { dispatch } }) =>
2095
+ await dispatch(listActions(getBaseUrl(location.pathname))),
2096
+ },
2097
+ ])(ContentsComponent);