@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
@@ -1,12 +1,6 @@
1
1
  /* eslint-disable @atlaskit/design-system/prefer-primitives */
2
2
  import type { MouseEvent } from 'react';
3
- import React, {
4
- Fragment,
5
- useCallback,
6
- useEffect,
7
- useMemo,
8
- useState,
9
- } from 'react';
3
+ import React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react';
10
4
 
11
5
  import { injectIntl } from 'react-intl-next';
12
6
  import type { WrappedComponentProps } from 'react-intl-next';
@@ -25,353 +19,323 @@ import { toggleDragMenu } from '../../../pm-plugins/drag-and-drop/commands';
25
19
  import type { TriggerType } from '../../../pm-plugins/drag-and-drop/types';
26
20
  import { getPluginState as getTablePluginState } from '../../../pm-plugins/plugin-factory';
27
21
  import { TableCssClassName as ClassName } from '../../../types';
28
- import type {
29
- CellHoverMeta,
30
- DraggableSourceData,
31
- HandleTypes,
32
- } from '../../../types';
33
- import {
34
- getRowHeights,
35
- getRowsParams,
36
- getSelectedRowIndexes,
37
- } from '../../../utils';
22
+ import type { CellHoverMeta, DraggableSourceData, HandleTypes } from '../../../types';
23
+ import { getRowHeights, getRowsParams, getSelectedRowIndexes } from '../../../utils';
38
24
  import { dropTargetExtendedWidth } from '../../consts';
39
25
  import type { DragHandleAppearance } from '../../DragHandle';
40
26
  import { DragHandle } from '../../DragHandle';
41
27
  import RowDropTarget from '../RowDropTarget';
42
28
 
43
29
  type DragControlsProps = {
44
- editorView: EditorView;
45
- tableRef: HTMLTableElement;
46
- tableNode?: PmNode;
47
- tableWidth: number;
48
- tableActive?: boolean;
49
- hoveredCell?: CellHoverMeta;
50
- isInDanger?: boolean;
51
- isTableHovered?: boolean;
52
- isResizing?: boolean;
53
- hoverRows: (rows: number[], danger?: boolean) => void;
54
- selectRow: (row: number, expand: boolean) => void;
55
- selectRows: (rowIndexes: number[]) => void;
56
- updateCellHoverLocation: (rowIndex: number) => void;
30
+ editorView: EditorView;
31
+ tableRef: HTMLTableElement;
32
+ tableNode?: PmNode;
33
+ tableWidth: number;
34
+ tableActive?: boolean;
35
+ hoveredCell?: CellHoverMeta;
36
+ isInDanger?: boolean;
37
+ isTableHovered?: boolean;
38
+ isResizing?: boolean;
39
+ hoverRows: (rows: number[], danger?: boolean) => void;
40
+ selectRow: (row: number, expand: boolean) => void;
41
+ selectRows: (rowIndexes: number[]) => void;
42
+ updateCellHoverLocation: (rowIndex: number) => void;
57
43
  };
58
44
 
59
45
  const getSelectedRows = (selection: Selection) => {
60
- if (selection instanceof CellSelection && selection.isRowSelection()) {
61
- const rect = getSelectionRect(selection);
62
- if (!rect) {
63
- return [];
64
- }
65
- return getSelectedRowIndexes(rect);
66
- }
67
- return [];
46
+ if (selection instanceof CellSelection && selection.isRowSelection()) {
47
+ const rect = getSelectionRect(selection);
48
+ if (!rect) {
49
+ return [];
50
+ }
51
+ return getSelectedRowIndexes(rect);
52
+ }
53
+ return [];
68
54
  };
69
55
 
70
56
  const DragControlsComponent = ({
71
- tableRef,
72
- tableNode,
73
- tableWidth,
74
- hoveredCell,
75
- tableActive,
76
- editorView,
77
- isInDanger,
78
- isResizing,
79
- isTableHovered,
80
- hoverRows,
81
- selectRow,
82
- selectRows,
83
- updateCellHoverLocation,
57
+ tableRef,
58
+ tableNode,
59
+ tableWidth,
60
+ hoveredCell,
61
+ tableActive,
62
+ editorView,
63
+ isInDanger,
64
+ isResizing,
65
+ isTableHovered,
66
+ hoverRows,
67
+ selectRow,
68
+ selectRows,
69
+ updateCellHoverLocation,
84
70
  }: DragControlsProps & WrappedComponentProps) => {
85
- const [isDragging, setIsDragging] = useState(false);
86
-
87
- const rowHeights = getRowHeights(tableRef);
88
- const rowsParams = getRowsParams(rowHeights);
89
- const heights = rowHeights.map((height) => `${height - 1}px`).join(' ');
90
- const selectedRowIndexes = getSelectedRows(editorView.state.selection);
91
- const currentNodeLocalId = tableNode?.attrs?.localId ?? '';
92
-
93
- useEffect(() => {
94
- return monitorForElements({
95
- canMonitor({ source }) {
96
- const { type, localId, indexes } =
97
- source.data as Partial<DraggableSourceData>;
98
-
99
- if (!indexes || !localId || type !== 'table-row') {
100
- return false;
101
- }
102
-
103
- const { tableNode } = getTablePluginState(editorView.state);
104
- // If the draggable localId is the same as the current selected table localId then we will allow the monitor
105
- // watch for changes
106
- return localId === tableNode?.attrs.localId;
107
- },
108
- onDragStart() {
109
- setIsDragging(true);
110
- },
111
- onDrop() {
112
- setIsDragging(false);
113
- },
114
- });
115
- }, [editorView]);
116
-
117
- const toggleDragMenuHandler = useCallback(
118
- (
119
- trigger: TriggerType,
120
- event: MouseEvent<HTMLButtonElement, globalThis.MouseEvent> | undefined,
121
- ) => {
122
- if (event?.shiftKey) {
123
- return;
124
- }
125
- toggleDragMenu(
126
- undefined,
127
- 'row',
128
- hoveredCell?.rowIndex,
129
- trigger,
130
- )(editorView.state, editorView.dispatch);
131
- },
132
- [editorView, hoveredCell?.rowIndex],
133
- );
134
-
135
- const rowIndex = hoveredCell?.rowIndex;
136
-
137
- const handleMouseOut = useCallback(() => {
138
- if (tableActive) {
139
- const { state, dispatch } = editorView;
140
- clearHoverSelection()(state, dispatch);
141
- }
142
- }, [editorView, tableActive]);
143
-
144
- const handleMouseMove = useCallback(
145
- (e: MouseEvent) => {
146
- if (getBooleanFF('platform.editor.explicit-html-element-check')) {
147
- const target =
148
- e.nativeEvent.target instanceof Element ? e.nativeEvent.target : null;
149
- const isParentDragControls = target?.closest(
150
- `.${ClassName.DRAG_ROW_CONTROLS}`,
151
- );
152
- const rowIndex = target?.getAttribute('data-start-index');
153
-
154
- // avoid updating if event target is not related
155
- if (!isParentDragControls || !rowIndex) {
156
- return;
157
- }
158
-
159
- updateCellHoverLocation(Number(rowIndex));
160
- } else {
161
- const isParentDragControls = (e.nativeEvent.target as Element).closest(
162
- `.${ClassName.DRAG_ROW_CONTROLS}`,
163
- );
164
- const rowIndex = (e.nativeEvent.target as Element).getAttribute(
165
- 'data-start-index',
166
- );
167
-
168
- // avoid updating if event target is not related
169
- if (!isParentDragControls || !rowIndex) {
170
- return;
171
- }
172
-
173
- updateCellHoverLocation(Number(rowIndex));
174
- }
175
- },
176
- [updateCellHoverLocation],
177
- );
178
-
179
- const rowIndexes = useMemo(() => {
180
- return [rowIndex!];
181
- }, [rowIndex]);
182
-
183
- const handleMouseOver = useCallback(() => {
184
- hoverRows([rowIndex!]);
185
- }, [hoverRows, rowIndex]);
186
-
187
- const handleClick = useCallback(
188
- (e: MouseEvent) => {
189
- const isClickOutsideSelectedRows =
190
- selectedRowIndexes.length >= 1 &&
191
- !selectedRowIndexes.includes(rowIndex!);
192
- if (
193
- !selectedRowIndexes ||
194
- selectedRowIndexes.length === 0 ||
195
- isClickOutsideSelectedRows
196
- ) {
197
- selectRow(rowIndex!, e.shiftKey);
198
- }
199
-
200
- if (
201
- selectedRowIndexes.length > 1 &&
202
- selectedRowIndexes.includes(rowIndex!) &&
203
- !e.shiftKey
204
- ) {
205
- selectRows(selectedRowIndexes);
206
- }
207
- },
208
- [rowIndex, selectRow, selectRows, selectedRowIndexes],
209
- );
210
-
211
- const generateHandleByType = (
212
- type: HandleTypes,
213
- appearance: DragHandleAppearance,
214
- gridRow: string,
215
- indexes: number[],
216
- ) => {
217
- const isHover = type === 'hover';
218
-
219
- const previewHeight = rowHeights.reduce(
220
- (sum, v, i) => sum + v * (indexes.includes(i) ? 1 : 0),
221
- 0,
222
- );
223
-
224
- return (
225
- <div
226
- key={type}
227
- style={{
228
- gridRow,
229
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
230
- gridColumn: '2',
231
- // DragHandle uses `transform: rotate(90)`, which doesn't affect its parent (this div) causing the width of this element to be the true height of the drag handle
232
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
233
- display: 'flex',
234
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
235
- width: '9px',
236
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
237
- height: '100%',
238
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
239
- position: 'relative',
240
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview, @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
241
- right: '-0.5px',
242
- }}
243
- data-testid={`table-floating-row-${
244
- isHover ? rowIndex : selectedRowIndexes[0]
245
- }-drag-handle`}
246
- >
247
- <DragHandle
248
- isDragMenuTarget={!isHover}
249
- direction="row"
250
- tableLocalId={currentNodeLocalId}
251
- indexes={indexes}
252
- forceDefaultHandle={!isHover}
253
- previewWidth={tableWidth}
254
- previewHeight={previewHeight}
255
- appearance={appearance}
256
- hoveredCell={hoveredCell}
257
- onClick={handleClick}
258
- onMouseOver={handleMouseOver}
259
- onMouseOut={handleMouseOut}
260
- toggleDragMenu={toggleDragMenuHandler}
261
- editorView={editorView}
262
- />
263
- </div>
264
- );
265
- };
266
-
267
- const rowHandles = () => {
268
- const handles = [];
269
- const isRowSelected = selectedRowIndexes.length > 0;
270
- const isEntireTableSelected = rowHeights.length > selectedRowIndexes.length;
271
-
272
- if (!tableActive) {
273
- return null;
274
- }
275
-
276
- // placeholder / selected need to always render at least one handle
277
- // so it can be focused via keyboard shortcuts
278
- handles.push(
279
- generateHandleByType(
280
- 'selected',
281
- isRowSelected && isEntireTableSelected
282
- ? isInDanger
283
- ? 'danger'
284
- : 'selected'
285
- : 'placeholder',
286
- `${selectedRowIndexes[0] + 1} / span ${selectedRowIndexes.length}`,
287
- selectedRowIndexes,
288
- ),
289
- );
290
-
291
- if (
292
- hoveredCell &&
293
- isTableHovered &&
294
- rowIndex !== undefined &&
295
- !selectedRowIndexes.includes(rowIndex) &&
296
- rowIndex < rowHeights.length
297
- ) {
298
- handles.push(
299
- generateHandleByType(
300
- 'hover',
301
- 'default',
302
- `${rowIndex + 1} / span 1`,
303
- rowIndexes,
304
- ),
305
- );
306
- }
307
-
308
- return handles;
309
- };
310
-
311
- if (isResizing) {
312
- return null;
313
- }
314
-
315
- return (
316
- <div
317
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
318
- className={ClassName.DRAG_ROW_CONTROLS}
319
- style={{
320
- gridTemplateRows: heights,
321
- gridTemplateColumns: isDragging
322
- ? `${dropTargetExtendedWidth}px 14px ${tableWidth}px`
323
- : '0px 14px 0px',
324
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
325
- left: isDragging
326
- ? `-${dropTargetExtendedWidth + 2}px`
327
- : token('space.negative.025', '-2px'),
328
- }}
329
- onMouseMove={handleMouseMove}
330
- contentEditable={false}
331
- >
332
- {rowsParams.map(({ startIndex, endIndex }, index) => (
333
- <Fragment key={index}>
334
- <div
335
- style={{
336
- gridRow: `${index + 1} / span 1`,
337
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
338
- gridColumn: '2',
339
- }}
340
- data-start-index={startIndex}
341
- data-end-index={endIndex}
342
- // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
343
- className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT_WRAPPER}
344
- contentEditable={false}
345
- key={`insert-dot-${index}`}
346
- >
347
- {/* eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766 */}
348
- <div className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT} />
349
- </div>
350
- {isDragging && (
351
- <RowDropTarget
352
- key={`drop-target-${index}`}
353
- index={index}
354
- localId={currentNodeLocalId}
355
- style={{
356
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
357
- gridColumn: '1 / span 3',
358
- gridRow: `${index + 1} / span 1`,
359
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
360
- height: '100%',
361
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
362
- pointerEvents: 'auto',
363
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
364
- position: 'relative',
365
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
366
- left: token('space.negative.100', '-8px'),
367
- }}
368
- />
369
- )}
370
- </Fragment>
371
- ))}
372
- {rowHandles()}
373
- </div>
374
- );
71
+ const [isDragging, setIsDragging] = useState(false);
72
+
73
+ const rowHeights = getRowHeights(tableRef);
74
+ const rowsParams = getRowsParams(rowHeights);
75
+ const heights = rowHeights.map((height) => `${height - 1}px`).join(' ');
76
+ const selectedRowIndexes = getSelectedRows(editorView.state.selection);
77
+ const currentNodeLocalId = tableNode?.attrs?.localId ?? '';
78
+
79
+ useEffect(() => {
80
+ return monitorForElements({
81
+ canMonitor({ source }) {
82
+ const { type, localId, indexes } = source.data as Partial<DraggableSourceData>;
83
+
84
+ if (!indexes || !localId || type !== 'table-row') {
85
+ return false;
86
+ }
87
+
88
+ const { tableNode } = getTablePluginState(editorView.state);
89
+ // If the draggable localId is the same as the current selected table localId then we will allow the monitor
90
+ // watch for changes
91
+ return localId === tableNode?.attrs.localId;
92
+ },
93
+ onDragStart() {
94
+ setIsDragging(true);
95
+ },
96
+ onDrop() {
97
+ setIsDragging(false);
98
+ },
99
+ });
100
+ }, [editorView]);
101
+
102
+ const toggleDragMenuHandler = useCallback(
103
+ (
104
+ trigger: TriggerType,
105
+ event: MouseEvent<HTMLButtonElement, globalThis.MouseEvent> | undefined,
106
+ ) => {
107
+ if (event?.shiftKey) {
108
+ return;
109
+ }
110
+ toggleDragMenu(
111
+ undefined,
112
+ 'row',
113
+ hoveredCell?.rowIndex,
114
+ trigger,
115
+ )(editorView.state, editorView.dispatch);
116
+ },
117
+ [editorView, hoveredCell?.rowIndex],
118
+ );
119
+
120
+ const rowIndex = hoveredCell?.rowIndex;
121
+
122
+ const handleMouseOut = useCallback(() => {
123
+ if (tableActive) {
124
+ const { state, dispatch } = editorView;
125
+ clearHoverSelection()(state, dispatch);
126
+ }
127
+ }, [editorView, tableActive]);
128
+
129
+ const handleMouseMove = useCallback(
130
+ (e: MouseEvent) => {
131
+ if (getBooleanFF('platform.editor.explicit-html-element-check')) {
132
+ const target = e.nativeEvent.target instanceof Element ? e.nativeEvent.target : null;
133
+ const isParentDragControls = target?.closest(`.${ClassName.DRAG_ROW_CONTROLS}`);
134
+ const rowIndex = target?.getAttribute('data-start-index');
135
+
136
+ // avoid updating if event target is not related
137
+ if (!isParentDragControls || !rowIndex) {
138
+ return;
139
+ }
140
+
141
+ updateCellHoverLocation(Number(rowIndex));
142
+ } else {
143
+ const isParentDragControls = (e.nativeEvent.target as Element).closest(
144
+ `.${ClassName.DRAG_ROW_CONTROLS}`,
145
+ );
146
+ const rowIndex = (e.nativeEvent.target as Element).getAttribute('data-start-index');
147
+
148
+ // avoid updating if event target is not related
149
+ if (!isParentDragControls || !rowIndex) {
150
+ return;
151
+ }
152
+
153
+ updateCellHoverLocation(Number(rowIndex));
154
+ }
155
+ },
156
+ [updateCellHoverLocation],
157
+ );
158
+
159
+ const rowIndexes = useMemo(() => {
160
+ return [rowIndex!];
161
+ }, [rowIndex]);
162
+
163
+ const handleMouseOver = useCallback(() => {
164
+ hoverRows([rowIndex!]);
165
+ }, [hoverRows, rowIndex]);
166
+
167
+ const handleClick = useCallback(
168
+ (e: MouseEvent) => {
169
+ const isClickOutsideSelectedRows =
170
+ selectedRowIndexes.length >= 1 && !selectedRowIndexes.includes(rowIndex!);
171
+ if (!selectedRowIndexes || selectedRowIndexes.length === 0 || isClickOutsideSelectedRows) {
172
+ selectRow(rowIndex!, e.shiftKey);
173
+ }
174
+
175
+ if (selectedRowIndexes.length > 1 && selectedRowIndexes.includes(rowIndex!) && !e.shiftKey) {
176
+ selectRows(selectedRowIndexes);
177
+ }
178
+ },
179
+ [rowIndex, selectRow, selectRows, selectedRowIndexes],
180
+ );
181
+
182
+ const generateHandleByType = (
183
+ type: HandleTypes,
184
+ appearance: DragHandleAppearance,
185
+ gridRow: string,
186
+ indexes: number[],
187
+ ) => {
188
+ const isHover = type === 'hover';
189
+
190
+ const previewHeight = rowHeights.reduce(
191
+ (sum, v, i) => sum + v * (indexes.includes(i) ? 1 : 0),
192
+ 0,
193
+ );
194
+
195
+ return (
196
+ <div
197
+ key={type}
198
+ style={{
199
+ gridRow,
200
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
201
+ gridColumn: '2',
202
+ // DragHandle uses `transform: rotate(90)`, which doesn't affect its parent (this div) causing the width of this element to be the true height of the drag handle
203
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
204
+ display: 'flex',
205
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
206
+ width: '9px',
207
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
208
+ height: '100%',
209
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
210
+ position: 'relative',
211
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview, @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
212
+ right: '-0.5px',
213
+ }}
214
+ data-testid={`table-floating-row-${isHover ? rowIndex : selectedRowIndexes[0]}-drag-handle`}
215
+ >
216
+ <DragHandle
217
+ isDragMenuTarget={!isHover}
218
+ direction="row"
219
+ tableLocalId={currentNodeLocalId}
220
+ indexes={indexes}
221
+ forceDefaultHandle={!isHover}
222
+ previewWidth={tableWidth}
223
+ previewHeight={previewHeight}
224
+ appearance={appearance}
225
+ hoveredCell={hoveredCell}
226
+ onClick={handleClick}
227
+ onMouseOver={handleMouseOver}
228
+ onMouseOut={handleMouseOut}
229
+ toggleDragMenu={toggleDragMenuHandler}
230
+ editorView={editorView}
231
+ />
232
+ </div>
233
+ );
234
+ };
235
+
236
+ const rowHandles = () => {
237
+ const handles = [];
238
+ const isRowSelected = selectedRowIndexes.length > 0;
239
+ const isEntireTableSelected = rowHeights.length > selectedRowIndexes.length;
240
+
241
+ if (!tableActive) {
242
+ return null;
243
+ }
244
+
245
+ // placeholder / selected need to always render at least one handle
246
+ // so it can be focused via keyboard shortcuts
247
+ handles.push(
248
+ generateHandleByType(
249
+ 'selected',
250
+ isRowSelected && isEntireTableSelected
251
+ ? isInDanger
252
+ ? 'danger'
253
+ : 'selected'
254
+ : 'placeholder',
255
+ `${selectedRowIndexes[0] + 1} / span ${selectedRowIndexes.length}`,
256
+ selectedRowIndexes,
257
+ ),
258
+ );
259
+
260
+ if (
261
+ hoveredCell &&
262
+ isTableHovered &&
263
+ rowIndex !== undefined &&
264
+ !selectedRowIndexes.includes(rowIndex) &&
265
+ rowIndex < rowHeights.length
266
+ ) {
267
+ handles.push(
268
+ generateHandleByType('hover', 'default', `${rowIndex + 1} / span 1`, rowIndexes),
269
+ );
270
+ }
271
+
272
+ return handles;
273
+ };
274
+
275
+ if (isResizing) {
276
+ return null;
277
+ }
278
+
279
+ return (
280
+ <div
281
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
282
+ className={ClassName.DRAG_ROW_CONTROLS}
283
+ style={{
284
+ gridTemplateRows: heights,
285
+ gridTemplateColumns: isDragging
286
+ ? `${dropTargetExtendedWidth}px 14px ${tableWidth}px`
287
+ : '0px 14px 0px',
288
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
289
+ left: isDragging
290
+ ? `-${dropTargetExtendedWidth + 2}px`
291
+ : token('space.negative.025', '-2px'),
292
+ }}
293
+ onMouseMove={handleMouseMove}
294
+ contentEditable={false}
295
+ >
296
+ {rowsParams.map(({ startIndex, endIndex }, index) => (
297
+ <Fragment key={index}>
298
+ <div
299
+ style={{
300
+ gridRow: `${index + 1} / span 1`,
301
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
302
+ gridColumn: '2',
303
+ }}
304
+ data-start-index={startIndex}
305
+ data-end-index={endIndex}
306
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766
307
+ className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT_WRAPPER}
308
+ contentEditable={false}
309
+ key={`insert-dot-${index}`}
310
+ >
311
+ {/* eslint-disable-next-line @atlaskit/ui-styling-standard/no-classname-prop -- Ignored via go/DSP-18766 */}
312
+ <div className={ClassName.DRAG_ROW_FLOATING_INSERT_DOT} />
313
+ </div>
314
+ {isDragging && (
315
+ <RowDropTarget
316
+ key={`drop-target-${index}`}
317
+ index={index}
318
+ localId={currentNodeLocalId}
319
+ style={{
320
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
321
+ gridColumn: '1 / span 3',
322
+ gridRow: `${index + 1} / span 1`,
323
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
324
+ height: '100%',
325
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
326
+ pointerEvents: 'auto',
327
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
328
+ position: 'relative',
329
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
330
+ left: token('space.negative.100', '-8px'),
331
+ }}
332
+ />
333
+ )}
334
+ </Fragment>
335
+ ))}
336
+ {rowHandles()}
337
+ </div>
338
+ );
375
339
  };
376
340
 
377
341
  export const DragControls = injectIntl(DragControlsComponent);