@atlaskit/editor-plugin-table 7.16.10 → 7.16.12

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 (244) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +1836 -1831
  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 +41 -6
  6. package/dist/cjs/nodeviews/TableResizer.js +7 -7
  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 +19 -13
  14. package/dist/cjs/ui/ui-styles.js +25 -25
  15. package/dist/cjs/utils/merged-cells.js +3 -3
  16. package/dist/es2019/commands/misc.js +3 -3
  17. package/dist/es2019/nodeviews/TableContainer.js +43 -5
  18. package/dist/es2019/nodeviews/TableResizer.js +7 -7
  19. package/dist/es2019/nodeviews/TableRow.js +21 -21
  20. package/dist/es2019/pm-plugins/table-resizing/plugin.js +3 -3
  21. package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  22. package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  23. package/dist/es2019/ui/FloatingContextualMenu/styles.js +47 -47
  24. package/dist/es2019/ui/FloatingDragMenu/styles.js +30 -30
  25. package/dist/es2019/ui/common-styles.js +808 -814
  26. package/dist/es2019/ui/ui-styles.js +665 -678
  27. package/dist/es2019/utils/merged-cells.js +3 -3
  28. package/dist/esm/commands/misc.js +3 -3
  29. package/dist/esm/nodeviews/TableCell.js +10 -10
  30. package/dist/esm/nodeviews/TableContainer.js +42 -7
  31. package/dist/esm/nodeviews/TableResizer.js +7 -7
  32. package/dist/esm/nodeviews/TableRow.js +23 -23
  33. package/dist/esm/pm-plugins/table-resizing/plugin.js +3 -3
  34. package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  35. package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  36. package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
  37. package/dist/esm/ui/FloatingDragMenu/styles.js +1 -1
  38. package/dist/esm/ui/common-styles.js +19 -13
  39. package/dist/esm/ui/ui-styles.js +25 -25
  40. package/dist/esm/utils/merged-cells.js +3 -3
  41. package/dist/types/pm-plugins/decorations/utils/index.d.ts +1 -1
  42. package/dist/types/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  43. package/dist/types/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  44. package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  45. package/dist/types/ui/ColumnResizeWidget/index.d.ts +1 -1
  46. package/dist/types/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  47. package/dist/types/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  48. package/dist/types/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  49. package/dist/types/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  50. package/dist/types/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  51. package/dist/types-ts4.5/pm-plugins/decorations/utils/index.d.ts +1 -1
  52. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  53. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  54. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  55. package/dist/types-ts4.5/ui/ColumnResizeWidget/index.d.ts +1 -1
  56. package/dist/types-ts4.5/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  57. package/dist/types-ts4.5/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  58. package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  59. package/dist/types-ts4.5/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  60. package/dist/types-ts4.5/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  61. package/docs/0-intro.tsx +9 -7
  62. package/package.json +5 -4
  63. package/report.api.md +67 -66
  64. package/src/commands/clear.ts +36 -44
  65. package/src/commands/collapse.ts +8 -8
  66. package/src/commands/column-resize.ts +412 -452
  67. package/src/commands/delete.ts +14 -14
  68. package/src/commands/display-mode.ts +10 -11
  69. package/src/commands/go-to-next-cell.ts +48 -54
  70. package/src/commands/hover.ts +210 -227
  71. package/src/commands/index.ts +35 -35
  72. package/src/commands/insert.ts +208 -235
  73. package/src/commands/misc.ts +655 -748
  74. package/src/commands/referentiality.ts +9 -9
  75. package/src/commands/selection.ts +433 -563
  76. package/src/commands/sort.ts +68 -86
  77. package/src/commands/split-cell.ts +14 -14
  78. package/src/commands/toggle.ts +69 -67
  79. package/src/commands-with-analytics.ts +570 -639
  80. package/src/create-plugin-config.ts +13 -13
  81. package/src/event-handlers.ts +513 -612
  82. package/src/handlers.ts +120 -133
  83. package/src/nodeviews/ExternalDropTargets.tsx +68 -73
  84. package/src/nodeviews/OverflowShadowsObserver.ts +148 -157
  85. package/src/nodeviews/TableCell.ts +47 -54
  86. package/src/nodeviews/TableComponent.tsx +1018 -1112
  87. package/src/nodeviews/TableComponentWithSharedState.tsx +91 -94
  88. package/src/nodeviews/TableContainer.tsx +363 -339
  89. package/src/nodeviews/TableNodeViewBase.ts +19 -24
  90. package/src/nodeviews/TableResizer.tsx +565 -657
  91. package/src/nodeviews/TableRow.ts +580 -629
  92. package/src/nodeviews/TableStickyScrollbar.ts +173 -190
  93. package/src/nodeviews/__mocks__/OverflowShadowsObserver.ts +8 -8
  94. package/src/nodeviews/__mocks__/OverridableMock.ts +14 -15
  95. package/src/nodeviews/table.tsx +345 -375
  96. package/src/nodeviews/types.ts +21 -24
  97. package/src/nodeviews/update-overflow-shadows.ts +8 -14
  98. package/src/plugin.tsx +578 -603
  99. package/src/pm-plugins/analytics/actions.ts +10 -12
  100. package/src/pm-plugins/analytics/commands.ts +31 -37
  101. package/src/pm-plugins/analytics/plugin-factory.ts +4 -2
  102. package/src/pm-plugins/analytics/plugin-key.ts +1 -3
  103. package/src/pm-plugins/analytics/plugin.ts +60 -70
  104. package/src/pm-plugins/analytics/reducer.ts +19 -19
  105. package/src/pm-plugins/analytics/types.ts +10 -10
  106. package/src/pm-plugins/analytics/utils/moved-event.ts +38 -38
  107. package/src/pm-plugins/decorations/plugin.ts +58 -77
  108. package/src/pm-plugins/decorations/utils/column-controls.ts +59 -71
  109. package/src/pm-plugins/decorations/utils/column-resizing.ts +50 -57
  110. package/src/pm-plugins/decorations/utils/compose-decorations.ts +6 -6
  111. package/src/pm-plugins/decorations/utils/index.ts +3 -6
  112. package/src/pm-plugins/decorations/utils/types.ts +7 -12
  113. package/src/pm-plugins/default-table-selection.ts +3 -3
  114. package/src/pm-plugins/drag-and-drop/actions.ts +25 -25
  115. package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +158 -190
  116. package/src/pm-plugins/drag-and-drop/commands.ts +154 -170
  117. package/src/pm-plugins/drag-and-drop/consts.ts +4 -5
  118. package/src/pm-plugins/drag-and-drop/plugin-factory.ts +23 -20
  119. package/src/pm-plugins/drag-and-drop/plugin-key.ts +1 -3
  120. package/src/pm-plugins/drag-and-drop/plugin.ts +329 -383
  121. package/src/pm-plugins/drag-and-drop/reducer.ts +30 -30
  122. package/src/pm-plugins/drag-and-drop/types.ts +8 -8
  123. package/src/pm-plugins/drag-and-drop/utils/autoscrollers.ts +38 -41
  124. package/src/pm-plugins/drag-and-drop/utils/getDragBehaviour.ts +3 -6
  125. package/src/pm-plugins/drag-and-drop/utils/monitor.ts +57 -70
  126. package/src/pm-plugins/keymap.ts +208 -220
  127. package/src/pm-plugins/main.ts +348 -400
  128. package/src/pm-plugins/plugin-factory.ts +32 -34
  129. package/src/pm-plugins/safari-delete-composition-text-issue-workaround.ts +83 -97
  130. package/src/pm-plugins/sticky-headers/commands.ts +2 -6
  131. package/src/pm-plugins/sticky-headers/plugin-key.ts +1 -3
  132. package/src/pm-plugins/sticky-headers/plugin-state.ts +41 -44
  133. package/src/pm-plugins/sticky-headers/plugin.ts +4 -4
  134. package/src/pm-plugins/sticky-headers/types.ts +8 -8
  135. package/src/pm-plugins/sticky-headers/util.ts +10 -10
  136. package/src/pm-plugins/table-analytics.ts +70 -72
  137. package/src/pm-plugins/table-local-id.ts +180 -184
  138. package/src/pm-plugins/table-resizing/commands.ts +72 -85
  139. package/src/pm-plugins/table-resizing/event-handlers.ts +298 -317
  140. package/src/pm-plugins/table-resizing/plugin-factory.ts +10 -10
  141. package/src/pm-plugins/table-resizing/plugin-key.ts +1 -3
  142. package/src/pm-plugins/table-resizing/plugin.ts +61 -68
  143. package/src/pm-plugins/table-resizing/reducer.ts +30 -33
  144. package/src/pm-plugins/table-resizing/utils/colgroup.ts +84 -84
  145. package/src/pm-plugins/table-resizing/utils/column-state.ts +78 -81
  146. package/src/pm-plugins/table-resizing/utils/content-width.ts +94 -114
  147. package/src/pm-plugins/table-resizing/utils/dom.ts +93 -110
  148. package/src/pm-plugins/table-resizing/utils/index.ts +29 -34
  149. package/src/pm-plugins/table-resizing/utils/misc.ts +94 -119
  150. package/src/pm-plugins/table-resizing/utils/resize-column.ts +93 -106
  151. package/src/pm-plugins/table-resizing/utils/resize-logic.ts +240 -257
  152. package/src/pm-plugins/table-resizing/utils/resize-state.ts +343 -372
  153. package/src/pm-plugins/table-resizing/utils/scale-table.ts +202 -207
  154. package/src/pm-plugins/table-resizing/utils/types.ts +17 -17
  155. package/src/pm-plugins/table-resizing/utils/unit-to-number.ts +1 -2
  156. package/src/pm-plugins/table-selection-keymap.ts +25 -51
  157. package/src/pm-plugins/table-width.ts +191 -204
  158. package/src/pm-plugins/view-mode-sort/index.ts +223 -227
  159. package/src/pm-plugins/view-mode-sort/plugin-key.ts +3 -2
  160. package/src/pm-plugins/view-mode-sort/types.ts +12 -12
  161. package/src/pm-plugins/view-mode-sort/utils.ts +108 -117
  162. package/src/reducer.ts +139 -155
  163. package/src/toolbar.tsx +815 -905
  164. package/src/transforms/column-width.ts +186 -213
  165. package/src/transforms/delete-columns.ts +208 -222
  166. package/src/transforms/delete-rows.ts +117 -121
  167. package/src/transforms/fix-tables.ts +190 -215
  168. package/src/transforms/merge.ts +263 -269
  169. package/src/transforms/replace-table.ts +27 -43
  170. package/src/transforms/split.ts +65 -75
  171. package/src/types.ts +421 -427
  172. package/src/ui/ColumnResizeWidget/index.tsx +40 -47
  173. package/src/ui/DragHandle/HandleIconComponent.tsx +9 -13
  174. package/src/ui/DragHandle/index.tsx +221 -250
  175. package/src/ui/DragPreview/index.tsx +35 -35
  176. package/src/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.tsx +33 -41
  177. package/src/ui/FloatingContextualButton/FixedButton.tsx +154 -157
  178. package/src/ui/FloatingContextualButton/index.tsx +109 -115
  179. package/src/ui/FloatingContextualButton/styles.ts +43 -46
  180. package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +634 -694
  181. package/src/ui/FloatingContextualMenu/index.tsx +83 -101
  182. package/src/ui/FloatingContextualMenu/styles.ts +57 -65
  183. package/src/ui/FloatingDeleteButton/DeleteButton.tsx +37 -37
  184. package/src/ui/FloatingDeleteButton/getPopUpOptions.ts +47 -57
  185. package/src/ui/FloatingDeleteButton/index.tsx +319 -350
  186. package/src/ui/FloatingDragMenu/DragMenu.tsx +555 -596
  187. package/src/ui/FloatingDragMenu/DropdownMenu.tsx +152 -162
  188. package/src/ui/FloatingDragMenu/index.tsx +88 -102
  189. package/src/ui/FloatingDragMenu/styles.ts +51 -54
  190. package/src/ui/FloatingInsertButton/InsertButton.tsx +204 -217
  191. package/src/ui/FloatingInsertButton/getPopupOptions.ts +100 -115
  192. package/src/ui/FloatingInsertButton/index.tsx +248 -292
  193. package/src/ui/FloatingToolbarLabel/FloatingToolbarLabel.tsx +24 -29
  194. package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +308 -329
  195. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.tsx +85 -94
  196. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/index.tsx +46 -46
  197. package/src/ui/TableFloatingColumnControls/index.tsx +116 -136
  198. package/src/ui/TableFloatingControls/CornerControls/ClassicCornerControls.tsx +79 -91
  199. package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +95 -102
  200. package/src/ui/TableFloatingControls/CornerControls/index.tsx +1 -4
  201. package/src/ui/TableFloatingControls/CornerControls/types.ts +8 -8
  202. package/src/ui/TableFloatingControls/FloatingControlsWithSelection.tsx +50 -50
  203. package/src/ui/TableFloatingControls/NumberColumn/index.tsx +111 -124
  204. package/src/ui/TableFloatingControls/RowControls/ClassicControls.tsx +86 -105
  205. package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +305 -341
  206. package/src/ui/TableFloatingControls/RowDropTarget/index.tsx +72 -75
  207. package/src/ui/TableFloatingControls/index.tsx +191 -193
  208. package/src/ui/TableFullWidthLabel/index.tsx +20 -20
  209. package/src/ui/common-styles.ts +881 -903
  210. package/src/ui/consts.ts +29 -74
  211. package/src/ui/icons/AddColLeftIcon.tsx +33 -39
  212. package/src/ui/icons/AddColRightIcon.tsx +33 -39
  213. package/src/ui/icons/AddRowAboveIcon.tsx +16 -22
  214. package/src/ui/icons/AddRowBelowIcon.tsx +33 -39
  215. package/src/ui/icons/DisplayModeIcon.tsx +31 -31
  216. package/src/ui/icons/DragHandleDisabledIcon.tsx +19 -21
  217. package/src/ui/icons/DragHandleIcon.tsx +12 -12
  218. package/src/ui/icons/DragInMotionIcon.tsx +45 -52
  219. package/src/ui/icons/MergeCellsIcon.tsx +22 -28
  220. package/src/ui/icons/MinimisedHandle.tsx +9 -9
  221. package/src/ui/icons/SplitCellIcon.tsx +30 -36
  222. package/src/ui/ui-styles.ts +769 -798
  223. package/src/utils/alignment.ts +1 -1
  224. package/src/utils/analytics.ts +192 -208
  225. package/src/utils/collapse.ts +55 -64
  226. package/src/utils/column-controls.ts +237 -254
  227. package/src/utils/create.ts +30 -30
  228. package/src/utils/decoration.ts +482 -502
  229. package/src/utils/dom.ts +127 -134
  230. package/src/utils/drag-menu.ts +322 -373
  231. package/src/utils/get-allow-add-column-custom-step.ts +4 -5
  232. package/src/utils/guidelines.ts +10 -21
  233. package/src/utils/index.ts +68 -68
  234. package/src/utils/merged-cells.ts +245 -254
  235. package/src/utils/nodes.ts +91 -106
  236. package/src/utils/paste.ts +119 -135
  237. package/src/utils/row-controls.ts +199 -213
  238. package/src/utils/selection.ts +77 -87
  239. package/src/utils/snapping.ts +84 -97
  240. package/src/utils/table.ts +44 -44
  241. package/src/utils/transforms.ts +5 -5
  242. package/src/utils/update-plugin-state-decorations.ts +5 -9
  243. package/tsconfig.app.json +107 -107
  244. package/tsconfig.dev.json +47 -47
@@ -1,76 +1,56 @@
1
1
  import type { IntlShape } from 'react-intl-next';
2
2
 
3
3
  import {
4
- ACTION,
5
- ACTION_SUBJECT,
6
- EVENT_TYPE,
7
- INPUT_METHOD,
8
- } from '@atlaskit/editor-common/analytics';
9
- import type {
10
- DispatchAnalyticsEvent,
11
- EditorAnalyticsAPI,
4
+ ACTION,
5
+ ACTION_SUBJECT,
6
+ EVENT_TYPE,
7
+ INPUT_METHOD,
12
8
  } from '@atlaskit/editor-common/analytics';
9
+ import type { DispatchAnalyticsEvent, EditorAnalyticsAPI } from '@atlaskit/editor-common/analytics';
13
10
  import { insideTable } from '@atlaskit/editor-common/core-utils';
14
- import type {
15
- Dispatch,
16
- EventDispatcher,
17
- } from '@atlaskit/editor-common/event-dispatcher';
11
+ import type { Dispatch, EventDispatcher } from '@atlaskit/editor-common/event-dispatcher';
18
12
  import { type PortalProviderAPI } from '@atlaskit/editor-common/portal';
19
13
  import type { LegacyPortalProviderAPI } from '@atlaskit/editor-common/portal-provider';
20
14
  import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
21
15
  import {
22
- transformSliceToRemoveOpenBodiedExtension,
23
- transformSliceToRemoveOpenExpand,
24
- transformSliceToRemoveOpenLayoutNodes,
25
- transformSliceToRemoveOpenMultiBodiedExtension,
26
- transformSliceToRemoveOpenNestedExpand,
16
+ transformSliceToRemoveOpenBodiedExtension,
17
+ transformSliceToRemoveOpenExpand,
18
+ transformSliceToRemoveOpenLayoutNodes,
19
+ transformSliceToRemoveOpenMultiBodiedExtension,
20
+ transformSliceToRemoveOpenNestedExpand,
27
21
  } from '@atlaskit/editor-common/transforms';
28
- import type {
29
- GetEditorContainerWidth,
30
- GetEditorFeatureFlags,
31
- } from '@atlaskit/editor-common/types';
22
+ import type { GetEditorContainerWidth, GetEditorFeatureFlags } from '@atlaskit/editor-common/types';
32
23
  import { browser, closestElement } from '@atlaskit/editor-common/utils';
33
- import type {
34
- EditorState,
35
- TextSelection,
36
- Transaction,
37
- } from '@atlaskit/editor-prosemirror/state';
38
- import {
39
- findParentDomRefOfType,
40
- findParentNodeOfType,
41
- } from '@atlaskit/editor-prosemirror/utils';
24
+ import type { EditorState, TextSelection, Transaction } from '@atlaskit/editor-prosemirror/state';
25
+ import { findParentDomRefOfType, findParentNodeOfType } from '@atlaskit/editor-prosemirror/utils';
42
26
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
43
27
  import { TableMap } from '@atlaskit/editor-tables';
44
28
  import { findTable } from '@atlaskit/editor-tables/utils';
45
29
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
46
30
 
47
- import {
48
- addBoldInEmptyHeaderCells,
49
- clearHoverSelection,
50
- setTableRef,
51
- } from '../commands';
31
+ import { addBoldInEmptyHeaderCells, clearHoverSelection, setTableRef } from '../commands';
52
32
  import { stopKeyboardColumnResizing } from '../commands/column-resize';
53
33
  import {
54
- removeResizeHandleDecorations,
55
- transformSliceRemoveCellBackgroundColor,
56
- transformSliceToAddTableHeaders,
57
- transformSliceToRemoveColumnsWidths,
34
+ removeResizeHandleDecorations,
35
+ transformSliceRemoveCellBackgroundColor,
36
+ transformSliceToAddTableHeaders,
37
+ transformSliceToRemoveColumnsWidths,
58
38
  } from '../commands/misc';
59
39
  import {
60
- handleBlur,
61
- handleClick,
62
- handleCut,
63
- handleFocus,
64
- handleMouseDown,
65
- handleMouseEnter,
66
- handleMouseLeave,
67
- handleMouseMove,
68
- handleMouseOut,
69
- handleMouseOver,
70
- handleMouseUp,
71
- handleTripleClick,
72
- whenTableInFocus,
73
- withCellTracking,
40
+ handleBlur,
41
+ handleClick,
42
+ handleCut,
43
+ handleFocus,
44
+ handleMouseDown,
45
+ handleMouseEnter,
46
+ handleMouseLeave,
47
+ handleMouseMove,
48
+ handleMouseOut,
49
+ handleMouseOver,
50
+ handleMouseUp,
51
+ handleTripleClick,
52
+ whenTableInFocus,
53
+ withCellTracking,
74
54
  } from '../event-handlers';
75
55
  import { createTableView } from '../nodeviews/table';
76
56
  import TableCell from '../nodeviews/TableCell';
@@ -78,362 +58,330 @@ import TableRow from '../nodeviews/TableRow';
78
58
  import { pluginKey as decorationsPluginKey } from '../pm-plugins/decorations/plugin';
79
59
  import { fixTables, replaceSelectedTable } from '../transforms';
80
60
  import type {
81
- InvalidNodeAttr,
82
- PluginConfig,
83
- PluginInjectionAPI,
84
- PluginInjectionAPIWithA11y,
61
+ InvalidNodeAttr,
62
+ PluginConfig,
63
+ PluginInjectionAPI,
64
+ PluginInjectionAPIWithA11y,
85
65
  } from '../types';
86
66
  import { TableCssClassName as ClassName } from '../types';
87
67
  import {
88
- findControlsHoverDecoration,
89
- transformSliceToCorrectEmptyTableCells,
90
- transformSliceToFixHardBreakProblemOnCopyFromCell,
91
- transformSliceToRemoveOpenTable,
68
+ findControlsHoverDecoration,
69
+ transformSliceToCorrectEmptyTableCells,
70
+ transformSliceToFixHardBreakProblemOnCopyFromCell,
71
+ transformSliceToRemoveOpenTable,
92
72
  } from '../utils';
93
73
  import { isHeaderRowRequired } from '../utils/paste';
94
74
 
95
- import {
96
- defaultHoveredCell,
97
- defaultTableSelection,
98
- } from './default-table-selection';
75
+ import { defaultHoveredCell, defaultTableSelection } from './default-table-selection';
99
76
  import { createPluginState, getPluginState } from './plugin-factory';
100
77
  import { pluginKey } from './plugin-key';
101
78
 
102
79
  export const createPlugin = (
103
- dispatchAnalyticsEvent: DispatchAnalyticsEvent,
104
- dispatch: Dispatch,
105
- portalProviderAPI: LegacyPortalProviderAPI | PortalProviderAPI,
106
- eventDispatcher: EventDispatcher,
107
- pluginConfig: PluginConfig,
108
- getEditorContainerWidth: GetEditorContainerWidth,
109
- getEditorFeatureFlags: GetEditorFeatureFlags,
110
- getIntl: () => IntlShape,
111
- tableResizingEnabled?: boolean,
112
- fullWidthModeEnabled?: boolean,
113
- previousFullWidthModeEnabled?: boolean,
114
- dragAndDropEnabled?: boolean,
115
- editorAnalyticsAPI?: EditorAnalyticsAPI,
116
- pluginInjectionApi?: PluginInjectionAPI,
117
- isTableScalingEnabled?: boolean,
118
- isTableAlignmentEnabled?: boolean,
80
+ dispatchAnalyticsEvent: DispatchAnalyticsEvent,
81
+ dispatch: Dispatch,
82
+ portalProviderAPI: LegacyPortalProviderAPI | PortalProviderAPI,
83
+ eventDispatcher: EventDispatcher,
84
+ pluginConfig: PluginConfig,
85
+ getEditorContainerWidth: GetEditorContainerWidth,
86
+ getEditorFeatureFlags: GetEditorFeatureFlags,
87
+ getIntl: () => IntlShape,
88
+ tableResizingEnabled?: boolean,
89
+ fullWidthModeEnabled?: boolean,
90
+ previousFullWidthModeEnabled?: boolean,
91
+ dragAndDropEnabled?: boolean,
92
+ editorAnalyticsAPI?: EditorAnalyticsAPI,
93
+ pluginInjectionApi?: PluginInjectionAPI,
94
+ isTableScalingEnabled?: boolean,
95
+ isTableAlignmentEnabled?: boolean,
119
96
  ) => {
120
- const state = createPluginState(dispatch, {
121
- pluginConfig,
122
- isTableHovered: false,
123
- insertColumnButtonIndex: undefined,
124
- insertRowButtonIndex: undefined,
125
- isFullWidthModeEnabled: fullWidthModeEnabled,
126
- wasFullWidthModeEnabled: previousFullWidthModeEnabled,
127
- isTableResizingEnabled: tableResizingEnabled,
128
- isHeaderRowEnabled: !!pluginConfig.allowHeaderRow,
129
- isHeaderColumnEnabled: false,
130
- isDragAndDropEnabled: dragAndDropEnabled,
131
- isTableScalingEnabled: isTableScalingEnabled,
132
- ...defaultHoveredCell,
133
- ...defaultTableSelection,
134
- getIntl,
135
- });
136
-
137
- // Used to prevent invalid table cell spans being reported more than once per editor/document
138
- const invalidTableIds: string[] = [];
139
- let editorViewRef: EditorView | null = null;
140
-
141
- const ariaNotifyPlugin = (pluginInjectionApi as PluginInjectionAPIWithA11y)
142
- ?.accessibilityUtils?.actions.ariaNotify;
143
-
144
- const getCurrentEditorState = (): EditorState | null => {
145
- const editorView = editorViewRef;
146
- if (!editorView) {
147
- return null;
148
- }
149
-
150
- return editorView.state;
151
- };
152
- return new SafePlugin({
153
- state: state,
154
- key: pluginKey,
155
- appendTransaction: (
156
- transactions: readonly Transaction[],
157
- oldState: EditorState,
158
- newState: EditorState,
159
- ) => {
160
- const tr = transactions.find((tr) => tr.getMeta('uiEvent') === 'cut');
161
-
162
- function reportInvalidTableCellSpanAttrs(
163
- invalidNodeAttr: InvalidNodeAttr,
164
- ) {
165
- if (invalidTableIds.find((id) => id === invalidNodeAttr.tableLocalId)) {
166
- return;
167
- }
168
-
169
- invalidTableIds.push(invalidNodeAttr.tableLocalId);
170
-
171
- dispatchAnalyticsEvent({
172
- action: ACTION.INVALID_DOCUMENT_ENCOUNTERED,
173
- actionSubject: ACTION_SUBJECT.EDITOR,
174
- eventType: EVENT_TYPE.OPERATIONAL,
175
- attributes: {
176
- nodeType: invalidNodeAttr.nodeType,
177
- reason: `${invalidNodeAttr.attribute}: ${invalidNodeAttr.reason}`,
178
- tableLocalId: invalidNodeAttr.tableLocalId,
179
- spanValue: invalidNodeAttr.spanValue,
180
- },
181
- });
182
- }
183
-
184
- if (tr) {
185
- // "fixTables" removes empty rows as we don't allow that in schema
186
- const updatedTr = handleCut(
187
- tr,
188
- oldState,
189
- newState,
190
- editorAnalyticsAPI,
191
- editorViewRef || undefined,
192
- isTableScalingEnabled,
193
- );
194
- return fixTables(updatedTr) || updatedTr;
195
- }
196
- if (transactions.find((tr) => tr.docChanged)) {
197
- return fixTables(newState.tr, reportInvalidTableCellSpanAttrs);
198
- }
199
- },
200
- view: (editorView: EditorView) => {
201
- const domAtPos = editorView.domAtPos.bind(editorView);
202
- editorViewRef = editorView;
203
-
204
- return {
205
- update: (view: EditorView, prevState: EditorState) => {
206
- const { state, dispatch } = view;
207
- const { selection } = state;
208
- const pluginState = getPluginState(state);
209
- let tableRef: HTMLTableElement | undefined;
210
- if (pluginState.editorHasFocus) {
211
- const parent = findParentDomRefOfType(
212
- state.schema.nodes.table,
213
- domAtPos,
214
- )(selection);
215
- if (parent) {
216
- tableRef =
217
- (parent as HTMLElement).querySelector<HTMLTableElement>(
218
- 'table',
219
- ) || undefined;
220
- }
221
- const tableNode = findTable(state.selection);
222
- if (getBooleanFF('platform.editor.a11y-column-resizing_emcvz')) {
223
- // when keyboard cursor leaves the table we need to stop column resizing
224
- const pluginPrevState = getPluginState(prevState);
225
- const isStopKeyboardColumResizing =
226
- pluginPrevState.isResizeHandleWidgetAdded &&
227
- pluginPrevState.isKeyboardResize;
228
- if (isStopKeyboardColumResizing) {
229
- const isTableNodesDifferent =
230
- pluginPrevState?.tableNode !== tableNode?.node;
231
- if (
232
- pluginPrevState?.tableNode &&
233
- tableNode &&
234
- isTableNodesDifferent
235
- ) {
236
- const oldRowsNumber = TableMap.get(
237
- pluginPrevState.tableNode,
238
- ).height;
239
- const newRowsNumber = TableMap.get(tableNode.node).height;
240
- if (
241
- oldRowsNumber !== newRowsNumber || // Add/delete row
242
- tableNode.node.attrs.localId !==
243
- pluginPrevState.tableNode.attrs.localId
244
- ) {
245
- // Jump to another table
246
- stopKeyboardColumnResizing({
247
- ariaNotify: ariaNotifyPlugin,
248
- getIntl: getIntl,
249
- })(state, dispatch);
250
- }
251
- } else if (!tableNode) {
252
- // selection outside of table
253
- stopKeyboardColumnResizing({
254
- ariaNotify: ariaNotifyPlugin,
255
- getIntl: getIntl,
256
- })(state, dispatch);
257
- }
258
- }
259
- }
260
- }
261
-
262
- if (pluginState.tableRef !== tableRef) {
263
- setTableRef(tableRef)(state, dispatch);
264
- }
265
-
266
- if (pluginState.editorHasFocus && pluginState.tableRef) {
267
- const { $cursor } = state.selection as TextSelection;
268
- if ($cursor) {
269
- // Only update bold when it's a cursor
270
- const tableCellHeader = findParentNodeOfType(
271
- state.schema.nodes.tableHeader,
272
- )(state.selection);
273
-
274
- if (tableCellHeader) {
275
- addBoldInEmptyHeaderCells(tableCellHeader)(state, dispatch);
276
- }
277
- }
278
- } else if (pluginState.isResizeHandleWidgetAdded) {
279
- removeResizeHandleDecorations()(state, dispatch);
280
- }
281
- },
282
- };
283
- },
284
- props: {
285
- transformPasted(slice) {
286
- const editorState = getCurrentEditorState();
287
- if (!editorState) {
288
- return slice;
289
- }
290
-
291
- const { schema } = editorState;
292
-
293
- // if we're pasting to outside a table or outside a table
294
- // header, ensure that we apply any table headers to the first
295
- // row of content we see, if required
296
- if (!insideTable(editorState) && isHeaderRowRequired(editorState)) {
297
- slice = transformSliceToAddTableHeaders(slice, schema);
298
- }
299
-
300
- slice = transformSliceToFixHardBreakProblemOnCopyFromCell(
301
- slice,
302
- schema,
303
- );
304
-
305
- // We do this separately, so it also applies to drag/drop events
306
- // This needs to go before `transformSliceToRemoveOpenExpand`
307
- slice = transformSliceToRemoveOpenLayoutNodes(slice, schema);
308
-
309
- // If a partial paste of expand, paste only the content
310
- // This needs to go before `transformSliceToRemoveOpenTable`
311
- slice = transformSliceToRemoveOpenExpand(slice, schema);
312
-
313
- /** If a partial paste of table, paste only table's content */
314
- slice = transformSliceToRemoveOpenTable(slice, schema);
315
-
316
- /** If a partial paste of bodied extension, paste only text */
317
- slice = transformSliceToRemoveOpenBodiedExtension(slice, schema);
318
-
319
- /** If a partial paste of multi bodied extension, paste only children */
320
- slice = transformSliceToRemoveOpenMultiBodiedExtension(slice, schema);
321
-
322
- slice = transformSliceToCorrectEmptyTableCells(slice, schema);
323
-
324
- if (!pluginConfig.allowColumnResizing) {
325
- slice = transformSliceToRemoveColumnsWidths(slice, schema);
326
- }
327
-
328
- // If we don't allow background on cells, we need to remove it
329
- // from the paste slice
330
- if (!pluginConfig.allowBackgroundColor) {
331
- slice = transformSliceRemoveCellBackgroundColor(slice, schema);
332
- }
333
-
334
- // If a partial paste of nested expand, paste only nested-expand's content */
335
- if (getBooleanFF('platform.editor.transform-slice-for-nested-expand')) {
336
- slice = transformSliceToRemoveOpenNestedExpand(slice, schema);
337
- }
338
-
339
- return slice;
340
- },
341
- handleClick: ({ state, dispatch }, _pos, event: MouseEvent) => {
342
- const decorationSet = decorationsPluginKey.getState(state);
343
- if (findControlsHoverDecoration(decorationSet).length) {
344
- clearHoverSelection()(state, dispatch);
345
- }
346
-
347
- // ED-6069: workaround for Chrome given a regression introduced in prosemirror-view@1.6.8
348
- // Returning true prevents that updateSelection() is getting called in the commit below:
349
- // @see https://github.com/ProseMirror/prosemirror-view/commit/33fe4a8b01584f6b4103c279033dcd33e8047b95
350
- if (browser.chrome && event.target) {
351
- const targetClassList = (event.target as HTMLElement).classList;
352
-
353
- if (
354
- targetClassList.contains(ClassName.CONTROLS_BUTTON) ||
355
- targetClassList.contains(ClassName.CONTEXTUAL_MENU_BUTTON) ||
356
- targetClassList.contains(
357
- ClassName.DRAG_HANDLE_BUTTON_CLICKABLE_ZONE,
358
- )
359
- ) {
360
- return true;
361
- }
362
- }
363
-
364
- return false;
365
- },
366
- handleScrollToSelection: (view: EditorView) => {
367
- // when typing into a sticky header cell, we don't want to scroll
368
- // back to the top of the table if the user has already scrolled down
369
- const { tableHeader } = view.state.schema.nodes;
370
- const domRef = findParentDomRefOfType(
371
- tableHeader,
372
- view.domAtPos.bind(view),
373
- )(view.state.selection);
374
-
375
- const maybeTr = closestElement(domRef as HTMLElement | undefined, 'tr');
376
- return maybeTr ? maybeTr.classList.contains('sticky') : false;
377
- },
378
- handleTextInput: (view, _from, _to, text) => {
379
- const { state, dispatch } = view;
380
- if (getBooleanFF('platform.editor.a11y-column-resizing_emcvz')) {
381
- const { isKeyboardResize } = getPluginState(state);
382
- if (isKeyboardResize) {
383
- stopKeyboardColumnResizing({
384
- ariaNotify: ariaNotifyPlugin,
385
- getIntl: getIntl,
386
- })(state, dispatch);
387
- return false;
388
- }
389
- }
390
- const tr = replaceSelectedTable(
391
- state,
392
- text,
393
- INPUT_METHOD.KEYBOARD,
394
- editorAnalyticsAPI,
395
- );
396
- if (tr.selectionSet) {
397
- dispatch(tr);
398
- return true;
399
- }
400
- return false;
401
- },
402
- nodeViews: {
403
- table: (node, view, getPos) =>
404
- createTableView(
405
- node,
406
- view,
407
- getPos,
408
- portalProviderAPI,
409
- eventDispatcher,
410
- getEditorContainerWidth,
411
- getEditorFeatureFlags,
412
- dispatchAnalyticsEvent,
413
- pluginInjectionApi,
414
- isTableAlignmentEnabled,
415
- ),
416
- tableRow: (node, view, getPos) =>
417
- new TableRow(node, view, getPos, eventDispatcher),
418
- tableCell: (node, view, getPos) =>
419
- new TableCell(node, view, getPos, eventDispatcher),
420
- tableHeader: (node, view, getPos) =>
421
- new TableCell(node, view, getPos, eventDispatcher),
422
- },
423
- handleDOMEvents: {
424
- focus: handleFocus,
425
- blur: handleBlur,
426
- mousedown: withCellTracking(handleMouseDown),
427
- mouseover: withCellTracking(whenTableInFocus(handleMouseOver)),
428
- mouseleave: handleMouseLeave,
429
- mouseout: whenTableInFocus(handleMouseOut),
430
- mousemove: whenTableInFocus(handleMouseMove),
431
- mouseenter: handleMouseEnter,
432
- mouseup: whenTableInFocus(handleMouseUp),
433
- click: withCellTracking(whenTableInFocus(handleClick)),
434
- },
435
-
436
- handleTripleClick,
437
- },
438
- });
97
+ const state = createPluginState(dispatch, {
98
+ pluginConfig,
99
+ isTableHovered: false,
100
+ insertColumnButtonIndex: undefined,
101
+ insertRowButtonIndex: undefined,
102
+ isFullWidthModeEnabled: fullWidthModeEnabled,
103
+ wasFullWidthModeEnabled: previousFullWidthModeEnabled,
104
+ isTableResizingEnabled: tableResizingEnabled,
105
+ isHeaderRowEnabled: !!pluginConfig.allowHeaderRow,
106
+ isHeaderColumnEnabled: false,
107
+ isDragAndDropEnabled: dragAndDropEnabled,
108
+ isTableScalingEnabled: isTableScalingEnabled,
109
+ ...defaultHoveredCell,
110
+ ...defaultTableSelection,
111
+ getIntl,
112
+ });
113
+
114
+ // Used to prevent invalid table cell spans being reported more than once per editor/document
115
+ const invalidTableIds: string[] = [];
116
+ let editorViewRef: EditorView | null = null;
117
+
118
+ const ariaNotifyPlugin = (pluginInjectionApi as PluginInjectionAPIWithA11y)?.accessibilityUtils
119
+ ?.actions.ariaNotify;
120
+
121
+ const getCurrentEditorState = (): EditorState | null => {
122
+ const editorView = editorViewRef;
123
+ if (!editorView) {
124
+ return null;
125
+ }
126
+
127
+ return editorView.state;
128
+ };
129
+ return new SafePlugin({
130
+ state: state,
131
+ key: pluginKey,
132
+ appendTransaction: (
133
+ transactions: readonly Transaction[],
134
+ oldState: EditorState,
135
+ newState: EditorState,
136
+ ) => {
137
+ const tr = transactions.find((tr) => tr.getMeta('uiEvent') === 'cut');
138
+
139
+ function reportInvalidTableCellSpanAttrs(invalidNodeAttr: InvalidNodeAttr) {
140
+ if (invalidTableIds.find((id) => id === invalidNodeAttr.tableLocalId)) {
141
+ return;
142
+ }
143
+
144
+ invalidTableIds.push(invalidNodeAttr.tableLocalId);
145
+
146
+ dispatchAnalyticsEvent({
147
+ action: ACTION.INVALID_DOCUMENT_ENCOUNTERED,
148
+ actionSubject: ACTION_SUBJECT.EDITOR,
149
+ eventType: EVENT_TYPE.OPERATIONAL,
150
+ attributes: {
151
+ nodeType: invalidNodeAttr.nodeType,
152
+ reason: `${invalidNodeAttr.attribute}: ${invalidNodeAttr.reason}`,
153
+ tableLocalId: invalidNodeAttr.tableLocalId,
154
+ spanValue: invalidNodeAttr.spanValue,
155
+ },
156
+ });
157
+ }
158
+
159
+ if (tr) {
160
+ // "fixTables" removes empty rows as we don't allow that in schema
161
+ const updatedTr = handleCut(
162
+ tr,
163
+ oldState,
164
+ newState,
165
+ editorAnalyticsAPI,
166
+ editorViewRef || undefined,
167
+ isTableScalingEnabled,
168
+ );
169
+ return fixTables(updatedTr) || updatedTr;
170
+ }
171
+ if (transactions.find((tr) => tr.docChanged)) {
172
+ return fixTables(newState.tr, reportInvalidTableCellSpanAttrs);
173
+ }
174
+ },
175
+ view: (editorView: EditorView) => {
176
+ const domAtPos = editorView.domAtPos.bind(editorView);
177
+ editorViewRef = editorView;
178
+
179
+ return {
180
+ update: (view: EditorView, prevState: EditorState) => {
181
+ const { state, dispatch } = view;
182
+ const { selection } = state;
183
+ const pluginState = getPluginState(state);
184
+ let tableRef: HTMLTableElement | undefined;
185
+ if (pluginState.editorHasFocus) {
186
+ const parent = findParentDomRefOfType(state.schema.nodes.table, domAtPos)(selection);
187
+ if (parent) {
188
+ tableRef =
189
+ (parent as HTMLElement).querySelector<HTMLTableElement>('table') || undefined;
190
+ }
191
+ const tableNode = findTable(state.selection);
192
+ if (getBooleanFF('platform.editor.a11y-column-resizing_emcvz')) {
193
+ // when keyboard cursor leaves the table we need to stop column resizing
194
+ const pluginPrevState = getPluginState(prevState);
195
+ const isStopKeyboardColumResizing =
196
+ pluginPrevState.isResizeHandleWidgetAdded && pluginPrevState.isKeyboardResize;
197
+ if (isStopKeyboardColumResizing) {
198
+ const isTableNodesDifferent = pluginPrevState?.tableNode !== tableNode?.node;
199
+ if (pluginPrevState?.tableNode && tableNode && isTableNodesDifferent) {
200
+ const oldRowsNumber = TableMap.get(pluginPrevState.tableNode).height;
201
+ const newRowsNumber = TableMap.get(tableNode.node).height;
202
+ if (
203
+ oldRowsNumber !== newRowsNumber || // Add/delete row
204
+ tableNode.node.attrs.localId !== pluginPrevState.tableNode.attrs.localId
205
+ ) {
206
+ // Jump to another table
207
+ stopKeyboardColumnResizing({
208
+ ariaNotify: ariaNotifyPlugin,
209
+ getIntl: getIntl,
210
+ })(state, dispatch);
211
+ }
212
+ } else if (!tableNode) {
213
+ // selection outside of table
214
+ stopKeyboardColumnResizing({
215
+ ariaNotify: ariaNotifyPlugin,
216
+ getIntl: getIntl,
217
+ })(state, dispatch);
218
+ }
219
+ }
220
+ }
221
+ }
222
+
223
+ if (pluginState.tableRef !== tableRef) {
224
+ setTableRef(tableRef)(state, dispatch);
225
+ }
226
+
227
+ if (pluginState.editorHasFocus && pluginState.tableRef) {
228
+ const { $cursor } = state.selection as TextSelection;
229
+ if ($cursor) {
230
+ // Only update bold when it's a cursor
231
+ const tableCellHeader = findParentNodeOfType(state.schema.nodes.tableHeader)(
232
+ state.selection,
233
+ );
234
+
235
+ if (tableCellHeader) {
236
+ addBoldInEmptyHeaderCells(tableCellHeader)(state, dispatch);
237
+ }
238
+ }
239
+ } else if (pluginState.isResizeHandleWidgetAdded) {
240
+ removeResizeHandleDecorations()(state, dispatch);
241
+ }
242
+ },
243
+ };
244
+ },
245
+ props: {
246
+ transformPasted(slice) {
247
+ const editorState = getCurrentEditorState();
248
+ if (!editorState) {
249
+ return slice;
250
+ }
251
+
252
+ const { schema } = editorState;
253
+
254
+ // if we're pasting to outside a table or outside a table
255
+ // header, ensure that we apply any table headers to the first
256
+ // row of content we see, if required
257
+ if (!insideTable(editorState) && isHeaderRowRequired(editorState)) {
258
+ slice = transformSliceToAddTableHeaders(slice, schema);
259
+ }
260
+
261
+ slice = transformSliceToFixHardBreakProblemOnCopyFromCell(slice, schema);
262
+
263
+ // We do this separately, so it also applies to drag/drop events
264
+ // This needs to go before `transformSliceToRemoveOpenExpand`
265
+ slice = transformSliceToRemoveOpenLayoutNodes(slice, schema);
266
+
267
+ // If a partial paste of expand, paste only the content
268
+ // This needs to go before `transformSliceToRemoveOpenTable`
269
+ slice = transformSliceToRemoveOpenExpand(slice, schema);
270
+
271
+ /** If a partial paste of table, paste only table's content */
272
+ slice = transformSliceToRemoveOpenTable(slice, schema);
273
+
274
+ /** If a partial paste of bodied extension, paste only text */
275
+ slice = transformSliceToRemoveOpenBodiedExtension(slice, schema);
276
+
277
+ /** If a partial paste of multi bodied extension, paste only children */
278
+ slice = transformSliceToRemoveOpenMultiBodiedExtension(slice, schema);
279
+
280
+ slice = transformSliceToCorrectEmptyTableCells(slice, schema);
281
+
282
+ if (!pluginConfig.allowColumnResizing) {
283
+ slice = transformSliceToRemoveColumnsWidths(slice, schema);
284
+ }
285
+
286
+ // If we don't allow background on cells, we need to remove it
287
+ // from the paste slice
288
+ if (!pluginConfig.allowBackgroundColor) {
289
+ slice = transformSliceRemoveCellBackgroundColor(slice, schema);
290
+ }
291
+
292
+ // If a partial paste of nested expand, paste only nested-expand's content */
293
+ if (getBooleanFF('platform.editor.transform-slice-for-nested-expand')) {
294
+ slice = transformSliceToRemoveOpenNestedExpand(slice, schema);
295
+ }
296
+
297
+ return slice;
298
+ },
299
+ handleClick: ({ state, dispatch }, _pos, event: MouseEvent) => {
300
+ const decorationSet = decorationsPluginKey.getState(state);
301
+ if (findControlsHoverDecoration(decorationSet).length) {
302
+ clearHoverSelection()(state, dispatch);
303
+ }
304
+
305
+ // ED-6069: workaround for Chrome given a regression introduced in prosemirror-view@1.6.8
306
+ // Returning true prevents that updateSelection() is getting called in the commit below:
307
+ // @see https://github.com/ProseMirror/prosemirror-view/commit/33fe4a8b01584f6b4103c279033dcd33e8047b95
308
+ if (browser.chrome && event.target) {
309
+ const targetClassList = (event.target as HTMLElement).classList;
310
+
311
+ if (
312
+ targetClassList.contains(ClassName.CONTROLS_BUTTON) ||
313
+ targetClassList.contains(ClassName.CONTEXTUAL_MENU_BUTTON) ||
314
+ targetClassList.contains(ClassName.DRAG_HANDLE_BUTTON_CLICKABLE_ZONE)
315
+ ) {
316
+ return true;
317
+ }
318
+ }
319
+
320
+ return false;
321
+ },
322
+ handleScrollToSelection: (view: EditorView) => {
323
+ // when typing into a sticky header cell, we don't want to scroll
324
+ // back to the top of the table if the user has already scrolled down
325
+ const { tableHeader } = view.state.schema.nodes;
326
+ const domRef = findParentDomRefOfType(
327
+ tableHeader,
328
+ view.domAtPos.bind(view),
329
+ )(view.state.selection);
330
+
331
+ const maybeTr = closestElement(domRef as HTMLElement | undefined, 'tr');
332
+ return maybeTr ? maybeTr.classList.contains('sticky') : false;
333
+ },
334
+ handleTextInput: (view, _from, _to, text) => {
335
+ const { state, dispatch } = view;
336
+ if (getBooleanFF('platform.editor.a11y-column-resizing_emcvz')) {
337
+ const { isKeyboardResize } = getPluginState(state);
338
+ if (isKeyboardResize) {
339
+ stopKeyboardColumnResizing({
340
+ ariaNotify: ariaNotifyPlugin,
341
+ getIntl: getIntl,
342
+ })(state, dispatch);
343
+ return false;
344
+ }
345
+ }
346
+ const tr = replaceSelectedTable(state, text, INPUT_METHOD.KEYBOARD, editorAnalyticsAPI);
347
+ if (tr.selectionSet) {
348
+ dispatch(tr);
349
+ return true;
350
+ }
351
+ return false;
352
+ },
353
+ nodeViews: {
354
+ table: (node, view, getPos) =>
355
+ createTableView(
356
+ node,
357
+ view,
358
+ getPos,
359
+ portalProviderAPI,
360
+ eventDispatcher,
361
+ getEditorContainerWidth,
362
+ getEditorFeatureFlags,
363
+ dispatchAnalyticsEvent,
364
+ pluginInjectionApi,
365
+ isTableAlignmentEnabled,
366
+ ),
367
+ tableRow: (node, view, getPos) => new TableRow(node, view, getPos, eventDispatcher),
368
+ tableCell: (node, view, getPos) => new TableCell(node, view, getPos, eventDispatcher),
369
+ tableHeader: (node, view, getPos) => new TableCell(node, view, getPos, eventDispatcher),
370
+ },
371
+ handleDOMEvents: {
372
+ focus: handleFocus,
373
+ blur: handleBlur,
374
+ mousedown: withCellTracking(handleMouseDown),
375
+ mouseover: withCellTracking(whenTableInFocus(handleMouseOver)),
376
+ mouseleave: handleMouseLeave,
377
+ mouseout: whenTableInFocus(handleMouseOut),
378
+ mousemove: whenTableInFocus(handleMouseMove),
379
+ mouseenter: handleMouseEnter,
380
+ mouseup: whenTableInFocus(handleMouseUp),
381
+ click: withCellTracking(whenTableInFocus(handleClick)),
382
+ },
383
+
384
+ handleTripleClick,
385
+ },
386
+ });
439
387
  };