@atlaskit/editor-plugin-table 7.16.11 → 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 (242) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +8 -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 +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 +13 -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 +802 -816
  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 +13 -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 +2 -2
  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 +880 -912
  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
@@ -12,25 +12,19 @@ import type { Selection } from '@atlaskit/editor-prosemirror/state';
12
12
  import type { EditorView } from '@atlaskit/editor-prosemirror/view';
13
13
  import { akEditorTableNumberColumnWidth } from '@atlaskit/editor-shared-styles';
14
14
  import { CellSelection } from '@atlaskit/editor-tables/cell-selection';
15
- import {
16
- getSelectionRect,
17
- isTableSelected,
18
- } from '@atlaskit/editor-tables/utils';
15
+ import { getSelectionRect, isTableSelected } from '@atlaskit/editor-tables/utils';
19
16
 
20
17
  import { clearHoverSelection, hoverColumns, hoverRows } from '../../commands';
21
- import {
22
- deleteColumnsWithAnalytics,
23
- deleteRowsWithAnalytics,
24
- } from '../../commands-with-analytics';
18
+ import { deleteColumnsWithAnalytics, deleteRowsWithAnalytics } from '../../commands-with-analytics';
25
19
  import { getPluginState as getTablePluginState } from '../../pm-plugins/plugin-factory';
26
20
  import type { RowStickyState } from '../../pm-plugins/sticky-headers';
27
21
  import type { TableDirection } from '../../types';
28
22
  import { TableCssClassName as ClassName } from '../../types';
29
23
  import {
30
- getColumnDeleteButtonParams,
31
- getColumnsWidths,
32
- getRowDeleteButtonParams,
33
- getRowHeights,
24
+ getColumnDeleteButtonParams,
25
+ getColumnsWidths,
26
+ getRowDeleteButtonParams,
27
+ getRowHeights,
34
28
  } from '../../utils';
35
29
  import { stickyRowZIndex } from '../consts';
36
30
 
@@ -39,352 +33,327 @@ import getPopupOptions from './getPopUpOptions';
39
33
  import type { CellSelectionType } from './types';
40
34
 
41
35
  export interface Props {
42
- editorView: EditorView;
43
- selection: Selection;
44
- tableRef?: HTMLTableElement;
45
- mountPoint?: HTMLElement;
46
- boundariesElement?: HTMLElement;
47
- scrollableElement?: HTMLElement;
48
- stickyHeaders?: RowStickyState;
49
- isNumberColumnEnabled?: boolean;
50
- editorAnalyticsAPI?: EditorAnalyticsAPI;
36
+ editorView: EditorView;
37
+ selection: Selection;
38
+ tableRef?: HTMLTableElement;
39
+ mountPoint?: HTMLElement;
40
+ boundariesElement?: HTMLElement;
41
+ scrollableElement?: HTMLElement;
42
+ stickyHeaders?: RowStickyState;
43
+ isNumberColumnEnabled?: boolean;
44
+ editorAnalyticsAPI?: EditorAnalyticsAPI;
51
45
  }
52
46
 
53
47
  export interface State {
54
- selectionType?: CellSelectionType;
55
- left: number;
56
- top: number;
57
- indexes: number[];
58
- position?: string;
59
- scrollLeft: number;
48
+ selectionType?: CellSelectionType;
49
+ left: number;
50
+ top: number;
51
+ indexes: number[];
52
+ position?: string;
53
+ scrollLeft: number;
60
54
  }
61
55
 
62
- export function getSelectionType(
63
- selection: Selection,
64
- ): TableDirection | undefined {
65
- if (!isTableSelected(selection) && selection instanceof CellSelection) {
66
- if (selection.isRowSelection()) {
67
- return 'row';
68
- }
69
- if (selection.isColSelection()) {
70
- return 'column';
71
- }
72
- }
73
-
74
- return;
56
+ export function getSelectionType(selection: Selection): TableDirection | undefined {
57
+ if (!isTableSelected(selection) && selection instanceof CellSelection) {
58
+ if (selection.isRowSelection()) {
59
+ return 'row';
60
+ }
61
+ if (selection.isColSelection()) {
62
+ return 'column';
63
+ }
64
+ }
65
+
66
+ return;
75
67
  }
76
68
 
77
69
  class FloatingDeleteButton extends Component<Props, State> {
78
- static displayName = 'FloatingDeleteButton';
79
-
80
- wrapper: HTMLElement | null = null;
81
-
82
- constructor(props: Props) {
83
- super(props);
84
-
85
- this.state = {
86
- selectionType: undefined,
87
- top: 0,
88
- left: 0,
89
- indexes: [],
90
- scrollLeft: 0,
91
- };
92
- }
93
-
94
- shouldComponentUpdate(_: Props, nextState: State) {
95
- return (
96
- this.state.selectionType !== nextState.selectionType ||
97
- this.state.left !== nextState.left ||
98
- this.state.top !== nextState.top ||
99
- this.state.scrollLeft !== nextState.scrollLeft
100
- );
101
- }
102
-
103
- componentDidMount() {
104
- this.updateWrapper();
105
- }
106
-
107
- componentDidUpdate() {
108
- this.updateWrapper();
109
- }
110
-
111
- updateWrapper = () => {
112
- const tableWrapper = closestElement(
113
- this.props.tableRef,
114
- `.${ClassName.TABLE_NODE_WRAPPER}`,
115
- );
116
- if (tableWrapper) {
117
- this.wrapper = tableWrapper;
118
- this.wrapper.addEventListener('scroll', this.onWrapperScrolled);
119
-
120
- this.setState({
121
- scrollLeft: tableWrapper.scrollLeft,
122
- });
123
- } else {
124
- if (this.wrapper) {
125
- // unsubscribe if we previously had one and it just went away
126
- this.wrapper.removeEventListener('scroll', this.onWrapperScrolled);
127
-
128
- // and reset scroll position
129
- this.setState({
130
- scrollLeft: 0,
131
- });
132
- }
133
-
134
- this.wrapper = null;
135
- }
136
- };
137
-
138
- componentWillUnmount() {
139
- if (this.wrapper) {
140
- this.wrapper.removeEventListener('scroll', this.onWrapperScrolled);
141
- }
142
- }
143
-
144
- onWrapperScrolled = (e: Event) => {
145
- const wrapper = e.target as HTMLElement;
146
- this.setState({
147
- scrollLeft: wrapper.scrollLeft,
148
- });
149
- };
150
-
151
- /**
152
- * We derivate the button state from the properties passed.
153
- * We do this in here because we need this information in different places
154
- * and this prevent to do multiple width calculations in the same component.
155
- */
156
- static getDerivedStateFromProps(
157
- nextProps: Readonly<Props>,
158
- prevState: State,
159
- ): Partial<State> | null {
160
- const selectionType = getSelectionType(nextProps.selection);
161
-
162
- const inStickyMode =
163
- nextProps.stickyHeaders && nextProps.stickyHeaders.sticky;
164
-
165
- const rect = getSelectionRect(nextProps.selection);
166
-
167
- // only tie row delete to sticky header if it's the only thing
168
- // in the selection, otherwise the row delete will hover around
169
- // the rest of the selection
170
- const firstRowInSelection = rect && rect.top === 0 && rect.bottom === 1;
171
- const shouldStickyButton = inStickyMode && firstRowInSelection;
172
- const stickyTop = nextProps.stickyHeaders
173
- ? nextProps.stickyHeaders.top + nextProps.stickyHeaders.padding
174
- : 0;
175
-
176
- if (selectionType) {
177
- switch (selectionType) {
178
- case 'column': {
179
- // Calculate the button position and indexes for columns
180
- const columnsWidths = getColumnsWidths(nextProps.editorView);
181
- const deleteBtnParams = getColumnDeleteButtonParams(
182
- columnsWidths,
183
- nextProps.editorView.state.selection,
184
- );
185
- if (deleteBtnParams) {
186
- return {
187
- ...deleteBtnParams,
188
- top: inStickyMode ? nextProps.stickyHeaders!.top : 0,
189
- position: inStickyMode ? 'sticky' : undefined,
190
- selectionType,
191
- };
192
- }
193
- return null;
194
- }
195
- case 'row': {
196
- // Calculate the button position and indexes for rows
197
- if (nextProps.tableRef) {
198
- const rowHeights = getRowHeights(nextProps.tableRef);
199
- const offsetTop = inStickyMode ? -rowHeights[0] : 0;
200
-
201
- const deleteBtnParams = getRowDeleteButtonParams(
202
- rowHeights,
203
- nextProps.editorView.state.selection,
204
- shouldStickyButton ? stickyTop : offsetTop,
205
- );
206
-
207
- if (deleteBtnParams) {
208
- return {
209
- ...deleteBtnParams,
210
- position: shouldStickyButton ? 'sticky' : undefined,
211
- left: 0,
212
- selectionType: selectionType,
213
- };
214
- }
215
- }
216
-
217
- return null;
218
- }
219
- }
220
- }
221
-
222
- // Clean state if no type
223
- if (prevState.selectionType !== selectionType) {
224
- return {
225
- selectionType: undefined,
226
- top: 0,
227
- left: 0,
228
- indexes: [],
229
- };
230
- }
231
-
232
- // Do nothing if doesn't change anything
233
- return null;
234
- }
235
-
236
- private handleMouseEnter = () => {
237
- const { state, dispatch } = this.props.editorView;
238
- switch (this.state.selectionType) {
239
- case 'row': {
240
- return hoverRows(this.state.indexes!, true)(
241
- state,
242
- dispatch,
243
- this.props.editorView,
244
- );
245
- }
246
- case 'column': {
247
- return hoverColumns(this.state.indexes!, true)(
248
- state,
249
- dispatch,
250
- this.props.editorView,
251
- );
252
- }
253
- }
254
- return false;
255
- };
256
-
257
- private handleMouseLeave = () => {
258
- const { state, dispatch } = this.props.editorView;
259
- return clearHoverSelection()(state, dispatch);
260
- };
261
-
262
- /**
263
- *
264
- *
265
- * @private
266
- * @memberof FloatingDeleteButton
267
- */
268
- private handleClick = (event: SyntheticEvent) => {
269
- event.preventDefault();
270
- const { editorAnalyticsAPI } = this.props;
271
- let { state, dispatch } = this.props.editorView;
272
- const {
273
- pluginConfig: { isHeaderRowRequired },
274
- } = getTablePluginState(state);
275
-
276
- const rect = getSelectionRect(state.selection);
277
- if (rect) {
278
- switch (this.state.selectionType) {
279
- case 'column': {
280
- deleteColumnsWithAnalytics(editorAnalyticsAPI)(
281
- INPUT_METHOD.BUTTON,
282
- rect,
283
- )(state, dispatch, this.props.editorView);
284
- return;
285
- }
286
- case 'row': {
287
- deleteRowsWithAnalytics(editorAnalyticsAPI)(
288
- INPUT_METHOD.BUTTON,
289
- rect,
290
- !!isHeaderRowRequired,
291
- )(state, dispatch);
292
- return;
293
- }
294
- }
295
- }
296
- ({ state, dispatch } = this.props.editorView);
297
- clearHoverSelection()(state, dispatch);
298
- };
299
-
300
- render() {
301
- const { mountPoint, boundariesElement, tableRef } = this.props;
302
- const { selectionType } = this.state;
303
-
304
- if (!selectionType || !tableRef) {
305
- return null;
306
- }
307
-
308
- const tableContainerWrapper = closestElement(
309
- tableRef,
310
- `.${ClassName.TABLE_CONTAINER}`,
311
- );
312
-
313
- const button = (
314
- <DeleteButton
315
- removeLabel={
316
- selectionType === 'column'
317
- ? messages.removeColumns
318
- : messages.removeRows
319
- }
320
- onClick={this.handleClick}
321
- onMouseEnter={this.handleMouseEnter}
322
- onMouseLeave={this.handleMouseLeave}
323
- />
324
- );
325
-
326
- const popupOpts = getPopupOptions({
327
- left: this.state.left,
328
- top: this.state.top,
329
- selectionType: this.state.selectionType,
330
- tableWrapper: this.wrapper,
331
- });
332
-
333
- const mountTo = tableContainerWrapper || mountPoint;
334
- if (this.state.position === 'sticky' && mountTo) {
335
- const headerRow = tableRef.querySelector('tr.sticky');
336
- if (headerRow) {
337
- const rect = headerRow!.getBoundingClientRect();
338
-
339
- const calculatePosition =
340
- popupOpts.onPositionCalculated || ((pos) => pos);
341
- const pos = calculatePosition({
342
- left: this.state.left,
343
- top: this.state.top,
344
- });
345
-
346
- return createPortal(
347
- <div
348
- style={{
349
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
350
- position: 'fixed',
351
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
352
- top: pos.top,
353
- // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
354
- zIndex: stickyRowZIndex,
355
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
356
- left:
357
- rect.left +
358
- (pos.left || 0) -
359
- (this.state.selectionType === 'column'
360
- ? this.state.scrollLeft
361
- : 0) -
362
- (this.props.isNumberColumnEnabled
363
- ? akEditorTableNumberColumnWidth
364
- : 0),
365
- }}
366
- >
367
- {button}
368
- </div>,
369
- mountTo,
370
- );
371
- }
372
- }
373
-
374
- return (
375
- <Popup
376
- target={tableRef}
377
- mountTo={mountTo}
378
- boundariesElement={tableContainerWrapper || boundariesElement}
379
- scrollableElement={this.wrapper || undefined}
380
- forcePlacement={true}
381
- allowOutOfBounds
382
- {...popupOpts}
383
- >
384
- {button}
385
- </Popup>
386
- );
387
- }
70
+ static displayName = 'FloatingDeleteButton';
71
+
72
+ wrapper: HTMLElement | null = null;
73
+
74
+ constructor(props: Props) {
75
+ super(props);
76
+
77
+ this.state = {
78
+ selectionType: undefined,
79
+ top: 0,
80
+ left: 0,
81
+ indexes: [],
82
+ scrollLeft: 0,
83
+ };
84
+ }
85
+
86
+ shouldComponentUpdate(_: Props, nextState: State) {
87
+ return (
88
+ this.state.selectionType !== nextState.selectionType ||
89
+ this.state.left !== nextState.left ||
90
+ this.state.top !== nextState.top ||
91
+ this.state.scrollLeft !== nextState.scrollLeft
92
+ );
93
+ }
94
+
95
+ componentDidMount() {
96
+ this.updateWrapper();
97
+ }
98
+
99
+ componentDidUpdate() {
100
+ this.updateWrapper();
101
+ }
102
+
103
+ updateWrapper = () => {
104
+ const tableWrapper = closestElement(this.props.tableRef, `.${ClassName.TABLE_NODE_WRAPPER}`);
105
+ if (tableWrapper) {
106
+ this.wrapper = tableWrapper;
107
+ this.wrapper.addEventListener('scroll', this.onWrapperScrolled);
108
+
109
+ this.setState({
110
+ scrollLeft: tableWrapper.scrollLeft,
111
+ });
112
+ } else {
113
+ if (this.wrapper) {
114
+ // unsubscribe if we previously had one and it just went away
115
+ this.wrapper.removeEventListener('scroll', this.onWrapperScrolled);
116
+
117
+ // and reset scroll position
118
+ this.setState({
119
+ scrollLeft: 0,
120
+ });
121
+ }
122
+
123
+ this.wrapper = null;
124
+ }
125
+ };
126
+
127
+ componentWillUnmount() {
128
+ if (this.wrapper) {
129
+ this.wrapper.removeEventListener('scroll', this.onWrapperScrolled);
130
+ }
131
+ }
132
+
133
+ onWrapperScrolled = (e: Event) => {
134
+ const wrapper = e.target as HTMLElement;
135
+ this.setState({
136
+ scrollLeft: wrapper.scrollLeft,
137
+ });
138
+ };
139
+
140
+ /**
141
+ * We derivate the button state from the properties passed.
142
+ * We do this in here because we need this information in different places
143
+ * and this prevent to do multiple width calculations in the same component.
144
+ */
145
+ static getDerivedStateFromProps(
146
+ nextProps: Readonly<Props>,
147
+ prevState: State,
148
+ ): Partial<State> | null {
149
+ const selectionType = getSelectionType(nextProps.selection);
150
+
151
+ const inStickyMode = nextProps.stickyHeaders && nextProps.stickyHeaders.sticky;
152
+
153
+ const rect = getSelectionRect(nextProps.selection);
154
+
155
+ // only tie row delete to sticky header if it's the only thing
156
+ // in the selection, otherwise the row delete will hover around
157
+ // the rest of the selection
158
+ const firstRowInSelection = rect && rect.top === 0 && rect.bottom === 1;
159
+ const shouldStickyButton = inStickyMode && firstRowInSelection;
160
+ const stickyTop = nextProps.stickyHeaders
161
+ ? nextProps.stickyHeaders.top + nextProps.stickyHeaders.padding
162
+ : 0;
163
+
164
+ if (selectionType) {
165
+ switch (selectionType) {
166
+ case 'column': {
167
+ // Calculate the button position and indexes for columns
168
+ const columnsWidths = getColumnsWidths(nextProps.editorView);
169
+ const deleteBtnParams = getColumnDeleteButtonParams(
170
+ columnsWidths,
171
+ nextProps.editorView.state.selection,
172
+ );
173
+ if (deleteBtnParams) {
174
+ return {
175
+ ...deleteBtnParams,
176
+ top: inStickyMode ? nextProps.stickyHeaders!.top : 0,
177
+ position: inStickyMode ? 'sticky' : undefined,
178
+ selectionType,
179
+ };
180
+ }
181
+ return null;
182
+ }
183
+ case 'row': {
184
+ // Calculate the button position and indexes for rows
185
+ if (nextProps.tableRef) {
186
+ const rowHeights = getRowHeights(nextProps.tableRef);
187
+ const offsetTop = inStickyMode ? -rowHeights[0] : 0;
188
+
189
+ const deleteBtnParams = getRowDeleteButtonParams(
190
+ rowHeights,
191
+ nextProps.editorView.state.selection,
192
+ shouldStickyButton ? stickyTop : offsetTop,
193
+ );
194
+
195
+ if (deleteBtnParams) {
196
+ return {
197
+ ...deleteBtnParams,
198
+ position: shouldStickyButton ? 'sticky' : undefined,
199
+ left: 0,
200
+ selectionType: selectionType,
201
+ };
202
+ }
203
+ }
204
+
205
+ return null;
206
+ }
207
+ }
208
+ }
209
+
210
+ // Clean state if no type
211
+ if (prevState.selectionType !== selectionType) {
212
+ return {
213
+ selectionType: undefined,
214
+ top: 0,
215
+ left: 0,
216
+ indexes: [],
217
+ };
218
+ }
219
+
220
+ // Do nothing if doesn't change anything
221
+ return null;
222
+ }
223
+
224
+ private handleMouseEnter = () => {
225
+ const { state, dispatch } = this.props.editorView;
226
+ switch (this.state.selectionType) {
227
+ case 'row': {
228
+ return hoverRows(this.state.indexes!, true)(state, dispatch, this.props.editorView);
229
+ }
230
+ case 'column': {
231
+ return hoverColumns(this.state.indexes!, true)(state, dispatch, this.props.editorView);
232
+ }
233
+ }
234
+ return false;
235
+ };
236
+
237
+ private handleMouseLeave = () => {
238
+ const { state, dispatch } = this.props.editorView;
239
+ return clearHoverSelection()(state, dispatch);
240
+ };
241
+
242
+ /**
243
+ *
244
+ *
245
+ * @private
246
+ * @memberof FloatingDeleteButton
247
+ */
248
+ private handleClick = (event: SyntheticEvent) => {
249
+ event.preventDefault();
250
+ const { editorAnalyticsAPI } = this.props;
251
+ let { state, dispatch } = this.props.editorView;
252
+ const {
253
+ pluginConfig: { isHeaderRowRequired },
254
+ } = getTablePluginState(state);
255
+
256
+ const rect = getSelectionRect(state.selection);
257
+ if (rect) {
258
+ switch (this.state.selectionType) {
259
+ case 'column': {
260
+ deleteColumnsWithAnalytics(editorAnalyticsAPI)(INPUT_METHOD.BUTTON, rect)(
261
+ state,
262
+ dispatch,
263
+ this.props.editorView,
264
+ );
265
+ return;
266
+ }
267
+ case 'row': {
268
+ deleteRowsWithAnalytics(editorAnalyticsAPI)(
269
+ INPUT_METHOD.BUTTON,
270
+ rect,
271
+ !!isHeaderRowRequired,
272
+ )(state, dispatch);
273
+ return;
274
+ }
275
+ }
276
+ }
277
+ ({ state, dispatch } = this.props.editorView);
278
+ clearHoverSelection()(state, dispatch);
279
+ };
280
+
281
+ render() {
282
+ const { mountPoint, boundariesElement, tableRef } = this.props;
283
+ const { selectionType } = this.state;
284
+
285
+ if (!selectionType || !tableRef) {
286
+ return null;
287
+ }
288
+
289
+ const tableContainerWrapper = closestElement(tableRef, `.${ClassName.TABLE_CONTAINER}`);
290
+
291
+ const button = (
292
+ <DeleteButton
293
+ removeLabel={selectionType === 'column' ? messages.removeColumns : messages.removeRows}
294
+ onClick={this.handleClick}
295
+ onMouseEnter={this.handleMouseEnter}
296
+ onMouseLeave={this.handleMouseLeave}
297
+ />
298
+ );
299
+
300
+ const popupOpts = getPopupOptions({
301
+ left: this.state.left,
302
+ top: this.state.top,
303
+ selectionType: this.state.selectionType,
304
+ tableWrapper: this.wrapper,
305
+ });
306
+
307
+ const mountTo = tableContainerWrapper || mountPoint;
308
+ if (this.state.position === 'sticky' && mountTo) {
309
+ const headerRow = tableRef.querySelector('tr.sticky');
310
+ if (headerRow) {
311
+ const rect = headerRow!.getBoundingClientRect();
312
+
313
+ const calculatePosition = popupOpts.onPositionCalculated || ((pos) => pos);
314
+ const pos = calculatePosition({
315
+ left: this.state.left,
316
+ top: this.state.top,
317
+ });
318
+
319
+ return createPortal(
320
+ <div
321
+ style={{
322
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
323
+ position: 'fixed',
324
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
325
+ top: pos.top,
326
+ // eslint-disable-next-line @atlaskit/ui-styling-standard/enforce-style-prop -- Ignored via go/DSP-18766
327
+ zIndex: stickyRowZIndex,
328
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
329
+ left:
330
+ rect.left +
331
+ (pos.left || 0) -
332
+ (this.state.selectionType === 'column' ? this.state.scrollLeft : 0) -
333
+ (this.props.isNumberColumnEnabled ? akEditorTableNumberColumnWidth : 0),
334
+ }}
335
+ >
336
+ {button}
337
+ </div>,
338
+ mountTo,
339
+ );
340
+ }
341
+ }
342
+
343
+ return (
344
+ <Popup
345
+ target={tableRef}
346
+ mountTo={mountTo}
347
+ boundariesElement={tableContainerWrapper || boundariesElement}
348
+ scrollableElement={this.wrapper || undefined}
349
+ forcePlacement={true}
350
+ allowOutOfBounds
351
+ {...popupOpts}
352
+ >
353
+ {button}
354
+ </Popup>
355
+ );
356
+ }
388
357
  }
389
358
 
390
359
  export default FloatingDeleteButton;