@wordpress/editor 14.44.0 → 14.45.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 (363) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/build/components/collab-sidebar/{comment-menu-item.cjs → add-note-menu-item.cjs} +17 -14
  3. package/build/components/collab-sidebar/add-note-menu-item.cjs.map +7 -0
  4. package/build/components/collab-sidebar/add-note.cjs +100 -0
  5. package/build/components/collab-sidebar/add-note.cjs.map +7 -0
  6. package/build/components/collab-sidebar/board-store.cjs +106 -0
  7. package/build/components/collab-sidebar/board-store.cjs.map +7 -0
  8. package/build/components/collab-sidebar/floating-container.cjs +63 -0
  9. package/build/components/collab-sidebar/floating-container.cjs.map +7 -0
  10. package/build/components/collab-sidebar/hooks.cjs +105 -140
  11. package/build/components/collab-sidebar/hooks.cjs.map +3 -3
  12. package/build/components/collab-sidebar/index.cjs +28 -90
  13. package/build/components/collab-sidebar/index.cjs.map +3 -3
  14. package/build/components/collab-sidebar/{comment-author-info.cjs → note-byline.cjs} +13 -9
  15. package/build/components/collab-sidebar/note-byline.cjs.map +7 -0
  16. package/build/components/collab-sidebar/note-card.cjs +58 -0
  17. package/build/components/collab-sidebar/note-card.cjs.map +7 -0
  18. package/build/components/collab-sidebar/{comment-form.cjs → note-form.cjs} +46 -45
  19. package/build/components/collab-sidebar/note-form.cjs.map +7 -0
  20. package/build/components/collab-sidebar/{comment-indicator-toolbar.cjs → note-indicator-toolbar.cjs} +31 -27
  21. package/build/components/collab-sidebar/note-indicator-toolbar.cjs.map +7 -0
  22. package/build/components/collab-sidebar/note-thread.cjs +321 -0
  23. package/build/components/collab-sidebar/note-thread.cjs.map +7 -0
  24. package/build/components/collab-sidebar/note.cjs +207 -0
  25. package/build/components/collab-sidebar/note.cjs.map +7 -0
  26. package/build/components/collab-sidebar/notes.cjs +237 -0
  27. package/build/components/collab-sidebar/notes.cjs.map +7 -0
  28. package/build/components/collab-sidebar/utils.cjs +80 -14
  29. package/build/components/collab-sidebar/utils.cjs.map +2 -2
  30. package/build/components/collaborators-presence/avatar/component.cjs.map +1 -1
  31. package/build/components/collaborators-presence/index.cjs +3 -3
  32. package/build/components/collaborators-presence/index.cjs.map +2 -2
  33. package/build/components/collaborators-presence/list.cjs +3 -3
  34. package/build/components/collaborators-presence/list.cjs.map +2 -2
  35. package/build/components/document-bar/index.cjs.map +3 -3
  36. package/build/components/error-boundary/index.cjs.map +3 -3
  37. package/build/components/list-view-sidebar/list-view-outline.cjs.map +3 -3
  38. package/build/components/media/media-editor-modal.cjs +93 -0
  39. package/build/components/media/media-editor-modal.cjs.map +7 -0
  40. package/build/components/media-categories/index.cjs +1 -1
  41. package/build/components/media-categories/index.cjs.map +1 -1
  42. package/build/components/more-menu/index.cjs +4 -3
  43. package/build/components/more-menu/index.cjs.map +2 -2
  44. package/build/components/post-actions/set-as-homepage.cjs.map +3 -3
  45. package/build/components/post-actions/set-as-posts-page.cjs.map +3 -3
  46. package/build/components/post-card-panel/index.cjs +2 -2
  47. package/build/components/post-card-panel/index.cjs.map +3 -3
  48. package/build/components/post-content-information/index.cjs.map +3 -3
  49. package/build/components/post-excerpt/panel.cjs.map +3 -3
  50. package/build/components/post-last-edited-panel/index.cjs.map +3 -3
  51. package/build/components/post-preview-button/index.cjs +3 -2
  52. package/build/components/post-preview-button/index.cjs.map +2 -2
  53. package/build/components/post-publish-button/index.cjs +2 -2
  54. package/build/components/post-publish-button/index.cjs.map +2 -2
  55. package/build/components/post-publish-button/label.cjs +4 -2
  56. package/build/components/post-publish-button/label.cjs.map +2 -2
  57. package/build/components/post-publish-panel/maybe-upload-media.cjs +1 -1
  58. package/build/components/post-publish-panel/maybe-upload-media.cjs.map +1 -1
  59. package/build/components/post-publish-panel/postpublish.cjs +3 -2
  60. package/build/components/post-publish-panel/postpublish.cjs.map +2 -2
  61. package/build/components/post-revisions-panel/index.cjs +2 -2
  62. package/build/components/post-revisions-panel/index.cjs.map +2 -2
  63. package/build/components/post-revisions-preview/diff-markers.cjs +1 -1
  64. package/build/components/post-revisions-preview/diff-markers.cjs.map +2 -2
  65. package/build/components/post-revisions-preview/revisions-slider.cjs +1 -0
  66. package/build/components/post-revisions-preview/revisions-slider.cjs.map +2 -2
  67. package/build/components/post-saved-state/index.cjs +4 -1
  68. package/build/components/post-saved-state/index.cjs.map +2 -2
  69. package/build/components/post-text-editor/index.cjs +3 -4
  70. package/build/components/post-text-editor/index.cjs.map +2 -2
  71. package/build/components/preview-dropdown/index.cjs +3 -2
  72. package/build/components/preview-dropdown/index.cjs.map +2 -2
  73. package/build/components/provider/index.cjs +3 -1
  74. package/build/components/provider/index.cjs.map +3 -3
  75. package/build/components/provider/use-block-editor-settings.cjs +7 -1
  76. package/build/components/provider/use-block-editor-settings.cjs.map +3 -3
  77. package/build/components/provider/use-upload-save-lock.cjs +2 -12
  78. package/build/components/provider/use-upload-save-lock.cjs.map +2 -2
  79. package/build/components/resizable-editor/resize-handle.cjs +2 -1
  80. package/build/components/resizable-editor/resize-handle.cjs.map +2 -2
  81. package/build/components/revision-created-panel/index.cjs.map +3 -3
  82. package/build/components/site-discussion/index.cjs.map +2 -2
  83. package/build/components/style-book/constants.cjs +1 -1
  84. package/build/components/style-book/constants.cjs.map +1 -1
  85. package/build/components/style-book/index.cjs +1 -1
  86. package/build/components/style-book/index.cjs.map +1 -1
  87. package/build/components/template-actions-panel/classic-theme-content.cjs.map +2 -2
  88. package/build/components/template-part-menu-items/convert-to-regular.cjs +54 -11
  89. package/build/components/template-part-menu-items/convert-to-regular.cjs.map +3 -3
  90. package/build/components/visual-editor/index.cjs +5 -22
  91. package/build/components/visual-editor/index.cjs.map +2 -2
  92. package/build/store/private-actions.cjs +0 -8
  93. package/build/store/private-actions.cjs.map +2 -2
  94. package/build/store/private-selectors.cjs +0 -5
  95. package/build/store/private-selectors.cjs.map +2 -2
  96. package/build/store/reducer.cjs +0 -10
  97. package/build/store/reducer.cjs.map +2 -2
  98. package/build/utils/media-finalize/index.cjs +3 -2
  99. package/build/utils/media-finalize/index.cjs.map +2 -2
  100. package/build/utils/media-upload/index.cjs +14 -25
  101. package/build/utils/media-upload/index.cjs.map +2 -2
  102. package/build-module/components/collab-sidebar/{comment-menu-item.mjs → add-note-menu-item.mjs} +10 -11
  103. package/build-module/components/collab-sidebar/add-note-menu-item.mjs.map +7 -0
  104. package/build-module/components/collab-sidebar/add-note.mjs +78 -0
  105. package/build-module/components/collab-sidebar/add-note.mjs.map +7 -0
  106. package/build-module/components/collab-sidebar/board-store.mjs +81 -0
  107. package/build-module/components/collab-sidebar/board-store.mjs.map +7 -0
  108. package/build-module/components/collab-sidebar/floating-container.mjs +28 -0
  109. package/build-module/components/collab-sidebar/floating-container.mjs.map +7 -0
  110. package/build-module/components/collab-sidebar/hooks.mjs +105 -144
  111. package/build-module/components/collab-sidebar/hooks.mjs.map +2 -2
  112. package/build-module/components/collab-sidebar/index.mjs +29 -95
  113. package/build-module/components/collab-sidebar/index.mjs.map +2 -2
  114. package/build-module/components/collab-sidebar/{comment-author-info.mjs → note-byline.mjs} +7 -7
  115. package/build-module/components/collab-sidebar/note-byline.mjs.map +7 -0
  116. package/build-module/components/collab-sidebar/note-card.mjs +33 -0
  117. package/build-module/components/collab-sidebar/note-card.mjs.map +7 -0
  118. package/build-module/components/collab-sidebar/note-form.mjs +84 -0
  119. package/build-module/components/collab-sidebar/note-form.mjs.map +7 -0
  120. package/build-module/components/collab-sidebar/{comment-indicator-toolbar.mjs → note-indicator-toolbar.mjs} +25 -29
  121. package/build-module/components/collab-sidebar/note-indicator-toolbar.mjs.map +7 -0
  122. package/build-module/components/collab-sidebar/note-thread.mjs +289 -0
  123. package/build-module/components/collab-sidebar/note-thread.mjs.map +7 -0
  124. package/build-module/components/collab-sidebar/note.mjs +176 -0
  125. package/build-module/components/collab-sidebar/note.mjs.map +7 -0
  126. package/build-module/components/collab-sidebar/notes.mjs +215 -0
  127. package/build-module/components/collab-sidebar/notes.mjs.map +7 -0
  128. package/build-module/components/collab-sidebar/utils.mjs +76 -10
  129. package/build-module/components/collab-sidebar/utils.mjs.map +2 -2
  130. package/build-module/components/collaborators-presence/avatar/component.mjs.map +1 -1
  131. package/build-module/components/collaborators-presence/index.mjs +3 -3
  132. package/build-module/components/collaborators-presence/index.mjs.map +2 -2
  133. package/build-module/components/collaborators-presence/list.mjs +3 -3
  134. package/build-module/components/collaborators-presence/list.mjs.map +2 -2
  135. package/build-module/components/document-bar/index.mjs +3 -3
  136. package/build-module/components/document-bar/index.mjs.map +2 -2
  137. package/build-module/components/error-boundary/index.mjs +2 -2
  138. package/build-module/components/error-boundary/index.mjs.map +2 -2
  139. package/build-module/components/list-view-sidebar/list-view-outline.mjs +5 -5
  140. package/build-module/components/list-view-sidebar/list-view-outline.mjs.map +2 -2
  141. package/build-module/components/media/media-editor-modal.mjs +62 -0
  142. package/build-module/components/media/media-editor-modal.mjs.map +7 -0
  143. package/build-module/components/media-categories/index.mjs +1 -1
  144. package/build-module/components/media-categories/index.mjs.map +1 -1
  145. package/build-module/components/more-menu/index.mjs +4 -8
  146. package/build-module/components/more-menu/index.mjs.map +2 -2
  147. package/build-module/components/post-actions/set-as-homepage.mjs +2 -2
  148. package/build-module/components/post-actions/set-as-homepage.mjs.map +2 -2
  149. package/build-module/components/post-actions/set-as-posts-page.mjs +2 -2
  150. package/build-module/components/post-actions/set-as-posts-page.mjs.map +2 -2
  151. package/build-module/components/post-card-panel/index.mjs +5 -5
  152. package/build-module/components/post-card-panel/index.mjs.map +2 -2
  153. package/build-module/components/post-content-information/index.mjs +2 -2
  154. package/build-module/components/post-content-information/index.mjs.map +2 -2
  155. package/build-module/components/post-excerpt/panel.mjs +2 -2
  156. package/build-module/components/post-excerpt/panel.mjs.map +2 -2
  157. package/build-module/components/post-last-edited-panel/index.mjs +2 -2
  158. package/build-module/components/post-last-edited-panel/index.mjs.map +2 -2
  159. package/build-module/components/post-preview-button/index.mjs +3 -2
  160. package/build-module/components/post-preview-button/index.mjs.map +2 -2
  161. package/build-module/components/post-publish-button/index.mjs +2 -2
  162. package/build-module/components/post-publish-button/index.mjs.map +2 -2
  163. package/build-module/components/post-publish-button/label.mjs +4 -2
  164. package/build-module/components/post-publish-button/label.mjs.map +2 -2
  165. package/build-module/components/post-publish-panel/maybe-upload-media.mjs +1 -1
  166. package/build-module/components/post-publish-panel/maybe-upload-media.mjs.map +1 -1
  167. package/build-module/components/post-publish-panel/postpublish.mjs +3 -3
  168. package/build-module/components/post-publish-panel/postpublish.mjs.map +2 -2
  169. package/build-module/components/post-revisions-panel/index.mjs +2 -2
  170. package/build-module/components/post-revisions-panel/index.mjs.map +2 -2
  171. package/build-module/components/post-revisions-preview/diff-markers.mjs +1 -1
  172. package/build-module/components/post-revisions-preview/diff-markers.mjs.map +2 -2
  173. package/build-module/components/post-revisions-preview/revisions-slider.mjs +1 -0
  174. package/build-module/components/post-revisions-preview/revisions-slider.mjs.map +2 -2
  175. package/build-module/components/post-saved-state/index.mjs +4 -1
  176. package/build-module/components/post-saved-state/index.mjs.map +2 -2
  177. package/build-module/components/post-text-editor/index.mjs +2 -3
  178. package/build-module/components/post-text-editor/index.mjs.map +2 -2
  179. package/build-module/components/preview-dropdown/index.mjs +2 -2
  180. package/build-module/components/preview-dropdown/index.mjs.map +2 -2
  181. package/build-module/components/provider/index.mjs +3 -1
  182. package/build-module/components/provider/index.mjs.map +2 -2
  183. package/build-module/components/provider/use-block-editor-settings.mjs +7 -1
  184. package/build-module/components/provider/use-block-editor-settings.mjs.map +2 -2
  185. package/build-module/components/provider/use-upload-save-lock.mjs +2 -12
  186. package/build-module/components/provider/use-upload-save-lock.mjs.map +2 -2
  187. package/build-module/components/resizable-editor/resize-handle.mjs +2 -5
  188. package/build-module/components/resizable-editor/resize-handle.mjs.map +2 -2
  189. package/build-module/components/revision-created-panel/index.mjs +2 -2
  190. package/build-module/components/revision-created-panel/index.mjs.map +2 -2
  191. package/build-module/components/site-discussion/index.mjs +2 -2
  192. package/build-module/components/site-discussion/index.mjs.map +2 -2
  193. package/build-module/components/style-book/constants.mjs +1 -1
  194. package/build-module/components/style-book/constants.mjs.map +1 -1
  195. package/build-module/components/style-book/index.mjs +1 -1
  196. package/build-module/components/style-book/index.mjs.map +1 -1
  197. package/build-module/components/template-actions-panel/classic-theme-content.mjs +2 -2
  198. package/build-module/components/template-actions-panel/classic-theme-content.mjs.map +2 -2
  199. package/build-module/components/template-part-menu-items/convert-to-regular.mjs +60 -14
  200. package/build-module/components/template-part-menu-items/convert-to-regular.mjs.map +2 -2
  201. package/build-module/components/visual-editor/index.mjs +5 -22
  202. package/build-module/components/visual-editor/index.mjs.map +2 -2
  203. package/build-module/store/private-actions.mjs +0 -7
  204. package/build-module/store/private-actions.mjs.map +2 -2
  205. package/build-module/store/private-selectors.mjs +0 -4
  206. package/build-module/store/private-selectors.mjs.map +2 -2
  207. package/build-module/store/reducer.mjs +0 -9
  208. package/build-module/store/reducer.mjs.map +2 -2
  209. package/build-module/utils/media-finalize/index.mjs +3 -2
  210. package/build-module/utils/media-finalize/index.mjs.map +2 -2
  211. package/build-module/utils/media-upload/index.mjs +14 -25
  212. package/build-module/utils/media-upload/index.mjs.map +2 -2
  213. package/build-style/style-rtl.css +397 -171
  214. package/build-style/style.css +397 -171
  215. package/build-types/components/collab-sidebar/add-note-menu-item.d.ts +5 -0
  216. package/build-types/components/collab-sidebar/add-note-menu-item.d.ts.map +1 -0
  217. package/build-types/components/collab-sidebar/add-note.d.ts +6 -0
  218. package/build-types/components/collab-sidebar/add-note.d.ts.map +1 -0
  219. package/build-types/components/collab-sidebar/board-store.d.ts +9 -0
  220. package/build-types/components/collab-sidebar/board-store.d.ts.map +1 -0
  221. package/build-types/components/collab-sidebar/floating-container.d.ts +8 -0
  222. package/build-types/components/collab-sidebar/floating-container.d.ts.map +1 -0
  223. package/build-types/components/collab-sidebar/hooks.d.ts +13 -22
  224. package/build-types/components/collab-sidebar/hooks.d.ts.map +1 -1
  225. package/build-types/components/collab-sidebar/index.d.ts.map +1 -1
  226. package/build-types/components/collab-sidebar/note-byline.d.ts +7 -0
  227. package/build-types/components/collab-sidebar/note-byline.d.ts.map +1 -0
  228. package/build-types/components/collab-sidebar/note-card.d.ts +8 -0
  229. package/build-types/components/collab-sidebar/note-card.d.ts.map +1 -0
  230. package/build-types/components/collab-sidebar/note-form.d.ts +7 -0
  231. package/build-types/components/collab-sidebar/note-form.d.ts.map +1 -0
  232. package/build-types/components/collab-sidebar/note-indicator-toolbar.d.ts +5 -0
  233. package/build-types/components/collab-sidebar/note-indicator-toolbar.d.ts.map +1 -0
  234. package/build-types/components/collab-sidebar/note-thread.d.ts +11 -0
  235. package/build-types/components/collab-sidebar/note-thread.d.ts.map +1 -0
  236. package/build-types/components/collab-sidebar/note.d.ts +9 -0
  237. package/build-types/components/collab-sidebar/note.d.ts.map +1 -0
  238. package/build-types/components/collab-sidebar/notes.d.ts +7 -0
  239. package/build-types/components/collab-sidebar/notes.d.ts.map +1 -0
  240. package/build-types/components/collab-sidebar/utils.d.ts +41 -17
  241. package/build-types/components/collab-sidebar/utils.d.ts.map +1 -1
  242. package/build-types/components/media/media-editor-modal.d.ts +11 -0
  243. package/build-types/components/media/media-editor-modal.d.ts.map +1 -0
  244. package/build-types/components/more-menu/index.d.ts.map +1 -1
  245. package/build-types/components/post-preview-button/index.d.ts.map +1 -1
  246. package/build-types/components/post-publish-button/index.d.ts.map +1 -1
  247. package/build-types/components/post-publish-button/label.d.ts.map +1 -1
  248. package/build-types/components/post-revisions-preview/revisions-slider.d.ts.map +1 -1
  249. package/build-types/components/post-saved-state/index.d.ts.map +1 -1
  250. package/build-types/components/provider/index.d.ts.map +1 -1
  251. package/build-types/components/provider/use-block-editor-settings.d.ts.map +1 -1
  252. package/build-types/components/provider/use-upload-save-lock.d.ts +0 -2
  253. package/build-types/components/provider/use-upload-save-lock.d.ts.map +1 -1
  254. package/build-types/components/resizable-editor/resize-handle.d.ts.map +1 -1
  255. package/build-types/components/style-book/constants.d.ts +1 -1
  256. package/build-types/components/style-book/constants.d.ts.map +1 -1
  257. package/build-types/components/template-part-menu-items/convert-to-regular.d.ts.map +1 -1
  258. package/build-types/components/visual-editor/index.d.ts.map +1 -1
  259. package/build-types/store/private-actions.d.ts +0 -7
  260. package/build-types/store/private-actions.d.ts.map +1 -1
  261. package/build-types/store/private-selectors.d.ts +0 -7
  262. package/build-types/store/private-selectors.d.ts.map +1 -1
  263. package/build-types/store/reducer.d.ts +0 -10
  264. package/build-types/store/reducer.d.ts.map +1 -1
  265. package/build-types/utils/media-finalize/index.d.ts +1 -1
  266. package/build-types/utils/media-finalize/index.d.ts.map +1 -1
  267. package/build-types/utils/media-upload/index.d.ts.map +1 -1
  268. package/package.json +46 -46
  269. package/src/components/collab-sidebar/README.md +117 -0
  270. package/src/components/collab-sidebar/{comment-menu-item.js → add-note-menu-item.js} +8 -10
  271. package/src/components/collab-sidebar/{add-comment.js → add-note.js} +26 -49
  272. package/src/components/collab-sidebar/board-store.js +85 -0
  273. package/src/components/collab-sidebar/floating-container.js +30 -0
  274. package/src/components/collab-sidebar/hooks.js +130 -178
  275. package/src/components/collab-sidebar/index.js +35 -106
  276. package/src/components/collab-sidebar/{comment-author-info.js → note-byline.js} +5 -6
  277. package/src/components/collab-sidebar/note-card.js +36 -0
  278. package/src/components/collab-sidebar/{comment-form.js → note-form.js} +29 -40
  279. package/src/components/collab-sidebar/{comment-indicator-toolbar.js → note-indicator-toolbar.js} +29 -32
  280. package/src/components/collab-sidebar/note-thread.js +331 -0
  281. package/src/components/collab-sidebar/note.js +209 -0
  282. package/src/components/collab-sidebar/notes.js +276 -0
  283. package/src/components/collab-sidebar/style.scss +21 -11
  284. package/src/components/collab-sidebar/test/utils.js +155 -0
  285. package/src/components/collab-sidebar/utils.js +125 -19
  286. package/src/components/collaborators-presence/avatar/component.tsx +1 -1
  287. package/src/components/collaborators-presence/styles/collaborators-list.scss +1 -1
  288. package/src/components/collaborators-presence/styles/collaborators-presence.scss +1 -1
  289. package/src/components/document-bar/index.js +4 -4
  290. package/src/components/document-outline/style.scss +1 -1
  291. package/src/components/error-boundary/index.js +3 -3
  292. package/src/components/list-view-sidebar/list-view-outline.js +6 -6
  293. package/src/components/media/media-editor-modal.js +95 -0
  294. package/src/components/media-categories/index.js +1 -1
  295. package/src/components/more-menu/index.js +4 -8
  296. package/src/components/post-actions/set-as-homepage.js +2 -2
  297. package/src/components/post-actions/set-as-posts-page.js +2 -2
  298. package/src/components/post-card-panel/index.js +7 -7
  299. package/src/components/post-content-information/index.js +3 -3
  300. package/src/components/post-excerpt/panel.js +3 -3
  301. package/src/components/post-last-edited-panel/index.js +3 -3
  302. package/src/components/post-preview-button/index.js +3 -2
  303. package/src/components/post-publish-button/index.js +6 -5
  304. package/src/components/post-publish-button/label.js +3 -1
  305. package/src/components/post-publish-panel/maybe-upload-media.js +1 -1
  306. package/src/components/post-publish-panel/postpublish.js +2 -2
  307. package/src/components/post-publish-panel/test/__snapshots__/index.js.snap +10 -16
  308. package/src/components/post-revisions-panel/index.js +3 -3
  309. package/src/components/post-revisions-preview/diff-markers.js +1 -1
  310. package/src/components/post-revisions-preview/revisions-slider.js +1 -0
  311. package/src/components/post-revisions-preview/style.scss +1 -1
  312. package/src/components/post-saved-state/index.js +4 -1
  313. package/src/components/post-saved-state/test/__snapshots__/index.js.snap +0 -1
  314. package/src/components/post-text-editor/index.js +3 -3
  315. package/src/components/preview-dropdown/index.js +2 -2
  316. package/src/components/provider/index.js +4 -0
  317. package/src/components/provider/use-block-editor-settings.js +10 -0
  318. package/src/components/provider/use-upload-save-lock.js +2 -17
  319. package/src/components/resizable-editor/resize-handle.js +2 -5
  320. package/src/components/revision-created-panel/index.js +3 -3
  321. package/src/components/site-discussion/index.js +3 -3
  322. package/src/components/style-book/constants.ts +1 -1
  323. package/src/components/style-book/index.js +1 -1
  324. package/src/components/template-actions-panel/classic-theme-content.js +3 -3
  325. package/src/components/template-actions-panel/style.scss +1 -1
  326. package/src/components/template-part-menu-items/convert-to-regular.js +74 -12
  327. package/src/components/visual-editor/index.js +2 -29
  328. package/src/store/private-actions.js +0 -13
  329. package/src/store/private-selectors.js +0 -10
  330. package/src/store/reducer.js +0 -16
  331. package/src/utils/media-finalize/index.js +2 -1
  332. package/src/utils/media-finalize/test/index.js +25 -1
  333. package/src/utils/media-upload/index.js +26 -29
  334. package/build/components/collab-sidebar/add-comment.cjs +0 -129
  335. package/build/components/collab-sidebar/add-comment.cjs.map +0 -7
  336. package/build/components/collab-sidebar/comment-author-info.cjs.map +0 -7
  337. package/build/components/collab-sidebar/comment-form.cjs.map +0 -7
  338. package/build/components/collab-sidebar/comment-indicator-toolbar.cjs.map +0 -7
  339. package/build/components/collab-sidebar/comment-menu-item.cjs.map +0 -7
  340. package/build/components/collab-sidebar/comments.cjs +0 -816
  341. package/build/components/collab-sidebar/comments.cjs.map +0 -7
  342. package/build-module/components/collab-sidebar/add-comment.mjs +0 -100
  343. package/build-module/components/collab-sidebar/add-comment.mjs.map +0 -7
  344. package/build-module/components/collab-sidebar/comment-author-info.mjs.map +0 -7
  345. package/build-module/components/collab-sidebar/comment-form.mjs +0 -90
  346. package/build-module/components/collab-sidebar/comment-form.mjs.map +0 -7
  347. package/build-module/components/collab-sidebar/comment-indicator-toolbar.mjs.map +0 -7
  348. package/build-module/components/collab-sidebar/comment-menu-item.mjs.map +0 -7
  349. package/build-module/components/collab-sidebar/comments.mjs +0 -799
  350. package/build-module/components/collab-sidebar/comments.mjs.map +0 -7
  351. package/build-types/components/collab-sidebar/add-comment.d.ts +0 -10
  352. package/build-types/components/collab-sidebar/add-comment.d.ts.map +0 -1
  353. package/build-types/components/collab-sidebar/comment-author-info.d.ts +0 -8
  354. package/build-types/components/collab-sidebar/comment-author-info.d.ts.map +0 -1
  355. package/build-types/components/collab-sidebar/comment-form.d.ts +0 -11
  356. package/build-types/components/collab-sidebar/comment-form.d.ts.map +0 -1
  357. package/build-types/components/collab-sidebar/comment-indicator-toolbar.d.ts +0 -6
  358. package/build-types/components/collab-sidebar/comment-indicator-toolbar.d.ts.map +0 -1
  359. package/build-types/components/collab-sidebar/comment-menu-item.d.ts +0 -6
  360. package/build-types/components/collab-sidebar/comment-menu-item.d.ts.map +0 -1
  361. package/build-types/components/collab-sidebar/comments.d.ts +0 -12
  362. package/build-types/components/collab-sidebar/comments.d.ts.map +0 -1
  363. package/src/components/collab-sidebar/comments.js +0 -985
@@ -1,985 +0,0 @@
1
- /**
2
- * External dependencies
3
- */
4
- import clsx from 'clsx';
5
-
6
- /**
7
- * WordPress dependencies
8
- */
9
- import {
10
- useState,
11
- RawHTML,
12
- useEffect,
13
- useCallback,
14
- useMemo,
15
- useRef,
16
- } from '@wordpress/element';
17
- import {
18
- __experimentalText as Text,
19
- __experimentalHStack as HStack,
20
- __experimentalVStack as VStack,
21
- __experimentalConfirmDialog as ConfirmDialog,
22
- Button,
23
- FlexItem,
24
- privateApis as componentsPrivateApis,
25
- } from '@wordpress/components';
26
- import { useDebounce } from '@wordpress/compose';
27
-
28
- import { published, moreVertical } from '@wordpress/icons';
29
- import { __, _x, sprintf, _n } from '@wordpress/i18n';
30
- import { useSelect, useDispatch } from '@wordpress/data';
31
- import { __unstableStripHTML as stripHTML } from '@wordpress/dom';
32
- import {
33
- store as blockEditorStore,
34
- privateApis as blockEditorPrivateApis,
35
- } from '@wordpress/block-editor';
36
-
37
- /**
38
- * Internal dependencies
39
- */
40
- import { unlock } from '../../lock-unlock';
41
- import CommentAuthorInfo from './comment-author-info';
42
- import CommentForm from './comment-form';
43
- import { focusCommentThread, getCommentExcerpt } from './utils';
44
- import { useFloatingThread } from './hooks';
45
- import { AddComment } from './add-comment';
46
- import { store as editorStore } from '../../store';
47
-
48
- const { useBlockElement } = unlock( blockEditorPrivateApis );
49
- const { Menu } = unlock( componentsPrivateApis );
50
-
51
- export function Comments( {
52
- threads: noteThreads,
53
- onEditComment,
54
- onAddReply,
55
- onCommentDelete,
56
- commentSidebarRef,
57
- reflowComments,
58
- isFloating = false,
59
- commentLastUpdated,
60
- } ) {
61
- const [ heights, setHeights ] = useState( {} );
62
- const [ boardOffsets, setBoardOffsets ] = useState( {} );
63
- const [ blockRefs, setBlockRefs ] = useState( {} );
64
-
65
- const { setCanvasMinHeight, selectNote } = unlock(
66
- useDispatch( editorStore )
67
- );
68
- const { selectBlock, toggleBlockSpotlight } = unlock(
69
- useDispatch( blockEditorStore )
70
- );
71
-
72
- const { blockCommentId, selectedBlockClientId, orderedBlockIds } =
73
- useSelect( ( select ) => {
74
- const {
75
- getBlockAttributes,
76
- getSelectedBlockClientId,
77
- getClientIdsWithDescendants,
78
- } = select( blockEditorStore );
79
- const clientId = getSelectedBlockClientId();
80
- return {
81
- blockCommentId: clientId
82
- ? getBlockAttributes( clientId )?.metadata?.noteId
83
- : null,
84
- selectedBlockClientId: clientId,
85
- orderedBlockIds: getClientIdsWithDescendants(),
86
- };
87
- }, [] );
88
- const { selectedNote, noteFocused } = useSelect( ( select ) => {
89
- const { getSelectedNote, isNoteFocused } = unlock(
90
- select( editorStore )
91
- );
92
- return {
93
- selectedNote: getSelectedNote(),
94
- noteFocused: isNoteFocused(),
95
- };
96
- }, [] );
97
-
98
- const relatedBlockElement = useBlockElement( selectedBlockClientId );
99
-
100
- const threads = useMemo( () => {
101
- const t = [ ...noteThreads ];
102
- const orderedThreads = [];
103
- // In floating mode, when the note board is shown, and as long
104
- // as the selected block doesn't have an existing note attached -
105
- // add a "new note" entry to the threads. This special thread type
106
- // gets sorted and floated like regular threads, but shows an AddComment
107
- // component instead of a regular comment thread.
108
- if ( isFloating && selectedNote === 'new' ) {
109
- // Insert the new note entry at the correct location for its blockId.
110
- const newNoteThread = {
111
- id: 'new',
112
- blockClientId: selectedBlockClientId,
113
- content: { rendered: '' },
114
- };
115
- // Insert the new comment block at the right order within the threads.
116
- orderedBlockIds.forEach( ( blockId ) => {
117
- if ( blockId === selectedBlockClientId ) {
118
- orderedThreads.push( newNoteThread );
119
- } else {
120
- const threadForBlock = t.find(
121
- ( thread ) => thread.blockClientId === blockId
122
- );
123
- if ( threadForBlock ) {
124
- orderedThreads.push( threadForBlock );
125
- }
126
- }
127
- } );
128
- return orderedThreads;
129
- }
130
- return t;
131
- }, [
132
- noteThreads,
133
- isFloating,
134
- selectedNote,
135
- selectedBlockClientId,
136
- orderedBlockIds,
137
- ] );
138
-
139
- const handleDelete = async ( comment ) => {
140
- const currentIndex = threads.findIndex( ( t ) => t.id === comment.id );
141
- const nextThread = threads[ currentIndex + 1 ];
142
- const prevThread = threads[ currentIndex - 1 ];
143
-
144
- await onCommentDelete( comment );
145
-
146
- if ( comment.parent !== 0 ) {
147
- // Move focus to the parent thread when a reply was deleted.
148
- selectNote( comment.parent );
149
- focusCommentThread( comment.parent, commentSidebarRef.current );
150
- return;
151
- }
152
-
153
- if ( nextThread ) {
154
- selectNote( nextThread.id );
155
- focusCommentThread( nextThread.id, commentSidebarRef.current );
156
- } else if ( prevThread ) {
157
- selectNote( prevThread.id );
158
- focusCommentThread( prevThread.id, commentSidebarRef.current );
159
- } else {
160
- selectNote( undefined );
161
- toggleBlockSpotlight( comment.blockClientId, false );
162
- // Move focus to the related block.
163
- relatedBlockElement?.focus();
164
- }
165
- };
166
-
167
- // Auto-select the related comment thread when a block is selected.
168
- useEffect( () => {
169
- selectNote( blockCommentId ?? undefined );
170
- }, [ blockCommentId, selectNote ] );
171
-
172
- // Focus the selected note when requested.
173
- useEffect( () => {
174
- if ( noteFocused && selectedNote ) {
175
- focusCommentThread(
176
- selectedNote,
177
- commentSidebarRef.current,
178
- selectedNote === 'new' ? 'textarea' : undefined
179
- );
180
- // Clear focus flag to avoid re-triggering.
181
- selectNote( selectedNote );
182
- }
183
- }, [ noteFocused, selectedNote, selectNote, commentSidebarRef ] );
184
-
185
- // Recalculate floating comment thread offsets whenever the heights change.
186
- useEffect( () => {
187
- /**
188
- * Calculate the y offsets for all comment threads. Account for potentially
189
- * overlapping threads and adjust their positions accordingly.
190
- */
191
- const calculateAllOffsets = () => {
192
- const offsets = {};
193
-
194
- if ( ! isFloating ) {
195
- return { offsets, minHeight: 0 };
196
- }
197
-
198
- // Find the index of the selected thread.
199
- const selectedThreadIndex = threads.findIndex(
200
- ( t ) => t.id === selectedNote
201
- );
202
-
203
- const breakIndex =
204
- selectedThreadIndex === -1 ? 0 : selectedThreadIndex;
205
-
206
- // If there is a selected thread, push threads above up and threads below down.
207
- const selectedThreadData = threads[ breakIndex ];
208
-
209
- if (
210
- ! selectedThreadData ||
211
- ! blockRefs[ selectedThreadData.id ]
212
- ) {
213
- return { offsets, minHeight: 0 };
214
- }
215
-
216
- let blockElement = blockRefs[ selectedThreadData.id ];
217
- let blockRect = blockElement?.getBoundingClientRect();
218
- const selectedThreadTop = blockRect?.top || 0;
219
- const selectedThreadHeight = heights[ selectedThreadData.id ] || 0;
220
-
221
- offsets[ selectedThreadData.id ] = -16;
222
-
223
- let previousThreadData = {
224
- threadTop: selectedThreadTop - 16,
225
- threadHeight: selectedThreadHeight,
226
- };
227
-
228
- // Process threads after the selected thread, offsetting any overlapping
229
- // threads downward.
230
- for ( let i = breakIndex + 1; i < threads.length; i++ ) {
231
- const thread = threads[ i ];
232
- if ( ! blockRefs[ thread.id ] ) {
233
- continue;
234
- }
235
-
236
- blockElement = blockRefs[ thread.id ];
237
- blockRect = blockElement?.getBoundingClientRect();
238
- const threadTop = blockRect?.top || 0;
239
- const threadHeight = heights[ thread.id ] || 0;
240
-
241
- let additionalOffset = -16;
242
-
243
- // Check if the thread overlaps with the previous one.
244
- const previousBottom =
245
- previousThreadData.threadTop +
246
- previousThreadData.threadHeight;
247
- if ( threadTop < previousBottom + 16 ) {
248
- // Shift down by the difference plus a margin to avoid overlap.
249
- additionalOffset = previousBottom - threadTop + 20;
250
- }
251
-
252
- offsets[ thread.id ] = additionalOffset;
253
-
254
- // Update for next iteration.
255
- previousThreadData = {
256
- threadTop: threadTop + additionalOffset,
257
- threadHeight,
258
- };
259
- }
260
-
261
- // Process threads before the selected thread, offsetting any overlapping
262
- // threads upward.
263
- let nextThreadData = {
264
- threadTop: selectedThreadTop - 16,
265
- };
266
-
267
- for ( let i = selectedThreadIndex - 1; i >= 0; i-- ) {
268
- const thread = threads[ i ];
269
- if ( ! blockRefs[ thread.id ] ) {
270
- continue;
271
- }
272
-
273
- blockElement = blockRefs[ thread.id ];
274
- blockRect = blockElement?.getBoundingClientRect();
275
- const threadTop = blockRect?.top || 0;
276
- const threadHeight = heights[ thread.id ] || 0;
277
-
278
- let additionalOffset = -16;
279
-
280
- // Calculate the bottom position of this thread with default offset.
281
- const threadBottom = threadTop + threadHeight;
282
-
283
- // Check if this thread's bottom would overlap with the next thread's top.
284
- if ( threadBottom > nextThreadData.threadTop ) {
285
- // Shift up by the difference plus a margin to avoid overlap.
286
- additionalOffset =
287
- nextThreadData.threadTop -
288
- threadTop -
289
- threadHeight -
290
- 20;
291
- }
292
-
293
- offsets[ thread.id ] = additionalOffset;
294
-
295
- // Update for next iteration (going upward).
296
- nextThreadData = {
297
- threadTop: threadTop + additionalOffset,
298
- };
299
- }
300
-
301
- let editorMinHeight = 0;
302
- // Take the calculated top of the final note plus its height as the editor min height.
303
- const lastThread = threads[ threads.length - 1 ];
304
- if ( blockRefs[ lastThread.id ] ) {
305
- const lastBlockElement = blockRefs[ lastThread.id ];
306
- const lastBlockRect = lastBlockElement?.getBoundingClientRect();
307
- const lastThreadTop = lastBlockRect?.top || 0;
308
- const lastThreadHeight = heights[ lastThread.id ] || 0;
309
- const lastThreadOffset = offsets[ lastThread.id ] || 0;
310
- editorMinHeight =
311
- lastThreadTop + lastThreadHeight + lastThreadOffset + 32;
312
- }
313
-
314
- return { offsets, minHeight: editorMinHeight };
315
- };
316
- const { offsets: newOffsets, minHeight } = calculateAllOffsets();
317
- if ( Object.keys( newOffsets ).length > 0 ) {
318
- setBoardOffsets( newOffsets );
319
- }
320
- // Ensure the editor has enough height to scroll to all notes.
321
- setCanvasMinHeight( minHeight );
322
- }, [
323
- heights,
324
- blockRefs,
325
- isFloating,
326
- threads,
327
- selectedNote,
328
- setCanvasMinHeight,
329
- ] );
330
-
331
- const handleThreadNavigation = ( event, thread, isSelected ) => {
332
- if ( event.defaultPrevented ) {
333
- return;
334
- }
335
-
336
- const currentIndex = threads.findIndex( ( t ) => t.id === thread.id );
337
-
338
- if (
339
- ( event.key === 'Enter' || event.key === 'ArrowRight' ) &&
340
- event.currentTarget === event.target &&
341
- ! isSelected
342
- ) {
343
- // Expand thread.
344
- selectNote( thread.id );
345
- if ( !! thread.blockClientId ) {
346
- // Pass `null` as the second parameter to prevent focusing the block.
347
- selectBlock( thread.blockClientId, null );
348
- toggleBlockSpotlight( thread.blockClientId, true );
349
- }
350
- } else if (
351
- ( ( event.key === 'Enter' || event.key === 'ArrowLeft' ) &&
352
- event.currentTarget === event.target &&
353
- isSelected ) ||
354
- event.key === 'Escape'
355
- ) {
356
- // Collapse thread.
357
- selectNote( undefined );
358
- if ( thread.blockClientId ) {
359
- toggleBlockSpotlight( thread.blockClientId, false );
360
- }
361
- focusCommentThread( thread.id, commentSidebarRef.current );
362
- } else if (
363
- event.key === 'ArrowDown' &&
364
- currentIndex < threads.length - 1 &&
365
- event.currentTarget === event.target
366
- ) {
367
- // Move to the next thread.
368
- const nextThread = threads[ currentIndex + 1 ];
369
- focusCommentThread( nextThread.id, commentSidebarRef.current );
370
- } else if (
371
- event.key === 'ArrowUp' &&
372
- currentIndex > 0 &&
373
- event.currentTarget === event.target
374
- ) {
375
- // Move to the previous thread.
376
- const prevThread = threads[ currentIndex - 1 ];
377
- focusCommentThread( prevThread.id, commentSidebarRef.current );
378
- } else if (
379
- event.key === 'Home' &&
380
- event.currentTarget === event.target
381
- ) {
382
- // Move to the first thread.
383
- focusCommentThread( threads[ 0 ].id, commentSidebarRef.current );
384
- } else if (
385
- event.key === 'End' &&
386
- event.currentTarget === event.target
387
- ) {
388
- // Move to the last thread.
389
- focusCommentThread(
390
- threads[ threads.length - 1 ].id,
391
- commentSidebarRef.current
392
- );
393
- }
394
- };
395
-
396
- const setBlockRef = useCallback( ( id, blockRef ) => {
397
- setBlockRefs( ( prev ) => ( { ...prev, [ id ]: blockRef } ) );
398
- }, [] );
399
-
400
- const hasThreads = Array.isArray( threads ) && threads.length > 0;
401
- // A special case for `template-locked` mode - https://github.com/WordPress/gutenberg/pull/72646.
402
- if ( ! hasThreads && ! isFloating ) {
403
- return (
404
- <AddComment
405
- onSubmit={ onAddReply }
406
- commentSidebarRef={ commentSidebarRef }
407
- />
408
- );
409
- }
410
-
411
- return (
412
- <>
413
- { ! isFloating && selectedNote === 'new' && (
414
- <AddComment
415
- onSubmit={ onAddReply }
416
- commentSidebarRef={ commentSidebarRef }
417
- />
418
- ) }
419
- { threads.map( ( thread ) => (
420
- <Thread
421
- key={ thread.id }
422
- thread={ thread }
423
- onAddReply={ onAddReply }
424
- onCommentDelete={ handleDelete }
425
- onEditComment={ onEditComment }
426
- isSelected={ selectedNote === thread.id }
427
- commentSidebarRef={ commentSidebarRef }
428
- reflowComments={ reflowComments }
429
- isFloating={ isFloating }
430
- calculatedOffset={ boardOffsets[ thread.id ] ?? 0 }
431
- setHeights={ setHeights }
432
- setBlockRef={ setBlockRef }
433
- commentLastUpdated={ commentLastUpdated }
434
- onKeyDown={ ( event ) =>
435
- handleThreadNavigation(
436
- event,
437
- thread,
438
- selectedNote === thread.id
439
- )
440
- }
441
- />
442
- ) ) }
443
- </>
444
- );
445
- }
446
-
447
- function Thread( {
448
- thread,
449
- onEditComment,
450
- onAddReply,
451
- onCommentDelete,
452
- isSelected,
453
- commentSidebarRef,
454
- reflowComments,
455
- isFloating,
456
- calculatedOffset,
457
- setHeights,
458
- setBlockRef,
459
- commentLastUpdated,
460
- onKeyDown,
461
- } ) {
462
- const { toggleBlockHighlight, selectBlock, toggleBlockSpotlight } = unlock(
463
- useDispatch( blockEditorStore )
464
- );
465
- const { selectNote } = unlock( useDispatch( editorStore ) );
466
- const selectedNote = useSelect(
467
- ( select ) => unlock( select( editorStore ) ).getSelectedNote(),
468
- []
469
- );
470
- const relatedBlockElement = useBlockElement( thread.blockClientId );
471
- const debouncedToggleBlockHighlight = useDebounce(
472
- toggleBlockHighlight,
473
- 50
474
- );
475
- const { y, refs } = useFloatingThread( {
476
- thread,
477
- calculatedOffset,
478
- setHeights,
479
- setBlockRef,
480
- selectedThread: selectedNote,
481
- commentLastUpdated,
482
- } );
483
- const isKeyboardTabbingRef = useRef( false );
484
-
485
- const onMouseEnter = () => {
486
- debouncedToggleBlockHighlight( thread.blockClientId, true );
487
- };
488
-
489
- const onMouseLeave = () => {
490
- debouncedToggleBlockHighlight( thread.blockClientId, false );
491
- };
492
-
493
- const onFocus = () => {
494
- toggleBlockHighlight( thread.blockClientId, true );
495
- };
496
-
497
- const onBlur = ( event ) => {
498
- // Don't deselect notes when the browser window/tab loses focus.
499
- if ( ! document.hasFocus() ) {
500
- return;
501
- }
502
-
503
- const isNoteFocused = event.relatedTarget?.closest(
504
- '.editor-collab-sidebar-panel__thread'
505
- );
506
- const isDialogFocused =
507
- event.relatedTarget?.closest( '[role="dialog"]' );
508
- const isTabbing = isKeyboardTabbingRef.current;
509
-
510
- // When another note is clicked, do nothing because the current note is automatically closed.
511
- if ( isNoteFocused && ! isTabbing ) {
512
- return;
513
- }
514
- // When deleting a note, a dialog appears, but the note should not be collapsed.
515
- if ( isDialogFocused ) {
516
- return;
517
- }
518
- // When tabbing, do nothing if the focus is within the current note.
519
- if (
520
- isTabbing &&
521
- event.currentTarget.contains( event.relatedTarget )
522
- ) {
523
- return;
524
- }
525
-
526
- // Closes a note that has lost focus when any of the following conditions are met:
527
- // - An element other than a note is clicked.
528
- // - Focus was lost by tabbing.
529
- toggleBlockHighlight( thread.blockClientId, false );
530
- unselectThread();
531
- };
532
-
533
- const handleCommentSelect = () => {
534
- selectNote( thread.id );
535
- toggleBlockSpotlight( thread.blockClientId, true );
536
- if ( !! thread.blockClientId ) {
537
- // Pass `null` as the second parameter to prevent focusing the block.
538
- selectBlock( thread.blockClientId, null );
539
- }
540
- };
541
-
542
- const unselectThread = () => {
543
- selectNote( undefined );
544
- toggleBlockSpotlight( thread.blockClientId, false );
545
- };
546
-
547
- const allReplies = thread?.reply || [];
548
- const lastReply =
549
- allReplies.length > 0 ? allReplies[ allReplies.length - 1 ] : undefined;
550
- const restReplies = allReplies.length > 0 ? allReplies.slice( 0, -1 ) : [];
551
-
552
- const commentExcerpt = getCommentExcerpt(
553
- stripHTML( thread.content?.rendered ),
554
- 10
555
- );
556
- const ariaLabel = !! thread.blockClientId
557
- ? sprintf(
558
- // translators: %s: note excerpt
559
- __( 'Note: %s' ),
560
- commentExcerpt
561
- )
562
- : sprintf(
563
- // translators: %s: note excerpt
564
- __( 'Original block deleted. Note: %s' ),
565
- commentExcerpt
566
- );
567
-
568
- if ( isFloating && thread.id === 'new' ) {
569
- return (
570
- <AddComment
571
- onSubmit={ onAddReply }
572
- commentSidebarRef={ commentSidebarRef }
573
- reflowComments={ reflowComments }
574
- isFloating={ isFloating }
575
- y={ y }
576
- refs={ refs }
577
- />
578
- );
579
- }
580
-
581
- return (
582
- <VStack
583
- className={ clsx( 'editor-collab-sidebar-panel__thread', {
584
- 'is-selected': isSelected,
585
- 'is-floating': isFloating,
586
- } ) }
587
- id={ `comment-thread-${ thread.id }` }
588
- spacing="3"
589
- onClick={ handleCommentSelect }
590
- onMouseEnter={ onMouseEnter }
591
- onMouseLeave={ onMouseLeave }
592
- onFocus={ onFocus }
593
- onBlur={ onBlur }
594
- onKeyUp={ ( event ) => {
595
- if ( event.key === 'Tab' ) {
596
- isKeyboardTabbingRef.current = false;
597
- }
598
- } }
599
- onKeyDown={ ( event ) => {
600
- if ( event.key === 'Tab' ) {
601
- isKeyboardTabbingRef.current = true;
602
- } else {
603
- onKeyDown( event );
604
- }
605
- } }
606
- tabIndex={ 0 }
607
- role="treeitem"
608
- aria-label={ ariaLabel }
609
- aria-expanded={ isSelected }
610
- ref={ isFloating ? refs.setFloating : undefined }
611
- style={ isFloating ? { top: y } : undefined }
612
- >
613
- <Button
614
- className="editor-collab-sidebar-panel__skip-to-comment"
615
- variant="secondary"
616
- size="compact"
617
- onClick={ () => {
618
- focusCommentThread(
619
- thread.id,
620
- commentSidebarRef.current,
621
- 'textarea'
622
- );
623
- } }
624
- >
625
- { __( 'Add new reply' ) }
626
- </Button>
627
- { ! thread.blockClientId && (
628
- <Text as="p" weight={ 500 } variant="muted">
629
- { __( 'Original block deleted.' ) }
630
- </Text>
631
- ) }
632
- <CommentBoard
633
- thread={ thread }
634
- isExpanded={ isSelected }
635
- onEdit={ ( params = {} ) => {
636
- onEditComment( params );
637
- if ( params.status === 'approved' ) {
638
- unselectThread();
639
- if ( isFloating ) {
640
- relatedBlockElement?.focus();
641
- } else {
642
- focusCommentThread(
643
- thread.id,
644
- commentSidebarRef.current
645
- );
646
- }
647
- }
648
- } }
649
- onDelete={ onCommentDelete }
650
- reflowComments={ reflowComments }
651
- />
652
- { isSelected &&
653
- allReplies.map( ( reply ) => (
654
- <CommentBoard
655
- key={ reply.id }
656
- thread={ reply }
657
- parent={ thread }
658
- isExpanded={ isSelected }
659
- onEdit={ onEditComment }
660
- onDelete={ onCommentDelete }
661
- reflowComments={ reflowComments }
662
- />
663
- ) ) }
664
- { ! isSelected && restReplies.length > 0 && (
665
- <HStack className="editor-collab-sidebar-panel__more-reply-separator">
666
- <Button
667
- size="compact"
668
- variant="tertiary"
669
- className="editor-collab-sidebar-panel__more-reply-button"
670
- onClick={ () => {
671
- selectNote( thread.id );
672
- focusCommentThread(
673
- thread.id,
674
- commentSidebarRef.current
675
- );
676
- } }
677
- >
678
- { sprintf(
679
- // translators: %s: number of replies.
680
- _n(
681
- '%s more reply',
682
- '%s more replies',
683
- restReplies.length
684
- ),
685
- restReplies.length
686
- ) }
687
- </Button>
688
- </HStack>
689
- ) }
690
- { ! isSelected && lastReply && (
691
- <CommentBoard
692
- thread={ lastReply }
693
- parent={ thread }
694
- isExpanded={ isSelected }
695
- onEdit={ onEditComment }
696
- onDelete={ onCommentDelete }
697
- reflowComments={ reflowComments }
698
- />
699
- ) }
700
- { isSelected && (
701
- <VStack spacing="2" role="treeitem">
702
- <HStack alignment="left" spacing="3" justify="flex-start">
703
- <CommentAuthorInfo />
704
- </HStack>
705
- <VStack spacing="2">
706
- <CommentForm
707
- onSubmit={ ( inputComment ) => {
708
- if ( 'approved' === thread.status ) {
709
- // For reopening, include the content in the reopen action.
710
- onEditComment( {
711
- id: thread.id,
712
- status: 'hold',
713
- content: inputComment,
714
- } );
715
- } else {
716
- // For regular replies, add as separate comment.
717
- onAddReply( {
718
- content: inputComment,
719
- parent: thread.id,
720
- } );
721
- }
722
- } }
723
- onCancel={ ( event ) => {
724
- // Prevent the parent onClick from being triggered.
725
- event.stopPropagation();
726
- unselectThread();
727
- focusCommentThread(
728
- thread.id,
729
- commentSidebarRef.current
730
- );
731
- } }
732
- submitButtonText={
733
- 'approved' === thread.status
734
- ? __( 'Reopen & Reply' )
735
- : __( 'Reply' )
736
- }
737
- rows={ 'approved' === thread.status ? 2 : 4 }
738
- labelText={ sprintf(
739
- // translators: %1$s: note identifier, %2$s: author name
740
- __( 'Reply to note %1$s by %2$s' ),
741
- thread.id,
742
- thread.author_name
743
- ) }
744
- reflowComments={ reflowComments }
745
- />
746
- </VStack>
747
- </VStack>
748
- ) }
749
- { !! thread.blockClientId && (
750
- <Button
751
- className="editor-collab-sidebar-panel__skip-to-block"
752
- variant="secondary"
753
- size="compact"
754
- onClick={ ( event ) => {
755
- event.stopPropagation();
756
- relatedBlockElement?.focus();
757
- } }
758
- >
759
- { __( 'Back to block' ) }
760
- </Button>
761
- ) }
762
- </VStack>
763
- );
764
- }
765
-
766
- const CommentBoard = ( {
767
- thread,
768
- parent,
769
- isExpanded,
770
- onEdit,
771
- onDelete,
772
- reflowComments,
773
- } ) => {
774
- const [ actionState, setActionState ] = useState( false );
775
- const [ showConfirmDialog, setShowConfirmDialog ] = useState( false );
776
- const actionButtonRef = useRef( null );
777
- const handleConfirmDelete = () => {
778
- onDelete( thread );
779
- setActionState( false );
780
- setShowConfirmDialog( false );
781
- };
782
-
783
- const handleCancel = () => {
784
- setActionState( false );
785
- setShowConfirmDialog( false );
786
- actionButtonRef.current?.focus();
787
- };
788
-
789
- // Check if this is a resolution comment by checking metadata.
790
- const isResolutionComment =
791
- thread.type === 'note' &&
792
- thread.meta &&
793
- ( thread.meta._wp_note_status === 'resolved' ||
794
- thread.meta._wp_note_status === 'reopen' );
795
-
796
- const actions = [
797
- {
798
- id: 'edit',
799
- title: __( 'Edit' ),
800
- isEligible: ( { status } ) => status !== 'approved',
801
- onClick: () => {
802
- setActionState( 'edit' );
803
- },
804
- },
805
- {
806
- id: 'reopen',
807
- title: _x( 'Reopen', 'Reopen note' ),
808
- isEligible: ( { status } ) => status === 'approved',
809
- onClick: () => {
810
- onEdit( { id: thread.id, status: 'hold' } );
811
- },
812
- },
813
- {
814
- id: 'delete',
815
- title: __( 'Delete' ),
816
- isEligible: () => true,
817
- onClick: () => {
818
- setActionState( 'delete' );
819
- setShowConfirmDialog( true );
820
- },
821
- },
822
- ];
823
-
824
- const canResolve = thread.parent === 0;
825
- const moreActions =
826
- parent?.status !== 'approved'
827
- ? actions.filter( ( item ) => item.isEligible( thread ) )
828
- : [];
829
-
830
- const deleteConfirmMessage =
831
- // When deleting a top level note, descendants will also be deleted.
832
- thread.parent === 0
833
- ? __(
834
- "Are you sure you want to delete this note? This will also delete all of this note's replies."
835
- )
836
- : __( 'Are you sure you want to delete this reply?' );
837
-
838
- return (
839
- <VStack
840
- spacing="2"
841
- role={ thread.parent !== 0 ? 'treeitem' : undefined }
842
- >
843
- <HStack alignment="left" spacing="3" justify="flex-start">
844
- <CommentAuthorInfo
845
- avatar={ thread?.author_avatar_urls?.[ 48 ] }
846
- name={ thread?.author_name }
847
- date={ thread?.date }
848
- userId={ thread?.author }
849
- />
850
- { isExpanded && (
851
- <FlexItem
852
- className="editor-collab-sidebar-panel__comment-status"
853
- onClick={ ( event ) => {
854
- // Prevent the thread from being selected.
855
- event.stopPropagation();
856
- } }
857
- >
858
- <HStack spacing="0">
859
- { canResolve && (
860
- <Button
861
- label={ _x(
862
- 'Resolve',
863
- 'Mark note as resolved'
864
- ) }
865
- size="small"
866
- icon={ published }
867
- disabled={ thread.status === 'approved' }
868
- accessibleWhenDisabled={
869
- thread.status === 'approved'
870
- }
871
- onClick={ () => {
872
- onEdit( {
873
- id: thread.id,
874
- status: 'approved',
875
- } );
876
- } }
877
- />
878
- ) }
879
- <Menu placement="bottom-end">
880
- <Menu.TriggerButton
881
- render={
882
- <Button
883
- ref={ actionButtonRef }
884
- size="small"
885
- icon={ moreVertical }
886
- label={ __( 'Actions' ) }
887
- disabled={ ! moreActions.length }
888
- accessibleWhenDisabled
889
- />
890
- }
891
- />
892
- <Menu.Popover
893
- // The menu popover is rendered in a portal, which causes focus to be
894
- // lost and the note to be collapsed unintentionally. To prevent this,
895
- // the popover should be rendered as an inline.
896
- modal={ false }
897
- >
898
- { moreActions.map( ( action ) => (
899
- <Menu.Item
900
- key={ action.id }
901
- onClick={ () => action.onClick() }
902
- >
903
- <Menu.ItemLabel>
904
- { action.title }
905
- </Menu.ItemLabel>
906
- </Menu.Item>
907
- ) ) }
908
- </Menu.Popover>
909
- </Menu>
910
- </HStack>
911
- </FlexItem>
912
- ) }
913
- </HStack>
914
- { 'edit' === actionState ? (
915
- <CommentForm
916
- onSubmit={ ( value ) => {
917
- onEdit( {
918
- id: thread.id,
919
- content: value,
920
- } );
921
- setActionState( false );
922
- actionButtonRef.current?.focus();
923
- } }
924
- onCancel={ () => handleCancel() }
925
- thread={ thread }
926
- submitButtonText={ _x( 'Update', 'verb' ) }
927
- labelText={ sprintf(
928
- // translators: %1$s: note identifier, %2$s: author name.
929
- __( 'Edit note %1$s by %2$s' ),
930
- thread.id,
931
- thread.author_name
932
- ) }
933
- reflowComments={ reflowComments }
934
- />
935
- ) : (
936
- <RawHTML
937
- className={ clsx(
938
- 'editor-collab-sidebar-panel__user-comment',
939
- {
940
- 'editor-collab-sidebar-panel__resolution-text':
941
- isResolutionComment,
942
- }
943
- ) }
944
- >
945
- { isResolutionComment
946
- ? ( () => {
947
- const actionText =
948
- thread.meta._wp_note_status === 'resolved'
949
- ? __( 'Marked as resolved' )
950
- : __( 'Reopened' );
951
- const content = thread?.content?.raw;
952
-
953
- if (
954
- content &&
955
- typeof content === 'string' &&
956
- content.trim() !== ''
957
- ) {
958
- return sprintf(
959
- // translators: %1$s: action label ("Marked as resolved" or "Reopened"); %2$s: note text.
960
- __( '%1$s: %2$s' ),
961
- actionText,
962
- content
963
- );
964
- }
965
- // If no content, just show the action.
966
- return actionText;
967
- } )()
968
- : thread?.content?.rendered }
969
- </RawHTML>
970
- ) }
971
- { 'delete' === actionState && (
972
- <ConfirmDialog
973
- isOpen={ showConfirmDialog }
974
- onConfirm={ handleConfirmDelete }
975
- onCancel={ handleCancel }
976
- confirmButtonText={ __( 'Delete' ) }
977
- >
978
- { deleteConfirmMessage }
979
- </ConfirmDialog>
980
- ) }
981
- </VStack>
982
- );
983
- };
984
-
985
- export default Comments;