@plone/volto 17.0.0-alpha.3 → 17.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 (438) hide show
  1. package/.eslintrc +26 -3
  2. package/.yarn/install-state.gz +0 -0
  3. package/.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs +541 -0
  4. package/.yarn/releases/yarn-3.6.3.cjs +874 -0
  5. package/CHANGELOG.md +716 -20
  6. package/CONTRIBUTING.md +5 -1
  7. package/README.md +20 -21
  8. package/addon-registry.js +44 -1
  9. package/create-addons-loader.js +1 -1
  10. package/create-theme-addons-loader.js +79 -0
  11. package/cypress/support/commands.js +70 -14
  12. package/cypress/support/e2e.js +1 -2
  13. package/cypress/support/volto-slate.js +4 -5
  14. package/cypress.config.js +1 -0
  15. package/docker-compose.yml +1 -1
  16. package/locales/ca/LC_MESSAGES/volto.po +422 -53
  17. package/locales/ca.json +1 -1
  18. package/locales/de/LC_MESSAGES/volto.po +442 -73
  19. package/locales/de.json +1 -1
  20. package/locales/en/LC_MESSAGES/volto.po +420 -51
  21. package/locales/en.json +1 -1
  22. package/locales/es/LC_MESSAGES/volto.po +431 -62
  23. package/locales/es.json +1 -1
  24. package/locales/eu/LC_MESSAGES/volto.po +421 -52
  25. package/locales/eu.json +1 -1
  26. package/locales/fi/LC_MESSAGES/volto.po +4985 -0
  27. package/locales/fi.json +1 -1
  28. package/locales/fr/LC_MESSAGES/volto.po +422 -53
  29. package/locales/fr.json +1 -1
  30. package/locales/it/LC_MESSAGES/volto.po +589 -220
  31. package/locales/it.json +1 -1
  32. package/locales/ja/LC_MESSAGES/volto.po +421 -52
  33. package/locales/ja.json +1 -1
  34. package/locales/nl/LC_MESSAGES/volto.po +1072 -691
  35. package/locales/nl.json +1 -1
  36. package/locales/pt/LC_MESSAGES/volto.po +422 -53
  37. package/locales/pt.json +1 -1
  38. package/locales/pt_BR/LC_MESSAGES/volto.po +429 -60
  39. package/locales/pt_BR.json +1 -1
  40. package/locales/ro/LC_MESSAGES/volto.po +422 -53
  41. package/locales/ro.json +1 -1
  42. package/locales/volto.pot +425 -52
  43. package/locales/zh_CN/LC_MESSAGES/volto.po +422 -53
  44. package/locales/zh_CN.json +1 -1
  45. package/package.json +46 -35
  46. package/packages/volto-slate/build/messages/src/blocks/Table/TableBlockEdit.json +1 -1
  47. package/packages/volto-slate/build/messages/src/blocks/Text/DefaultTextBlockEditor.json +1 -1
  48. package/packages/volto-slate/build/messages/src/blocks/Text/DetachedTextBlockEditor.json +1 -1
  49. package/packages/volto-slate/build/messages/src/blocks/Text/SlashMenu.json +1 -1
  50. package/packages/volto-slate/build/messages/src/editor/plugins/AdvancedLink/index.json +1 -1
  51. package/packages/volto-slate/build/messages/src/editor/plugins/Link/index.json +1 -1
  52. package/packages/volto-slate/build/messages/src/editor/plugins/Table/index.json +1 -1
  53. package/packages/volto-slate/build/messages/src/elementEditor/messages.json +1 -1
  54. package/packages/volto-slate/build/messages/src/widgets/HtmlSlateWidget.json +1 -1
  55. package/packages/volto-slate/build/messages/src/widgets/RichTextWidgetView.json +1 -1
  56. package/packages/volto-slate/package.json +1 -1
  57. package/packages/volto-slate/src/actions/index.js +1 -1
  58. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  59. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  60. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  61. package/packages/volto-slate/src/blocks/Text/SlashMenu.jsx +4 -3
  62. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  63. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  64. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  65. package/packages/volto-slate/src/editor/config.jsx +5 -4
  66. package/packages/volto-slate/src/editor/deserialize.js +0 -1
  67. package/packages/volto-slate/src/editor/index.js +4 -4
  68. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  69. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  70. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  71. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  72. package/packages/volto-slate/src/editor/render.jsx +77 -8
  73. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  74. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  75. package/packages/volto-slate/src/index.js +2 -2
  76. package/packages/volto-slate/src/utils/blocks.js +7 -0
  77. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  78. package/razzle.config.js +32 -6
  79. package/src/actions/index.js +10 -0
  80. package/src/actions/language/language.js +9 -8
  81. package/src/actions/navroot/navroot.js +16 -0
  82. package/src/actions/navroot/navroot.test.js +15 -0
  83. package/src/actions/querystringsearch/querystringsearch.js +20 -14
  84. package/src/actions/relations/rebuild.js +25 -0
  85. package/src/actions/relations/relations.js +103 -0
  86. package/src/actions/relations/relations.test.js +15 -0
  87. package/src/actions/site/site.js +16 -0
  88. package/src/actions/site/site.test.js +15 -0
  89. package/src/actions/userSession/userSession.js +17 -1
  90. package/src/components/index.js +194 -191
  91. package/src/components/manage/Actions/Actions.jsx +133 -243
  92. package/src/components/manage/Add/Add.jsx +9 -10
  93. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  94. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  95. package/src/components/manage/BlockChooser/BlockChooser.jsx +8 -3
  96. package/src/components/manage/BlockChooser/BlockChooser.test.jsx +5 -0
  97. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  98. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  99. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  100. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  101. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  102. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  103. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  104. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  105. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  106. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  107. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  108. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  109. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  110. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  111. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  112. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  113. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  114. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  115. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  116. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  117. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  118. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  119. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  120. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  121. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  122. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  123. package/src/components/manage/Blocks/Image/schema.js +17 -10
  124. package/src/components/manage/Blocks/Image/utils.js +14 -0
  125. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  126. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  127. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  128. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  129. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  130. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  131. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  132. package/src/components/manage/Blocks/Listing/Edit.jsx +0 -14
  133. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  134. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  135. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  136. package/src/components/manage/Blocks/Listing/getAsyncData.js +9 -3
  137. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +34 -19
  138. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  139. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  140. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  141. package/src/components/manage/Blocks/Search/SearchBlockEdit.jsx +5 -4
  142. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +4 -2
  143. package/src/components/manage/Blocks/Search/components/DateRangeFacet.jsx +4 -1
  144. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  145. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  146. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  147. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  148. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  149. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  150. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  151. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +93 -46
  152. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  153. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  154. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  155. package/src/components/manage/Blocks/Search/schema.js +29 -14
  156. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  157. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  158. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  159. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  160. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  161. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  162. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  163. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  164. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  165. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  166. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  167. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  168. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  169. package/src/components/manage/Contents/Contents.jsx +319 -139
  170. package/src/components/manage/Contents/ContentsItem.jsx +6 -0
  171. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  172. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  173. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  174. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  175. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  176. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  177. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  178. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  179. package/src/components/manage/Controlpanels/Controlpanels.jsx +199 -224
  180. package/src/components/manage/Controlpanels/Controlpanels.test.jsx +46 -7
  181. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  182. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  183. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +91 -0
  184. package/src/components/manage/Controlpanels/Relations/Relations.jsx +114 -0
  185. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +480 -0
  186. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +531 -0
  187. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  188. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  189. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  190. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  191. package/src/components/manage/Controlpanels/Users/UserGroupMembershipControlPanel.jsx +3 -3
  192. package/src/components/manage/Controlpanels/Users/UserGroupMembershipListing.jsx +51 -82
  193. package/src/components/manage/Controlpanels/Users/UserGroupMembershipMatrix.jsx +79 -75
  194. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  195. package/src/components/manage/Delete/Delete.jsx +96 -171
  196. package/src/components/manage/Diff/DiffField.jsx +25 -1
  197. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  198. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  199. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  200. package/src/components/manage/Form/Form.jsx +7 -6
  201. package/src/components/manage/Form/InlineForm.jsx +39 -9
  202. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  203. package/src/components/manage/Form/InlineFormState.js +8 -0
  204. package/src/components/manage/History/History.jsx +11 -1
  205. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  206. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  207. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  208. package/src/components/manage/Messages/Messages.jsx +32 -99
  209. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  210. package/src/components/manage/Multilingual/CreateTranslation.jsx +2 -2
  211. package/src/components/manage/Multilingual/TranslationObject.jsx +4 -3
  212. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  213. package/src/components/manage/Preferences/PersonalPreferences.jsx +2 -2
  214. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  215. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  216. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  217. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  218. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  219. package/src/components/manage/TemplateChooser/template.svg +10 -0
  220. package/src/components/manage/Toast/Toast.jsx +2 -2
  221. package/src/components/manage/Toolbar/More.jsx +17 -2
  222. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  223. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  224. package/src/components/manage/Toolbar/Types.jsx +2 -2
  225. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  226. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  227. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  228. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  229. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  230. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  231. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  232. package/src/components/manage/Widgets/DatetimeWidget.jsx +11 -13
  233. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  234. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  235. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  236. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  237. package/src/components/manage/Widgets/ObjectListWidget.jsx +3 -8
  238. package/src/components/manage/Widgets/RecurrenceWidget/ByDayField.jsx +2 -1
  239. package/src/components/manage/Widgets/RecurrenceWidget/MonthOfTheYearField.jsx +2 -1
  240. package/src/components/manage/Widgets/RecurrenceWidget/Occurences.jsx +2 -1
  241. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +10 -12
  242. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthField.jsx +2 -1
  243. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  244. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  245. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  246. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  247. package/src/components/manage/Widgets/SelectUtils.js +2 -2
  248. package/src/components/manage/Widgets/SelectWidget.jsx +16 -2
  249. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  250. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  251. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  252. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  253. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  254. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  255. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  256. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  257. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  258. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  259. package/src/components/theme/Comments/Comments.jsx +268 -380
  260. package/src/components/theme/Component/Component.jsx +1 -1
  261. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  262. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  263. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  264. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  265. package/src/components/theme/Error/ServerError.jsx +29 -0
  266. package/src/components/theme/Footer/Footer.jsx +2 -13
  267. package/src/components/theme/Header/Header.jsx +37 -63
  268. package/src/components/theme/Header/Header.test.jsx +18 -0
  269. package/src/components/theme/Icon/Icon.jsx +2 -2
  270. package/src/components/theme/Image/Image.jsx +96 -0
  271. package/src/components/theme/Image/Image.test.jsx +125 -0
  272. package/src/components/theme/LanguageSelector/LanguageSelector.js +8 -3
  273. package/src/components/theme/Login/Login.jsx +160 -242
  274. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  275. package/src/components/theme/Logo/Logo.jsx +35 -26
  276. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  277. package/src/components/theme/Logout/Logout.jsx +36 -83
  278. package/src/components/theme/MultilingualRedirector/MultilingualRedirector.jsx +2 -2
  279. package/src/components/theme/Navigation/NavItem.jsx +4 -2
  280. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  281. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  282. package/src/components/theme/PasswordReset/PasswordReset.jsx +8 -6
  283. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +96 -171
  284. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  285. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  286. package/src/components/theme/Register/Register.jsx +2 -4
  287. package/src/components/theme/Search/SearchTags.jsx +30 -60
  288. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  289. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  290. package/src/components/theme/Sitemap/Sitemap.jsx +25 -12
  291. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  292. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  293. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  294. package/src/components/theme/View/AlbumView.jsx +21 -16
  295. package/src/components/theme/View/DefaultView.jsx +1 -1
  296. package/src/components/theme/View/EventDatesInfo.jsx +2 -1
  297. package/src/components/theme/View/EventView.jsx +36 -25
  298. package/src/components/theme/View/FileView.jsx +23 -18
  299. package/src/components/theme/View/ImageView.jsx +40 -32
  300. package/src/components/theme/View/ImageView.test.jsx +4 -0
  301. package/src/components/theme/View/LinkView.jsx +53 -78
  302. package/src/components/theme/View/ListingView.jsx +36 -28
  303. package/src/components/theme/View/NewsItemView.jsx +16 -17
  304. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  305. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  306. package/src/components/theme/View/SummaryView.jsx +49 -39
  307. package/src/components/theme/View/TabularView.jsx +59 -53
  308. package/src/components/theme/View/View.jsx +2 -0
  309. package/src/components/theme/Widgets/DateWidget.jsx +2 -1
  310. package/src/components/theme/Widgets/DatetimeWidget.jsx +2 -1
  311. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  312. package/src/components/theme/Widgets/RelationsWidget.jsx +13 -11
  313. package/src/config/Blocks.jsx +46 -0
  314. package/src/config/Components.jsx +3 -1
  315. package/src/config/ControlPanels.js +2 -1
  316. package/src/config/Loadables.jsx +1 -1
  317. package/src/config/NonContentRoutes.jsx +1 -0
  318. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  319. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  320. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  321. package/src/config/RichTextEditor/Styles.jsx +1 -1
  322. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  323. package/src/config/RichTextEditor/index.js +2 -3
  324. package/src/config/Views.jsx +6 -4
  325. package/src/config/Widgets.jsx +4 -0
  326. package/src/config/index.js +38 -2
  327. package/src/config/server.js +2 -0
  328. package/src/constants/ActionTypes.js +8 -0
  329. package/src/constants/Indexes.js +3 -1
  330. package/src/constants/Languages.js +8 -4
  331. package/src/express-middleware/devproxy.js +1 -1
  332. package/src/express-middleware/files.js +11 -9
  333. package/src/express-middleware/images.js +12 -5
  334. package/src/express-middleware/ok.js +16 -0
  335. package/src/express-middleware/robotstxt.js +1 -1
  336. package/src/express-middleware/sitemap.js +37 -5
  337. package/src/express-middleware/static.js +3 -3
  338. package/src/helpers/Api/Api.js +1 -1
  339. package/src/helpers/Blocks/Blocks.js +52 -6
  340. package/src/helpers/Blocks/Blocks.test.js +92 -13
  341. package/src/helpers/Extensions/index.js +2 -1
  342. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  343. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  344. package/src/helpers/FormValidation/FormValidation.js +42 -3
  345. package/src/helpers/FormValidation/FormValidation.test.js +73 -0
  346. package/src/helpers/Html/Html.jsx +5 -9
  347. package/src/helpers/Html/Html.test.jsx +5 -0
  348. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  349. package/src/helpers/MessageLabels/MessageLabels.js +111 -4
  350. package/src/helpers/Robots/Robots.js +24 -6
  351. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  352. package/src/helpers/Site/index.js +21 -0
  353. package/src/helpers/Sitemap/Sitemap.js +44 -2
  354. package/src/helpers/Url/Url.js +30 -4
  355. package/src/helpers/Url/Url.test.js +55 -0
  356. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  357. package/src/helpers/Utils/Utils.js +73 -13
  358. package/src/helpers/Utils/Utils.test.js +17 -4
  359. package/src/helpers/Utils/usePagination.js +67 -14
  360. package/src/helpers/Utils/usePagination.test.js +115 -0
  361. package/src/helpers/index.js +22 -10
  362. package/src/hooks/client/useClient.js +11 -0
  363. package/src/hooks/clipboard/useClipboard.js +26 -0
  364. package/src/hooks/index.js +2 -0
  365. package/src/icons/grid-block.svg +11 -0
  366. package/src/middleware/Api.test.js +54 -0
  367. package/src/middleware/api.js +209 -175
  368. package/src/middleware/blacklistRoutes.js +25 -22
  369. package/src/middleware/index.js +2 -2
  370. package/src/middleware/storeProtectLoadUtils.js +61 -62
  371. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  372. package/src/reducers/actions/actions.js +8 -6
  373. package/src/reducers/actions/actions.test.js +70 -0
  374. package/src/reducers/breadcrumbs/breadcrumbs.js +1 -1
  375. package/src/reducers/content/content.test.js +4 -4
  376. package/src/reducers/index.js +6 -0
  377. package/src/reducers/navigation/navigation.js +6 -6
  378. package/src/reducers/navigation/navigation.test.js +30 -0
  379. package/src/reducers/navroot/navroot.js +79 -0
  380. package/src/reducers/navroot/navroot.test.js +110 -0
  381. package/src/reducers/relations/relations.js +201 -0
  382. package/src/reducers/site/site.js +51 -0
  383. package/src/reducers/site/site.test.js +67 -0
  384. package/src/reducers/types/types.js +1 -1
  385. package/src/reducers/userSession/userSession.js +15 -1
  386. package/src/registry.js +2 -2
  387. package/src/routes.js +14 -0
  388. package/src/server.jsx +37 -23
  389. package/src/start-server.js +2 -2
  390. package/src/storybook.jsx +24 -38
  391. package/test-setup-config.js +12 -1
  392. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  393. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  394. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  395. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  396. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  397. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  398. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  399. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  400. package/theme/themes/pastanaga/extras/contents.less +6 -1
  401. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  402. package/theme/themes/pastanaga/extras/grid.less +427 -0
  403. package/theme/themes/pastanaga/extras/login.less +3 -0
  404. package/theme/themes/pastanaga/extras/main.less +14 -7
  405. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  406. package/theme/themes/pastanaga/extras/search.less +7 -1
  407. package/theme/themes/pastanaga/extras/sidebar.less +9 -4
  408. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  409. package/theme/themes/pastanaga/extras/toc.less +29 -0
  410. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  411. package/theme/themes/pastanaga/extras/userscontrolpanel.less +104 -73
  412. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  413. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  414. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  415. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  416. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  417. package/tsconfig.json +33 -0
  418. package/webpack-plugins/webpack-less-plugin.js +19 -0
  419. package/.changelog.draft +0 -19
  420. package/.editorconfig +0 -36
  421. package/.storybook/main.js +0 -127
  422. package/.storybook/manager.js +0 -15
  423. package/.storybook/preview.js +0 -21
  424. package/.storybook/static/previewImage.svg +0 -48
  425. package/.vale.ini +0 -10
  426. package/.yarnrc.yml +0 -5
  427. package/jsdoc.json +0 -16
  428. package/netlify.toml +0 -5
  429. package/pyvenv.cfg +0 -3
  430. package/share/man/man1/ttx.1 +0 -225
  431. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  432. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  433. package/src/components/theme/Header/Header.md +0 -27
  434. package/styles/Vocab/Base/accept.txt +0 -0
  435. package/styles/Vocab/Base/reject.txt +0 -0
  436. package/styles/Vocab/Plone/accept.txt +0 -8
  437. package/styles/Vocab/Plone/reject.txt +0 -0
  438. package/towncrier.toml +0 -33
@@ -53,6 +53,7 @@ const DragDropList = (props) => {
53
53
  const {
54
54
  childList,
55
55
  children,
56
+ direction = 'vertical',
56
57
  onMoveItem,
57
58
  as = 'div',
58
59
  style,
@@ -128,6 +129,7 @@ const DragDropList = (props) => {
128
129
  >
129
130
  <Droppable
130
131
  droppableId={uid}
132
+ direction={direction}
131
133
  renderClone={(provided, snapshot, rubric) => {
132
134
  const index = rubric.source.index;
133
135
  return children({
@@ -160,19 +162,22 @@ const DragDropList = (props) => {
160
162
  </Draggable>
161
163
  ))}
162
164
  {provided.placeholder}
163
- {!isEmpty(placeholderProps) && snapshot.isDraggingOver && (
164
- <div
165
- style={{
166
- position: 'absolute',
167
- top: placeholderProps.clientY,
168
- left: placeholderProps.clientX,
169
- height: placeholderProps.clientHeight,
170
- background: '#eee',
171
- width: placeholderProps.clientWidth,
172
- borderRadius: '3px',
173
- }}
174
- />
175
- )}
165
+ {/* TODO: Fix the ghost problem if horizontal dnd is present */}
166
+ {direction !== 'horizontal' &&
167
+ !isEmpty(placeholderProps) &&
168
+ snapshot.isDraggingOver && (
169
+ <div
170
+ style={{
171
+ position: 'absolute',
172
+ top: placeholderProps.clientY,
173
+ left: placeholderProps.clientX,
174
+ height: placeholderProps.clientHeight,
175
+ background: '#eee',
176
+ width: placeholderProps.clientWidth,
177
+ borderRadius: '3px',
178
+ }}
179
+ />
180
+ )}
176
181
  </AsDomComponent>
177
182
  )}
178
183
  </Droppable>
@@ -5,7 +5,7 @@ import { withVariationSchemaEnhancer } from '@plone/volto/helpers';
5
5
  const EnhancedBlockDataForm = withVariationSchemaEnhancer(InlineForm);
6
6
 
7
7
  export default function BlockDataForm(props) {
8
- const { onChangeBlock, block } = props;
8
+ const { onChangeBlock, block, applySchemaEnhancers = true } = props;
9
9
 
10
10
  if (!onChangeBlock) {
11
11
  // eslint-disable-next-line no-console
@@ -19,8 +19,9 @@ export default function BlockDataForm(props) {
19
19
  [block, onChangeBlock],
20
20
  );
21
21
 
22
+ const Form = applySchemaEnhancers ? EnhancedBlockDataForm : InlineForm;
22
23
  return (
23
- <EnhancedBlockDataForm
24
+ <Form
24
25
  {...props}
25
26
  onChangeFormData={onChangeBlock ? onChangeFormData : undefined}
26
27
  />
@@ -8,23 +8,25 @@ import { Provider } from 'react-intl-redux';
8
8
 
9
9
  const mockStore = configureStore();
10
10
 
11
- const withStateManagement = (Component) => ({ ...props }) => {
12
- const [formData, onChangeFormData] = React.useState(props.formData || {});
13
- const onChangeField = (id, value) => {
14
- onChangeFormData({ ...formData, [id]: value });
15
- };
11
+ const withStateManagement =
12
+ (Component) =>
13
+ ({ ...props }) => {
14
+ const [formData, onChangeFormData] = React.useState(props.formData || {});
15
+ const onChangeField = (id, value) => {
16
+ onChangeFormData({ ...formData, [id]: value });
17
+ };
16
18
 
17
- // NOTE: onChangeBlock here is not "really" implemented
19
+ // NOTE: onChangeBlock here is not "really" implemented
18
20
 
19
- return (
20
- <Component
21
- {...props}
22
- onChangeField={onChangeField}
23
- onChangeBlock={(block, data) => onChangeFormData(data)}
24
- formData={formData}
25
- />
26
- );
27
- };
21
+ return (
22
+ <Component
23
+ {...props}
24
+ onChangeField={onChangeField}
25
+ onChangeBlock={(block, data) => onChangeFormData(data)}
26
+ formData={formData}
27
+ />
28
+ );
29
+ };
28
30
 
29
31
  beforeAll(() => {
30
32
  config.widgets = {
@@ -72,7 +74,7 @@ beforeAll(() => {
72
74
  });
73
75
 
74
76
  describe('BlockDataForm', () => {
75
- it('should does not add variations to schema when unneeded', () => {
77
+ it('should not add variations to schema when unneeded', () => {
76
78
  const WrappedBlockDataForm = withStateManagement(BlockDataForm);
77
79
  const store = mockStore({
78
80
  intl: {
@@ -103,7 +105,7 @@ describe('BlockDataForm', () => {
103
105
  expect(testSchema.fieldsets[0].fields).toStrictEqual([]);
104
106
  });
105
107
 
106
- it('should does not add variations when only one variation', () => {
108
+ it('should not add variations when only one variation', () => {
107
109
  const WrappedBlockDataForm = withStateManagement(BlockDataForm);
108
110
  const store = mockStore({
109
111
  intl: {
@@ -164,4 +166,36 @@ describe('BlockDataForm', () => {
164
166
  // schema is cloned, not mutated in place
165
167
  expect(testSchema.fieldsets[0].fields).toStrictEqual([]);
166
168
  });
169
+
170
+ it('should not add variations to schema when explicitly disabled', () => {
171
+ const WrappedBlockDataForm = withStateManagement(BlockDataForm);
172
+ const store = mockStore({
173
+ intl: {
174
+ locale: 'en',
175
+ messages: {},
176
+ },
177
+ });
178
+ const testSchema = {
179
+ fieldsets: [{ title: 'Default', id: 'default', fields: [] }],
180
+ properties: {},
181
+ required: [],
182
+ };
183
+ const formData = {
184
+ '@type': 'testBlock',
185
+ };
186
+ const { container } = render(
187
+ <Provider store={store}>
188
+ <WrappedBlockDataForm
189
+ formData={formData}
190
+ schema={testSchema}
191
+ onChangeField={(id, value) => {}}
192
+ applySchemaEnhancers={false}
193
+ />
194
+ </Provider>,
195
+ );
196
+ expect(container).toMatchSnapshot();
197
+
198
+ // schema is cloned, not mutated in place
199
+ expect(testSchema.fieldsets[0].fields).toStrictEqual([]);
200
+ });
167
201
  });
@@ -31,7 +31,7 @@ import { Portal } from 'react-portal';
31
31
  import { connect } from 'react-redux';
32
32
  import {
33
33
  Button,
34
- Container,
34
+ Container as SemanticContainer,
35
35
  Form as UiForm,
36
36
  Message,
37
37
  Segment,
@@ -229,9 +229,8 @@ class Form extends Component {
229
229
  let activeIndex = 0;
230
230
 
231
231
  if (requestError && prevProps.requestError !== requestError) {
232
- errors = FormValidation.giveServerErrorsToCorrespondingFields(
233
- requestError,
234
- );
232
+ errors =
233
+ FormValidation.giveServerErrorsToCorrespondingFields(requestError);
235
234
  activeIndex = FormValidation.showFirstTabWithErrors({
236
235
  errors,
237
236
  schema: this.props.schema,
@@ -545,12 +544,14 @@ class Form extends Component {
545
544
  const { schema: originalSchema, onCancel, onSubmit } = this.props;
546
545
  const { formData } = this.state;
547
546
  const schema = this.removeBlocksLayoutFields(originalSchema);
547
+ const Container =
548
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
548
549
 
549
550
  return this.props.visual ? (
550
551
  // Removing this from SSR is important, since react-beautiful-dnd supports SSR,
551
552
  // but draftJS don't like it much and the hydration gets messed up
552
553
  this.state.isClient && (
553
- <div className="ui container">
554
+ <Container>
554
555
  <BlocksToolbar
555
556
  formData={this.state.formData}
556
557
  selectedBlock={this.state.selected}
@@ -639,7 +640,7 @@ class Form extends Component {
639
640
  </UiForm>
640
641
  </Portal>
641
642
  )}
642
- </div>
643
+ </Container>
643
644
  )
644
645
  ) : (
645
646
  <Container>
@@ -4,13 +4,21 @@ import { Accordion, Segment, Message } from 'semantic-ui-react';
4
4
  import { defineMessages, injectIntl } from 'react-intl';
5
5
  import AnimateHeight from 'react-animate-height';
6
6
  import { keys, map, isEqual } from 'lodash';
7
-
7
+ import { useAtom } from 'jotai';
8
+ import { inlineFormFieldsetsState } from './InlineFormState';
9
+ import {
10
+ insertInArray,
11
+ removeFromArray,
12
+ arrayRange,
13
+ } from '@plone/volto/helpers/Utils/Utils';
8
14
  import { Field, Icon } from '@plone/volto/components';
9
15
  import { applySchemaDefaults } from '@plone/volto/helpers';
10
16
 
11
17
  import upSVG from '@plone/volto/icons/up-key.svg';
12
18
  import downSVG from '@plone/volto/icons/down-key.svg';
13
19
 
20
+ import config from '@plone/volto/registry';
21
+
14
22
  const messages = defineMessages({
15
23
  editValues: {
16
24
  id: 'Edit values',
@@ -70,12 +78,34 @@ const InlineForm = (props) => {
70
78
  // eslint-disable-next-line react-hooks/exhaustive-deps
71
79
  }, []);
72
80
 
73
- const [currentActiveFieldset, setCurrentActiveFieldset] = React.useState(0);
81
+ const [currentActiveFieldset, setCurrentActiveFieldset] = useAtom(
82
+ inlineFormFieldsetsState({
83
+ name: block,
84
+ fielsetList: other,
85
+ initialState: config.settings.blockSettingsTabFieldsetsInitialStateOpen
86
+ ? arrayRange(0, other.length - 1, 1)
87
+ : [],
88
+ }),
89
+ );
90
+
74
91
  function handleCurrentActiveFieldset(e, blockProps) {
75
92
  const { index } = blockProps;
76
- const newIndex = currentActiveFieldset === index ? -1 : index;
77
-
78
- setCurrentActiveFieldset(newIndex);
93
+ if (currentActiveFieldset.includes(index)) {
94
+ setCurrentActiveFieldset(
95
+ removeFromArray(
96
+ currentActiveFieldset,
97
+ currentActiveFieldset.indexOf(index),
98
+ ),
99
+ );
100
+ } else {
101
+ setCurrentActiveFieldset(
102
+ insertInArray(
103
+ currentActiveFieldset,
104
+ index,
105
+ currentActiveFieldset.length + 1,
106
+ ),
107
+ );
108
+ }
79
109
  }
80
110
 
81
111
  return (
@@ -136,22 +166,22 @@ const InlineForm = (props) => {
136
166
  <Accordion fluid styled className="form" key={fieldset.id}>
137
167
  <div key={fieldset.id} id={`blockform-fieldset-${fieldset.id}`}>
138
168
  <Accordion.Title
139
- active={currentActiveFieldset === index}
169
+ active={currentActiveFieldset.includes(index)}
140
170
  index={index}
141
171
  onClick={handleCurrentActiveFieldset}
142
172
  >
143
173
  {fieldset.title && <>{fieldset.title}</>}
144
- {currentActiveFieldset === index ? (
174
+ {currentActiveFieldset.includes(index) ? (
145
175
  <Icon name={upSVG} size="20px" />
146
176
  ) : (
147
177
  <Icon name={downSVG} size="20px" />
148
178
  )}
149
179
  </Accordion.Title>
150
- <Accordion.Content active={currentActiveFieldset === index}>
180
+ <Accordion.Content active={currentActiveFieldset.includes(index)}>
151
181
  <AnimateHeight
152
182
  animateOpacity
153
183
  duration={500}
154
- height={currentActiveFieldset === index ? 'auto' : 0}
184
+ height={currentActiveFieldset.includes(index) ? 'auto' : 0}
155
185
  >
156
186
  <Segment className="attached">
157
187
  {map(fieldset.fields, (field) => (
@@ -19,22 +19,24 @@ function NewBaseWidget(name) {
19
19
  );
20
20
  }
21
21
 
22
- const withStateManagement = (Component) => ({ ...props }) => {
23
- const [formData, onChangeFormData] = React.useState(props.formData || {});
24
- const onChangeField = (id, value) => {
25
- onChangeFormData({ ...formData, [id]: value });
22
+ const withStateManagement =
23
+ (Component) =>
24
+ ({ ...props }) => {
25
+ const [formData, onChangeFormData] = React.useState(props.formData || {});
26
+ const onChangeField = (id, value) => {
27
+ onChangeFormData({ ...formData, [id]: value });
28
+ };
29
+
30
+ return (
31
+ <Component
32
+ {...props}
33
+ onChangeField={onChangeField}
34
+ onChangeFormData={onChangeFormData}
35
+ formData={formData}
36
+ />
37
+ );
26
38
  };
27
39
 
28
- return (
29
- <Component
30
- {...props}
31
- onChangeField={onChangeField}
32
- onChangeFormData={onChangeFormData}
33
- formData={formData}
34
- />
35
- );
36
- };
37
-
38
40
  beforeAll(() => {
39
41
  config.widgets.default = NewBaseWidget('default');
40
42
  config.widgets.type.boolean = NewBaseWidget('boolean');
@@ -0,0 +1,8 @@
1
+ import { atom } from 'jotai';
2
+ import { atomFamily } from 'jotai/utils';
3
+ import { isEqual } from 'lodash';
4
+
5
+ export const inlineFormFieldsetsState = atomFamily(
6
+ ({ name, initialState }) => atom(initialState),
7
+ (a, b) => a.name === b.name && isEqual(a.fielsetList, b.fielsetList),
8
+ );
@@ -9,7 +9,13 @@ import { Helmet } from '@plone/volto/helpers';
9
9
  import { Link } from 'react-router-dom';
10
10
  import { connect } from 'react-redux';
11
11
  import { compose } from 'redux';
12
- import { Container, Dropdown, Icon, Segment, Table } from 'semantic-ui-react';
12
+ import {
13
+ Container as SemanticContainer,
14
+ Dropdown,
15
+ Icon,
16
+ Segment,
17
+ Table,
18
+ } from 'semantic-ui-react';
13
19
  import { concat, map, reverse, find } from 'lodash';
14
20
  import { Portal } from 'react-portal';
15
21
  import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
@@ -24,6 +30,7 @@ import {
24
30
  } from '@plone/volto/components';
25
31
  import { getHistory, revertHistory, listActions } from '@plone/volto/actions';
26
32
  import { getBaseUrl } from '@plone/volto/helpers';
33
+ import config from '@plone/volto/registry';
27
34
 
28
35
  import backSVG from '@plone/volto/icons/back.svg';
29
36
 
@@ -147,6 +154,9 @@ class History extends Component {
147
154
  });
148
155
  const entries = this.processHistoryEntries();
149
156
 
157
+ const Container =
158
+ config.getComponent({ name: 'Container' }).component || SemanticContainer;
159
+
150
160
  return !historyAction ? (
151
161
  <>
152
162
  {this.props.token ? (
@@ -0,0 +1,209 @@
1
+ /**
2
+ * LinksToItem component
3
+ * @module components/manage/LinksToItem/LinksToItem
4
+ */
5
+ import { useEffect } from 'react';
6
+ import { find } from 'lodash';
7
+ import { Helmet } from '@plone/volto/helpers';
8
+ import { Link } from 'react-router-dom';
9
+ import { Portal } from 'react-portal';
10
+ import { Container, Segment, Table } from 'semantic-ui-react';
11
+ import { FormattedMessage, defineMessages, useIntl } from 'react-intl';
12
+ import { useDispatch, useSelector } from 'react-redux';
13
+ import { getContent, queryRelations } from '@plone/volto/actions';
14
+ import {
15
+ Icon as IconNext,
16
+ Toolbar,
17
+ UniversalLink,
18
+ } from '@plone/volto/components';
19
+
20
+ import { getBaseUrl } from '@plone/volto/helpers';
21
+ import backSVG from '@plone/volto/icons/back.svg';
22
+ import settingsSVG from '@plone/volto/icons/settings.svg';
23
+
24
+ const messages = defineMessages({
25
+ back: {
26
+ id: 'Back',
27
+ defaultMessage: 'Back',
28
+ },
29
+ linkstoitem: {
30
+ id: 'Links and references',
31
+ defaultMessage: 'Links and references',
32
+ },
33
+ helpLinkRelationsControlPanel: {
34
+ id: 'Overview of relations of all content items',
35
+ defaultMessage: 'Overview of relations of all content items',
36
+ },
37
+ });
38
+
39
+ const LinksToItem = (props) => {
40
+ const intl = useIntl();
41
+ const dispatch = useDispatch();
42
+ const pathname = props.location.pathname;
43
+ const itempath = getBaseUrl(pathname);
44
+
45
+ const title = useSelector((state) => state.content.data?.title || '');
46
+ const myrelations = useSelector(
47
+ (state) => state.relations.subrequests[itempath]?.data,
48
+ );
49
+ const actions = useSelector((state) => state.actions?.actions ?? {});
50
+ const ploneSetupAction = find(actions.user, {
51
+ id: 'plone_setup',
52
+ });
53
+
54
+ useEffect(() => {
55
+ dispatch(queryRelations(null, false, itempath, null, [itempath]));
56
+ }, [dispatch, itempath]);
57
+
58
+ useEffect(() => {
59
+ if (!title) dispatch(getContent(itempath));
60
+ }, [dispatch, itempath, title]);
61
+
62
+ let links = {};
63
+ if (myrelations) {
64
+ Object.keys(myrelations).forEach((relationtype) => {
65
+ links[relationtype] = {};
66
+ myrelations[relationtype].items.forEach((item) => {
67
+ links[relationtype][item.source.UID] = item.source;
68
+ });
69
+ });
70
+ }
71
+
72
+ let links_ordered = {};
73
+ Object.keys(links).forEach((relationtype) => {
74
+ links_ordered[relationtype] = Object.values(links[relationtype]).sort(
75
+ (link) => link['@id'],
76
+ );
77
+ });
78
+
79
+ const relations_found = Object.keys(links_ordered).length > 0;
80
+ return (
81
+ <Container id="linkstoitem">
82
+ <Helmet title={intl.formatMessage(messages.linkstoitem)} />
83
+ <Segment.Group raised>
84
+ <Segment className="primary">
85
+ <FormattedMessage
86
+ id="Content that links to or references {title}"
87
+ defaultMessage="Content that links to or references {title}"
88
+ values={{ title: <q>{title}</q> }}
89
+ />
90
+ </Segment>
91
+ {relations_found ? (
92
+ <Table selectable compact singleLine attached>
93
+ {
94
+ <Table.Body>
95
+ {Object.keys(links_ordered).map((relationtype) => {
96
+ return [].concat(
97
+ [
98
+ <Table.Row>
99
+ <Table.HeaderCell>
100
+ {relationtype === 'isReferencing' ? (
101
+ <FormattedMessage
102
+ id="Linking this item with hyperlink in text"
103
+ defaultMessage="Linking this item with hyperlink in text"
104
+ />
105
+ ) : relationtype === 'relatedItems' ? (
106
+ <FormattedMessage
107
+ id="Referencing this item as related item"
108
+ defaultMessage="Referencing this item as related item"
109
+ />
110
+ ) : (
111
+ <>
112
+ <FormattedMessage
113
+ id="Referencing this item with {relationship}"
114
+ defaultMessage="Referencing this item with {relationship}"
115
+ values={{ relationship: <q>{relationtype}</q> }}
116
+ />
117
+ </>
118
+ )}
119
+ </Table.HeaderCell>
120
+ <Table.HeaderCell>
121
+ <FormattedMessage
122
+ id="Review state"
123
+ defaultMessage="Review state"
124
+ />
125
+ </Table.HeaderCell>
126
+ <Table.HeaderCell>
127
+ <FormattedMessage id="Type" defaultMessage="Type" />
128
+ </Table.HeaderCell>
129
+ </Table.Row>,
130
+ ],
131
+ links_ordered[relationtype].map((link) => {
132
+ return (
133
+ <Table.Row key={link['@id']}>
134
+ <Table.Cell>
135
+ <UniversalLink
136
+ href={link['@id']}
137
+ className={`source ${link.review_state}`}
138
+ >
139
+ <span className="label" title={link.type_title}>
140
+ {link.title}
141
+ </span>
142
+ </UniversalLink>
143
+ </Table.Cell>
144
+ <Table.Cell>
145
+ <span>{link.review_state}</span>
146
+ </Table.Cell>
147
+ <Table.Cell>
148
+ <span>{link.type_title || ''}</span>
149
+ </Table.Cell>
150
+ </Table.Row>
151
+ );
152
+ }),
153
+ );
154
+ })}
155
+ </Table.Body>
156
+ }
157
+ </Table>
158
+ ) : (
159
+ <Segment secondary>
160
+ <FormattedMessage
161
+ id="No links to this item found."
162
+ defaultMessage="No links to this item found."
163
+ />
164
+ </Segment>
165
+ )}
166
+ </Segment.Group>
167
+ {__CLIENT__ && (
168
+ <Portal node={document.getElementById('toolbar')}>
169
+ <Toolbar
170
+ pathname={pathname}
171
+ hideDefaultViewButtons
172
+ inner={
173
+ <>
174
+ <Link to={itempath} className="item">
175
+ <IconNext
176
+ name={backSVG}
177
+ className="contents circled"
178
+ size="30px"
179
+ title={intl.formatMessage(messages.back)}
180
+ />
181
+ </Link>
182
+
183
+ <>
184
+ {ploneSetupAction ? (
185
+ <Link to="/controlpanel/relations" className="relations">
186
+ <IconNext
187
+ name={settingsSVG}
188
+ className="circled"
189
+ aria-label={intl.formatMessage(
190
+ messages.helpLinkRelationsControlPanel,
191
+ )}
192
+ size="30px"
193
+ title={intl.formatMessage(
194
+ messages.helpLinkRelationsControlPanel,
195
+ )}
196
+ />
197
+ </Link>
198
+ ) : null}
199
+ </>
200
+ </>
201
+ }
202
+ />
203
+ </Portal>
204
+ )}
205
+ </Container>
206
+ );
207
+ };
208
+
209
+ export default LinksToItem;