@wordpress/block-editor 7.0.4 → 8.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 (347) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/README.md +31 -0
  3. package/build/components/alignment-control/ui.js +1 -2
  4. package/build/components/alignment-control/ui.js.map +1 -1
  5. package/build/components/block-icon/index.js +5 -1
  6. package/build/components/block-icon/index.js.map +1 -1
  7. package/build/components/block-inspector/index.js +4 -0
  8. package/build/components/block-inspector/index.js.map +1 -1
  9. package/build/components/block-list/index.native.js +1 -1
  10. package/build/components/block-list/index.native.js.map +1 -1
  11. package/build/components/block-list/use-block-props/use-multi-selection.js +21 -8
  12. package/build/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  13. package/build/components/block-navigation/dropdown.js +0 -1
  14. package/build/components/block-navigation/dropdown.js.map +1 -1
  15. package/build/components/block-patterns-list/index.js +1 -8
  16. package/build/components/block-patterns-list/index.js.map +1 -1
  17. package/build/components/block-settings/container.native.js +5 -2
  18. package/build/components/block-settings/container.native.js.map +1 -1
  19. package/build/components/block-settings-menu/block-settings-dropdown.js +22 -2
  20. package/build/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  21. package/build/components/block-styles/preview.native.js +2 -2
  22. package/build/components/block-styles/preview.native.js.map +1 -1
  23. package/build/components/colors-gradients/control.js +8 -47
  24. package/build/components/colors-gradients/control.js.map +1 -1
  25. package/build/components/colors-gradients/panel-color-gradient-settings.js +81 -6
  26. package/build/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  27. package/build/components/duotone-control/index.js +5 -2
  28. package/build/components/duotone-control/index.js.map +1 -1
  29. package/build/components/font-appearance-control/index.js +27 -15
  30. package/build/components/font-appearance-control/index.js.map +1 -1
  31. package/build/components/iframe/index.js +1 -1
  32. package/build/components/iframe/index.js.map +1 -1
  33. package/build/components/index.js +20 -2
  34. package/build/components/index.js.map +1 -1
  35. package/build/components/index.native.js +2 -2
  36. package/build/components/index.native.js.map +1 -1
  37. package/build/components/inner-blocks/index.js +5 -4
  38. package/build/components/inner-blocks/index.js.map +1 -1
  39. package/build/components/inner-blocks/index.native.js +4 -3
  40. package/build/components/inner-blocks/index.native.js.map +1 -1
  41. package/build/components/inserter/block-patterns-explorer/explorer.js +62 -0
  42. package/build/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  43. package/build/components/inserter/block-patterns-explorer/patterns-list.js +111 -0
  44. package/build/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  45. package/build/components/inserter/block-patterns-explorer/sidebar.js +78 -0
  46. package/build/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  47. package/build/components/inserter/block-patterns-tab.js +74 -45
  48. package/build/components/inserter/block-patterns-tab.js.map +1 -1
  49. package/build/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  50. package/build/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  51. package/build/components/inserter/pattern-panel.js +19 -10
  52. package/build/components/inserter/pattern-panel.js.map +1 -1
  53. package/build/components/inspector-controls/groups.js +3 -1
  54. package/build/components/inspector-controls/groups.js.map +1 -1
  55. package/build/components/letter-spacing-control/index.js +9 -6
  56. package/build/components/letter-spacing-control/index.js.map +1 -1
  57. package/build/components/link-control/index.js +88 -35
  58. package/build/components/link-control/index.js.map +1 -1
  59. package/build/components/link-control/link-preview.js +19 -6
  60. package/build/components/link-control/link-preview.js.map +1 -1
  61. package/build/components/link-control/search-input.js +12 -3
  62. package/build/components/link-control/search-input.js.map +1 -1
  63. package/build/components/list-view/block.js +49 -23
  64. package/build/components/list-view/block.js.map +1 -1
  65. package/build/components/list-view/branch.js +92 -73
  66. package/build/components/list-view/branch.js.map +1 -1
  67. package/build/components/list-view/index.js +39 -16
  68. package/build/components/list-view/index.js.map +1 -1
  69. package/build/components/list-view/leaf.js +1 -1
  70. package/build/components/list-view/leaf.js.map +1 -1
  71. package/build/components/list-view/use-list-view-client-ids.js +8 -58
  72. package/build/components/list-view/use-list-view-client-ids.js.map +1 -1
  73. package/build/components/rich-text/embed-handler-picker.native.js +1 -0
  74. package/build/components/rich-text/embed-handler-picker.native.js.map +1 -1
  75. package/build/components/rich-text/format-edit.js +28 -2
  76. package/build/components/rich-text/format-edit.js.map +1 -1
  77. package/build/components/rich-text/format-toolbar/index.js +2 -1
  78. package/build/components/rich-text/format-toolbar/index.js.map +1 -1
  79. package/build/components/url-input/index.js +11 -4
  80. package/build/components/url-input/index.js.map +1 -1
  81. package/build/components/use-setting/index.js +48 -9
  82. package/build/components/use-setting/index.js.map +1 -1
  83. package/build/hooks/border.js +5 -5
  84. package/build/hooks/border.js.map +1 -1
  85. package/build/hooks/color-panel.js +2 -1
  86. package/build/hooks/color-panel.js.map +1 -1
  87. package/build/hooks/duotone.js +16 -5
  88. package/build/hooks/duotone.js.map +1 -1
  89. package/build/hooks/font-appearance.js +49 -6
  90. package/build/hooks/font-appearance.js.map +1 -1
  91. package/build/hooks/font-family.js +37 -16
  92. package/build/hooks/font-family.js.map +1 -1
  93. package/build/hooks/font-size.js +51 -9
  94. package/build/hooks/font-size.js.map +1 -1
  95. package/build/hooks/index.js +8 -0
  96. package/build/hooks/index.js.map +1 -1
  97. package/build/hooks/index.native.js +8 -0
  98. package/build/hooks/index.native.js.map +1 -1
  99. package/build/hooks/letter-spacing.js +44 -7
  100. package/build/hooks/letter-spacing.js.map +1 -1
  101. package/build/hooks/line-height.js +45 -8
  102. package/build/hooks/line-height.js.map +1 -1
  103. package/build/hooks/margin.js +1 -1
  104. package/build/hooks/margin.js.map +1 -1
  105. package/build/hooks/padding.js +1 -1
  106. package/build/hooks/padding.js.map +1 -1
  107. package/build/hooks/text-decoration.js +42 -6
  108. package/build/hooks/text-decoration.js.map +1 -1
  109. package/build/hooks/text-transform.js +42 -6
  110. package/build/hooks/text-transform.js.map +1 -1
  111. package/build/hooks/typography.js +108 -8
  112. package/build/hooks/typography.js.map +1 -1
  113. package/build/hooks/use-cached-truthy.js +29 -0
  114. package/build/hooks/use-cached-truthy.js.map +1 -0
  115. package/build/index.js +7 -0
  116. package/build/index.js.map +1 -1
  117. package/build/layouts/flex.js +120 -28
  118. package/build/layouts/flex.js.map +1 -1
  119. package/build/store/actions.js +303 -265
  120. package/build/store/actions.js.map +1 -1
  121. package/build/store/index.js +1 -3
  122. package/build/store/index.js.map +1 -1
  123. package/build/store/reducer.js +23 -22
  124. package/build/store/reducer.js.map +1 -1
  125. package/build/store/selectors.js +44 -35
  126. package/build/store/selectors.js.map +1 -1
  127. package/build-module/components/alignment-control/ui.js +1 -2
  128. package/build-module/components/alignment-control/ui.js.map +1 -1
  129. package/build-module/components/block-icon/index.js +5 -1
  130. package/build-module/components/block-icon/index.js.map +1 -1
  131. package/build-module/components/block-inspector/index.js +4 -0
  132. package/build-module/components/block-inspector/index.js.map +1 -1
  133. package/build-module/components/block-list/index.native.js +1 -1
  134. package/build-module/components/block-list/index.native.js.map +1 -1
  135. package/build-module/components/block-list/use-block-props/use-multi-selection.js +21 -8
  136. package/build-module/components/block-list/use-block-props/use-multi-selection.js.map +1 -1
  137. package/build-module/components/block-navigation/dropdown.js +0 -1
  138. package/build-module/components/block-navigation/dropdown.js.map +1 -1
  139. package/build-module/components/block-patterns-list/index.js +1 -6
  140. package/build-module/components/block-patterns-list/index.js.map +1 -1
  141. package/build-module/components/block-settings/container.native.js +6 -3
  142. package/build-module/components/block-settings/container.native.js.map +1 -1
  143. package/build-module/components/block-settings-menu/block-settings-dropdown.js +24 -4
  144. package/build-module/components/block-settings-menu/block-settings-dropdown.js.map +1 -1
  145. package/build-module/components/block-styles/preview.native.js +2 -2
  146. package/build-module/components/block-styles/preview.native.js.map +1 -1
  147. package/build-module/components/colors-gradients/control.js +12 -53
  148. package/build-module/components/colors-gradients/control.js.map +1 -1
  149. package/build-module/components/colors-gradients/panel-color-gradient-settings.js +82 -6
  150. package/build-module/components/colors-gradients/panel-color-gradient-settings.js.map +1 -1
  151. package/build-module/components/duotone-control/index.js +5 -2
  152. package/build-module/components/duotone-control/index.js.map +1 -1
  153. package/build-module/components/font-appearance-control/index.js +23 -15
  154. package/build-module/components/font-appearance-control/index.js.map +1 -1
  155. package/build-module/components/iframe/index.js +1 -1
  156. package/build-module/components/iframe/index.js.map +1 -1
  157. package/build-module/components/index.js +3 -1
  158. package/build-module/components/index.js.map +1 -1
  159. package/build-module/components/index.native.js +1 -1
  160. package/build-module/components/index.native.js.map +1 -1
  161. package/build-module/components/inner-blocks/index.js +6 -5
  162. package/build-module/components/inner-blocks/index.js.map +1 -1
  163. package/build-module/components/inner-blocks/index.native.js +5 -4
  164. package/build-module/components/inner-blocks/index.native.js.map +1 -1
  165. package/build-module/components/inserter/block-patterns-explorer/explorer.js +50 -0
  166. package/build-module/components/inserter/block-patterns-explorer/explorer.js.map +1 -0
  167. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js +92 -0
  168. package/build-module/components/inserter/block-patterns-explorer/patterns-list.js.map +1 -0
  169. package/build-module/components/inserter/block-patterns-explorer/sidebar.js +69 -0
  170. package/build-module/components/inserter/block-patterns-explorer/sidebar.js.map +1 -0
  171. package/build-module/components/inserter/block-patterns-tab.js +75 -46
  172. package/build-module/components/inserter/block-patterns-tab.js.map +1 -1
  173. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js +4 -7
  174. package/build-module/components/inserter/hooks/use-block-type-impressions.native.js.map +1 -1
  175. package/build-module/components/inserter/pattern-panel.js +21 -13
  176. package/build-module/components/inserter/pattern-panel.js.map +1 -1
  177. package/build-module/components/inspector-controls/groups.js +3 -1
  178. package/build-module/components/inspector-controls/groups.js.map +1 -1
  179. package/build-module/components/letter-spacing-control/index.js +9 -6
  180. package/build-module/components/letter-spacing-control/index.js.map +1 -1
  181. package/build-module/components/link-control/index.js +88 -36
  182. package/build-module/components/link-control/index.js.map +1 -1
  183. package/build-module/components/link-control/link-preview.js +19 -7
  184. package/build-module/components/link-control/link-preview.js.map +1 -1
  185. package/build-module/components/link-control/search-input.js +11 -3
  186. package/build-module/components/link-control/search-input.js.map +1 -1
  187. package/build-module/components/list-view/block.js +49 -24
  188. package/build-module/components/list-view/block.js.map +1 -1
  189. package/build-module/components/list-view/branch.js +92 -73
  190. package/build-module/components/list-view/branch.js.map +1 -1
  191. package/build-module/components/list-view/index.js +41 -18
  192. package/build-module/components/list-view/index.js.map +1 -1
  193. package/build-module/components/list-view/leaf.js +1 -1
  194. package/build-module/components/list-view/leaf.js.map +1 -1
  195. package/build-module/components/list-view/use-list-view-client-ids.js +8 -58
  196. package/build-module/components/list-view/use-list-view-client-ids.js.map +1 -1
  197. package/build-module/components/rich-text/embed-handler-picker.native.js +1 -0
  198. package/build-module/components/rich-text/embed-handler-picker.native.js.map +1 -1
  199. package/build-module/components/rich-text/format-edit.js +28 -3
  200. package/build-module/components/rich-text/format-edit.js.map +1 -1
  201. package/build-module/components/rich-text/format-toolbar/index.js +2 -1
  202. package/build-module/components/rich-text/format-toolbar/index.js.map +1 -1
  203. package/build-module/components/url-input/index.js +11 -4
  204. package/build-module/components/url-input/index.js.map +1 -1
  205. package/build-module/components/use-setting/index.js +48 -9
  206. package/build-module/components/use-setting/index.js.map +1 -1
  207. package/build-module/hooks/border.js +5 -5
  208. package/build-module/hooks/border.js.map +1 -1
  209. package/build-module/hooks/color-panel.js +2 -1
  210. package/build-module/hooks/color-panel.js.map +1 -1
  211. package/build-module/hooks/duotone.js +16 -5
  212. package/build-module/hooks/duotone.js.map +1 -1
  213. package/build-module/hooks/font-appearance.js +45 -6
  214. package/build-module/hooks/font-appearance.js.map +1 -1
  215. package/build-module/hooks/font-family.js +33 -16
  216. package/build-module/hooks/font-family.js.map +1 -1
  217. package/build-module/hooks/font-size.js +47 -9
  218. package/build-module/hooks/font-size.js.map +1 -1
  219. package/build-module/hooks/index.js +1 -0
  220. package/build-module/hooks/index.js.map +1 -1
  221. package/build-module/hooks/index.native.js +1 -0
  222. package/build-module/hooks/index.native.js.map +1 -1
  223. package/build-module/hooks/letter-spacing.js +40 -7
  224. package/build-module/hooks/letter-spacing.js.map +1 -1
  225. package/build-module/hooks/line-height.js +41 -8
  226. package/build-module/hooks/line-height.js.map +1 -1
  227. package/build-module/hooks/margin.js +1 -1
  228. package/build-module/hooks/margin.js.map +1 -1
  229. package/build-module/hooks/padding.js +1 -1
  230. package/build-module/hooks/padding.js.map +1 -1
  231. package/build-module/hooks/text-decoration.js +38 -6
  232. package/build-module/hooks/text-decoration.js.map +1 -1
  233. package/build-module/hooks/text-transform.js +38 -6
  234. package/build-module/hooks/text-transform.js.map +1 -1
  235. package/build-module/hooks/typography.js +117 -17
  236. package/build-module/hooks/typography.js.map +1 -1
  237. package/build-module/hooks/use-cached-truthy.js +21 -0
  238. package/build-module/hooks/use-cached-truthy.js.map +1 -0
  239. package/build-module/index.js +1 -1
  240. package/build-module/index.js.map +1 -1
  241. package/build-module/layouts/flex.js +124 -32
  242. package/build-module/layouts/flex.js.map +1 -1
  243. package/build-module/store/actions.js +266 -241
  244. package/build-module/store/actions.js.map +1 -1
  245. package/build-module/store/index.js +1 -2
  246. package/build-module/store/index.js.map +1 -1
  247. package/build-module/store/reducer.js +23 -22
  248. package/build-module/store/reducer.js.map +1 -1
  249. package/build-module/store/selectors.js +42 -30
  250. package/build-module/store/selectors.js.map +1 -1
  251. package/build-style/style-rtl.css +160 -57
  252. package/build-style/style.css +160 -57
  253. package/package.json +13 -14
  254. package/src/components/alignment-control/test/__snapshots__/index.js.snap +0 -2
  255. package/src/components/alignment-control/ui.js +1 -4
  256. package/src/components/block-draggable/style.scss +19 -4
  257. package/src/components/block-icon/index.js +4 -1
  258. package/src/components/block-inspector/index.js +5 -0
  259. package/src/components/block-list/index.native.js +1 -1
  260. package/src/components/block-list/use-block-props/use-multi-selection.js +27 -7
  261. package/src/components/block-navigation/dropdown.js +0 -1
  262. package/src/components/block-patterns-list/index.js +1 -8
  263. package/src/components/block-patterns-list/style.scss +22 -12
  264. package/src/components/block-settings/container.native.js +7 -0
  265. package/src/components/block-settings-menu/block-settings-dropdown.js +19 -7
  266. package/src/components/block-styles/preview.native.js +2 -2
  267. package/src/components/block-switcher/test/__snapshots__/index.js.snap +1 -1
  268. package/src/components/color-palette/test/__snapshots__/control.js.snap +88 -63
  269. package/src/components/colors-gradients/control.js +19 -62
  270. package/src/components/colors-gradients/panel-color-gradient-settings.js +76 -6
  271. package/src/components/colors-gradients/style.scss +3 -14
  272. package/src/components/colors-gradients/test/control.js +0 -16
  273. package/src/components/duotone-control/index.js +6 -0
  274. package/src/components/duotone-control/style.scss +27 -12
  275. package/src/components/font-appearance-control/index.js +22 -14
  276. package/src/components/iframe/index.js +1 -1
  277. package/src/components/index.js +3 -4
  278. package/src/components/index.native.js +1 -4
  279. package/src/components/inner-blocks/index.js +4 -4
  280. package/src/components/inner-blocks/index.native.js +7 -4
  281. package/src/components/inserter/block-patterns-explorer/explorer.js +50 -0
  282. package/src/components/inserter/block-patterns-explorer/patterns-list.js +122 -0
  283. package/src/components/inserter/block-patterns-explorer/sidebar.js +73 -0
  284. package/src/components/inserter/block-patterns-tab.js +107 -80
  285. package/src/components/inserter/hooks/use-block-type-impressions.native.js +14 -21
  286. package/src/components/inserter/pattern-panel.js +33 -16
  287. package/src/components/inserter/style.scss +64 -1
  288. package/src/components/inserter/test/block-types-tab.native.js +1 -1
  289. package/src/components/inserter/test/fixtures/index.native.js +12 -0
  290. package/src/components/inspector-controls/groups.js +4 -0
  291. package/src/components/letter-spacing-control/index.js +12 -6
  292. package/src/components/link-control/README.md +7 -0
  293. package/src/components/link-control/index.js +99 -34
  294. package/src/components/link-control/link-preview.js +21 -9
  295. package/src/components/link-control/search-input.js +9 -3
  296. package/src/components/link-control/style.scss +32 -16
  297. package/src/components/link-control/test/index.js +179 -4
  298. package/src/components/list-view/block.js +67 -23
  299. package/src/components/list-view/branch.js +113 -91
  300. package/src/components/list-view/index.js +58 -19
  301. package/src/components/list-view/leaf.js +1 -1
  302. package/src/components/list-view/style.scss +14 -3
  303. package/src/components/list-view/use-list-view-client-ids.js +7 -66
  304. package/src/components/rich-text/embed-handler-picker.native.js +1 -0
  305. package/src/components/rich-text/format-edit.js +36 -2
  306. package/src/components/rich-text/format-toolbar/index.js +3 -0
  307. package/src/components/url-input/index.js +14 -4
  308. package/src/components/use-setting/index.js +49 -11
  309. package/src/hooks/border.js +8 -11
  310. package/src/hooks/color-panel.js +1 -0
  311. package/src/hooks/duotone.js +21 -7
  312. package/src/hooks/font-appearance.js +38 -7
  313. package/src/hooks/font-family.js +29 -13
  314. package/src/hooks/font-size.js +42 -6
  315. package/src/hooks/index.js +1 -0
  316. package/src/hooks/index.native.js +1 -0
  317. package/src/hooks/layout.scss +3 -1
  318. package/src/hooks/letter-spacing.js +35 -7
  319. package/src/hooks/line-height.js +37 -9
  320. package/src/hooks/margin.js +1 -1
  321. package/src/hooks/padding.js +1 -1
  322. package/src/hooks/text-decoration.js +34 -6
  323. package/src/hooks/text-transform.js +34 -6
  324. package/src/hooks/typography.js +165 -15
  325. package/src/hooks/typography.scss +16 -0
  326. package/src/hooks/use-cached-truthy.js +20 -0
  327. package/src/index.js +1 -0
  328. package/src/layouts/flex.js +137 -41
  329. package/src/store/actions.js +223 -391
  330. package/src/store/index.js +1 -2
  331. package/src/store/reducer.js +36 -18
  332. package/src/store/selectors.js +52 -47
  333. package/src/store/test/actions.js +395 -694
  334. package/src/store/test/selectors.js +79 -21
  335. package/src/style.scss +1 -1
  336. package/src/utils/test/parse-css-unit-to-px.js +127 -167
  337. package/build/components/text-decoration-and-transform/index.js +0 -39
  338. package/build/components/text-decoration-and-transform/index.js.map +0 -1
  339. package/build/store/controls.js +0 -44
  340. package/build/store/controls.js.map +0 -1
  341. package/build-module/components/text-decoration-and-transform/index.js +0 -30
  342. package/build-module/components/text-decoration-and-transform/index.js.map +0 -1
  343. package/build-module/store/controls.js +0 -32
  344. package/build-module/store/controls.js.map +0 -1
  345. package/src/components/text-decoration-and-transform/index.js +0 -36
  346. package/src/components/text-decoration-and-transform/style.scss +0 -3
  347. package/src/store/controls.js +0 -39
@@ -10,7 +10,7 @@ import classnames from 'classnames';
10
10
 
11
11
  import { __experimentalTreeGridCell as TreeGridCell, __experimentalTreeGridItem as TreeGridItem } from '@wordpress/components';
12
12
  import { moreVertical } from '@wordpress/icons';
13
- import { useState, useRef, useEffect } from '@wordpress/element';
13
+ import { useState, useRef, useEffect, useCallback, memo } from '@wordpress/element';
14
14
  import { useDispatch } from '@wordpress/data';
15
15
  /**
16
16
  * Internal dependencies
@@ -22,14 +22,13 @@ import ListViewBlockContents from './block-contents';
22
22
  import BlockSettingsDropdown from '../block-settings-menu/block-settings-dropdown';
23
23
  import { useListViewContext } from './context';
24
24
  import { store as blockEditorStore } from '../../store';
25
- export default function ListViewBlock({
25
+
26
+ function ListViewBlock({
26
27
  block,
27
- isSelected,
28
28
  isDragged,
29
+ isSelected,
29
30
  isBranchSelected,
30
- isLastOfSelectedBranch,
31
- onClick,
32
- onToggleExpanded,
31
+ selectBlock,
33
32
  position,
34
33
  level,
35
34
  rowCount,
@@ -46,16 +45,19 @@ export default function ListViewBlock({
46
45
  const {
47
46
  toggleBlockHighlight
48
47
  } = useDispatch(blockEditorStore);
48
+ const {
49
+ __experimentalFeatures: withExperimentalFeatures,
50
+ __experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,
51
+ __experimentalHideContainerBlockActions: hideContainerBlockActions,
52
+ isTreeGridMounted,
53
+ expand,
54
+ collapse
55
+ } = useListViewContext();
49
56
  const hasSiblings = siblingBlockCount > 0;
50
57
  const hasRenderedMovers = showBlockMovers && hasSiblings;
51
58
  const moverCellClassName = classnames('block-editor-list-view-block__mover-cell', {
52
59
  'is-visible': isHovered || isSelected
53
60
  });
54
- const {
55
- __experimentalFeatures: withExperimentalFeatures,
56
- __experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,
57
- isTreeGridMounted
58
- } = useListViewContext();
59
61
  const listViewBlockSettingsClassName = classnames('block-editor-list-view-block__menu-cell', {
60
62
  'is-visible': isHovered || isSelected
61
63
  }); // If ListView has experimental features related to the Persistent List View,
@@ -68,22 +70,43 @@ export default function ListViewBlock({
68
70
  }
69
71
  }, []);
70
72
  const highlightBlock = withExperimentalPersistentListViewFeatures ? toggleBlockHighlight : () => {};
71
-
72
- const onMouseEnter = () => {
73
+ const onMouseEnter = useCallback(() => {
73
74
  setIsHovered(true);
74
75
  highlightBlock(clientId, true);
75
- };
76
-
77
- const onMouseLeave = () => {
76
+ }, [clientId, setIsHovered, highlightBlock]);
77
+ const onMouseLeave = useCallback(() => {
78
78
  setIsHovered(false);
79
79
  highlightBlock(clientId, false);
80
- };
80
+ }, [clientId, setIsHovered, highlightBlock]);
81
+ const selectEditorBlock = useCallback(event => {
82
+ event.stopPropagation();
83
+ selectBlock(clientId);
84
+ }, [clientId, selectBlock]);
85
+ const toggleExpanded = useCallback(event => {
86
+ event.stopPropagation();
87
+
88
+ if (isExpanded === true) {
89
+ collapse(clientId);
90
+ } else if (isExpanded === false) {
91
+ expand(clientId);
92
+ }
93
+ }, [clientId, expand, collapse, isExpanded]);
94
+ const showBlockActions = withExperimentalFeatures && ( //hide actions for blocks like core/widget-areas
95
+ !hideContainerBlockActions || hideContainerBlockActions && level > 1);
96
+ const hideBlockActions = withExperimentalFeatures && !showBlockActions;
97
+ let colSpan;
98
+
99
+ if (hasRenderedMovers) {
100
+ colSpan = 2;
101
+ } else if (hideBlockActions) {
102
+ colSpan = 3;
103
+ }
81
104
 
82
105
  const classes = classnames({
83
106
  'is-selected': isSelected,
84
107
  'is-branch-selected': withExperimentalPersistentListViewFeatures && isBranchSelected,
85
- 'is-last-of-selected-branch': withExperimentalPersistentListViewFeatures && isLastOfSelectedBranch,
86
- 'is-dragging': isDragged
108
+ 'is-dragging': isDragged,
109
+ 'has-single-cell': hideBlockActions
87
110
  });
88
111
  return createElement(ListViewLeaf, {
89
112
  className: classes,
@@ -100,7 +123,7 @@ export default function ListViewBlock({
100
123
  isExpanded: isExpanded
101
124
  }, createElement(TreeGridCell, {
102
125
  className: "block-editor-list-view-block__contents-cell",
103
- colSpan: hasRenderedMovers ? undefined : 2,
126
+ colSpan: colSpan,
104
127
  ref: cellRef
105
128
  }, ({
106
129
  ref,
@@ -110,8 +133,8 @@ export default function ListViewBlock({
110
133
  className: "block-editor-list-view-block__contents-container"
111
134
  }, createElement(ListViewBlockContents, {
112
135
  block: block,
113
- onClick: onClick,
114
- onToggleExpanded: onToggleExpanded,
136
+ onClick: selectEditorBlock,
137
+ onToggleExpanded: toggleExpanded,
115
138
  isSelected: isSelected,
116
139
  position: position,
117
140
  siblingBlockCount: siblingBlockCount,
@@ -142,7 +165,7 @@ export default function ListViewBlock({
142
165
  ref: ref,
143
166
  tabIndex: tabIndex,
144
167
  onFocus: onFocus
145
- })))), withExperimentalFeatures && createElement(TreeGridCell, {
168
+ })))), showBlockActions && createElement(TreeGridCell, {
146
169
  className: listViewBlockSettingsClassName
147
170
  }, ({
148
171
  ref,
@@ -158,7 +181,9 @@ export default function ListViewBlock({
158
181
  onFocus
159
182
  },
160
183
  disableOpenOnArrowDown: true,
161
- __experimentalSelectBlock: onClick
184
+ __experimentalSelectBlock: selectEditorBlock
162
185
  })));
163
186
  }
187
+
188
+ export default memo(ListViewBlock);
164
189
  //# sourceMappingURL=block.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/list-view/block.js"],"names":["classnames","__experimentalTreeGridCell","TreeGridCell","__experimentalTreeGridItem","TreeGridItem","moreVertical","useState","useRef","useEffect","useDispatch","ListViewLeaf","BlockMoverUpButton","BlockMoverDownButton","ListViewBlockContents","BlockSettingsDropdown","useListViewContext","store","blockEditorStore","ListViewBlock","block","isSelected","isDragged","isBranchSelected","isLastOfSelectedBranch","onClick","onToggleExpanded","position","level","rowCount","siblingBlockCount","showBlockMovers","path","isExpanded","cellRef","isHovered","setIsHovered","clientId","toggleBlockHighlight","hasSiblings","hasRenderedMovers","moverCellClassName","__experimentalFeatures","withExperimentalFeatures","__experimentalPersistentListViewFeatures","withExperimentalPersistentListViewFeatures","isTreeGridMounted","listViewBlockSettingsClassName","current","focus","highlightBlock","onMouseEnter","onMouseLeave","classes","undefined","ref","tabIndex","onFocus","className"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalTreeGridCell as TreeGridCell,\n\t__experimentalTreeGridItem as TreeGridItem,\n} from '@wordpress/components';\nimport { moreVertical } from '@wordpress/icons';\nimport { useState, useRef, useEffect } from '@wordpress/element';\nimport { useDispatch } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport ListViewLeaf from './leaf';\nimport {\n\tBlockMoverUpButton,\n\tBlockMoverDownButton,\n} from '../block-mover/button';\nimport ListViewBlockContents from './block-contents';\nimport BlockSettingsDropdown from '../block-settings-menu/block-settings-dropdown';\nimport { useListViewContext } from './context';\nimport { store as blockEditorStore } from '../../store';\n\nexport default function ListViewBlock( {\n\tblock,\n\tisSelected,\n\tisDragged,\n\tisBranchSelected,\n\tisLastOfSelectedBranch,\n\tonClick,\n\tonToggleExpanded,\n\tposition,\n\tlevel,\n\trowCount,\n\tsiblingBlockCount,\n\tshowBlockMovers,\n\tpath,\n\tisExpanded,\n} ) {\n\tconst cellRef = useRef( null );\n\tconst [ isHovered, setIsHovered ] = useState( false );\n\tconst { clientId } = block;\n\n\tconst { toggleBlockHighlight } = useDispatch( blockEditorStore );\n\n\tconst hasSiblings = siblingBlockCount > 0;\n\tconst hasRenderedMovers = showBlockMovers && hasSiblings;\n\tconst moverCellClassName = classnames(\n\t\t'block-editor-list-view-block__mover-cell',\n\t\t{ 'is-visible': isHovered || isSelected }\n\t);\n\tconst {\n\t\t__experimentalFeatures: withExperimentalFeatures,\n\t\t__experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,\n\t\tisTreeGridMounted,\n\t} = useListViewContext();\n\tconst listViewBlockSettingsClassName = classnames(\n\t\t'block-editor-list-view-block__menu-cell',\n\t\t{ 'is-visible': isHovered || isSelected }\n\t);\n\n\t// If ListView has experimental features related to the Persistent List View,\n\t// only focus the selected list item on mount; otherwise the list would always\n\t// try to steal the focus from the editor canvas.\n\tuseEffect( () => {\n\t\tif (\n\t\t\twithExperimentalPersistentListViewFeatures &&\n\t\t\t! isTreeGridMounted &&\n\t\t\tisSelected\n\t\t) {\n\t\t\tcellRef.current.focus();\n\t\t}\n\t}, [] );\n\n\tconst highlightBlock = withExperimentalPersistentListViewFeatures\n\t\t? toggleBlockHighlight\n\t\t: () => {};\n\n\tconst onMouseEnter = () => {\n\t\tsetIsHovered( true );\n\t\thighlightBlock( clientId, true );\n\t};\n\tconst onMouseLeave = () => {\n\t\tsetIsHovered( false );\n\t\thighlightBlock( clientId, false );\n\t};\n\n\tconst classes = classnames( {\n\t\t'is-selected': isSelected,\n\t\t'is-branch-selected':\n\t\t\twithExperimentalPersistentListViewFeatures && isBranchSelected,\n\t\t'is-last-of-selected-branch':\n\t\t\twithExperimentalPersistentListViewFeatures &&\n\t\t\tisLastOfSelectedBranch,\n\t\t'is-dragging': isDragged,\n\t} );\n\n\treturn (\n\t\t<ListViewLeaf\n\t\t\tclassName={ classes }\n\t\t\tonMouseEnter={ onMouseEnter }\n\t\t\tonMouseLeave={ onMouseLeave }\n\t\t\tonFocus={ onMouseEnter }\n\t\t\tonBlur={ onMouseLeave }\n\t\t\tlevel={ level }\n\t\t\tposition={ position }\n\t\t\trowCount={ rowCount }\n\t\t\tpath={ path }\n\t\t\tid={ `list-view-block-${ clientId }` }\n\t\t\tdata-block={ clientId }\n\t\t\tisExpanded={ isExpanded }\n\t\t>\n\t\t\t<TreeGridCell\n\t\t\t\tclassName=\"block-editor-list-view-block__contents-cell\"\n\t\t\t\tcolSpan={ hasRenderedMovers ? undefined : 2 }\n\t\t\t\tref={ cellRef }\n\t\t\t>\n\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t<div className=\"block-editor-list-view-block__contents-container\">\n\t\t\t\t\t\t<ListViewBlockContents\n\t\t\t\t\t\t\tblock={ block }\n\t\t\t\t\t\t\tonClick={ onClick }\n\t\t\t\t\t\t\tonToggleExpanded={ onToggleExpanded }\n\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\tposition={ position }\n\t\t\t\t\t\t\tsiblingBlockCount={ siblingBlockCount }\n\t\t\t\t\t\t\tlevel={ level }\n\t\t\t\t\t\t\tref={ ref }\n\t\t\t\t\t\t\ttabIndex={ tabIndex }\n\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t</TreeGridCell>\n\t\t\t{ hasRenderedMovers && (\n\t\t\t\t<>\n\t\t\t\t\t<TreeGridCell\n\t\t\t\t\t\tclassName={ moverCellClassName }\n\t\t\t\t\t\twithoutGridItem\n\t\t\t\t\t>\n\t\t\t\t\t\t<TreeGridItem>\n\t\t\t\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t\t\t\t<BlockMoverUpButton\n\t\t\t\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\t\t\t\tclientIds={ [ clientId ] }\n\t\t\t\t\t\t\t\t\tref={ ref }\n\t\t\t\t\t\t\t\t\ttabIndex={ tabIndex }\n\t\t\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</TreeGridItem>\n\t\t\t\t\t\t<TreeGridItem>\n\t\t\t\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t\t\t\t<BlockMoverDownButton\n\t\t\t\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\t\t\t\tclientIds={ [ clientId ] }\n\t\t\t\t\t\t\t\t\tref={ ref }\n\t\t\t\t\t\t\t\t\ttabIndex={ tabIndex }\n\t\t\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</TreeGridItem>\n\t\t\t\t\t</TreeGridCell>\n\t\t\t\t</>\n\t\t\t) }\n\n\t\t\t{ withExperimentalFeatures && (\n\t\t\t\t<TreeGridCell className={ listViewBlockSettingsClassName }>\n\t\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t\t<BlockSettingsDropdown\n\t\t\t\t\t\t\tclientIds={ [ clientId ] }\n\t\t\t\t\t\t\ticon={ moreVertical }\n\t\t\t\t\t\t\ttoggleProps={ {\n\t\t\t\t\t\t\t\tref,\n\t\t\t\t\t\t\t\tclassName: 'block-editor-list-view-block__menu',\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t\tonFocus,\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\tdisableOpenOnArrowDown\n\t\t\t\t\t\t\t__experimentalSelectBlock={ onClick }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</TreeGridCell>\n\t\t\t) }\n\t\t</ListViewLeaf>\n\t);\n}\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/list-view/block.js"],"names":["classnames","__experimentalTreeGridCell","TreeGridCell","__experimentalTreeGridItem","TreeGridItem","moreVertical","useState","useRef","useEffect","useCallback","memo","useDispatch","ListViewLeaf","BlockMoverUpButton","BlockMoverDownButton","ListViewBlockContents","BlockSettingsDropdown","useListViewContext","store","blockEditorStore","ListViewBlock","block","isDragged","isSelected","isBranchSelected","selectBlock","position","level","rowCount","siblingBlockCount","showBlockMovers","path","isExpanded","cellRef","isHovered","setIsHovered","clientId","toggleBlockHighlight","__experimentalFeatures","withExperimentalFeatures","__experimentalPersistentListViewFeatures","withExperimentalPersistentListViewFeatures","__experimentalHideContainerBlockActions","hideContainerBlockActions","isTreeGridMounted","expand","collapse","hasSiblings","hasRenderedMovers","moverCellClassName","listViewBlockSettingsClassName","current","focus","highlightBlock","onMouseEnter","onMouseLeave","selectEditorBlock","event","stopPropagation","toggleExpanded","showBlockActions","hideBlockActions","colSpan","classes","ref","tabIndex","onFocus","className"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport classnames from 'classnames';\n\n/**\n * WordPress dependencies\n */\nimport {\n\t__experimentalTreeGridCell as TreeGridCell,\n\t__experimentalTreeGridItem as TreeGridItem,\n} from '@wordpress/components';\nimport { moreVertical } from '@wordpress/icons';\nimport {\n\tuseState,\n\tuseRef,\n\tuseEffect,\n\tuseCallback,\n\tmemo,\n} from '@wordpress/element';\nimport { useDispatch } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport ListViewLeaf from './leaf';\nimport {\n\tBlockMoverUpButton,\n\tBlockMoverDownButton,\n} from '../block-mover/button';\nimport ListViewBlockContents from './block-contents';\nimport BlockSettingsDropdown from '../block-settings-menu/block-settings-dropdown';\nimport { useListViewContext } from './context';\nimport { store as blockEditorStore } from '../../store';\n\nfunction ListViewBlock( {\n\tblock,\n\tisDragged,\n\tisSelected,\n\tisBranchSelected,\n\tselectBlock,\n\tposition,\n\tlevel,\n\trowCount,\n\tsiblingBlockCount,\n\tshowBlockMovers,\n\tpath,\n\tisExpanded,\n} ) {\n\tconst cellRef = useRef( null );\n\tconst [ isHovered, setIsHovered ] = useState( false );\n\tconst { clientId } = block;\n\n\tconst { toggleBlockHighlight } = useDispatch( blockEditorStore );\n\n\tconst {\n\t\t__experimentalFeatures: withExperimentalFeatures,\n\t\t__experimentalPersistentListViewFeatures: withExperimentalPersistentListViewFeatures,\n\t\t__experimentalHideContainerBlockActions: hideContainerBlockActions,\n\t\tisTreeGridMounted,\n\t\texpand,\n\t\tcollapse,\n\t} = useListViewContext();\n\n\tconst hasSiblings = siblingBlockCount > 0;\n\tconst hasRenderedMovers = showBlockMovers && hasSiblings;\n\tconst moverCellClassName = classnames(\n\t\t'block-editor-list-view-block__mover-cell',\n\t\t{ 'is-visible': isHovered || isSelected }\n\t);\n\n\tconst listViewBlockSettingsClassName = classnames(\n\t\t'block-editor-list-view-block__menu-cell',\n\t\t{ 'is-visible': isHovered || isSelected }\n\t);\n\n\t// If ListView has experimental features related to the Persistent List View,\n\t// only focus the selected list item on mount; otherwise the list would always\n\t// try to steal the focus from the editor canvas.\n\tuseEffect( () => {\n\t\tif (\n\t\t\twithExperimentalPersistentListViewFeatures &&\n\t\t\t! isTreeGridMounted &&\n\t\t\tisSelected\n\t\t) {\n\t\t\tcellRef.current.focus();\n\t\t}\n\t}, [] );\n\n\tconst highlightBlock = withExperimentalPersistentListViewFeatures\n\t\t? toggleBlockHighlight\n\t\t: () => {};\n\n\tconst onMouseEnter = useCallback( () => {\n\t\tsetIsHovered( true );\n\t\thighlightBlock( clientId, true );\n\t}, [ clientId, setIsHovered, highlightBlock ] );\n\tconst onMouseLeave = useCallback( () => {\n\t\tsetIsHovered( false );\n\t\thighlightBlock( clientId, false );\n\t}, [ clientId, setIsHovered, highlightBlock ] );\n\n\tconst selectEditorBlock = useCallback(\n\t\t( event ) => {\n\t\t\tevent.stopPropagation();\n\t\t\tselectBlock( clientId );\n\t\t},\n\t\t[ clientId, selectBlock ]\n\t);\n\n\tconst toggleExpanded = useCallback(\n\t\t( event ) => {\n\t\t\tevent.stopPropagation();\n\t\t\tif ( isExpanded === true ) {\n\t\t\t\tcollapse( clientId );\n\t\t\t} else if ( isExpanded === false ) {\n\t\t\t\texpand( clientId );\n\t\t\t}\n\t\t},\n\t\t[ clientId, expand, collapse, isExpanded ]\n\t);\n\n\tconst showBlockActions =\n\t\twithExperimentalFeatures &&\n\t\t//hide actions for blocks like core/widget-areas\n\t\t( ! hideContainerBlockActions ||\n\t\t\t( hideContainerBlockActions && level > 1 ) );\n\n\tconst hideBlockActions = withExperimentalFeatures && ! showBlockActions;\n\n\tlet colSpan;\n\tif ( hasRenderedMovers ) {\n\t\tcolSpan = 2;\n\t} else if ( hideBlockActions ) {\n\t\tcolSpan = 3;\n\t}\n\n\tconst classes = classnames( {\n\t\t'is-selected': isSelected,\n\t\t'is-branch-selected':\n\t\t\twithExperimentalPersistentListViewFeatures && isBranchSelected,\n\t\t'is-dragging': isDragged,\n\t\t'has-single-cell': hideBlockActions,\n\t} );\n\n\treturn (\n\t\t<ListViewLeaf\n\t\t\tclassName={ classes }\n\t\t\tonMouseEnter={ onMouseEnter }\n\t\t\tonMouseLeave={ onMouseLeave }\n\t\t\tonFocus={ onMouseEnter }\n\t\t\tonBlur={ onMouseLeave }\n\t\t\tlevel={ level }\n\t\t\tposition={ position }\n\t\t\trowCount={ rowCount }\n\t\t\tpath={ path }\n\t\t\tid={ `list-view-block-${ clientId }` }\n\t\t\tdata-block={ clientId }\n\t\t\tisExpanded={ isExpanded }\n\t\t>\n\t\t\t<TreeGridCell\n\t\t\t\tclassName=\"block-editor-list-view-block__contents-cell\"\n\t\t\t\tcolSpan={ colSpan }\n\t\t\t\tref={ cellRef }\n\t\t\t>\n\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t<div className=\"block-editor-list-view-block__contents-container\">\n\t\t\t\t\t\t<ListViewBlockContents\n\t\t\t\t\t\t\tblock={ block }\n\t\t\t\t\t\t\tonClick={ selectEditorBlock }\n\t\t\t\t\t\t\tonToggleExpanded={ toggleExpanded }\n\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\tposition={ position }\n\t\t\t\t\t\t\tsiblingBlockCount={ siblingBlockCount }\n\t\t\t\t\t\t\tlevel={ level }\n\t\t\t\t\t\t\tref={ ref }\n\t\t\t\t\t\t\ttabIndex={ tabIndex }\n\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t) }\n\t\t\t</TreeGridCell>\n\t\t\t{ hasRenderedMovers && (\n\t\t\t\t<>\n\t\t\t\t\t<TreeGridCell\n\t\t\t\t\t\tclassName={ moverCellClassName }\n\t\t\t\t\t\twithoutGridItem\n\t\t\t\t\t>\n\t\t\t\t\t\t<TreeGridItem>\n\t\t\t\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t\t\t\t<BlockMoverUpButton\n\t\t\t\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\t\t\t\tclientIds={ [ clientId ] }\n\t\t\t\t\t\t\t\t\tref={ ref }\n\t\t\t\t\t\t\t\t\ttabIndex={ tabIndex }\n\t\t\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</TreeGridItem>\n\t\t\t\t\t\t<TreeGridItem>\n\t\t\t\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t\t\t\t<BlockMoverDownButton\n\t\t\t\t\t\t\t\t\torientation=\"vertical\"\n\t\t\t\t\t\t\t\t\tclientIds={ [ clientId ] }\n\t\t\t\t\t\t\t\t\tref={ ref }\n\t\t\t\t\t\t\t\t\ttabIndex={ tabIndex }\n\t\t\t\t\t\t\t\t\tonFocus={ onFocus }\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) }\n\t\t\t\t\t\t</TreeGridItem>\n\t\t\t\t\t</TreeGridCell>\n\t\t\t\t</>\n\t\t\t) }\n\n\t\t\t{ showBlockActions && (\n\t\t\t\t<TreeGridCell className={ listViewBlockSettingsClassName }>\n\t\t\t\t\t{ ( { ref, tabIndex, onFocus } ) => (\n\t\t\t\t\t\t<BlockSettingsDropdown\n\t\t\t\t\t\t\tclientIds={ [ clientId ] }\n\t\t\t\t\t\t\ticon={ moreVertical }\n\t\t\t\t\t\t\ttoggleProps={ {\n\t\t\t\t\t\t\t\tref,\n\t\t\t\t\t\t\t\tclassName: 'block-editor-list-view-block__menu',\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t\tonFocus,\n\t\t\t\t\t\t\t} }\n\t\t\t\t\t\t\tdisableOpenOnArrowDown\n\t\t\t\t\t\t\t__experimentalSelectBlock={ selectEditorBlock }\n\t\t\t\t\t\t/>\n\t\t\t\t\t) }\n\t\t\t\t</TreeGridCell>\n\t\t\t) }\n\t\t</ListViewLeaf>\n\t);\n}\n\nexport default memo( ListViewBlock );\n"]}
@@ -3,134 +3,153 @@ import { createElement, Fragment } from "@wordpress/element";
3
3
  /**
4
4
  * External dependencies
5
5
  */
6
- import { map, compact } from 'lodash';
6
+ import { compact } from 'lodash';
7
7
  /**
8
8
  * WordPress dependencies
9
9
  */
10
10
 
11
+ import { memo } from '@wordpress/element';
11
12
  import { AsyncModeProvider } from '@wordpress/data';
12
13
  /**
13
14
  * Internal dependencies
14
15
  */
15
16
 
16
17
  import ListViewBlock from './block';
17
- import ListViewAppender from './appender';
18
- import { isClientIdSelected } from './utils';
19
18
  import { useListViewContext } from './context';
20
- export default function ListViewBranch(props) {
19
+ import { isClientIdSelected } from './utils';
20
+ /**
21
+ * Given a block, returns the total number of blocks in that subtree. This is used to help determine
22
+ * the list position of a block.
23
+ *
24
+ * When a block is collapsed, we do not count their children as part of that total. In the current drag
25
+ * implementation dragged blocks and their children are not counted.
26
+ *
27
+ * @param {Object} block block tree
28
+ * @param {Object} expandedState state that notes which branches are collapsed
29
+ * @param {Array} draggedClientIds a list of dragged client ids
30
+ * @return {number} block count
31
+ */
32
+
33
+ function countBlocks(block, expandedState, draggedClientIds) {
34
+ var _expandedState$block$;
35
+
36
+ const isDragged = draggedClientIds === null || draggedClientIds === void 0 ? void 0 : draggedClientIds.includes(block.clientId);
37
+
38
+ if (isDragged) {
39
+ return 0;
40
+ }
41
+
42
+ const isExpanded = (_expandedState$block$ = expandedState[block.clientId]) !== null && _expandedState$block$ !== void 0 ? _expandedState$block$ : true;
43
+
44
+ if (isExpanded) {
45
+ return 1 + block.innerBlocks.reduce(countReducer(expandedState, draggedClientIds), 0);
46
+ }
47
+
48
+ return 1;
49
+ }
50
+
51
+ const countReducer = (expandedState, draggedClientIds) => (count, block) => {
52
+ var _expandedState$block$2;
53
+
54
+ const isDragged = draggedClientIds === null || draggedClientIds === void 0 ? void 0 : draggedClientIds.includes(block.clientId);
55
+
56
+ if (isDragged) {
57
+ return count;
58
+ }
59
+
60
+ const isExpanded = (_expandedState$block$2 = expandedState[block.clientId]) !== null && _expandedState$block$2 !== void 0 ? _expandedState$block$2 : true;
61
+
62
+ if (isExpanded && block.innerBlocks.length > 0) {
63
+ return count + countBlocks(block, expandedState, draggedClientIds);
64
+ }
65
+
66
+ return count + 1;
67
+ };
68
+
69
+ function ListViewBranch(props) {
21
70
  const {
22
71
  blocks,
23
72
  selectBlock,
24
- showAppender,
25
73
  showBlockMovers,
26
74
  showNestedBlocks,
27
- parentBlockClientId,
75
+ selectedClientIds,
28
76
  level = 1,
29
- terminatedLevels = [],
30
- path = [],
77
+ path = '',
31
78
  isBranchSelected = false,
32
- isLastOfBranch = false
79
+ listPosition = 0,
80
+ fixedListWindow
33
81
  } = props;
34
82
  const {
35
83
  expandedState,
36
- expand,
37
- collapse,
38
84
  draggedClientIds,
39
- selectedClientIds
85
+ __experimentalPersistentListViewFeatures
40
86
  } = useListViewContext();
41
- const isTreeRoot = !parentBlockClientId;
42
87
  const filteredBlocks = compact(blocks);
43
-
44
- const itemHasAppender = parentClientId => showAppender && !isTreeRoot && isClientIdSelected(parentClientId, selectedClientIds);
45
-
46
- const hasAppender = itemHasAppender(parentBlockClientId); // Add +1 to the rowCount to take the block appender into account.
47
-
48
88
  const blockCount = filteredBlocks.length;
49
- const rowCount = hasAppender ? blockCount + 1 : blockCount;
50
- const appenderPosition = rowCount;
51
- return createElement(Fragment, null, map(filteredBlocks, (block, index) => {
89
+ let nextPosition = listPosition;
90
+ return createElement(Fragment, null, filteredBlocks.map((block, index) => {
52
91
  var _expandedState$client;
53
92
 
54
93
  const {
55
94
  clientId,
56
95
  innerBlocks
57
96
  } = block;
97
+
98
+ if (index > 0) {
99
+ nextPosition += countBlocks(filteredBlocks[index - 1], expandedState, draggedClientIds);
100
+ }
101
+
102
+ const usesWindowing = __experimentalPersistentListViewFeatures;
103
+ const {
104
+ itemInView
105
+ } = fixedListWindow;
106
+ const blockInView = !usesWindowing || itemInView(nextPosition);
58
107
  const position = index + 1;
59
- const isLastRowAtLevel = rowCount === position;
60
- const updatedTerminatedLevels = isLastRowAtLevel ? [...terminatedLevels, level] : terminatedLevels;
61
- const updatedPath = [...path, position];
108
+ const updatedPath = path.length > 0 ? `${path}_${position}` : `${position}`;
62
109
  const hasNestedBlocks = showNestedBlocks && !!innerBlocks && !!innerBlocks.length;
63
- const hasNestedAppender = itemHasAppender(clientId);
64
- const hasNestedBranch = hasNestedBlocks || hasNestedAppender;
65
- const isSelected = isClientIdSelected(clientId, selectedClientIds);
66
- const isSelectedBranch = isBranchSelected || isSelected && hasNestedBranch; // Logic needed to target the last item of a selected branch which might be deeply nested.
67
- // This is currently only needed for styling purposes. See: `.is-last-of-selected-branch`.
68
-
69
- const isLastBlock = index === blockCount - 1;
70
- const isLast = isSelected || isLastOfBranch && isLastBlock;
71
- const isLastOfSelectedBranch = isLastOfBranch && !hasNestedBranch && isLastBlock;
72
- const isExpanded = hasNestedBranch ? (_expandedState$client = expandedState[clientId]) !== null && _expandedState$client !== void 0 ? _expandedState$client : true : undefined;
73
-
74
- const selectBlockWithClientId = event => {
75
- event.stopPropagation();
76
- selectBlock(clientId);
77
- };
78
-
79
- const toggleExpanded = event => {
80
- event.stopPropagation();
81
-
82
- if (isExpanded === true) {
83
- collapse(clientId);
84
- } else if (isExpanded === false) {
85
- expand(clientId);
86
- }
87
- }; // Make updates to the selected or dragged blocks synchronous,
110
+ const isExpanded = hasNestedBlocks ? (_expandedState$client = expandedState[clientId]) !== null && _expandedState$client !== void 0 ? _expandedState$client : true : undefined;
111
+ const isDragged = !!(draggedClientIds !== null && draggedClientIds !== void 0 && draggedClientIds.includes(clientId));
112
+ const showBlock = isDragged || blockInView; // Make updates to the selected or dragged blocks synchronous,
88
113
  // but asynchronous for any other block.
89
114
 
90
-
91
- const isDragged = !!(draggedClientIds !== null && draggedClientIds !== void 0 && draggedClientIds.includes(clientId));
115
+ const isSelected = isClientIdSelected(clientId, selectedClientIds);
116
+ const isSelectedBranch = isBranchSelected || isSelected && hasNestedBlocks;
92
117
  return createElement(AsyncModeProvider, {
93
118
  key: clientId,
94
119
  value: !isSelected
95
- }, createElement(ListViewBlock, {
120
+ }, showBlock && createElement(ListViewBlock, {
96
121
  block: block,
97
- onClick: selectBlockWithClientId,
98
- onToggleExpanded: toggleExpanded,
99
- isDragged: isDragged,
122
+ selectBlock: selectBlock,
100
123
  isSelected: isSelected,
101
124
  isBranchSelected: isSelectedBranch,
102
- isLastOfSelectedBranch: isLastOfSelectedBranch,
125
+ isDragged: isDragged,
103
126
  level: level,
104
127
  position: position,
105
- rowCount: rowCount,
128
+ rowCount: blockCount,
106
129
  siblingBlockCount: blockCount,
107
130
  showBlockMovers: showBlockMovers,
108
- terminatedLevels: terminatedLevels,
109
131
  path: updatedPath,
110
- isExpanded: isExpanded
111
- }), hasNestedBranch && isExpanded && !isDragged && createElement(ListViewBranch, {
132
+ isExpanded: isExpanded,
133
+ listPosition: nextPosition
134
+ }), !showBlock && createElement("tr", null, createElement("td", {
135
+ className: "block-editor-list-view-placeholder"
136
+ })), hasNestedBlocks && isExpanded && !isDragged && createElement(ListViewBranch, {
112
137
  blocks: innerBlocks,
113
138
  selectBlock: selectBlock,
114
- isBranchSelected: isSelectedBranch,
115
- isLastOfBranch: isLast,
116
- showAppender: showAppender,
117
139
  showBlockMovers: showBlockMovers,
118
140
  showNestedBlocks: showNestedBlocks,
119
- parentBlockClientId: clientId,
120
141
  level: level + 1,
121
- terminatedLevels: updatedTerminatedLevels,
122
- path: updatedPath
142
+ path: updatedPath,
143
+ listPosition: nextPosition + 1,
144
+ fixedListWindow: fixedListWindow,
145
+ isBranchSelected: isSelectedBranch,
146
+ selectedClientIds: selectedClientIds
123
147
  }));
124
- }), hasAppender && createElement(ListViewAppender, {
125
- parentBlockClientId: parentBlockClientId,
126
- position: rowCount,
127
- rowCount: appenderPosition,
128
- level: level,
129
- terminatedLevels: terminatedLevels,
130
- path: [...path, appenderPosition]
131
148
  }));
132
149
  }
150
+
133
151
  ListViewBranch.defaultProps = {
134
152
  selectBlock: () => {}
135
153
  };
154
+ export default memo(ListViewBranch);
136
155
  //# sourceMappingURL=branch.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["@wordpress/block-editor/src/components/list-view/branch.js"],"names":["map","compact","AsyncModeProvider","ListViewBlock","ListViewAppender","isClientIdSelected","useListViewContext","ListViewBranch","props","blocks","selectBlock","showAppender","showBlockMovers","showNestedBlocks","parentBlockClientId","level","terminatedLevels","path","isBranchSelected","isLastOfBranch","expandedState","expand","collapse","draggedClientIds","selectedClientIds","isTreeRoot","filteredBlocks","itemHasAppender","parentClientId","hasAppender","blockCount","length","rowCount","appenderPosition","block","index","clientId","innerBlocks","position","isLastRowAtLevel","updatedTerminatedLevels","updatedPath","hasNestedBlocks","hasNestedAppender","hasNestedBranch","isSelected","isSelectedBranch","isLastBlock","isLast","isLastOfSelectedBranch","isExpanded","undefined","selectBlockWithClientId","event","stopPropagation","toggleExpanded","isDragged","includes","defaultProps"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { map, compact } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { AsyncModeProvider } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport ListViewBlock from './block';\nimport ListViewAppender from './appender';\nimport { isClientIdSelected } from './utils';\nimport { useListViewContext } from './context';\n\nexport default function ListViewBranch( props ) {\n\tconst {\n\t\tblocks,\n\t\tselectBlock,\n\t\tshowAppender,\n\t\tshowBlockMovers,\n\t\tshowNestedBlocks,\n\t\tparentBlockClientId,\n\t\tlevel = 1,\n\t\tterminatedLevels = [],\n\t\tpath = [],\n\t\tisBranchSelected = false,\n\t\tisLastOfBranch = false,\n\t} = props;\n\n\tconst {\n\t\texpandedState,\n\t\texpand,\n\t\tcollapse,\n\t\tdraggedClientIds,\n\t\tselectedClientIds,\n\t} = useListViewContext();\n\n\tconst isTreeRoot = ! parentBlockClientId;\n\tconst filteredBlocks = compact( blocks );\n\tconst itemHasAppender = ( parentClientId ) =>\n\t\tshowAppender &&\n\t\t! isTreeRoot &&\n\t\tisClientIdSelected( parentClientId, selectedClientIds );\n\tconst hasAppender = itemHasAppender( parentBlockClientId );\n\t// Add +1 to the rowCount to take the block appender into account.\n\tconst blockCount = filteredBlocks.length;\n\tconst rowCount = hasAppender ? blockCount + 1 : blockCount;\n\tconst appenderPosition = rowCount;\n\n\treturn (\n\t\t<>\n\t\t\t{ map( filteredBlocks, ( block, index ) => {\n\t\t\t\tconst { clientId, innerBlocks } = block;\n\t\t\t\tconst position = index + 1;\n\t\t\t\tconst isLastRowAtLevel = rowCount === position;\n\t\t\t\tconst updatedTerminatedLevels = isLastRowAtLevel\n\t\t\t\t\t? [ ...terminatedLevels, level ]\n\t\t\t\t\t: terminatedLevels;\n\t\t\t\tconst updatedPath = [ ...path, position ];\n\t\t\t\tconst hasNestedBlocks =\n\t\t\t\t\tshowNestedBlocks && !! innerBlocks && !! innerBlocks.length;\n\t\t\t\tconst hasNestedAppender = itemHasAppender( clientId );\n\t\t\t\tconst hasNestedBranch = hasNestedBlocks || hasNestedAppender;\n\n\t\t\t\tconst isSelected = isClientIdSelected(\n\t\t\t\t\tclientId,\n\t\t\t\t\tselectedClientIds\n\t\t\t\t);\n\t\t\t\tconst isSelectedBranch =\n\t\t\t\t\tisBranchSelected || ( isSelected && hasNestedBranch );\n\n\t\t\t\t// Logic needed to target the last item of a selected branch which might be deeply nested.\n\t\t\t\t// This is currently only needed for styling purposes. See: `.is-last-of-selected-branch`.\n\t\t\t\tconst isLastBlock = index === blockCount - 1;\n\t\t\t\tconst isLast = isSelected || ( isLastOfBranch && isLastBlock );\n\t\t\t\tconst isLastOfSelectedBranch =\n\t\t\t\t\tisLastOfBranch && ! hasNestedBranch && isLastBlock;\n\n\t\t\t\tconst isExpanded = hasNestedBranch\n\t\t\t\t\t? expandedState[ clientId ] ?? true\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst selectBlockWithClientId = ( event ) => {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tselectBlock( clientId );\n\t\t\t\t};\n\n\t\t\t\tconst toggleExpanded = ( event ) => {\n\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\tif ( isExpanded === true ) {\n\t\t\t\t\t\tcollapse( clientId );\n\t\t\t\t\t} else if ( isExpanded === false ) {\n\t\t\t\t\t\texpand( clientId );\n\t\t\t\t\t}\n\t\t\t\t};\n\n\t\t\t\t// Make updates to the selected or dragged blocks synchronous,\n\t\t\t\t// but asynchronous for any other block.\n\t\t\t\tconst isDragged = !! draggedClientIds?.includes( clientId );\n\n\t\t\t\treturn (\n\t\t\t\t\t<AsyncModeProvider key={ clientId } value={ ! isSelected }>\n\t\t\t\t\t\t<ListViewBlock\n\t\t\t\t\t\t\tblock={ block }\n\t\t\t\t\t\t\tonClick={ selectBlockWithClientId }\n\t\t\t\t\t\t\tonToggleExpanded={ toggleExpanded }\n\t\t\t\t\t\t\tisDragged={ isDragged }\n\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\tisBranchSelected={ isSelectedBranch }\n\t\t\t\t\t\t\tisLastOfSelectedBranch={ isLastOfSelectedBranch }\n\t\t\t\t\t\t\tlevel={ level }\n\t\t\t\t\t\t\tposition={ position }\n\t\t\t\t\t\t\trowCount={ rowCount }\n\t\t\t\t\t\t\tsiblingBlockCount={ blockCount }\n\t\t\t\t\t\t\tshowBlockMovers={ showBlockMovers }\n\t\t\t\t\t\t\tterminatedLevels={ terminatedLevels }\n\t\t\t\t\t\t\tpath={ updatedPath }\n\t\t\t\t\t\t\tisExpanded={ isExpanded }\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{ hasNestedBranch && isExpanded && ! isDragged && (\n\t\t\t\t\t\t\t<ListViewBranch\n\t\t\t\t\t\t\t\tblocks={ innerBlocks }\n\t\t\t\t\t\t\t\tselectBlock={ selectBlock }\n\t\t\t\t\t\t\t\tisBranchSelected={ isSelectedBranch }\n\t\t\t\t\t\t\t\tisLastOfBranch={ isLast }\n\t\t\t\t\t\t\t\tshowAppender={ showAppender }\n\t\t\t\t\t\t\t\tshowBlockMovers={ showBlockMovers }\n\t\t\t\t\t\t\t\tshowNestedBlocks={ showNestedBlocks }\n\t\t\t\t\t\t\t\tparentBlockClientId={ clientId }\n\t\t\t\t\t\t\t\tlevel={ level + 1 }\n\t\t\t\t\t\t\t\tterminatedLevels={ updatedTerminatedLevels }\n\t\t\t\t\t\t\t\tpath={ updatedPath }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</AsyncModeProvider>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t\t{ hasAppender && (\n\t\t\t\t<ListViewAppender\n\t\t\t\t\tparentBlockClientId={ parentBlockClientId }\n\t\t\t\t\tposition={ rowCount }\n\t\t\t\t\trowCount={ appenderPosition }\n\t\t\t\t\tlevel={ level }\n\t\t\t\t\tterminatedLevels={ terminatedLevels }\n\t\t\t\t\tpath={ [ ...path, appenderPosition ] }\n\t\t\t\t/>\n\t\t\t) }\n\t\t</>\n\t);\n}\n\nListViewBranch.defaultProps = {\n\tselectBlock: () => {},\n};\n"]}
1
+ {"version":3,"sources":["@wordpress/block-editor/src/components/list-view/branch.js"],"names":["compact","memo","AsyncModeProvider","ListViewBlock","useListViewContext","isClientIdSelected","countBlocks","block","expandedState","draggedClientIds","isDragged","includes","clientId","isExpanded","innerBlocks","reduce","countReducer","count","length","ListViewBranch","props","blocks","selectBlock","showBlockMovers","showNestedBlocks","selectedClientIds","level","path","isBranchSelected","listPosition","fixedListWindow","__experimentalPersistentListViewFeatures","filteredBlocks","blockCount","nextPosition","map","index","usesWindowing","itemInView","blockInView","position","updatedPath","hasNestedBlocks","undefined","showBlock","isSelected","isSelectedBranch","defaultProps"],"mappings":"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","sourcesContent":["/**\n * External dependencies\n */\nimport { compact } from 'lodash';\n\n/**\n * WordPress dependencies\n */\nimport { memo } from '@wordpress/element';\nimport { AsyncModeProvider } from '@wordpress/data';\n\n/**\n * Internal dependencies\n */\nimport ListViewBlock from './block';\nimport { useListViewContext } from './context';\nimport { isClientIdSelected } from './utils';\n\n/**\n * Given a block, returns the total number of blocks in that subtree. This is used to help determine\n * the list position of a block.\n *\n * When a block is collapsed, we do not count their children as part of that total. In the current drag\n * implementation dragged blocks and their children are not counted.\n *\n * @param {Object} block block tree\n * @param {Object} expandedState state that notes which branches are collapsed\n * @param {Array} draggedClientIds a list of dragged client ids\n * @return {number} block count\n */\nfunction countBlocks( block, expandedState, draggedClientIds ) {\n\tconst isDragged = draggedClientIds?.includes( block.clientId );\n\tif ( isDragged ) {\n\t\treturn 0;\n\t}\n\tconst isExpanded = expandedState[ block.clientId ] ?? true;\n\tif ( isExpanded ) {\n\t\treturn (\n\t\t\t1 +\n\t\t\tblock.innerBlocks.reduce(\n\t\t\t\tcountReducer( expandedState, draggedClientIds ),\n\t\t\t\t0\n\t\t\t)\n\t\t);\n\t}\n\treturn 1;\n}\nconst countReducer = ( expandedState, draggedClientIds ) => (\n\tcount,\n\tblock\n) => {\n\tconst isDragged = draggedClientIds?.includes( block.clientId );\n\tif ( isDragged ) {\n\t\treturn count;\n\t}\n\tconst isExpanded = expandedState[ block.clientId ] ?? true;\n\tif ( isExpanded && block.innerBlocks.length > 0 ) {\n\t\treturn count + countBlocks( block, expandedState, draggedClientIds );\n\t}\n\treturn count + 1;\n};\n\nfunction ListViewBranch( props ) {\n\tconst {\n\t\tblocks,\n\t\tselectBlock,\n\t\tshowBlockMovers,\n\t\tshowNestedBlocks,\n\t\tselectedClientIds,\n\t\tlevel = 1,\n\t\tpath = '',\n\t\tisBranchSelected = false,\n\t\tlistPosition = 0,\n\t\tfixedListWindow,\n\t} = props;\n\n\tconst {\n\t\texpandedState,\n\t\tdraggedClientIds,\n\t\t__experimentalPersistentListViewFeatures,\n\t} = useListViewContext();\n\n\tconst filteredBlocks = compact( blocks );\n\tconst blockCount = filteredBlocks.length;\n\tlet nextPosition = listPosition;\n\n\treturn (\n\t\t<>\n\t\t\t{ filteredBlocks.map( ( block, index ) => {\n\t\t\t\tconst { clientId, innerBlocks } = block;\n\n\t\t\t\tif ( index > 0 ) {\n\t\t\t\t\tnextPosition += countBlocks(\n\t\t\t\t\t\tfilteredBlocks[ index - 1 ],\n\t\t\t\t\t\texpandedState,\n\t\t\t\t\t\tdraggedClientIds\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconst usesWindowing = __experimentalPersistentListViewFeatures;\n\n\t\t\t\tconst { itemInView } = fixedListWindow;\n\n\t\t\t\tconst blockInView =\n\t\t\t\t\t! usesWindowing || itemInView( nextPosition );\n\n\t\t\t\tconst position = index + 1;\n\t\t\t\tconst updatedPath =\n\t\t\t\t\tpath.length > 0\n\t\t\t\t\t\t? `${ path }_${ position }`\n\t\t\t\t\t\t: `${ position }`;\n\t\t\t\tconst hasNestedBlocks =\n\t\t\t\t\tshowNestedBlocks && !! innerBlocks && !! innerBlocks.length;\n\n\t\t\t\tconst isExpanded = hasNestedBlocks\n\t\t\t\t\t? expandedState[ clientId ] ?? true\n\t\t\t\t\t: undefined;\n\n\t\t\t\tconst isDragged = !! draggedClientIds?.includes( clientId );\n\n\t\t\t\tconst showBlock = isDragged || blockInView;\n\n\t\t\t\t// Make updates to the selected or dragged blocks synchronous,\n\t\t\t\t// but asynchronous for any other block.\n\t\t\t\tconst isSelected = isClientIdSelected(\n\t\t\t\t\tclientId,\n\t\t\t\t\tselectedClientIds\n\t\t\t\t);\n\t\t\t\tconst isSelectedBranch =\n\t\t\t\t\tisBranchSelected || ( isSelected && hasNestedBlocks );\n\t\t\t\treturn (\n\t\t\t\t\t<AsyncModeProvider key={ clientId } value={ ! isSelected }>\n\t\t\t\t\t\t{ showBlock && (\n\t\t\t\t\t\t\t<ListViewBlock\n\t\t\t\t\t\t\t\tblock={ block }\n\t\t\t\t\t\t\t\tselectBlock={ selectBlock }\n\t\t\t\t\t\t\t\tisSelected={ isSelected }\n\t\t\t\t\t\t\t\tisBranchSelected={ isSelectedBranch }\n\t\t\t\t\t\t\t\tisDragged={ isDragged }\n\t\t\t\t\t\t\t\tlevel={ level }\n\t\t\t\t\t\t\t\tposition={ position }\n\t\t\t\t\t\t\t\trowCount={ blockCount }\n\t\t\t\t\t\t\t\tsiblingBlockCount={ blockCount }\n\t\t\t\t\t\t\t\tshowBlockMovers={ showBlockMovers }\n\t\t\t\t\t\t\t\tpath={ updatedPath }\n\t\t\t\t\t\t\t\tisExpanded={ isExpanded }\n\t\t\t\t\t\t\t\tlistPosition={ nextPosition }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ ! showBlock && (\n\t\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t\t<td className=\"block-editor-list-view-placeholder\" />\n\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t) }\n\t\t\t\t\t\t{ hasNestedBlocks && isExpanded && ! isDragged && (\n\t\t\t\t\t\t\t<ListViewBranch\n\t\t\t\t\t\t\t\tblocks={ innerBlocks }\n\t\t\t\t\t\t\t\tselectBlock={ selectBlock }\n\t\t\t\t\t\t\t\tshowBlockMovers={ showBlockMovers }\n\t\t\t\t\t\t\t\tshowNestedBlocks={ showNestedBlocks }\n\t\t\t\t\t\t\t\tlevel={ level + 1 }\n\t\t\t\t\t\t\t\tpath={ updatedPath }\n\t\t\t\t\t\t\t\tlistPosition={ nextPosition + 1 }\n\t\t\t\t\t\t\t\tfixedListWindow={ fixedListWindow }\n\t\t\t\t\t\t\t\tisBranchSelected={ isSelectedBranch }\n\t\t\t\t\t\t\t\tselectedClientIds={ selectedClientIds }\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t) }\n\t\t\t\t\t</AsyncModeProvider>\n\t\t\t\t);\n\t\t\t} ) }\n\t\t</>\n\t);\n}\n\nListViewBranch.defaultProps = {\n\tselectBlock: () => {},\n};\n\nexport default memo( ListViewBranch );\n"]}
@@ -4,9 +4,9 @@ import { createElement } from "@wordpress/element";
4
4
  /**
5
5
  * WordPress dependencies
6
6
  */
7
- import { useMergeRefs } from '@wordpress/compose';
7
+ import { useMergeRefs, __experimentalUseFixedWindowList as useFixedWindowList } from '@wordpress/compose';
8
8
  import { __experimentalTreeGrid as TreeGrid } from '@wordpress/components';
9
- import { AsyncModeProvider, useDispatch } from '@wordpress/data';
9
+ import { AsyncModeProvider, useDispatch, useSelect } from '@wordpress/data';
10
10
  import { useCallback, useEffect, useMemo, useRef, useReducer, forwardRef } from '@wordpress/element';
11
11
  import { __ } from '@wordpress/i18n';
12
12
  /**
@@ -51,29 +51,44 @@ const expanded = (state, action) => {
51
51
  * @param {Array} props.blocks Custom subset of block client IDs to be used instead of the default hierarchy.
52
52
  * @param {Function} props.onSelect Block selection callback.
53
53
  * @param {boolean} props.showNestedBlocks Flag to enable displaying nested blocks.
54
- * @param {boolean} props.showOnlyCurrentHierarchy Flag to limit the list to the current hierarchy of blocks.
54
+ * @param {boolean} props.showBlockMovers Flag to enable block movers
55
55
  * @param {boolean} props.__experimentalFeatures Flag to enable experimental features.
56
56
  * @param {boolean} props.__experimentalPersistentListViewFeatures Flag to enable features for the Persistent List View experiment.
57
+ * @param {boolean} props.__experimentalHideContainerBlockActions Flag to hide actions of top level blocks (like core/widget-area)
57
58
  * @param {Object} ref Forwarded ref
58
59
  */
59
60
 
60
61
 
61
62
  function ListView({
62
63
  blocks,
63
- showOnlyCurrentHierarchy,
64
64
  onSelect = noop,
65
65
  __experimentalFeatures,
66
66
  __experimentalPersistentListViewFeatures,
67
+ __experimentalHideContainerBlockActions,
68
+ showNestedBlocks,
69
+ showBlockMovers,
67
70
  ...props
68
71
  }, ref) {
69
72
  const {
70
73
  clientIdsTree,
71
- selectedClientIds,
72
- draggedClientIds
73
- } = useListViewClientIds(blocks, showOnlyCurrentHierarchy, __experimentalPersistentListViewFeatures);
74
+ draggedClientIds,
75
+ selectedClientIds
76
+ } = useListViewClientIds(blocks);
74
77
  const {
75
78
  selectBlock
76
79
  } = useDispatch(blockEditorStore);
80
+ const {
81
+ visibleBlockCount
82
+ } = useSelect(select => {
83
+ const {
84
+ getGlobalBlockCount,
85
+ getClientIdsOfDescendants
86
+ } = select(blockEditorStore);
87
+ const draggedBlockCount = (draggedClientIds === null || draggedClientIds === void 0 ? void 0 : draggedClientIds.length) > 0 ? getClientIdsOfDescendants(draggedClientIds).length + 1 : 0;
88
+ return {
89
+ visibleBlockCount: getGlobalBlockCount() - draggedBlockCount
90
+ };
91
+ }, [draggedClientIds]);
77
92
  const selectEditorBlock = useCallback(clientId => {
78
93
  selectBlock(clientId);
79
94
  onSelect(clientId);
@@ -88,7 +103,14 @@ function ListView({
88
103
  const isMounted = useRef(false);
89
104
  useEffect(() => {
90
105
  isMounted.current = true;
91
- }, []);
106
+ }, []); // List View renders a fixed number of items and relies on each having a fixed item height of 36px.
107
+ // If this value changes, we should also change the itemHeight value set in useFixedWindowList.
108
+ // See: https://github.com/WordPress/gutenberg/pull/35230 for additional context.
109
+
110
+ const [fixedListWindow] = useFixedWindowList(elementRef, 36, visibleBlockCount, {
111
+ useWindowing: __experimentalPersistentListViewFeatures,
112
+ windowOverscan: 40
113
+ });
92
114
  const expand = useCallback(clientId => {
93
115
  if (!clientId) {
94
116
  return;
@@ -109,29 +131,26 @@ function ListView({
109
131
  clientId
110
132
  });
111
133
  }, [setExpandedState]);
112
-
113
- const expandRow = row => {
134
+ const expandRow = useCallback(row => {
114
135
  var _row$dataset;
115
136
 
116
137
  expand(row === null || row === void 0 ? void 0 : (_row$dataset = row.dataset) === null || _row$dataset === void 0 ? void 0 : _row$dataset.block);
117
- };
118
-
119
- const collapseRow = row => {
138
+ }, [expand]);
139
+ const collapseRow = useCallback(row => {
120
140
  var _row$dataset2;
121
141
 
122
142
  collapse(row === null || row === void 0 ? void 0 : (_row$dataset2 = row.dataset) === null || _row$dataset2 === void 0 ? void 0 : _row$dataset2.block);
123
- };
124
-
143
+ }, [collapse]);
125
144
  const contextValue = useMemo(() => ({
126
145
  __experimentalFeatures,
127
146
  __experimentalPersistentListViewFeatures,
147
+ __experimentalHideContainerBlockActions,
128
148
  isTreeGridMounted: isMounted.current,
129
149
  draggedClientIds,
130
- selectedClientIds,
131
150
  expandedState,
132
151
  expand,
133
152
  collapse
134
- }), [__experimentalFeatures, __experimentalPersistentListViewFeatures, isMounted.current, draggedClientIds, selectedClientIds, expandedState, expand, collapse]);
153
+ }), [__experimentalFeatures, __experimentalPersistentListViewFeatures, __experimentalHideContainerBlockActions, isMounted.current, draggedClientIds, expandedState, expand, collapse]);
135
154
  return createElement(AsyncModeProvider, {
136
155
  value: true
137
156
  }, createElement(ListViewDropIndicator, {
@@ -147,7 +166,11 @@ function ListView({
147
166
  value: contextValue
148
167
  }, createElement(ListViewBranch, _extends({
149
168
  blocks: clientIdsTree,
150
- selectBlock: selectEditorBlock
169
+ selectBlock: selectEditorBlock,
170
+ showNestedBlocks: showNestedBlocks,
171
+ showBlockMovers: showBlockMovers,
172
+ fixedListWindow: fixedListWindow,
173
+ selectedClientIds: selectedClientIds
151
174
  }, props)))));
152
175
  }
153
176