@plone/volto 17.0.0-alpha.8 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (365) hide show
  1. package/.eslintrc +26 -3
  2. package/CHANGELOG.md +488 -5
  3. package/CONTRIBUTING.md +5 -1
  4. package/README.md +12 -9
  5. package/addon-registry.js +10 -1
  6. package/create-addons-loader.js +1 -1
  7. package/cypress/support/commands.js +70 -14
  8. package/cypress/support/e2e.js +1 -2
  9. package/cypress/support/volto-slate.js +4 -5
  10. package/cypress.config.js +1 -0
  11. package/docker-compose.yml +1 -1
  12. package/locales/ca/LC_MESSAGES/volto.po +276 -53
  13. package/locales/ca.json +1 -1
  14. package/locales/de/LC_MESSAGES/volto.po +284 -61
  15. package/locales/de.json +1 -1
  16. package/locales/en/LC_MESSAGES/volto.po +274 -51
  17. package/locales/en.json +1 -1
  18. package/locales/es/LC_MESSAGES/volto.po +313 -90
  19. package/locales/es.json +1 -1
  20. package/locales/eu/LC_MESSAGES/volto.po +275 -52
  21. package/locales/eu.json +1 -1
  22. package/locales/fi/LC_MESSAGES/volto.po +275 -52
  23. package/locales/fi.json +1 -1
  24. package/locales/fr/LC_MESSAGES/volto.po +276 -53
  25. package/locales/fr.json +1 -1
  26. package/locales/it/LC_MESSAGES/volto.po +469 -246
  27. package/locales/it.json +1 -1
  28. package/locales/ja/LC_MESSAGES/volto.po +275 -52
  29. package/locales/ja.json +1 -1
  30. package/locales/nl/LC_MESSAGES/volto.po +276 -53
  31. package/locales/nl.json +1 -1
  32. package/locales/pt/LC_MESSAGES/volto.po +276 -53
  33. package/locales/pt.json +1 -1
  34. package/locales/pt_BR/LC_MESSAGES/volto.po +309 -86
  35. package/locales/pt_BR.json +1 -1
  36. package/locales/ro/LC_MESSAGES/volto.po +276 -53
  37. package/locales/ro.json +1 -1
  38. package/locales/volto.pot +279 -52
  39. package/locales/zh_CN/LC_MESSAGES/volto.po +276 -53
  40. package/locales/zh_CN.json +1 -1
  41. package/package.json +44 -34
  42. package/packages/volto-slate/package.json +1 -1
  43. package/packages/volto-slate/src/actions/index.js +1 -1
  44. package/packages/volto-slate/src/blocks/Table/TableBlockEdit.jsx +21 -212
  45. package/packages/volto-slate/src/blocks/Table/schema.js +122 -0
  46. package/packages/volto-slate/src/blocks/Text/DefaultTextBlockEditor.jsx +8 -3
  47. package/packages/volto-slate/src/blocks/Text/TextBlockView.jsx +21 -16
  48. package/packages/volto-slate/src/blocks/Text/extensions/withDeserializers.js +3 -1
  49. package/packages/volto-slate/src/blocks/Text/index.js +10 -7
  50. package/packages/volto-slate/src/editor/config.jsx +5 -4
  51. package/packages/volto-slate/src/editor/index.js +4 -4
  52. package/packages/volto-slate/src/editor/less/slate.less +28 -0
  53. package/packages/volto-slate/src/editor/plugins/Link/render.jsx +5 -6
  54. package/packages/volto-slate/src/editor/plugins/StyleMenu/StyleMenu.jsx +14 -4
  55. package/packages/volto-slate/src/editor/plugins/StyleMenu/utils.js +14 -5
  56. package/packages/volto-slate/src/editor/render.jsx +77 -8
  57. package/packages/volto-slate/src/editor/ui/SlateContextToolbar.jsx +2 -2
  58. package/packages/volto-slate/src/editor/ui/index.js +15 -15
  59. package/packages/volto-slate/src/index.js +2 -2
  60. package/packages/volto-slate/src/utils/blocks.js +7 -0
  61. package/packages/volto-slate/src/widgets/RichTextWidget.jsx +15 -8
  62. package/razzle.config.js +4 -6
  63. package/src/actions/index.js +4 -0
  64. package/src/actions/navroot/navroot.js +16 -0
  65. package/src/actions/navroot/navroot.test.js +15 -0
  66. package/src/actions/relations/rebuild.js +7 -7
  67. package/src/actions/relations/relations.js +17 -0
  68. package/src/actions/site/site.js +16 -0
  69. package/src/actions/site/site.test.js +15 -0
  70. package/src/actions/userSession/userSession.js +17 -1
  71. package/src/components/index.js +194 -192
  72. package/src/components/manage/Actions/Actions.jsx +133 -243
  73. package/src/components/manage/Add/Add.jsx +7 -8
  74. package/src/components/manage/AnchorPlugin/index.jsx +2 -2
  75. package/src/components/manage/AnchorPlugin/utils/EditorUtils.js +3 -1
  76. package/src/components/manage/Blocks/Block/BlocksForm.jsx +19 -2
  77. package/src/components/manage/Blocks/Block/Edit.jsx +1 -1
  78. package/src/components/manage/Blocks/Block/Settings.jsx +2 -0
  79. package/src/components/manage/Blocks/Block/Settings.test.jsx +92 -0
  80. package/src/components/manage/Blocks/Block/Style.jsx +2 -2
  81. package/src/components/manage/Blocks/Container/Data.jsx +32 -0
  82. package/src/components/manage/Blocks/Container/Edit.jsx +177 -0
  83. package/src/components/manage/Blocks/Container/EditBlockWrapper.jsx +121 -0
  84. package/src/components/manage/Blocks/Container/NewBlockAddButton.jsx +84 -0
  85. package/src/components/manage/Blocks/Container/SimpleContainerToolbar.jsx +54 -0
  86. package/src/components/manage/Blocks/Grid/Edit.jsx +47 -0
  87. package/src/components/manage/Blocks/Grid/View.jsx +43 -0
  88. package/src/components/manage/Blocks/Grid/adapter.js +14 -0
  89. package/src/components/manage/Blocks/Grid/grid-1.svg +6 -0
  90. package/src/components/manage/Blocks/Grid/grid-2.svg +9 -0
  91. package/src/components/manage/Blocks/Grid/grid-3.svg +10 -0
  92. package/src/components/manage/Blocks/Grid/grid-4.svg +11 -0
  93. package/src/components/manage/Blocks/Grid/schema.js +35 -0
  94. package/src/components/manage/Blocks/Grid/templates.js +47 -0
  95. package/src/components/manage/Blocks/HTML/Edit.jsx +8 -8
  96. package/src/components/manage/Blocks/HeroImageLeft/Edit.jsx +36 -26
  97. package/src/components/manage/Blocks/Image/Edit.jsx +51 -12
  98. package/src/components/manage/Blocks/Image/Edit.test.jsx +2 -0
  99. package/src/components/manage/Blocks/Image/ImageSidebar.jsx +66 -16
  100. package/src/components/manage/Blocks/Image/View.jsx +26 -5
  101. package/src/components/manage/Blocks/Image/View.test.jsx +20 -0
  102. package/src/components/manage/Blocks/Image/schema.js +17 -10
  103. package/src/components/manage/Blocks/Image/utils.js +14 -0
  104. package/src/components/manage/Blocks/LeadImage/Edit.jsx +32 -10
  105. package/src/components/manage/Blocks/LeadImage/Edit.test.jsx +11 -1
  106. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.jsx +28 -9
  107. package/src/components/manage/Blocks/LeadImage/LeadImageSidebar.test.jsx +8 -2
  108. package/src/components/manage/Blocks/LeadImage/View.jsx +50 -38
  109. package/src/components/manage/Blocks/LeadImage/View.test.jsx +11 -1
  110. package/src/components/manage/Blocks/Listing/DefaultTemplate.jsx +18 -3
  111. package/src/components/manage/Blocks/Listing/ListingBody.jsx +32 -8
  112. package/src/components/manage/Blocks/Listing/ListingBody.test.jsx +20 -0
  113. package/src/components/manage/Blocks/Listing/SummaryTemplate.jsx +1 -1
  114. package/src/components/manage/Blocks/Listing/getAsyncData.js +3 -5
  115. package/src/components/manage/Blocks/Listing/withQuerystringResults.jsx +27 -17
  116. package/src/components/manage/Blocks/Maps/Edit.jsx +135 -209
  117. package/src/components/manage/Blocks/Maps/Edit.test.jsx +1 -2
  118. package/src/components/manage/Blocks/Maps/View.test.jsx +1 -2
  119. package/src/components/manage/Blocks/Search/SearchBlockView.jsx +3 -2
  120. package/src/components/manage/Blocks/Search/components/Facets.jsx +66 -7
  121. package/src/components/manage/Blocks/Search/components/FilterList.jsx +4 -6
  122. package/src/components/manage/Blocks/Search/components/SearchInput.jsx +9 -2
  123. package/src/components/manage/Blocks/Search/components/SelectFacet.jsx +2 -9
  124. package/src/components/manage/Blocks/Search/components/index.js +13 -13
  125. package/src/components/manage/Blocks/Search/hocs/index.js +2 -2
  126. package/src/components/manage/Blocks/Search/hocs/withQueryString.jsx +5 -2
  127. package/src/components/manage/Blocks/Search/hocs/withSearch.jsx +70 -36
  128. package/src/components/manage/Blocks/Search/layout/LeftColumnFacets.jsx +17 -5
  129. package/src/components/manage/Blocks/Search/layout/RightColumnFacets.jsx +17 -5
  130. package/src/components/manage/Blocks/Search/layout/TopSideFacets.jsx +21 -5
  131. package/src/components/manage/Blocks/Search/schema.js +29 -14
  132. package/src/components/manage/Blocks/Table/Cell.jsx +2 -3
  133. package/src/components/manage/Blocks/Teaser/Body.jsx +0 -1
  134. package/src/components/manage/Blocks/Teaser/DefaultBody.jsx +5 -10
  135. package/src/components/manage/Blocks/Teaser/schema.js +5 -0
  136. package/src/components/manage/Blocks/Text/Edit.jsx +2 -3
  137. package/src/components/manage/Blocks/Title/View.jsx +0 -23
  138. package/src/components/manage/Blocks/Title/View.test.jsx +16 -1
  139. package/src/components/manage/Blocks/ToC/Schema.jsx +40 -7
  140. package/src/components/manage/Blocks/ToC/View.jsx +84 -14
  141. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.jsx +8 -3
  142. package/src/components/manage/Blocks/ToC/variations/DefaultTocRenderer.test.jsx +44 -0
  143. package/src/components/manage/Blocks/ToC/variations/HorizontalMenu.jsx +149 -10
  144. package/src/components/manage/Blocks/ToC/variations/index.js +3 -1
  145. package/src/components/manage/Contents/Contents.jsx +285 -114
  146. package/src/components/manage/Contents/ContentsPropertiesModal.jsx +90 -166
  147. package/src/components/manage/Contents/ContentsRenameModal.jsx +88 -139
  148. package/src/components/manage/Contents/ContentsRenameModal.stories.jsx +61 -0
  149. package/src/components/manage/Contents/ContentsTagsModal.jsx +83 -130
  150. package/src/components/manage/Contents/ContentsTagsModal.stories.jsx +68 -0
  151. package/src/components/manage/Contents/ContentsUploadModal.jsx +11 -7
  152. package/src/components/manage/Contents/ContentsWorkflowModal.jsx +87 -154
  153. package/src/components/manage/Controlpanels/Aliases.jsx +4 -12
  154. package/src/components/manage/Controlpanels/Groups/GroupsControlpanel.jsx +65 -38
  155. package/src/components/manage/Controlpanels/Groups/RenderGroups.jsx +2 -2
  156. package/src/components/manage/Controlpanels/Relations/BrokenRelations.jsx +38 -13
  157. package/src/components/manage/Controlpanels/Relations/Relations.jsx +5 -5
  158. package/src/components/manage/Controlpanels/Relations/RelationsListing.jsx +8 -7
  159. package/src/components/manage/Controlpanels/Relations/RelationsMatrix.jsx +68 -68
  160. package/src/components/manage/Controlpanels/Rules/AddRule.jsx +3 -10
  161. package/src/components/manage/Controlpanels/Rules/EditRule.jsx +1 -1
  162. package/src/components/manage/Controlpanels/UndoControlpanel.jsx +6 -9
  163. package/src/components/manage/Controlpanels/Users/RenderUsers.jsx +97 -7
  164. package/src/components/manage/Controlpanels/Users/UsersControlpanel.jsx +127 -99
  165. package/src/components/manage/Delete/Delete.jsx +96 -171
  166. package/src/components/manage/Diff/DiffField.jsx +25 -1
  167. package/src/components/manage/DragDropList/DragDropList.jsx +18 -13
  168. package/src/components/manage/Form/BlockDataForm.jsx +3 -2
  169. package/src/components/manage/Form/BlockDataForm.test.jsx +51 -17
  170. package/src/components/manage/Form/Form.jsx +7 -6
  171. package/src/components/manage/Form/InlineForm.test.jsx +16 -14
  172. package/src/components/manage/History/History.jsx +11 -1
  173. package/src/components/manage/LinksToItem/LinksToItem.jsx +209 -0
  174. package/src/components/manage/LinksToItem/LinksToItem.test.jsx +100 -0
  175. package/src/components/manage/LockingToastsFactory/LockingToastsFactory.jsx +1 -2
  176. package/src/components/manage/Messages/Messages.jsx +32 -99
  177. package/src/components/manage/Messages/Messages.test.jsx +0 -1
  178. package/src/components/manage/Preferences/ChangePassword.jsx +2 -2
  179. package/src/components/manage/Sharing/Sharing.jsx +62 -22
  180. package/src/components/manage/Sidebar/AlignBlock.jsx +1 -1
  181. package/src/components/manage/Sidebar/Sidebar.jsx +139 -220
  182. package/src/components/manage/TemplateChooser/TemplateChooser.jsx +38 -0
  183. package/src/components/manage/TemplateChooser/TemplateChooser.test.jsx +34 -0
  184. package/src/components/manage/TemplateChooser/template.svg +10 -0
  185. package/src/components/manage/Toast/Toast.jsx +1 -1
  186. package/src/components/manage/Toolbar/More.jsx +17 -2
  187. package/src/components/manage/Toolbar/PersonalTools.jsx +97 -155
  188. package/src/components/manage/Toolbar/Toolbar.jsx +2 -2
  189. package/src/components/manage/UniversalLink/UniversalLink.jsx +6 -12
  190. package/src/components/manage/UniversalLink/UniversalLink.test.jsx +37 -0
  191. package/src/components/manage/Widgets/AlignWidget.jsx +2 -4
  192. package/src/components/manage/Widgets/ArrayWidget.jsx +3 -1
  193. package/src/components/manage/Widgets/ArrayWidget.test.jsx +45 -1
  194. package/src/components/manage/Widgets/ColorPickerWidget.jsx +6 -1
  195. package/src/components/manage/Widgets/ColorPickerWidget.test.jsx +9 -7
  196. package/src/components/manage/Widgets/DatetimeWidget.jsx +2 -8
  197. package/src/components/manage/Widgets/FileWidget.jsx +2 -1
  198. package/src/components/manage/Widgets/FormFieldWrapper.jsx +1 -1
  199. package/src/components/manage/Widgets/IdWidget.jsx +1 -2
  200. package/src/components/manage/Widgets/ObjectBrowserWidget.jsx +2 -9
  201. package/src/components/manage/Widgets/RecurrenceWidget/RecurrenceWidget.jsx +3 -10
  202. package/src/components/manage/Widgets/RecurrenceWidget/WeekdayOfTheMonthIndexField.jsx +4 -4
  203. package/src/components/manage/Widgets/RegistryImageWidget.jsx +210 -0
  204. package/src/components/manage/Widgets/RegistryImageWidget.test.jsx +91 -0
  205. package/src/components/manage/Widgets/SchemaWidget.jsx +6 -9
  206. package/src/components/manage/Widgets/SelectUtils.js +1 -1
  207. package/src/components/manage/Widgets/SelectWidget.jsx +15 -1
  208. package/src/components/manage/Widgets/SelectWidget.test.jsx +45 -1
  209. package/src/components/manage/Widgets/WysiwygWidget.jsx +2 -9
  210. package/src/components/manage/Workflow/Workflow.jsx +75 -184
  211. package/src/components/theme/Anontools/Anontools.jsx +44 -72
  212. package/src/components/theme/Anontools/Anontools.stories.jsx +16 -6
  213. package/src/components/theme/Anontools/Anontools.test.jsx +16 -2
  214. package/src/components/theme/Breadcrumbs/Breadcrumbs.jsx +52 -99
  215. package/src/components/theme/Breadcrumbs/Breadcrumbs.stories.jsx +14 -13
  216. package/src/components/theme/Comments/Comment.stories.jsx +84 -0
  217. package/src/components/theme/Comments/CommentEditModal.jsx +63 -115
  218. package/src/components/theme/Comments/Comments.jsx +268 -380
  219. package/src/components/theme/Component/Component.jsx +1 -1
  220. package/src/components/theme/ContactForm/ContactForm.jsx +108 -192
  221. package/src/components/theme/ContactForm/ContactForm.stories.jsx +1 -1
  222. package/src/components/theme/ContactForm/ContactForm.test.jsx +2 -3
  223. package/src/components/theme/ContentMetadataTags/ContentMetadataTags.jsx +41 -3
  224. package/src/components/theme/Error/ServerError.jsx +29 -0
  225. package/src/components/theme/Header/Header.jsx +37 -63
  226. package/src/components/theme/Header/Header.test.jsx +18 -0
  227. package/src/components/theme/Image/Image.jsx +96 -0
  228. package/src/components/theme/Image/Image.test.jsx +125 -0
  229. package/src/components/theme/Login/Login.jsx +160 -243
  230. package/src/components/theme/Logo/Logo.Multilingual.test.jsx +131 -1
  231. package/src/components/theme/Logo/Logo.jsx +35 -27
  232. package/src/components/theme/Logo/Logo.test.jsx +135 -1
  233. package/src/components/theme/Logout/Logout.jsx +36 -83
  234. package/src/components/theme/Navigation/Navigation.jsx +86 -171
  235. package/src/components/theme/NotFound/NotFound.jsx +55 -41
  236. package/src/components/theme/PasswordReset/PasswordReset.jsx +7 -5
  237. package/src/components/theme/PasswordReset/RequestPasswordReset.jsx +95 -170
  238. package/src/components/theme/PreviewImage/PreviewImage.jsx +31 -15
  239. package/src/components/theme/PreviewImage/PreviewImage.test.js +53 -13
  240. package/src/components/theme/Register/Register.jsx +2 -4
  241. package/src/components/theme/Search/SearchTags.jsx +30 -60
  242. package/src/components/theme/SearchWidget/SearchWidget.jsx +49 -97
  243. package/src/components/theme/SearchWidget/SearchWidget.test.jsx +8 -0
  244. package/src/components/theme/Sitemap/Sitemap.jsx +24 -13
  245. package/src/components/theme/Sitemap/Sitemap.test.jsx +23 -2
  246. package/src/components/theme/TsTest/TsTest.test.tsx +11 -0
  247. package/src/components/theme/TsTest/TsTest.tsx +15 -0
  248. package/src/components/theme/View/AlbumView.jsx +21 -16
  249. package/src/components/theme/View/EventView.jsx +36 -25
  250. package/src/components/theme/View/FileView.jsx +23 -18
  251. package/src/components/theme/View/ImageView.jsx +40 -32
  252. package/src/components/theme/View/ImageView.test.jsx +4 -0
  253. package/src/components/theme/View/LinkView.jsx +53 -78
  254. package/src/components/theme/View/ListingView.jsx +36 -28
  255. package/src/components/theme/View/NewsItemView.jsx +16 -17
  256. package/src/components/theme/View/RenderBlocks.jsx +56 -21
  257. package/src/components/theme/View/RenderEmptyBlock.jsx +5 -0
  258. package/src/components/theme/View/SummaryView.jsx +49 -39
  259. package/src/components/theme/View/TabularView.jsx +59 -53
  260. package/src/components/theme/View/View.jsx +2 -0
  261. package/src/components/theme/Widgets/ImageWidget.stories.jsx +1 -2
  262. package/src/config/Blocks.jsx +46 -0
  263. package/src/config/Components.jsx +3 -1
  264. package/src/config/ControlPanels.js +0 -1
  265. package/src/config/Loadables.jsx +1 -1
  266. package/src/config/NonContentRoutes.jsx +1 -0
  267. package/src/config/RichTextEditor/Blocks.jsx +4 -5
  268. package/src/config/RichTextEditor/FromHTML.jsx +2 -2
  269. package/src/config/RichTextEditor/Plugins.jsx +2 -3
  270. package/src/config/RichTextEditor/Styles.jsx +1 -1
  271. package/src/config/RichTextEditor/ToHTML.jsx +12 -10
  272. package/src/config/RichTextEditor/index.js +2 -3
  273. package/src/config/Views.jsx +6 -4
  274. package/src/config/Widgets.jsx +3 -0
  275. package/src/config/index.js +36 -2
  276. package/src/config/server.js +2 -0
  277. package/src/constants/ActionTypes.js +4 -0
  278. package/src/constants/Indexes.js +3 -1
  279. package/src/express-middleware/devproxy.js +1 -1
  280. package/src/express-middleware/files.js +11 -9
  281. package/src/express-middleware/images.js +12 -5
  282. package/src/express-middleware/ok.js +16 -0
  283. package/src/express-middleware/robotstxt.js +1 -1
  284. package/src/express-middleware/sitemap.js +1 -1
  285. package/src/express-middleware/static.js +3 -3
  286. package/src/helpers/Api/Api.js +1 -1
  287. package/src/helpers/Blocks/Blocks.js +52 -6
  288. package/src/helpers/Blocks/Blocks.test.js +92 -13
  289. package/src/helpers/Extensions/index.js +2 -1
  290. package/src/helpers/Extensions/withBlockSchemaEnhancer.js +63 -61
  291. package/src/helpers/Extensions/withBlockSchemaEnhancer.test.js +145 -0
  292. package/src/helpers/FormValidation/FormValidation.js +37 -7
  293. package/src/helpers/FormValidation/FormValidation.test.js +32 -0
  294. package/src/helpers/Html/Html.jsx +2 -8
  295. package/src/helpers/Loadable/__mocks__/Loadable.js +18 -18
  296. package/src/helpers/MessageLabels/MessageLabels.js +39 -4
  297. package/src/helpers/ScrollToTop/ScrollToTop.jsx +5 -3
  298. package/src/helpers/Site/index.js +21 -0
  299. package/src/helpers/Url/Url.js +22 -1
  300. package/src/helpers/Url/Url.test.js +41 -0
  301. package/src/helpers/Utils/UseDetectClickOutside.stories.jsx +190 -0
  302. package/src/helpers/Utils/Utils.js +35 -0
  303. package/src/helpers/Utils/Utils.test.js +13 -0
  304. package/src/helpers/Utils/usePagination.js +67 -14
  305. package/src/helpers/Utils/usePagination.test.js +115 -0
  306. package/src/helpers/index.js +15 -8
  307. package/src/hooks/client/useClient.js +11 -0
  308. package/src/hooks/clipboard/useClipboard.js +26 -0
  309. package/src/hooks/index.js +2 -0
  310. package/src/icons/grid-block.svg +11 -0
  311. package/src/middleware/api.js +203 -173
  312. package/src/middleware/blacklistRoutes.js +25 -22
  313. package/src/middleware/index.js +2 -2
  314. package/src/middleware/storeProtectLoadUtils.js +61 -62
  315. package/src/middleware/storeProtectLoadUtils.test.js +47 -43
  316. package/src/reducers/actions/actions.js +7 -5
  317. package/src/reducers/actions/actions.test.js +70 -0
  318. package/src/reducers/content/content.test.js +4 -4
  319. package/src/reducers/index.js +4 -0
  320. package/src/reducers/navigation/navigation.js +5 -5
  321. package/src/reducers/navigation/navigation.test.js +30 -0
  322. package/src/reducers/navroot/navroot.js +79 -0
  323. package/src/reducers/navroot/navroot.test.js +110 -0
  324. package/src/reducers/relations/relations.js +74 -46
  325. package/src/reducers/site/site.js +51 -0
  326. package/src/reducers/site/site.test.js +67 -0
  327. package/src/reducers/userSession/userSession.js +15 -1
  328. package/src/registry.js +2 -2
  329. package/src/routes.js +9 -0
  330. package/src/server.jsx +9 -0
  331. package/src/start-server.js +2 -2
  332. package/src/storybook.jsx +24 -38
  333. package/test-setup-config.js +11 -1
  334. package/theme/themes/pastanaga/collections/form.overrides +46 -0
  335. package/theme/themes/pastanaga/collections/menu.overrides +3 -2
  336. package/theme/themes/pastanaga/elements/container.overrides +5 -2
  337. package/theme/themes/pastanaga/elements/input.overrides +11 -1
  338. package/theme/themes/pastanaga/elements/label.overrides +10 -0
  339. package/theme/themes/pastanaga/elements/step.overrides +2 -1
  340. package/theme/themes/pastanaga/extras/blocks.less +25 -15
  341. package/theme/themes/pastanaga/extras/color-picker-widget.less +1 -1
  342. package/theme/themes/pastanaga/extras/contents.less +6 -1
  343. package/theme/themes/pastanaga/extras/draftjs.less +4 -4
  344. package/theme/themes/pastanaga/extras/grid.less +427 -0
  345. package/theme/themes/pastanaga/extras/login.less +3 -0
  346. package/theme/themes/pastanaga/extras/main.less +14 -7
  347. package/theme/themes/pastanaga/extras/react-dates-overrides.less +4 -2
  348. package/theme/themes/pastanaga/extras/search.less +7 -1
  349. package/theme/themes/pastanaga/extras/sidebar.less +5 -4
  350. package/theme/themes/pastanaga/extras/time-picker-overrides.less +5 -3
  351. package/theme/themes/pastanaga/extras/toc.less +29 -0
  352. package/theme/themes/pastanaga/extras/toolbar.less +6 -2
  353. package/theme/themes/pastanaga/extras/userscontrolpanel.less +17 -9
  354. package/theme/themes/pastanaga/extras/widgets.less +1 -1
  355. package/theme/themes/pastanaga/modules/rating.overrides +2 -1
  356. package/theme/themes/pastanaga-cms-ui/elements/container.overrides +2 -1
  357. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.elements.container.less +6 -2
  358. package/theme/themes/pastanaga-cms-ui/extras/cms-ui.site.less +2 -2
  359. package/tsconfig.json +33 -0
  360. package/webpack-plugins/webpack-less-plugin.js +19 -0
  361. package/.yarn/install-state.gz +0 -0
  362. package/.yarn/releases/yarn-3.2.3.cjs +0 -783
  363. package/src/components/manage/Blocks/Teaser/utils.js +0 -44
  364. package/src/components/manage/Blocks/Teaser/utils.test.jsx +0 -229
  365. package/src/components/theme/Header/Header.md +0 -27
@@ -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);