@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
@@ -1,8 +1,12 @@
1
- /**
2
- * Comments components.
3
- * @module components/theme/Comments/Comments
4
- */
1
+ import { useEffect, useState, useMemo, useCallback } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { defineMessages, FormattedMessage, useIntl } from 'react-intl';
4
+ import { Portal } from 'react-portal';
5
+ import { useDispatch, useSelector, shallowEqual } from 'react-redux';
6
+ import { compose } from 'redux';
7
+ import { Button, Comment, Container, Icon } from 'semantic-ui-react';
5
8
 
9
+ import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
6
10
  import {
7
11
  addComment,
8
12
  deleteComment,
@@ -10,16 +14,12 @@ import {
10
14
  listMoreComments,
11
15
  } from '@plone/volto/actions';
12
16
  import { Avatar, CommentEditModal, Form } from '@plone/volto/components';
13
- import { flattenToAppURL, getBaseUrl, getColor } from '@plone/volto/helpers';
14
- import PropTypes from 'prop-types';
15
- import React, { Component } from 'react';
16
- import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
17
- import { Portal } from 'react-portal';
18
- import { connect } from 'react-redux';
19
- import { compose } from 'redux';
20
- import { Button, Comment, Container, Icon } from 'semantic-ui-react';
21
- import { injectLazyLibs } from '@plone/volto/helpers/Loadable/Loadable';
22
- // import { Button, Grid, Segment, Container } from 'semantic-ui-react';
17
+ import {
18
+ flattenToAppURL,
19
+ getBaseUrl,
20
+ getColor,
21
+ usePrevious,
22
+ } from '@plone/volto/helpers';
23
23
 
24
24
  const messages = defineMessages({
25
25
  comment: {
@@ -31,8 +31,7 @@ const messages = defineMessages({
31
31
  defaultMessage: 'Comments',
32
32
  },
33
33
  commentDescription: {
34
- id:
35
- 'You can add a comment by filling out the form below. Plain text formatting.',
34
+ id: 'You can add a comment by filling out the form below. Plain text formatting.',
36
35
  defaultMessage:
37
36
  'You can add a comment by filling out the form below. Plain text formatting.',
38
37
  },
@@ -65,10 +64,7 @@ const messages = defineMessages({
65
64
  defaultMessage: 'Load more...',
66
65
  },
67
66
  });
68
- /**
69
- * Schema for the Form components to show an input field with it's label
70
- * @param {Object} intl
71
- */
67
+
72
68
  const makeFormSchema = (intl) => ({
73
69
  fieldsets: [
74
70
  {
@@ -87,193 +83,108 @@ const makeFormSchema = (intl) => ({
87
83
  required: ['comment1'],
88
84
  });
89
85
 
90
- /**
91
- * Comments container class.
92
- * @class Comments
93
- * @extends Component
94
- */
95
- class Comments extends Component {
96
- /**
97
- * Property types.
98
- * @property {Object} propTypes Property types.
99
- * @static
100
- */
101
- static propTypes = {
102
- addComment: PropTypes.func.isRequired,
103
- deleteComment: PropTypes.func.isRequired,
104
- listComments: PropTypes.func.isRequired,
105
- listMoreComments: PropTypes.func.isRequired,
106
- pathname: PropTypes.string.isRequired,
107
- items: PropTypes.arrayOf(
108
- PropTypes.shape({
109
- author_name: PropTypes.string,
110
- creation_date: PropTypes.string,
111
- text: PropTypes.shape({
112
- data: PropTypes.string,
113
- 'mime-type': PropTypes.string,
114
- }),
115
- is_deletable: PropTypes.bool,
116
- is_editable: PropTypes.bool,
117
- }),
118
- ).isRequired,
119
- addRequest: PropTypes.shape({
120
- loading: PropTypes.bool,
121
- loaded: PropTypes.bool,
122
- }).isRequired,
123
- deleteRequest: PropTypes.shape({
124
- loading: PropTypes.bool,
125
- loaded: PropTypes.bool,
126
- }).isRequired,
127
- };
86
+ const useComments = () => {
87
+ const items = useSelector((state) => state.comments.items, shallowEqual);
88
+ const next = useSelector((state) => state.comments.next, shallowEqual);
89
+ const items_total = useSelector(
90
+ (state) => state.comments.items_total,
91
+ shallowEqual,
92
+ );
93
+ const permissions = useSelector(
94
+ (state) => state.comments.permissions || {},
95
+ shallowEqual,
96
+ );
97
+ const addRequest = useSelector((state) => state.comments.add, shallowEqual);
98
+ const deleteRequest = useSelector(
99
+ (state) => state.comments.delete,
100
+ shallowEqual,
101
+ );
128
102
 
129
- /**
130
- * Constructor
131
- * @method constructor
132
- * @param {Object} props Component properties
133
- * @constructs Comments
134
- */
135
- constructor(props) {
136
- super(props);
137
- this.onSubmit = this.onSubmit.bind(this);
138
- this.onDelete = this.onDelete.bind(this);
139
- this.onEdit = this.onEdit.bind(this);
140
- this.onEditOk = this.onEditOk.bind(this);
141
- this.onEditCancel = this.onEditCancel.bind(this);
142
- this.setReplyTo = this.setReplyTo.bind(this);
143
- this.loadMoreComments = this.loadMoreComments.bind(this);
144
- this.state = {
145
- showEdit: false,
146
- editId: null,
147
- editText: null,
148
- replyTo: null,
149
- collapsedComments: {},
150
- };
151
- }
103
+ return { items, next, items_total, permissions, addRequest, deleteRequest };
104
+ };
152
105
 
153
- componentDidMount() {
154
- this.props.listComments(getBaseUrl(this.props.pathname));
155
- }
106
+ const Comments = (props) => {
107
+ const intl = useIntl();
108
+ const dispatch = useDispatch();
109
+ const { pathname } = props;
110
+ const [showEdit, setshowEdit] = useState(false);
111
+ const [editId, seteditId] = useState(null);
112
+ const [editText, seteditText] = useState(null);
113
+ const [replyTo, setreplyTo] = useState(null);
114
+ const [collapsedComments, setcollapsedComments] = useState({});
115
+ const { items, next, items_total, permissions, addRequest, deleteRequest } =
116
+ useComments();
156
117
 
157
- /**
158
- * Component will receive props
159
- * @method componentWillReceiveProps
160
- * @param {Object} nextProps Next properties
161
- * @returns {undefined}
162
- */
163
- UNSAFE_componentWillReceiveProps(nextProps) {
118
+ const prevpathname = usePrevious(pathname);
119
+
120
+ const prevaddRequestLoading = usePrevious(addRequest.loading);
121
+ const prevdeleteRequestLoading = usePrevious(deleteRequest.loading);
122
+
123
+ useEffect(() => {
164
124
  if (
165
- nextProps.pathname !== this.props.pathname ||
166
- (this.props.addRequest.loading && nextProps.addRequest.loaded) ||
167
- (this.props.deleteRequest.loading && nextProps.deleteRequest.loaded)
125
+ pathname !== prevpathname ||
126
+ (prevaddRequestLoading && addRequest.loaded) ||
127
+ (prevdeleteRequestLoading && deleteRequest.loaded)
168
128
  ) {
169
- this.props.listComments(getBaseUrl(nextProps.pathname));
129
+ dispatch(listComments(getBaseUrl(pathname)));
170
130
  }
171
- }
131
+ }, [
132
+ dispatch,
133
+ pathname,
134
+ prevpathname,
135
+ prevaddRequestLoading,
136
+ addRequest.loaded,
137
+ prevdeleteRequestLoading,
138
+ deleteRequest.loaded,
139
+ ]);
172
140
 
173
- /**
174
- * Submit handler
175
- * @method onSubmit
176
- * @param {Object} formData Form data.
177
- * @returns {undefined}
178
- */
179
- onSubmit(formData) {
180
- this.props.addComment(
181
- getBaseUrl(this.props.pathname),
182
- formData.comment,
183
- this.state.replyTo,
184
- );
185
- this.setState({ replyTo: null });
186
- }
187
-
188
- /**
189
- * The id of the comment that will receive a reply
190
- * @param {string} commentId
191
- */
192
- setReplyTo(commentId) {
193
- this.setState({ replyTo: commentId });
194
- }
141
+ const onSubmit = (formData) => {
142
+ dispatch(addComment(getBaseUrl(pathname), formData.comment, replyTo));
143
+ setreplyTo(null);
144
+ };
195
145
 
196
- /**
197
- * Calls the action listMoreComments passing the received url for next array of comments
198
- */
199
- loadMoreComments() {
200
- this.props.listMoreComments(this.props.next);
201
- }
146
+ const setReplyTo = (commentId) => {
147
+ setreplyTo(commentId);
148
+ };
202
149
 
203
- /**
204
- * Delete handler
205
- * @method onDelete
206
- * @param {Object} event Event object.
207
- * @param {string} value Delete value.
208
- * @returns {undefined}
209
- */
210
- onDelete(value) {
211
- this.props.deleteComment(value);
212
- }
150
+ const loadMoreComments = () => {
151
+ dispatch(listMoreComments(next));
152
+ };
213
153
 
214
- /**
215
- * Will hide all replies to the specific comment
216
- * including replies to any of the replies
217
- * @param {string} commentId
218
- */
219
- hideReply(commentId) {
220
- this.setState((prevState) => {
221
- const hasComment = prevState.collapsedComments[commentId];
222
- const { collapsedComments } = prevState;
154
+ const onDelete = (value) => {
155
+ dispatch(deleteComment(value));
156
+ };
157
+ const prevcollapsedComments = usePrevious(collapsedComments);
223
158
 
224
- return {
225
- collapsedComments: {
226
- ...collapsedComments,
227
- [commentId]: !hasComment,
228
- },
229
- };
230
- });
231
- }
159
+ const hideReply = (commentId) => {
160
+ const hasComment = prevcollapsedComments[commentId];
161
+ setcollapsedComments((prevState) => ({
162
+ ...prevState,
163
+ [commentId]: !hasComment,
164
+ }));
165
+ };
232
166
 
233
- /**
234
- * Edit handler
235
- * @method onEdit
236
- * @param {Object} event Event object.
237
- * @param {string} value Delete value.
238
- * @returns {undefined}
239
- */
240
- onEdit(value) {
241
- this.setState({
242
- showEdit: true,
243
- editId: value.id,
244
- editText: value.text,
245
- });
246
- }
167
+ const onEdit = useCallback((value) => {
168
+ setshowEdit(true);
169
+ seteditText(value.text);
170
+ seteditId(value.id);
171
+ }, []);
247
172
 
248
- /**
249
- * On edit ok
250
- * @method onEditOk
251
- * @returns {undefined}
252
- */
253
- onEditOk() {
254
- this.setState({
255
- showEdit: false,
256
- editId: null,
257
- editText: null,
258
- });
259
- this.props.listComments(getBaseUrl(this.props.pathname));
260
- }
173
+ const onEditOk = () => {
174
+ setshowEdit(false);
175
+ seteditId(null);
176
+ seteditText(null);
177
+ dispatch(listComments(getBaseUrl(pathname)));
178
+ };
261
179
 
262
- /**
263
- * On edit cancel
264
- * @method onEditCancel
265
- * @returns {undefined}
266
- */
267
- onEditCancel(ev) {
268
- this.setState({
269
- showEdit: false,
270
- editId: null,
271
- editText: null,
272
- replyTo: null,
273
- });
274
- }
180
+ const onEditCancel = useCallback(() => {
181
+ setshowEdit(false);
182
+ seteditId(null);
183
+ seteditText(null);
184
+ setreplyTo(null);
185
+ }, []);
275
186
 
276
- addRepliesAsChildrenToComments(items) {
187
+ const addRepliesAsChildrenToComments = (items) => {
277
188
  let initialValue = {};
278
189
  const allCommentsWithCildren = items.reduce((accumulator, item) => {
279
190
  return {
@@ -288,205 +199,182 @@ class Comments extends Component {
288
199
  }
289
200
  });
290
201
  return allCommentsWithCildren;
291
- }
202
+ };
292
203
 
293
- /**
294
- * Render method.
295
- * @method render
296
- * @returns {string} Markup for the component.
297
- */
298
- render() {
299
- const { items, permissions } = this.props;
300
- const moment = this.props.moment.default;
301
- const { collapsedComments } = this.state;
302
- // object with comment ids, to easily verify if any comment has children
303
- const allCommentsWithCildren = this.addRepliesAsChildrenToComments(items);
304
- // all comments that are not a reply will be shown in the first iteration
305
- const allPrimaryComments = items.filter((comment) => !comment.in_reply_to);
204
+ const moment = props.moment.default;
306
205
 
307
- // recursively makes comments with their replies nested
308
- // each iteration will show replies to the specific comment using allCommentsWithCildren
309
- const commentElement = (comment) => (
310
- <Comment key={comment.comment_id}>
311
- <Avatar
312
- src={flattenToAppURL(comment.author_image)}
313
- title={comment.author_name || 'Anonymous'}
314
- color={getColor(comment.author_username)}
315
- />
316
- <Comment.Content>
317
- <Comment.Author>{comment.author_name}</Comment.Author>
318
- <Comment.Metadata>
319
- <span>
320
- {' '}
321
- <span title={moment(comment.creation_date).format('LLLL')}>
322
- {moment(comment.creation_date).fromNow()}
323
- </span>
324
- </span>
325
- </Comment.Metadata>
326
- <Comment.Text>
206
+ const allCommentsWithCildren = useMemo(
207
+ () => addRepliesAsChildrenToComments(items),
208
+ [items],
209
+ );
210
+ // all comments that are not a reply will be shown in the first iteration
211
+ const allPrimaryComments = items.filter((comment) => !comment.in_reply_to);
212
+
213
+ // recursively makes comments with their replies nested
214
+ // each iteration will show replies to the specific comment using allCommentsWithCildren
215
+ const commentElement = (comment) => (
216
+ <Comment key={comment.comment_id}>
217
+ <Avatar
218
+ src={flattenToAppURL(comment.author_image)}
219
+ title={comment.author_name || 'Anonymous'}
220
+ color={getColor(comment.author_username)}
221
+ />
222
+ <Comment.Content>
223
+ <Comment.Author>{comment.author_name}</Comment.Author>
224
+ <Comment.Metadata>
225
+ <span>
327
226
  {' '}
328
- {comment.text['mime-type'] === 'text/html' ? (
329
- <div
330
- dangerouslySetInnerHTML={{
331
- __html: comment.text.data,
332
- }}
333
- />
334
- ) : (
335
- comment.text.data
336
- )}
337
- </Comment.Text>
338
- <Comment.Actions>
339
- {comment.can_reply && (
340
- <Comment.Action
341
- as="a"
342
- aria-label={this.props.intl.formatMessage(messages.reply)}
343
- onClick={() => this.setReplyTo(comment.comment_id)}
344
- >
345
- <FormattedMessage id="Reply" defaultMessage="Reply" />
346
- </Comment.Action>
347
- )}
348
- {comment.is_editable && (
349
- <Comment.Action
350
- onClick={() =>
351
- this.onEdit({
352
- id: flattenToAppURL(comment['@id']),
353
- text: comment.text.data,
354
- })
355
- }
356
- aria-label={this.props.intl.formatMessage(messages.edit)}
357
- value={{
227
+ <span title={moment(comment.creation_date).format('LLLL')}>
228
+ {moment(comment.creation_date).fromNow()}
229
+ </span>
230
+ </span>
231
+ </Comment.Metadata>
232
+ <Comment.Text>
233
+ {' '}
234
+ {comment.text['mime-type'] === 'text/html' ? (
235
+ <div
236
+ dangerouslySetInnerHTML={{
237
+ __html: comment.text.data,
238
+ }}
239
+ />
240
+ ) : (
241
+ comment.text.data
242
+ )}
243
+ </Comment.Text>
244
+ <Comment.Actions>
245
+ {comment.can_reply && (
246
+ <Comment.Action
247
+ as="a"
248
+ aria-label={intl.formatMessage(messages.reply)}
249
+ onClick={() => setReplyTo(comment.comment_id)}
250
+ >
251
+ <FormattedMessage id="Reply" defaultMessage="Reply" />
252
+ </Comment.Action>
253
+ )}
254
+ {comment.is_editable && (
255
+ <Comment.Action
256
+ onClick={() =>
257
+ onEdit({
358
258
  id: flattenToAppURL(comment['@id']),
359
259
  text: comment.text.data,
360
- }}
361
- >
362
- <FormattedMessage id="Edit" defaultMessage="Edit" />
363
- </Comment.Action>
364
- )}
365
- {comment.is_deletable && (
366
- <Comment.Action
367
- aria-label={this.props.intl.formatMessage(messages.delete)}
368
- onClick={() => this.onDelete(flattenToAppURL(comment['@id']))}
369
- color="red"
370
- >
371
- <Icon name="delete" color="red" />
372
- <FormattedMessage
373
- id="Delete"
374
- defaultMessage="Delete"
375
- color="red"
376
- />
377
- </Comment.Action>
378
- )}
260
+ })
261
+ }
262
+ aria-label={intl.formatMessage(messages.edit)}
263
+ value={{
264
+ id: flattenToAppURL(comment['@id']),
265
+ text: comment.text.data,
266
+ }}
267
+ >
268
+ <FormattedMessage id="Edit" defaultMessage="Edit" />
269
+ </Comment.Action>
270
+ )}
271
+ {comment.is_deletable && (
379
272
  <Comment.Action
380
- as="a"
381
- onClick={() => this.hideReply(comment.comment_id)}
273
+ aria-label={intl.formatMessage(messages.delete)}
274
+ onClick={() => onDelete(flattenToAppURL(comment['@id']))}
275
+ color="red"
382
276
  >
383
- {allCommentsWithCildren[comment.comment_id].children.length >
384
- 0 ? (
385
- this.state.collapsedComments[comment.comment_id] ? (
386
- <>
387
- <Icon name="eye" color="blue" />
388
- <FormattedMessage
389
- id="Show Replies"
390
- defaultMessage="Show Replies"
391
- />
392
- </>
393
- ) : (
394
- <>
395
- <Icon name="minus" color="blue" />
396
- <FormattedMessage
397
- id="Hide Replies"
398
- defaultMessage="Hide Replies"
399
- />
400
- </>
401
- )
402
- ) : null}
277
+ <Icon name="delete" color="red" />
278
+ <FormattedMessage
279
+ id="Delete"
280
+ defaultMessage="Delete"
281
+ color="red"
282
+ />
403
283
  </Comment.Action>
404
- </Comment.Actions>
405
- <div id={`reply-place-${comment.comment_id}`}></div>
406
- </Comment.Content>
284
+ )}
285
+ <Comment.Action as="a" onClick={() => hideReply(comment.comment_id)}>
286
+ {allCommentsWithCildren[comment.comment_id].children.length > 0 ? (
287
+ collapsedComments[comment.comment_id] ? (
288
+ <>
289
+ <Icon name="eye" color="blue" />
290
+ <FormattedMessage
291
+ id="Show Replies"
292
+ defaultMessage="Show Replies"
293
+ />
294
+ </>
295
+ ) : (
296
+ <>
297
+ <Icon name="minus" color="blue" />
298
+ <FormattedMessage
299
+ id="Hide Replies"
300
+ defaultMessage="Hide Replies"
301
+ />
302
+ </>
303
+ )
304
+ ) : null}
305
+ </Comment.Action>
306
+ </Comment.Actions>
307
+ <div id={`reply-place-${comment.comment_id}`}></div>
308
+ </Comment.Content>
309
+
310
+ {allCommentsWithCildren[comment.comment_id].children.length > 0
311
+ ? allCommentsWithCildren[comment.comment_id].children.map(
312
+ (child, index) => (
313
+ <Comment.Group
314
+ collapsed={collapsedComments[comment.comment_id]}
315
+ key={`group-${index}-${comment.comment_id}`}
316
+ >
317
+ {commentElement(child)}
318
+ </Comment.Group>
319
+ ),
320
+ )
321
+ : null}
322
+ </Comment>
323
+ );
407
324
 
408
- {allCommentsWithCildren[comment.comment_id].children.length > 0
409
- ? allCommentsWithCildren[comment.comment_id].children.map(
410
- (child, index) => (
411
- <Comment.Group
412
- collapsed={collapsedComments[comment.comment_id]}
413
- key={`group-${index}-${comment.comment_id}`}
414
- >
415
- {commentElement(child)}
416
- </Comment.Group>
417
- ),
418
- )
419
- : null}
420
- </Comment>
421
- );
325
+ if (!permissions.view_comments) return '';
422
326
 
423
- if (!permissions.view_comments) return '';
327
+ return (
328
+ <Container className="comments">
329
+ <CommentEditModal
330
+ open={showEdit}
331
+ onCancel={onEditCancel}
332
+ onOk={onEditOk}
333
+ id={editId}
334
+ text={editText}
335
+ />
336
+ {permissions.can_reply && (
337
+ <div id="comment-add-id">
338
+ <Form
339
+ onSubmit={onSubmit}
340
+ onCancel={onEditCancel}
341
+ submitLabel={intl.formatMessage(messages.comment)}
342
+ resetAfterSubmit
343
+ schema={makeFormSchema(intl)}
344
+ />
345
+ </div>
346
+ )}
347
+ {/* all comments */}
348
+ <Comment.Group threaded>
349
+ {allPrimaryComments.map((item) => commentElement(item))}
350
+ </Comment.Group>
424
351
 
425
- return (
426
- <Container className="comments">
427
- <CommentEditModal
428
- open={this.state.showEdit}
429
- onCancel={this.onEditCancel}
430
- onOk={this.onEditOk}
431
- id={this.state.editId}
432
- text={this.state.editText}
433
- />
434
- {permissions.can_reply && (
435
- <div id="comment-add-id">
436
- <Form
437
- onSubmit={this.onSubmit}
438
- onCancel={this.onEditCancel}
439
- submitLabel={this.props.intl.formatMessage(messages.comment)}
440
- resetAfterSubmit
441
- schema={makeFormSchema(this.props.intl)}
442
- />
443
- </div>
444
- )}
445
- {/* all comments */}
446
- <Comment.Group threaded>
447
- {allPrimaryComments.map((item) => commentElement(item))}
448
- </Comment.Group>
352
+ {/* load more button */}
353
+ {items_total > items.length && (
354
+ <Button fluid basic color="blue" onClick={loadMoreComments}>
355
+ <FormattedMessage id="Load more" defaultMessage="Load more..." />
356
+ </Button>
357
+ )}
449
358
 
450
- {/* load more button */}
451
- {this.props.items_total > this.props.items.length && (
452
- <Button fluid basic color="blue" onClick={this.loadMoreComments}>
453
- <FormattedMessage id="Load more" defaultMessage="Load more..." />
454
- </Button>
455
- )}
359
+ {replyTo && (
360
+ <Portal
361
+ node={document && document.getElementById(`reply-place-${replyTo}`)}
362
+ >
363
+ <Form
364
+ onSubmit={onSubmit}
365
+ onCancel={onEditCancel}
366
+ submitLabel={intl.formatMessage(messages.comment)}
367
+ resetAfterSubmit
368
+ schema={makeFormSchema(intl)}
369
+ />
370
+ </Portal>
371
+ )}
372
+ </Container>
373
+ );
374
+ };
456
375
 
457
- {this.state.replyTo && (
458
- <Portal
459
- node={
460
- document &&
461
- document.getElementById(`reply-place-${this.state.replyTo}`)
462
- }
463
- >
464
- <Form
465
- onSubmit={this.onSubmit}
466
- onCancel={this.onEditCancel}
467
- submitLabel={this.props.intl.formatMessage(messages.comment)}
468
- resetAfterSubmit
469
- schema={makeFormSchema(this.props.intl)}
470
- />
471
- </Portal>
472
- )}
473
- </Container>
474
- );
475
- }
476
- }
376
+ Comments.propTypes = {
377
+ pathname: PropTypes.string.isRequired,
378
+ };
477
379
 
478
- export default compose(
479
- injectIntl,
480
- injectLazyLibs(['moment']),
481
- connect(
482
- (state) => ({
483
- items: state.comments.items,
484
- next: state.comments.next,
485
- items_total: state.comments.items_total,
486
- permissions: state.comments.permissions || {},
487
- addRequest: state.comments.add,
488
- deleteRequest: state.comments.delete,
489
- }),
490
- { addComment, deleteComment, listComments, listMoreComments },
491
- ),
492
- )(Comments);
380
+ export default compose(injectLazyLibs(['moment']))(Comments);