@atlaskit/editor-plugin-table 7.16.11 → 7.16.13

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 (254) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +16 -0
  3. package/dist/cjs/commands/misc.js +3 -3
  4. package/dist/cjs/nodeviews/TableCell.js +10 -10
  5. package/dist/cjs/nodeviews/TableContainer.js +83 -27
  6. package/dist/cjs/nodeviews/TableResizer.js +40 -19
  7. package/dist/cjs/nodeviews/TableRow.js +23 -23
  8. package/dist/cjs/pm-plugins/table-resizing/plugin.js +3 -3
  9. package/dist/cjs/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  10. package/dist/cjs/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  11. package/dist/cjs/ui/FloatingContextualMenu/styles.js +1 -1
  12. package/dist/cjs/ui/FloatingDragMenu/styles.js +1 -1
  13. package/dist/cjs/ui/common-styles.js +13 -13
  14. package/dist/cjs/ui/ui-styles.js +25 -25
  15. package/dist/cjs/utils/guidelines.js +7 -4
  16. package/dist/cjs/utils/merged-cells.js +3 -3
  17. package/dist/cjs/utils/snapping.js +7 -8
  18. package/dist/es2019/commands/misc.js +3 -3
  19. package/dist/es2019/nodeviews/TableContainer.js +70 -9
  20. package/dist/es2019/nodeviews/TableResizer.js +42 -21
  21. package/dist/es2019/nodeviews/TableRow.js +21 -21
  22. package/dist/es2019/pm-plugins/table-resizing/plugin.js +3 -3
  23. package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  24. package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  25. package/dist/es2019/ui/FloatingContextualMenu/styles.js +47 -47
  26. package/dist/es2019/ui/FloatingDragMenu/styles.js +30 -30
  27. package/dist/es2019/ui/common-styles.js +802 -816
  28. package/dist/es2019/ui/ui-styles.js +665 -678
  29. package/dist/es2019/utils/guidelines.js +5 -2
  30. package/dist/es2019/utils/merged-cells.js +3 -3
  31. package/dist/es2019/utils/snapping.js +5 -6
  32. package/dist/esm/commands/misc.js +3 -3
  33. package/dist/esm/nodeviews/TableCell.js +10 -10
  34. package/dist/esm/nodeviews/TableContainer.js +85 -29
  35. package/dist/esm/nodeviews/TableResizer.js +42 -21
  36. package/dist/esm/nodeviews/TableRow.js +23 -23
  37. package/dist/esm/pm-plugins/table-resizing/plugin.js +3 -3
  38. package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  39. package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  40. package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
  41. package/dist/esm/ui/FloatingDragMenu/styles.js +1 -1
  42. package/dist/esm/ui/common-styles.js +13 -13
  43. package/dist/esm/ui/ui-styles.js +25 -25
  44. package/dist/esm/utils/guidelines.js +6 -3
  45. package/dist/esm/utils/merged-cells.js +3 -3
  46. package/dist/esm/utils/snapping.js +6 -7
  47. package/dist/types/nodeviews/TableResizer.d.ts +2 -1
  48. package/dist/types/pm-plugins/decorations/utils/index.d.ts +1 -1
  49. package/dist/types/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  50. package/dist/types/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  51. package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  52. package/dist/types/ui/ColumnResizeWidget/index.d.ts +1 -1
  53. package/dist/types/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  54. package/dist/types/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  55. package/dist/types/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  56. package/dist/types/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  57. package/dist/types/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  58. package/dist/types/utils/guidelines.d.ts +2 -1
  59. package/dist/types/utils/snapping.d.ts +3 -2
  60. package/dist/types-ts4.5/nodeviews/TableResizer.d.ts +2 -1
  61. package/dist/types-ts4.5/pm-plugins/decorations/utils/index.d.ts +1 -1
  62. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  63. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  64. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  65. package/dist/types-ts4.5/ui/ColumnResizeWidget/index.d.ts +1 -1
  66. package/dist/types-ts4.5/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  67. package/dist/types-ts4.5/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  68. package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  69. package/dist/types-ts4.5/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  70. package/dist/types-ts4.5/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  71. package/dist/types-ts4.5/utils/guidelines.d.ts +2 -1
  72. package/dist/types-ts4.5/utils/snapping.d.ts +3 -2
  73. package/docs/0-intro.tsx +9 -7
  74. package/package.json +3 -3
  75. package/report.api.md +67 -66
  76. package/src/commands/clear.ts +36 -44
  77. package/src/commands/collapse.ts +8 -8
  78. package/src/commands/column-resize.ts +412 -452
  79. package/src/commands/delete.ts +14 -14
  80. package/src/commands/display-mode.ts +10 -11
  81. package/src/commands/go-to-next-cell.ts +48 -54
  82. package/src/commands/hover.ts +210 -227
  83. package/src/commands/index.ts +35 -35
  84. package/src/commands/insert.ts +208 -235
  85. package/src/commands/misc.ts +655 -748
  86. package/src/commands/referentiality.ts +9 -9
  87. package/src/commands/selection.ts +433 -563
  88. package/src/commands/sort.ts +68 -86
  89. package/src/commands/split-cell.ts +14 -14
  90. package/src/commands/toggle.ts +69 -67
  91. package/src/commands-with-analytics.ts +570 -639
  92. package/src/create-plugin-config.ts +13 -13
  93. package/src/event-handlers.ts +513 -612
  94. package/src/handlers.ts +120 -133
  95. package/src/nodeviews/ExternalDropTargets.tsx +68 -73
  96. package/src/nodeviews/OverflowShadowsObserver.ts +148 -157
  97. package/src/nodeviews/TableCell.ts +47 -54
  98. package/src/nodeviews/TableComponent.tsx +1018 -1112
  99. package/src/nodeviews/TableComponentWithSharedState.tsx +91 -94
  100. package/src/nodeviews/TableContainer.tsx +384 -340
  101. package/src/nodeviews/TableNodeViewBase.ts +19 -24
  102. package/src/nodeviews/TableResizer.tsx +642 -653
  103. package/src/nodeviews/TableRow.ts +580 -629
  104. package/src/nodeviews/TableStickyScrollbar.ts +173 -190
  105. package/src/nodeviews/__mocks__/OverflowShadowsObserver.ts +8 -8
  106. package/src/nodeviews/__mocks__/OverridableMock.ts +14 -15
  107. package/src/nodeviews/table.tsx +345 -375
  108. package/src/nodeviews/types.ts +21 -24
  109. package/src/nodeviews/update-overflow-shadows.ts +8 -14
  110. package/src/plugin.tsx +578 -603
  111. package/src/pm-plugins/analytics/actions.ts +10 -12
  112. package/src/pm-plugins/analytics/commands.ts +31 -37
  113. package/src/pm-plugins/analytics/plugin-factory.ts +4 -2
  114. package/src/pm-plugins/analytics/plugin-key.ts +1 -3
  115. package/src/pm-plugins/analytics/plugin.ts +60 -70
  116. package/src/pm-plugins/analytics/reducer.ts +19 -19
  117. package/src/pm-plugins/analytics/types.ts +10 -10
  118. package/src/pm-plugins/analytics/utils/moved-event.ts +38 -38
  119. package/src/pm-plugins/decorations/plugin.ts +58 -77
  120. package/src/pm-plugins/decorations/utils/column-controls.ts +59 -71
  121. package/src/pm-plugins/decorations/utils/column-resizing.ts +50 -57
  122. package/src/pm-plugins/decorations/utils/compose-decorations.ts +6 -6
  123. package/src/pm-plugins/decorations/utils/index.ts +3 -6
  124. package/src/pm-plugins/decorations/utils/types.ts +7 -12
  125. package/src/pm-plugins/default-table-selection.ts +3 -3
  126. package/src/pm-plugins/drag-and-drop/actions.ts +25 -25
  127. package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +158 -190
  128. package/src/pm-plugins/drag-and-drop/commands.ts +154 -170
  129. package/src/pm-plugins/drag-and-drop/consts.ts +4 -5
  130. package/src/pm-plugins/drag-and-drop/plugin-factory.ts +23 -20
  131. package/src/pm-plugins/drag-and-drop/plugin-key.ts +1 -3
  132. package/src/pm-plugins/drag-and-drop/plugin.ts +329 -383
  133. package/src/pm-plugins/drag-and-drop/reducer.ts +30 -30
  134. package/src/pm-plugins/drag-and-drop/types.ts +8 -8
  135. package/src/pm-plugins/drag-and-drop/utils/autoscrollers.ts +38 -41
  136. package/src/pm-plugins/drag-and-drop/utils/getDragBehaviour.ts +3 -6
  137. package/src/pm-plugins/drag-and-drop/utils/monitor.ts +57 -70
  138. package/src/pm-plugins/keymap.ts +208 -220
  139. package/src/pm-plugins/main.ts +348 -400
  140. package/src/pm-plugins/plugin-factory.ts +32 -34
  141. package/src/pm-plugins/safari-delete-composition-text-issue-workaround.ts +83 -97
  142. package/src/pm-plugins/sticky-headers/commands.ts +2 -6
  143. package/src/pm-plugins/sticky-headers/plugin-key.ts +1 -3
  144. package/src/pm-plugins/sticky-headers/plugin-state.ts +41 -44
  145. package/src/pm-plugins/sticky-headers/plugin.ts +4 -4
  146. package/src/pm-plugins/sticky-headers/types.ts +8 -8
  147. package/src/pm-plugins/sticky-headers/util.ts +10 -10
  148. package/src/pm-plugins/table-analytics.ts +70 -72
  149. package/src/pm-plugins/table-local-id.ts +180 -184
  150. package/src/pm-plugins/table-resizing/commands.ts +72 -85
  151. package/src/pm-plugins/table-resizing/event-handlers.ts +298 -317
  152. package/src/pm-plugins/table-resizing/plugin-factory.ts +10 -10
  153. package/src/pm-plugins/table-resizing/plugin-key.ts +1 -3
  154. package/src/pm-plugins/table-resizing/plugin.ts +61 -68
  155. package/src/pm-plugins/table-resizing/reducer.ts +30 -33
  156. package/src/pm-plugins/table-resizing/utils/colgroup.ts +84 -84
  157. package/src/pm-plugins/table-resizing/utils/column-state.ts +78 -81
  158. package/src/pm-plugins/table-resizing/utils/content-width.ts +94 -114
  159. package/src/pm-plugins/table-resizing/utils/dom.ts +93 -110
  160. package/src/pm-plugins/table-resizing/utils/index.ts +29 -34
  161. package/src/pm-plugins/table-resizing/utils/misc.ts +94 -119
  162. package/src/pm-plugins/table-resizing/utils/resize-column.ts +93 -106
  163. package/src/pm-plugins/table-resizing/utils/resize-logic.ts +240 -257
  164. package/src/pm-plugins/table-resizing/utils/resize-state.ts +343 -372
  165. package/src/pm-plugins/table-resizing/utils/scale-table.ts +202 -207
  166. package/src/pm-plugins/table-resizing/utils/types.ts +17 -17
  167. package/src/pm-plugins/table-resizing/utils/unit-to-number.ts +1 -2
  168. package/src/pm-plugins/table-selection-keymap.ts +25 -51
  169. package/src/pm-plugins/table-width.ts +191 -204
  170. package/src/pm-plugins/view-mode-sort/index.ts +223 -227
  171. package/src/pm-plugins/view-mode-sort/plugin-key.ts +3 -2
  172. package/src/pm-plugins/view-mode-sort/types.ts +12 -12
  173. package/src/pm-plugins/view-mode-sort/utils.ts +108 -117
  174. package/src/reducer.ts +139 -155
  175. package/src/toolbar.tsx +815 -905
  176. package/src/transforms/column-width.ts +186 -213
  177. package/src/transforms/delete-columns.ts +208 -222
  178. package/src/transforms/delete-rows.ts +117 -121
  179. package/src/transforms/fix-tables.ts +190 -215
  180. package/src/transforms/merge.ts +263 -269
  181. package/src/transforms/replace-table.ts +27 -43
  182. package/src/transforms/split.ts +65 -75
  183. package/src/types.ts +421 -427
  184. package/src/ui/ColumnResizeWidget/index.tsx +40 -47
  185. package/src/ui/DragHandle/HandleIconComponent.tsx +9 -13
  186. package/src/ui/DragHandle/index.tsx +221 -250
  187. package/src/ui/DragPreview/index.tsx +35 -35
  188. package/src/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.tsx +33 -41
  189. package/src/ui/FloatingContextualButton/FixedButton.tsx +154 -157
  190. package/src/ui/FloatingContextualButton/index.tsx +109 -115
  191. package/src/ui/FloatingContextualButton/styles.ts +43 -46
  192. package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +634 -694
  193. package/src/ui/FloatingContextualMenu/index.tsx +83 -101
  194. package/src/ui/FloatingContextualMenu/styles.ts +57 -65
  195. package/src/ui/FloatingDeleteButton/DeleteButton.tsx +37 -37
  196. package/src/ui/FloatingDeleteButton/getPopUpOptions.ts +47 -57
  197. package/src/ui/FloatingDeleteButton/index.tsx +319 -350
  198. package/src/ui/FloatingDragMenu/DragMenu.tsx +555 -596
  199. package/src/ui/FloatingDragMenu/DropdownMenu.tsx +152 -162
  200. package/src/ui/FloatingDragMenu/index.tsx +88 -102
  201. package/src/ui/FloatingDragMenu/styles.ts +51 -54
  202. package/src/ui/FloatingInsertButton/InsertButton.tsx +204 -217
  203. package/src/ui/FloatingInsertButton/getPopupOptions.ts +100 -115
  204. package/src/ui/FloatingInsertButton/index.tsx +248 -292
  205. package/src/ui/FloatingToolbarLabel/FloatingToolbarLabel.tsx +24 -29
  206. package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +308 -329
  207. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.tsx +85 -94
  208. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/index.tsx +46 -46
  209. package/src/ui/TableFloatingColumnControls/index.tsx +116 -136
  210. package/src/ui/TableFloatingControls/CornerControls/ClassicCornerControls.tsx +79 -91
  211. package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +95 -102
  212. package/src/ui/TableFloatingControls/CornerControls/index.tsx +1 -4
  213. package/src/ui/TableFloatingControls/CornerControls/types.ts +8 -8
  214. package/src/ui/TableFloatingControls/FloatingControlsWithSelection.tsx +50 -50
  215. package/src/ui/TableFloatingControls/NumberColumn/index.tsx +111 -124
  216. package/src/ui/TableFloatingControls/RowControls/ClassicControls.tsx +86 -105
  217. package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +305 -341
  218. package/src/ui/TableFloatingControls/RowDropTarget/index.tsx +72 -75
  219. package/src/ui/TableFloatingControls/index.tsx +191 -193
  220. package/src/ui/TableFullWidthLabel/index.tsx +20 -20
  221. package/src/ui/common-styles.ts +880 -912
  222. package/src/ui/consts.ts +29 -74
  223. package/src/ui/icons/AddColLeftIcon.tsx +33 -39
  224. package/src/ui/icons/AddColRightIcon.tsx +33 -39
  225. package/src/ui/icons/AddRowAboveIcon.tsx +16 -22
  226. package/src/ui/icons/AddRowBelowIcon.tsx +33 -39
  227. package/src/ui/icons/DisplayModeIcon.tsx +31 -31
  228. package/src/ui/icons/DragHandleDisabledIcon.tsx +19 -21
  229. package/src/ui/icons/DragHandleIcon.tsx +12 -12
  230. package/src/ui/icons/DragInMotionIcon.tsx +45 -52
  231. package/src/ui/icons/MergeCellsIcon.tsx +22 -28
  232. package/src/ui/icons/MinimisedHandle.tsx +9 -9
  233. package/src/ui/icons/SplitCellIcon.tsx +30 -36
  234. package/src/ui/ui-styles.ts +769 -798
  235. package/src/utils/alignment.ts +1 -1
  236. package/src/utils/analytics.ts +192 -208
  237. package/src/utils/collapse.ts +55 -64
  238. package/src/utils/column-controls.ts +237 -254
  239. package/src/utils/create.ts +30 -30
  240. package/src/utils/decoration.ts +482 -502
  241. package/src/utils/dom.ts +127 -134
  242. package/src/utils/drag-menu.ts +322 -373
  243. package/src/utils/get-allow-add-column-custom-step.ts +4 -5
  244. package/src/utils/guidelines.ts +16 -21
  245. package/src/utils/index.ts +68 -68
  246. package/src/utils/merged-cells.ts +245 -254
  247. package/src/utils/nodes.ts +91 -106
  248. package/src/utils/paste.ts +119 -135
  249. package/src/utils/row-controls.ts +199 -213
  250. package/src/utils/selection.ts +77 -87
  251. package/src/utils/snapping.ts +87 -100
  252. package/src/utils/table.ts +44 -44
  253. package/src/utils/transforms.ts +5 -5
  254. package/src/utils/update-plugin-state-decorations.ts +5 -9
@@ -5,161 +5,152 @@ import { TableCssClassName as ClassName, ShadowEvent } from '../types';
5
5
  import { updateShadowListForStickyStyles } from './update-overflow-shadows';
6
6
 
7
7
  export class OverflowShadowsObserver {
8
- private tableIntersectionObserver?: IntersectionObserver;
9
- private updateShadowState: (shadowKey: ShadowEvent, value: boolean) => void;
10
- private table: HTMLElement;
11
- private wrapper: HTMLDivElement;
12
-
13
- private leftShadowSentinel: HTMLElement | null = null;
14
- private rightShadowSentinel: HTMLElement | null = null;
15
- private shadowsObserved: boolean = false;
16
-
17
- private isSticky = false;
18
- private stickyRowHeight = 0;
19
-
20
- // updateShadowState is a method to update shadow key
21
- constructor(
22
- updateShadowState: (shadowKey: ShadowEvent, value: boolean) => void,
23
- table: HTMLElement,
24
- wrapper: HTMLDivElement,
25
- ) {
26
- this.updateShadowState = updateShadowState;
27
- this.table = table;
28
- this.wrapper = wrapper;
29
-
30
- this.init();
31
- }
32
-
33
- private init = () => {
34
- const table = this.table;
35
-
36
- if (!this.wrapper || !table) {
37
- return;
38
- }
39
-
40
- if (!this.tableIntersectionObserver) {
41
- const intersectonOnbserverCallback = (
42
- entry: IntersectionObserverEntry,
43
- ) => {
44
- if (
45
- entry.target !== this.leftShadowSentinel &&
46
- entry.target !== this.rightShadowSentinel
47
- ) {
48
- return;
49
- }
50
-
51
- this.updateStickyShadowsHeightIfChanged();
52
- this.updateShadowState(
53
- this.leftShadowSentinel === entry.target
54
- ? ShadowEvent.SHOW_BEFORE_SHADOW
55
- : ShadowEvent.SHOW_AFTER_SHADOW,
56
- entry.intersectionRatio !== 1,
57
- );
58
- };
59
-
60
- this.tableIntersectionObserver = new IntersectionObserver(
61
- (entries: IntersectionObserverEntry[], _: IntersectionObserver) => {
62
- entries.forEach((entry) => intersectonOnbserverCallback(entry));
63
- },
64
- {
65
- threshold: [0, 1],
66
- root: this.wrapper,
67
- rootMargin: '0px',
68
- },
69
- );
70
- return;
71
- }
72
- };
73
-
74
- private updateStickyShadowsHeightIfChanged() {
75
- if (!this.isSticky) {
76
- return;
77
- }
78
- const stickyCell = this.getStickyCell();
79
- if (!stickyCell) {
80
- return;
81
- }
82
-
83
- this.updateStickyShadows();
84
- }
85
-
86
- private getStickyCell() {
87
- const stickyRow = this.wrapper?.querySelector('tr.sticky');
88
- const stickyCell = stickyRow && stickyRow.firstElementChild;
89
- return stickyCell;
90
- }
91
-
92
- observeShadowSentinels = (isSticky?: boolean) => {
93
- if (this.isSticky === isSticky) {
94
- return;
95
- }
96
-
97
- this.isSticky = !!isSticky;
98
-
99
- // reset height
100
- this.stickyRowHeight = 0;
101
- // update sticky shadows
102
- this.updateStickyShadowsHeightIfChanged();
103
-
104
- this.leftShadowSentinel = this.table?.querySelector(
105
- `.${ClassName.TABLE_SHADOW_SENTINEL_LEFT}`,
106
- );
107
- this.rightShadowSentinel = this.table?.querySelector(
108
- `.${ClassName.TABLE_SHADOW_SENTINEL_RIGHT}`,
109
- );
110
-
111
- if (
112
- this.tableIntersectionObserver &&
113
- this.leftShadowSentinel &&
114
- this.rightShadowSentinel &&
115
- !this.shadowsObserved
116
- ) {
117
- this.tableIntersectionObserver.disconnect();
118
- this.tableIntersectionObserver.observe(this.leftShadowSentinel);
119
- this.tableIntersectionObserver.observe(this.rightShadowSentinel);
120
- this.shadowsObserved = true;
121
- }
122
- };
123
-
124
- /**
125
- * Takes a heightStyle if it can be computed in a less expensive manner,
126
- * e.g. bounds on an IntersectionObserverEntry, otherwise proceed with
127
- * reading it from sticky cell
128
- */
129
- updateStickyShadows = rafSchedule((stickyRowHeight?: number) => {
130
- if (!this.isSticky) {
131
- return;
132
- }
133
- const stickyCell = this.getStickyCell();
134
- if (!stickyCell || !this.wrapper?.parentElement) {
135
- return;
136
- }
137
-
138
- // Reflow Warning! - stickyCell.clientHeight
139
- const newStickyRowHeight = stickyRowHeight || stickyCell.clientHeight + 1;
140
-
141
- if (newStickyRowHeight !== this.stickyRowHeight) {
142
- this.stickyRowHeight = newStickyRowHeight;
143
- const heightStyleOrCompute = `${newStickyRowHeight}px`;
144
- // Use getElementsByClassName here for a live node list to capture
145
- // sticky shadows
146
- const liveRightShadows =
147
- this.wrapper?.parentElement?.getElementsByClassName(
148
- `${ClassName.TABLE_RIGHT_SHADOW}`,
149
- );
150
- const liveLeftShadows =
151
- this.wrapper?.parentElement?.getElementsByClassName(
152
- `${ClassName.TABLE_LEFT_SHADOW}`,
153
- );
154
- updateShadowListForStickyStyles(heightStyleOrCompute, liveLeftShadows);
155
- updateShadowListForStickyStyles(heightStyleOrCompute, liveRightShadows);
156
- }
157
- });
158
-
159
- dispose() {
160
- if (this.tableIntersectionObserver) {
161
- this.tableIntersectionObserver.disconnect();
162
- this.tableIntersectionObserver = undefined;
163
- }
164
- }
8
+ private tableIntersectionObserver?: IntersectionObserver;
9
+ private updateShadowState: (shadowKey: ShadowEvent, value: boolean) => void;
10
+ private table: HTMLElement;
11
+ private wrapper: HTMLDivElement;
12
+
13
+ private leftShadowSentinel: HTMLElement | null = null;
14
+ private rightShadowSentinel: HTMLElement | null = null;
15
+ private shadowsObserved: boolean = false;
16
+
17
+ private isSticky = false;
18
+ private stickyRowHeight = 0;
19
+
20
+ // updateShadowState is a method to update shadow key
21
+ constructor(
22
+ updateShadowState: (shadowKey: ShadowEvent, value: boolean) => void,
23
+ table: HTMLElement,
24
+ wrapper: HTMLDivElement,
25
+ ) {
26
+ this.updateShadowState = updateShadowState;
27
+ this.table = table;
28
+ this.wrapper = wrapper;
29
+
30
+ this.init();
31
+ }
32
+
33
+ private init = () => {
34
+ const table = this.table;
35
+
36
+ if (!this.wrapper || !table) {
37
+ return;
38
+ }
39
+
40
+ if (!this.tableIntersectionObserver) {
41
+ const intersectonOnbserverCallback = (entry: IntersectionObserverEntry) => {
42
+ if (entry.target !== this.leftShadowSentinel && entry.target !== this.rightShadowSentinel) {
43
+ return;
44
+ }
45
+
46
+ this.updateStickyShadowsHeightIfChanged();
47
+ this.updateShadowState(
48
+ this.leftShadowSentinel === entry.target
49
+ ? ShadowEvent.SHOW_BEFORE_SHADOW
50
+ : ShadowEvent.SHOW_AFTER_SHADOW,
51
+ entry.intersectionRatio !== 1,
52
+ );
53
+ };
54
+
55
+ this.tableIntersectionObserver = new IntersectionObserver(
56
+ (entries: IntersectionObserverEntry[], _: IntersectionObserver) => {
57
+ entries.forEach((entry) => intersectonOnbserverCallback(entry));
58
+ },
59
+ {
60
+ threshold: [0, 1],
61
+ root: this.wrapper,
62
+ rootMargin: '0px',
63
+ },
64
+ );
65
+ return;
66
+ }
67
+ };
68
+
69
+ private updateStickyShadowsHeightIfChanged() {
70
+ if (!this.isSticky) {
71
+ return;
72
+ }
73
+ const stickyCell = this.getStickyCell();
74
+ if (!stickyCell) {
75
+ return;
76
+ }
77
+
78
+ this.updateStickyShadows();
79
+ }
80
+
81
+ private getStickyCell() {
82
+ const stickyRow = this.wrapper?.querySelector('tr.sticky');
83
+ const stickyCell = stickyRow && stickyRow.firstElementChild;
84
+ return stickyCell;
85
+ }
86
+
87
+ observeShadowSentinels = (isSticky?: boolean) => {
88
+ if (this.isSticky === isSticky) {
89
+ return;
90
+ }
91
+
92
+ this.isSticky = !!isSticky;
93
+
94
+ // reset height
95
+ this.stickyRowHeight = 0;
96
+ // update sticky shadows
97
+ this.updateStickyShadowsHeightIfChanged();
98
+
99
+ this.leftShadowSentinel = this.table?.querySelector(`.${ClassName.TABLE_SHADOW_SENTINEL_LEFT}`);
100
+ this.rightShadowSentinel = this.table?.querySelector(
101
+ `.${ClassName.TABLE_SHADOW_SENTINEL_RIGHT}`,
102
+ );
103
+
104
+ if (
105
+ this.tableIntersectionObserver &&
106
+ this.leftShadowSentinel &&
107
+ this.rightShadowSentinel &&
108
+ !this.shadowsObserved
109
+ ) {
110
+ this.tableIntersectionObserver.disconnect();
111
+ this.tableIntersectionObserver.observe(this.leftShadowSentinel);
112
+ this.tableIntersectionObserver.observe(this.rightShadowSentinel);
113
+ this.shadowsObserved = true;
114
+ }
115
+ };
116
+
117
+ /**
118
+ * Takes a heightStyle if it can be computed in a less expensive manner,
119
+ * e.g. bounds on an IntersectionObserverEntry, otherwise proceed with
120
+ * reading it from sticky cell
121
+ */
122
+ updateStickyShadows = rafSchedule((stickyRowHeight?: number) => {
123
+ if (!this.isSticky) {
124
+ return;
125
+ }
126
+ const stickyCell = this.getStickyCell();
127
+ if (!stickyCell || !this.wrapper?.parentElement) {
128
+ return;
129
+ }
130
+
131
+ // Reflow Warning! - stickyCell.clientHeight
132
+ const newStickyRowHeight = stickyRowHeight || stickyCell.clientHeight + 1;
133
+
134
+ if (newStickyRowHeight !== this.stickyRowHeight) {
135
+ this.stickyRowHeight = newStickyRowHeight;
136
+ const heightStyleOrCompute = `${newStickyRowHeight}px`;
137
+ // Use getElementsByClassName here for a live node list to capture
138
+ // sticky shadows
139
+ const liveRightShadows = this.wrapper?.parentElement?.getElementsByClassName(
140
+ `${ClassName.TABLE_RIGHT_SHADOW}`,
141
+ );
142
+ const liveLeftShadows = this.wrapper?.parentElement?.getElementsByClassName(
143
+ `${ClassName.TABLE_LEFT_SHADOW}`,
144
+ );
145
+ updateShadowListForStickyStyles(heightStyleOrCompute, liveLeftShadows);
146
+ updateShadowListForStickyStyles(heightStyleOrCompute, liveRightShadows);
147
+ }
148
+ });
149
+
150
+ dispose() {
151
+ if (this.tableIntersectionObserver) {
152
+ this.tableIntersectionObserver.disconnect();
153
+ this.tableIntersectionObserver = undefined;
154
+ }
155
+ }
165
156
  }
@@ -9,68 +9,61 @@ import TableNodeView from './TableNodeViewBase';
9
9
  const DEFAULT_COL_SPAN = 1;
10
10
  const DEFAULT_ROW_SPAN = 1;
11
11
 
12
- export default class TableCell
13
- extends TableNodeView<HTMLElement>
14
- implements NodeView
15
- {
16
- constructor(
17
- node: PMNode,
18
- view: EditorView,
19
- getPos: () => number | undefined,
20
- eventDispatcher: EventDispatcher,
21
- ) {
22
- super(node, view, getPos, eventDispatcher);
23
- }
12
+ export default class TableCell extends TableNodeView<HTMLElement> implements NodeView {
13
+ constructor(
14
+ node: PMNode,
15
+ view: EditorView,
16
+ getPos: () => number | undefined,
17
+ eventDispatcher: EventDispatcher,
18
+ ) {
19
+ super(node, view, getPos, eventDispatcher);
20
+ }
24
21
 
25
- update(node: PMNode) {
26
- const didUpdate = this.updateNodeView(node);
27
- if (didUpdate) {
28
- this.node = node;
29
- }
30
- return didUpdate;
31
- }
22
+ update(node: PMNode) {
23
+ const didUpdate = this.updateNodeView(node);
24
+ if (didUpdate) {
25
+ this.node = node;
26
+ }
27
+ return didUpdate;
28
+ }
32
29
 
33
- private updateNodeView(node: PMNode) {
34
- if (this.node.type !== node.type) {
35
- return false;
36
- }
30
+ private updateNodeView(node: PMNode) {
31
+ if (this.node.type !== node.type) {
32
+ return false;
33
+ }
37
34
 
38
- const attrs = getCellDomAttrs(this.node);
39
- const nextAttrs = getCellDomAttrs(node);
35
+ const attrs = getCellDomAttrs(this.node);
36
+ const nextAttrs = getCellDomAttrs(node);
40
37
 
41
- const { colspan, rowspan } = getCellAttrs(this.dom);
38
+ const { colspan, rowspan } = getCellAttrs(this.dom);
42
39
 
43
- // need to rerender when colspan/rowspan in dom are different from the node attrs
44
- // this can happen when undoing merge cells
45
- if (
46
- colspan !== (node.attrs.colspan || DEFAULT_COL_SPAN) ||
47
- rowspan !== (node.attrs.rowspan || DEFAULT_ROW_SPAN)
48
- ) {
49
- return false;
50
- }
40
+ // need to rerender when colspan/rowspan in dom are different from the node attrs
41
+ // this can happen when undoing merge cells
42
+ if (
43
+ colspan !== (node.attrs.colspan || DEFAULT_COL_SPAN) ||
44
+ rowspan !== (node.attrs.rowspan || DEFAULT_ROW_SPAN)
45
+ ) {
46
+ return false;
47
+ }
51
48
 
52
- // added + changed attributes
53
- const addedAttrs = Object.entries(nextAttrs).filter(
54
- ([key, value]) => attrs[key as keyof CellDomAttrs] !== value,
55
- );
49
+ // added + changed attributes
50
+ const addedAttrs = Object.entries(nextAttrs).filter(
51
+ ([key, value]) => attrs[key as keyof CellDomAttrs] !== value,
52
+ );
56
53
 
57
- const removedAttrs = Object.keys(attrs).filter(
58
- (key) => !nextAttrs.hasOwnProperty(key),
59
- );
54
+ const removedAttrs = Object.keys(attrs).filter((key) => !nextAttrs.hasOwnProperty(key));
60
55
 
61
- if (addedAttrs.length || removedAttrs.length) {
62
- addedAttrs.forEach(([key, value]) =>
63
- this.dom.setAttribute(key, value || ''),
64
- );
65
- removedAttrs.forEach((key) => this.dom.removeAttribute(key));
66
- return true;
67
- }
56
+ if (addedAttrs.length || removedAttrs.length) {
57
+ addedAttrs.forEach(([key, value]) => this.dom.setAttribute(key, value || ''));
58
+ removedAttrs.forEach((key) => this.dom.removeAttribute(key));
59
+ return true;
60
+ }
68
61
 
69
- // Return true to not re-render this node view
70
- if (this.node.sameMarkup(node)) {
71
- return true;
72
- }
62
+ // Return true to not re-render this node view
63
+ if (this.node.sameMarkup(node)) {
64
+ return true;
65
+ }
73
66
 
74
- return false;
75
- }
67
+ return false;
68
+ }
76
69
  }