@atlaskit/editor-plugin-table 7.5.4 → 7.5.6

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 (236) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/commands/column-resize.js +3 -3
  3. package/dist/cjs/commands/delete.js +2 -2
  4. package/dist/cjs/commands/insert.js +15 -15
  5. package/dist/cjs/commands-with-analytics.js +7 -7
  6. package/dist/cjs/event-handlers.js +27 -11
  7. package/dist/cjs/nodeviews/OverflowShadowsObserver.js +24 -15
  8. package/dist/cjs/nodeviews/TableCell.js +5 -30
  9. package/dist/cjs/nodeviews/TableComponent.js +120 -83
  10. package/dist/cjs/nodeviews/TableContainer.js +23 -21
  11. package/dist/cjs/nodeviews/TableResizer.js +13 -13
  12. package/dist/cjs/nodeviews/table.js +9 -9
  13. package/dist/cjs/plugin.js +60 -59
  14. package/dist/cjs/pm-plugins/drag-and-drop/plugin.js +13 -13
  15. package/dist/cjs/pm-plugins/keymap.js +6 -8
  16. package/dist/cjs/pm-plugins/main.js +7 -24
  17. package/dist/cjs/pm-plugins/sticky-headers/plugin.js +2 -3
  18. package/dist/cjs/pm-plugins/table-resizing/event-handlers.js +12 -12
  19. package/dist/cjs/pm-plugins/table-resizing/utils/colgroup.js +2 -2
  20. package/dist/cjs/pm-plugins/table-resizing/utils/consts.js +4 -2
  21. package/dist/cjs/pm-plugins/table-resizing/utils/index.js +2 -2
  22. package/dist/cjs/pm-plugins/table-resizing/utils/misc.js +3 -3
  23. package/dist/cjs/pm-plugins/table-resizing/utils/resize-column.js +3 -3
  24. package/dist/cjs/pm-plugins/table-resizing/utils/resize-state.js +11 -12
  25. package/dist/cjs/pm-plugins/table-resizing/utils/scale-table.js +13 -13
  26. package/dist/cjs/pm-plugins/table-width.js +6 -2
  27. package/dist/cjs/toolbar.js +21 -21
  28. package/dist/cjs/transforms/column-width.js +4 -4
  29. package/dist/cjs/transforms/delete-columns.js +2 -2
  30. package/dist/cjs/ui/FloatingContextualMenu/ContextualMenu.js +53 -55
  31. package/dist/cjs/ui/FloatingContextualMenu/index.js +2 -4
  32. package/dist/cjs/ui/FloatingDragMenu/DragMenu.js +2 -2
  33. package/dist/cjs/ui/FloatingDragMenu/index.js +6 -6
  34. package/dist/cjs/ui/FloatingInsertButton/index.js +6 -7
  35. package/dist/cjs/ui/TableFloatingColumnControls/index.js +8 -48
  36. package/dist/cjs/ui/TableFloatingControls/index.js +113 -223
  37. package/dist/cjs/utils/column-controls.js +5 -5
  38. package/dist/cjs/utils/create.js +2 -5
  39. package/dist/cjs/utils/dom.js +13 -15
  40. package/dist/cjs/utils/drag-menu.js +4 -4
  41. package/dist/es2019/commands/column-resize.js +3 -3
  42. package/dist/es2019/commands/delete.js +2 -2
  43. package/dist/es2019/commands/insert.js +12 -12
  44. package/dist/es2019/commands-with-analytics.js +6 -6
  45. package/dist/es2019/event-handlers.js +27 -11
  46. package/dist/es2019/nodeviews/OverflowShadowsObserver.js +24 -15
  47. package/dist/es2019/nodeviews/TableCell.js +1 -24
  48. package/dist/es2019/nodeviews/TableComponent.js +88 -63
  49. package/dist/es2019/nodeviews/TableContainer.js +20 -22
  50. package/dist/es2019/nodeviews/TableResizer.js +13 -13
  51. package/dist/es2019/nodeviews/table.js +9 -9
  52. package/dist/es2019/plugin.js +19 -20
  53. package/dist/es2019/pm-plugins/drag-and-drop/plugin.js +6 -6
  54. package/dist/es2019/pm-plugins/keymap.js +5 -8
  55. package/dist/es2019/pm-plugins/main.js +6 -23
  56. package/dist/es2019/pm-plugins/sticky-headers/plugin.js +1 -1
  57. package/dist/es2019/pm-plugins/table-resizing/event-handlers.js +5 -5
  58. package/dist/es2019/pm-plugins/table-resizing/utils/colgroup.js +2 -2
  59. package/dist/es2019/pm-plugins/table-resizing/utils/consts.js +3 -1
  60. package/dist/es2019/pm-plugins/table-resizing/utils/index.js +1 -1
  61. package/dist/es2019/pm-plugins/table-resizing/utils/misc.js +2 -2
  62. package/dist/es2019/pm-plugins/table-resizing/utils/resize-column.js +3 -2
  63. package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +12 -13
  64. package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +13 -13
  65. package/dist/es2019/pm-plugins/table-width.js +6 -2
  66. package/dist/es2019/toolbar.js +15 -15
  67. package/dist/es2019/transforms/column-width.js +5 -5
  68. package/dist/es2019/transforms/delete-columns.js +2 -2
  69. package/dist/es2019/ui/FloatingContextualMenu/ContextualMenu.js +9 -12
  70. package/dist/es2019/ui/FloatingContextualMenu/index.js +2 -4
  71. package/dist/es2019/ui/FloatingDragMenu/DragMenu.js +2 -2
  72. package/dist/es2019/ui/FloatingDragMenu/index.js +5 -5
  73. package/dist/es2019/ui/FloatingInsertButton/index.js +5 -6
  74. package/dist/es2019/ui/TableFloatingColumnControls/index.js +5 -27
  75. package/dist/es2019/ui/TableFloatingControls/index.js +119 -193
  76. package/dist/es2019/utils/column-controls.js +6 -6
  77. package/dist/es2019/utils/create.js +2 -5
  78. package/dist/es2019/utils/dom.js +13 -15
  79. package/dist/es2019/utils/drag-menu.js +4 -4
  80. package/dist/esm/commands/column-resize.js +3 -3
  81. package/dist/esm/commands/delete.js +2 -2
  82. package/dist/esm/commands/insert.js +15 -15
  83. package/dist/esm/commands-with-analytics.js +7 -7
  84. package/dist/esm/event-handlers.js +27 -11
  85. package/dist/esm/nodeviews/OverflowShadowsObserver.js +24 -15
  86. package/dist/esm/nodeviews/TableCell.js +5 -30
  87. package/dist/esm/nodeviews/TableComponent.js +119 -82
  88. package/dist/esm/nodeviews/TableContainer.js +24 -22
  89. package/dist/esm/nodeviews/TableResizer.js +13 -13
  90. package/dist/esm/nodeviews/table.js +9 -9
  91. package/dist/esm/plugin.js +60 -59
  92. package/dist/esm/pm-plugins/drag-and-drop/plugin.js +13 -13
  93. package/dist/esm/pm-plugins/keymap.js +6 -8
  94. package/dist/esm/pm-plugins/main.js +7 -24
  95. package/dist/esm/pm-plugins/sticky-headers/plugin.js +2 -3
  96. package/dist/esm/pm-plugins/table-resizing/event-handlers.js +12 -12
  97. package/dist/esm/pm-plugins/table-resizing/utils/colgroup.js +2 -2
  98. package/dist/esm/pm-plugins/table-resizing/utils/consts.js +3 -1
  99. package/dist/esm/pm-plugins/table-resizing/utils/index.js +1 -1
  100. package/dist/esm/pm-plugins/table-resizing/utils/misc.js +2 -2
  101. package/dist/esm/pm-plugins/table-resizing/utils/resize-column.js +4 -3
  102. package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +13 -14
  103. package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +13 -13
  104. package/dist/esm/pm-plugins/table-width.js +6 -2
  105. package/dist/esm/toolbar.js +21 -21
  106. package/dist/esm/transforms/column-width.js +5 -5
  107. package/dist/esm/transforms/delete-columns.js +2 -2
  108. package/dist/esm/ui/FloatingContextualMenu/ContextualMenu.js +53 -55
  109. package/dist/esm/ui/FloatingContextualMenu/index.js +2 -4
  110. package/dist/esm/ui/FloatingDragMenu/DragMenu.js +2 -2
  111. package/dist/esm/ui/FloatingDragMenu/index.js +6 -6
  112. package/dist/esm/ui/FloatingInsertButton/index.js +6 -7
  113. package/dist/esm/ui/TableFloatingColumnControls/index.js +8 -48
  114. package/dist/esm/ui/TableFloatingControls/index.js +113 -224
  115. package/dist/esm/utils/column-controls.js +6 -6
  116. package/dist/esm/utils/create.js +2 -5
  117. package/dist/esm/utils/dom.js +13 -15
  118. package/dist/esm/utils/drag-menu.js +4 -4
  119. package/dist/types/commands/column-resize.d.ts +1 -1
  120. package/dist/types/commands/delete.d.ts +1 -1
  121. package/dist/types/commands/insert.d.ts +7 -7
  122. package/dist/types/commands-with-analytics.d.ts +3 -3
  123. package/dist/types/event-handlers.d.ts +4 -5
  124. package/dist/types/nodeviews/OverflowShadowsObserver.d.ts +3 -1
  125. package/dist/types/nodeviews/TableCell.d.ts +1 -5
  126. package/dist/types/nodeviews/TableComponent.d.ts +6 -3
  127. package/dist/types/nodeviews/TableContainer.d.ts +6 -4
  128. package/dist/types/nodeviews/TableResizer.d.ts +2 -2
  129. package/dist/types/nodeviews/table.d.ts +1 -1
  130. package/dist/types/nodeviews/types.d.ts +1 -0
  131. package/dist/types/plugin.d.ts +1 -0
  132. package/dist/types/pm-plugins/drag-and-drop/plugin.d.ts +1 -2
  133. package/dist/types/pm-plugins/keymap.d.ts +2 -2
  134. package/dist/types/pm-plugins/main.d.ts +1 -1
  135. package/dist/types/pm-plugins/sticky-headers/plugin.d.ts +2 -3
  136. package/dist/types/pm-plugins/table-resizing/utils/colgroup.d.ts +1 -1
  137. package/dist/types/pm-plugins/table-resizing/utils/consts.d.ts +1 -0
  138. package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  139. package/dist/types/pm-plugins/table-resizing/utils/misc.d.ts +1 -1
  140. package/dist/types/pm-plugins/table-resizing/utils/resize-column.d.ts +2 -1
  141. package/dist/types/pm-plugins/table-resizing/utils/resize-state.d.ts +4 -4
  142. package/dist/types/pm-plugins/table-resizing/utils/scale-table.d.ts +4 -4
  143. package/dist/types/pm-plugins/table-width.d.ts +1 -2
  144. package/dist/types/toolbar.d.ts +2 -2
  145. package/dist/types/transforms/column-width.d.ts +1 -1
  146. package/dist/types/transforms/delete-columns.d.ts +1 -1
  147. package/dist/types/types.d.ts +1 -3
  148. package/dist/types/ui/FloatingContextualMenu/index.d.ts +1 -1
  149. package/dist/types/ui/FloatingDragMenu/DragMenu.d.ts +2 -2
  150. package/dist/types/ui/FloatingDragMenu/index.d.ts +2 -3
  151. package/dist/types/ui/FloatingInsertButton/index.d.ts +1 -2
  152. package/dist/types/ui/TableFloatingColumnControls/index.d.ts +2 -1
  153. package/dist/types/ui/TableFloatingControls/index.d.ts +5 -22
  154. package/dist/types/utils/create.d.ts +1 -2
  155. package/dist/types/utils/dom.d.ts +10 -2
  156. package/dist/types/utils/drag-menu.d.ts +1 -1
  157. package/dist/types-ts4.5/commands/column-resize.d.ts +1 -1
  158. package/dist/types-ts4.5/commands/delete.d.ts +1 -1
  159. package/dist/types-ts4.5/commands/insert.d.ts +7 -7
  160. package/dist/types-ts4.5/commands-with-analytics.d.ts +3 -3
  161. package/dist/types-ts4.5/event-handlers.d.ts +4 -5
  162. package/dist/types-ts4.5/nodeviews/OverflowShadowsObserver.d.ts +3 -1
  163. package/dist/types-ts4.5/nodeviews/TableCell.d.ts +1 -5
  164. package/dist/types-ts4.5/nodeviews/TableComponent.d.ts +6 -3
  165. package/dist/types-ts4.5/nodeviews/TableContainer.d.ts +6 -4
  166. package/dist/types-ts4.5/nodeviews/TableResizer.d.ts +2 -2
  167. package/dist/types-ts4.5/nodeviews/table.d.ts +1 -1
  168. package/dist/types-ts4.5/nodeviews/types.d.ts +1 -0
  169. package/dist/types-ts4.5/plugin.d.ts +1 -0
  170. package/dist/types-ts4.5/pm-plugins/drag-and-drop/plugin.d.ts +1 -2
  171. package/dist/types-ts4.5/pm-plugins/keymap.d.ts +2 -2
  172. package/dist/types-ts4.5/pm-plugins/main.d.ts +1 -1
  173. package/dist/types-ts4.5/pm-plugins/sticky-headers/plugin.d.ts +2 -3
  174. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/colgroup.d.ts +1 -1
  175. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/consts.d.ts +1 -0
  176. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  177. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/misc.d.ts +1 -1
  178. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/resize-column.d.ts +2 -1
  179. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/resize-state.d.ts +4 -4
  180. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/scale-table.d.ts +4 -4
  181. package/dist/types-ts4.5/pm-plugins/table-width.d.ts +1 -2
  182. package/dist/types-ts4.5/toolbar.d.ts +2 -2
  183. package/dist/types-ts4.5/transforms/column-width.d.ts +1 -1
  184. package/dist/types-ts4.5/transforms/delete-columns.d.ts +1 -1
  185. package/dist/types-ts4.5/types.d.ts +1 -3
  186. package/dist/types-ts4.5/ui/FloatingContextualMenu/index.d.ts +1 -1
  187. package/dist/types-ts4.5/ui/FloatingDragMenu/DragMenu.d.ts +2 -2
  188. package/dist/types-ts4.5/ui/FloatingDragMenu/index.d.ts +2 -3
  189. package/dist/types-ts4.5/ui/FloatingInsertButton/index.d.ts +1 -2
  190. package/dist/types-ts4.5/ui/TableFloatingColumnControls/index.d.ts +2 -1
  191. package/dist/types-ts4.5/ui/TableFloatingControls/index.d.ts +5 -22
  192. package/dist/types-ts4.5/utils/create.d.ts +1 -2
  193. package/dist/types-ts4.5/utils/dom.d.ts +10 -2
  194. package/dist/types-ts4.5/utils/drag-menu.d.ts +1 -1
  195. package/package.json +3 -4
  196. package/src/commands/column-resize.ts +4 -3
  197. package/src/commands/delete.ts +2 -2
  198. package/src/commands/insert.ts +15 -27
  199. package/src/commands-with-analytics.ts +6 -9
  200. package/src/event-handlers.ts +107 -105
  201. package/src/nodeviews/OverflowShadowsObserver.ts +32 -21
  202. package/src/nodeviews/TableCell.ts +0 -26
  203. package/src/nodeviews/TableComponent.tsx +107 -78
  204. package/src/nodeviews/TableContainer.tsx +26 -32
  205. package/src/nodeviews/TableResizer.tsx +15 -18
  206. package/src/nodeviews/table.tsx +6 -5
  207. package/src/nodeviews/types.ts +1 -0
  208. package/src/plugin.tsx +17 -32
  209. package/src/pm-plugins/drag-and-drop/plugin.ts +10 -15
  210. package/src/pm-plugins/keymap.ts +6 -13
  211. package/src/pm-plugins/main.ts +6 -25
  212. package/src/pm-plugins/sticky-headers/plugin.ts +2 -11
  213. package/src/pm-plugins/table-resizing/event-handlers.ts +6 -4
  214. package/src/pm-plugins/table-resizing/utils/colgroup.ts +2 -2
  215. package/src/pm-plugins/table-resizing/utils/consts.ts +2 -0
  216. package/src/pm-plugins/table-resizing/utils/index.ts +1 -1
  217. package/src/pm-plugins/table-resizing/utils/misc.ts +2 -2
  218. package/src/pm-plugins/table-resizing/utils/resize-column.ts +5 -2
  219. package/src/pm-plugins/table-resizing/utils/resize-state.ts +18 -13
  220. package/src/pm-plugins/table-resizing/utils/scale-table.ts +14 -14
  221. package/src/pm-plugins/table-width.ts +4 -6
  222. package/src/toolbar.tsx +16 -19
  223. package/src/transforms/column-width.ts +7 -6
  224. package/src/transforms/delete-columns.ts +2 -2
  225. package/src/types.ts +1 -4
  226. package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +11 -16
  227. package/src/ui/FloatingContextualMenu/index.tsx +0 -2
  228. package/src/ui/FloatingDragMenu/DragMenu.tsx +3 -3
  229. package/src/ui/FloatingDragMenu/index.tsx +4 -8
  230. package/src/ui/FloatingInsertButton/index.tsx +11 -22
  231. package/src/ui/TableFloatingColumnControls/index.tsx +5 -29
  232. package/src/ui/TableFloatingControls/index.tsx +155 -241
  233. package/src/utils/column-controls.ts +5 -6
  234. package/src/utils/create.ts +2 -5
  235. package/src/utils/dom.ts +12 -19
  236. package/src/utils/drag-menu.ts +7 -12
@@ -1,4 +1,4 @@
1
- import React, { Component } from 'react';
1
+ import React, { useCallback } from 'react';
2
2
 
3
3
  import type { TableColumnOrdering } from '@atlaskit/custom-steps';
4
4
  import { browser } from '@atlaskit/editor-common/utils';
@@ -10,13 +10,12 @@ import { hoverCell, hoverRows, selectRow, selectRows } from '../../commands';
10
10
  import type { RowStickyState } from '../../pm-plugins/sticky-headers';
11
11
  import { TableCssClassName as ClassName } from '../../types';
12
12
  import type { CellHoverMeta } from '../../types';
13
- import { isSelectionUpdated } from '../../utils';
14
13
 
15
14
  import { CornerControls, DragCornerControls } from './CornerControls';
16
15
  import NumberColumn from './NumberColumn';
17
16
  import { DragControls, RowControls } from './RowControls';
18
17
 
19
- export interface Props {
18
+ export interface TableFloatingControlsProps {
20
19
  editorView: EditorView;
21
20
  selection?: Selection;
22
21
  tableRef?: HTMLTableElement;
@@ -36,248 +35,163 @@ export interface Props {
36
35
  ordering?: TableColumnOrdering;
37
36
  stickyHeader?: RowStickyState;
38
37
  insertRowButtonIndex?: number;
38
+ tableWrapperWidth?: number;
39
39
  }
40
40
 
41
- interface State {
42
- tableWrapperWidth: number;
43
- tableWrapperHeight: number;
44
- }
45
-
46
- export default class TableFloatingControls extends Component<Props, State> {
47
- static displayName = 'TableFloatingControls';
48
- private resizeObserver?: ResizeObserver;
49
-
50
- constructor(props: Props) {
51
- super(props);
52
-
53
- this.state = {
54
- tableWrapperWidth: 0,
55
- /** Height needs to be tracked to re-render decorations correctly, do not remove */
56
- tableWrapperHeight: 0,
57
- };
58
- }
59
-
60
- componentDidMount() {
61
- this.tryInitResizeObserver();
62
- }
63
-
64
- componentDidUpdate() {
65
- // tableRef prop is not guaranteed to be defined after componentDidMount, so retry to init resize observer on update
66
- this.tryInitResizeObserver();
67
- }
68
-
69
- // tracking the table height changes to update floating controls
70
- private tryInitResizeObserver() {
71
- let { tableRef } = this.props;
72
- if (tableRef && !this.resizeObserver && window?.ResizeObserver) {
73
- const tableWrapper = tableRef.closest(
74
- `.${ClassName.TABLE_NODE_WRAPPER}`,
75
- ) as Element;
76
- this.resizeObserver = new ResizeObserver((entries) => {
77
- for (let entry of entries) {
78
- this.setState((prev) => {
79
- return prev?.tableWrapperWidth === entry.contentRect.width &&
80
- prev.tableWrapperHeight === entry.contentRect.height
81
- ? prev
82
- : {
83
- tableWrapperWidth: entry.contentRect.width,
84
- tableWrapperHeight: entry.contentRect.height,
85
- };
86
- });
87
- }
88
- });
89
- this.resizeObserver.observe(tableWrapper);
90
- }
91
- }
92
-
93
- shouldComponentUpdate(nextProps: Props, nextState: State) {
94
- const {
95
- tableRef,
96
- isInDanger,
97
- isResizing,
98
- isHeaderRowEnabled,
99
- isNumberColumnEnabled,
100
- hoveredRows,
101
- selection,
102
- tableActive,
103
- isHeaderColumnEnabled,
104
- ordering,
105
- headerRowHeight,
106
- stickyHeader,
107
- hoveredCell,
108
- isTableHovered,
109
- } = this.props;
110
- return (
111
- this.state.tableWrapperWidth !== nextState.tableWrapperWidth ||
112
- this.state.tableWrapperHeight !== nextState.tableWrapperHeight ||
113
- ordering !== nextProps.ordering ||
114
- tableRef !== nextProps.tableRef ||
115
- tableActive !== nextProps.tableActive ||
116
- isInDanger !== nextProps.isInDanger ||
117
- isResizing !== nextProps.isResizing ||
118
- hoveredRows !== nextProps.hoveredRows ||
119
- isHeaderRowEnabled !== nextProps.isHeaderRowEnabled ||
120
- isHeaderColumnEnabled !== nextProps.isHeaderColumnEnabled ||
121
- isNumberColumnEnabled !== nextProps.isNumberColumnEnabled ||
122
- isSelectionUpdated(selection!, nextProps.selection) ||
123
- headerRowHeight !== nextProps.headerRowHeight ||
124
- stickyHeader !== nextProps.stickyHeader ||
125
- hoveredCell !== nextProps.hoveredCell ||
126
- isTableHovered !== nextProps.isTableHovered
127
- );
128
- }
41
+ export const TableFloatingControls = ({
42
+ editorView,
43
+ tableRef,
44
+ tableNode,
45
+ isInDanger,
46
+ isResizing,
47
+ isNumberColumnEnabled,
48
+ isHeaderRowEnabled,
49
+ isHeaderColumnEnabled,
50
+ tableActive,
51
+ hasHeaderRow,
52
+ hoveredRows,
53
+ stickyHeader,
54
+ isDragAndDropEnabled,
55
+ hoveredCell,
56
+ isTableHovered,
57
+ tableWrapperWidth,
58
+ }: TableFloatingControlsProps) => {
59
+ const _selectRow = useCallback(
60
+ (row: number, expand: boolean) => {
61
+ const { state, dispatch } = editorView;
62
+ // fix for issue ED-4665
63
+ if (browser.ie_version === 11) {
64
+ (editorView.dom as HTMLElement).blur();
65
+ }
66
+ selectRow(row, expand)(state, dispatch);
67
+ },
68
+ [editorView],
69
+ );
70
+
71
+ const _selectRows = useCallback(
72
+ (rowIndexes: number[]) => {
73
+ const { state, dispatch } = editorView;
74
+ // fix for issue ED-4665
75
+ if (browser.ie_version === 11) {
76
+ (editorView.dom as HTMLElement).blur();
77
+ }
78
+ selectRows(rowIndexes)(state, dispatch);
79
+ },
80
+ [editorView],
81
+ );
82
+
83
+ const _hoverRows = useCallback(
84
+ (rows: Array<number>, danger?: boolean) => {
85
+ const { state, dispatch } = editorView;
86
+ hoverRows(rows, danger)(state, dispatch);
87
+ },
88
+ [editorView],
89
+ );
129
90
 
130
- componentWillUnmount() {
131
- if (this.resizeObserver) {
132
- this.resizeObserver.disconnect();
133
- }
91
+ // re-use across numbered columns and row controls
92
+ const updateCellHoverLocation = useCallback(
93
+ (rowIndex: number) => {
94
+ const { state, dispatch } = editorView;
95
+
96
+ if (tableActive) {
97
+ // For context: Whenever we mouse over a column or row drag handle, we will ALWAYS be hovering over the 0 index
98
+ // of the opposite dimension. For example; here when we mouse over the row drag handle then we're technically
99
+ // also hovering over column 0 index. And vice-versa with columns. This means we don't need to worry about knowing the
100
+ // current column index. We can just force it to 0.
101
+ hoverCell(rowIndex, 0)(state, dispatch);
102
+ }
103
+ },
104
+ [editorView, tableActive],
105
+ );
106
+
107
+ if (!tableRef) {
108
+ return null;
134
109
  }
135
110
 
136
- render() {
137
- const {
138
- editorView,
139
- tableRef,
140
- tableNode,
141
- isInDanger,
142
- isResizing,
143
- isNumberColumnEnabled,
144
- isHeaderRowEnabled,
145
- isHeaderColumnEnabled,
146
- tableActive,
147
- hasHeaderRow,
148
- hoveredRows,
149
- stickyHeader,
150
- isDragAndDropEnabled,
151
- hoveredCell,
152
- isTableHovered,
153
- } = this.props;
154
-
155
- if (!tableRef) {
156
- return null;
157
- }
158
-
159
- const stickyTop =
160
- stickyHeader && stickyHeader.sticky && hasHeaderRow
161
- ? stickyHeader.top
162
- : undefined;
163
-
164
- const wrapperClassName = isDragAndDropEnabled
165
- ? ClassName.DRAG_ROW_CONTROLS_WRAPPER
166
- : ClassName.ROW_CONTROLS_WRAPPER;
167
-
168
- return (
169
- <div className={wrapperClassName}>
170
- <div onMouseDown={(e) => !isDragAndDropEnabled && e.preventDefault()}>
171
- {isNumberColumnEnabled ? (
172
- <NumberColumn
173
- editorView={editorView}
174
- hoverRows={this.hoverRows}
175
- tableRef={tableRef}
176
- tableActive={tableActive}
177
- hoveredRows={hoveredRows}
178
- hasHeaderRow={hasHeaderRow}
179
- isInDanger={isInDanger}
180
- isResizing={isResizing}
181
- selectRow={this.selectRow}
182
- updateCellHoverLocation={this.updateCellHoverLocation}
183
- stickyTop={stickyTop}
184
- isDragAndDropEnabled={isDragAndDropEnabled}
185
- />
186
- ) : null}
187
-
188
- {tableActive && (
189
- <>
190
- {isDragAndDropEnabled ? (
191
- <>
192
- <DragCornerControls
193
- editorView={editorView}
194
- tableRef={tableRef}
195
- isInDanger={isInDanger}
196
- isResizing={isResizing}
197
- />
198
- <DragControls
199
- tableRef={tableRef}
200
- tableNode={tableNode}
201
- hoveredCell={hoveredCell}
202
- isTableHovered={isTableHovered}
203
- editorView={editorView}
204
- tableActive={tableActive}
205
- isInDanger={isInDanger}
206
- isResizing={isResizing}
207
- tableWidth={this.state.tableWrapperWidth}
208
- hoverRows={this.hoverRows}
209
- selectRow={this.selectRow}
210
- selectRows={this.selectRows}
211
- updateCellHoverLocation={this.updateCellHoverLocation}
212
- />
213
- </>
214
- ) : (
215
- <>
216
- <CornerControls
217
- editorView={editorView}
218
- tableRef={tableRef}
219
- isInDanger={isInDanger}
220
- isResizing={isResizing}
221
- isHeaderRowEnabled={isHeaderRowEnabled}
222
- isHeaderColumnEnabled={isHeaderColumnEnabled}
223
- hoveredRows={hoveredRows}
224
- stickyTop={tableActive ? stickyTop : undefined}
225
- />
226
- <RowControls
227
- editorView={editorView}
228
- tableRef={tableRef}
229
- hoverRows={this.hoverRows}
230
- hoveredRows={hoveredRows}
231
- isInDanger={isInDanger}
232
- isResizing={isResizing}
233
- selectRow={this.selectRow}
234
- stickyTop={tableActive ? stickyTop : undefined}
235
- />
236
- </>
237
- )}
238
- </>
239
- )}
240
- </div>
111
+ const stickyTop =
112
+ stickyHeader && stickyHeader.sticky && hasHeaderRow
113
+ ? stickyHeader.top
114
+ : undefined;
115
+
116
+ const wrapperClassName = isDragAndDropEnabled
117
+ ? ClassName.DRAG_ROW_CONTROLS_WRAPPER
118
+ : ClassName.ROW_CONTROLS_WRAPPER;
119
+
120
+ return (
121
+ <div className={wrapperClassName}>
122
+ <div onMouseDown={(e) => !isDragAndDropEnabled && e.preventDefault()}>
123
+ {isNumberColumnEnabled ? (
124
+ <NumberColumn
125
+ editorView={editorView}
126
+ hoverRows={_hoverRows}
127
+ tableRef={tableRef}
128
+ tableActive={tableActive}
129
+ hoveredRows={hoveredRows}
130
+ hasHeaderRow={hasHeaderRow}
131
+ isInDanger={isInDanger}
132
+ isResizing={isResizing}
133
+ selectRow={_selectRow}
134
+ updateCellHoverLocation={updateCellHoverLocation}
135
+ stickyTop={stickyTop}
136
+ isDragAndDropEnabled={isDragAndDropEnabled}
137
+ />
138
+ ) : null}
139
+
140
+ {tableActive && (
141
+ <>
142
+ {isDragAndDropEnabled ? (
143
+ <>
144
+ <DragCornerControls
145
+ editorView={editorView}
146
+ tableRef={tableRef}
147
+ isInDanger={isInDanger}
148
+ isResizing={isResizing}
149
+ />
150
+ <DragControls
151
+ tableRef={tableRef}
152
+ tableNode={tableNode}
153
+ hoveredCell={hoveredCell}
154
+ isTableHovered={isTableHovered}
155
+ editorView={editorView}
156
+ tableActive={tableActive}
157
+ isInDanger={isInDanger}
158
+ isResizing={isResizing}
159
+ tableWidth={tableWrapperWidth!}
160
+ hoverRows={_hoverRows}
161
+ selectRow={_selectRow}
162
+ selectRows={_selectRows}
163
+ updateCellHoverLocation={updateCellHoverLocation}
164
+ />
165
+ </>
166
+ ) : (
167
+ <>
168
+ <CornerControls
169
+ editorView={editorView}
170
+ tableRef={tableRef}
171
+ isInDanger={isInDanger}
172
+ isResizing={isResizing}
173
+ isHeaderRowEnabled={isHeaderRowEnabled}
174
+ isHeaderColumnEnabled={isHeaderColumnEnabled}
175
+ hoveredRows={hoveredRows}
176
+ stickyTop={tableActive ? stickyTop : undefined}
177
+ />
178
+ <RowControls
179
+ editorView={editorView}
180
+ tableRef={tableRef}
181
+ hoverRows={_hoverRows}
182
+ hoveredRows={hoveredRows}
183
+ isInDanger={isInDanger}
184
+ isResizing={isResizing}
185
+ selectRow={_selectRow}
186
+ stickyTop={tableActive ? stickyTop : undefined}
187
+ />
188
+ </>
189
+ )}
190
+ </>
191
+ )}
241
192
  </div>
242
- );
243
- }
193
+ </div>
194
+ );
195
+ };
244
196
 
245
- private selectRow = (row: number, expand: boolean) => {
246
- const { editorView } = this.props;
247
- const { state, dispatch } = editorView;
248
- // fix for issue ED-4665
249
- if (browser.ie_version === 11) {
250
- (editorView.dom as HTMLElement).blur();
251
- }
252
- selectRow(row, expand)(state, dispatch);
253
- };
254
-
255
- private selectRows = (rowIndexes: number[]) => {
256
- const { editorView } = this.props;
257
- const { state, dispatch } = editorView;
258
- // fix for issue ED-4665
259
- if (browser.ie_version === 11) {
260
- (editorView.dom as HTMLElement).blur();
261
- }
262
- selectRows(rowIndexes)(state, dispatch);
263
- };
264
-
265
- private hoverRows = (rows: Array<number>, danger?: boolean) => {
266
- const { state, dispatch } = this.props.editorView;
267
- hoverRows(rows, danger)(state, dispatch);
268
- };
269
-
270
- // re-use across numbered columns and row controls
271
- private updateCellHoverLocation = (rowIndex: number) => {
272
- const { editorView, tableActive } = this.props;
273
- const { state, dispatch } = editorView;
274
-
275
- if (tableActive) {
276
- // For context: Whenever we mouse over a column or row drag handle, we will ALWAYS be hovering over the 0 index
277
- // of the opposite dimension. For example; here when we mouse over the row drag handle then we're technically
278
- // also hovering over column 0 index. And vice-versa with columns. This means we don't need to worry about knowing the
279
- // current column index. We can just force it to 0.
280
- hoverCell(rowIndex, 0)(state, dispatch);
281
- }
282
- };
283
- }
197
+ export default TableFloatingControls;
@@ -6,7 +6,6 @@ import { CellSelection } from '@atlaskit/editor-tables/cell-selection';
6
6
  import { TableMap } from '@atlaskit/editor-tables/table-map';
7
7
  import {
8
8
  findTable,
9
- getCellsInColumn,
10
9
  getSelectionRect,
11
10
  isColumnSelected,
12
11
  isTableSelected,
@@ -34,13 +33,13 @@ export const getColumnsWidths = (
34
33
  // When there is no cell we need to fill it with undefined
35
34
  widths = Array.from({ length: map.width });
36
35
  for (let i = 0; i < map.width; i++) {
37
- const cells = getCellsInColumn(i)(selection)!;
38
- const cell = cells[0];
39
- if (cell) {
40
- const cellRef = findDomRefAtPos(cell.pos, domAtPos) as HTMLElement;
36
+ if (!map.isCellMergedTopLeft(0, i)) {
37
+ const node = table.node.nodeAt(map.map[i])!;
38
+ const pos = map.map[i] + table.start;
39
+ const cellRef = findDomRefAtPos(pos, domAtPos) as HTMLElement;
41
40
  const rect = cellRef.getBoundingClientRect();
42
41
  widths[i] = (rect ? rect.width : cellRef.offsetWidth) + 1;
43
- i += cell.node.attrs.colspan - 1;
42
+ i += node.attrs.colspan - 1;
44
43
  }
45
44
  }
46
45
  }
@@ -1,4 +1,3 @@
1
- import type { GetEditorFeatureFlags } from '@atlaskit/editor-common/types';
2
1
  import type { Schema } from '@atlaskit/editor-prosemirror/model';
3
2
  import { createTable } from '@atlaskit/editor-tables/utils';
4
3
 
@@ -6,17 +5,15 @@ import { TABLE_MAX_WIDTH } from '../pm-plugins/table-resizing/utils';
6
5
 
7
6
  export const createTableWithWidth =
8
7
  (
8
+ isTableScalingEnabled?: boolean,
9
9
  isFullWidthModeEnabled?: boolean,
10
- getEditorFeatureFlags?: GetEditorFeatureFlags,
11
10
  createTableProps?: {
12
11
  rowsCount?: number;
13
12
  colsCount?: number;
14
13
  },
15
14
  ) =>
16
15
  (schema: Schema) => {
17
- const { tablePreserveWidth = false } = getEditorFeatureFlags?.() || {};
18
-
19
- if (tablePreserveWidth && isFullWidthModeEnabled) {
16
+ if (isTableScalingEnabled && isFullWidthModeEnabled) {
20
17
  return createTable({
21
18
  schema,
22
19
  tableWidth: TABLE_MAX_WIDTH,
package/src/utils/dom.ts CHANGED
@@ -4,9 +4,6 @@ import {
4
4
  } from '@atlaskit/editor-common/utils';
5
5
 
6
6
  import { TableCssClassName as ClassName } from '../types';
7
- import type { ElementContentRects } from '../types';
8
-
9
- const SELECTOR_TABLE_LEAFS = `.${ClassName.TABLE_CELL}, .${ClassName.TABLE_HEADER_CELL}`;
10
7
 
11
8
  export const isCell = (node: HTMLElement | null): boolean => {
12
9
  return Boolean(
@@ -118,29 +115,25 @@ export const isDragCornerButton = (node: HTMLElement | null) =>
118
115
  *
119
116
  * the same is valid to the right side.
120
117
  */
121
-
118
+ /**
119
+ * This can be used with mouse events to determine the left/right side of the target the pointer is closest too.
120
+ *
121
+ * WARNING: This metod reads properties which can trigger a reflow; use this wisely.
122
+ *
123
+ * @param mouseEvent
124
+ * @param gapInPixels
125
+ * @returns
126
+ */
122
127
  export const getMousePositionHorizontalRelativeByElement = (
123
128
  mouseEvent: MouseEvent,
124
- elementContentRects?: ElementContentRects,
129
+ offsetX: number,
125
130
  gapInPixels?: number,
126
- isDragAndDropEnabled?: boolean,
127
131
  ): 'left' | 'right' | null => {
128
132
  const element = mouseEvent.target;
129
133
 
130
134
  if (element instanceof HTMLElement) {
131
- let width, x;
132
-
133
- if (isDragAndDropEnabled) {
134
- // mouse event fires for new overlapping column controls, so the cell can not get detected. Get width
135
- // directly from element that will be .pm-table-drag-columns-floating-insert-dot-wrapper
136
- width = element.clientWidth;
137
- } else {
138
- const closestCell = element.closest(SELECTOR_TABLE_LEAFS);
139
-
140
- const id = closestCell?.id ?? '';
141
- width = elementContentRects?.[id]?.width ?? 0;
142
- }
143
- x = mouseEvent.offsetX;
135
+ const width = element.clientWidth; // reflow
136
+ const x = !Number.isNaN(offsetX) ? offsetX : mouseEvent.offsetX; // reflow
144
137
 
145
138
  if (width <= 0) {
146
139
  return null;
@@ -159,7 +159,7 @@ export const getDragMenuConfig = (
159
159
  selectionRect?: Rect,
160
160
  editorAnalyticsAPI?: EditorAnalyticsAPI,
161
161
  isHeaderRowRequired?: boolean,
162
- tablePreserveWidth = false,
162
+ isTableScalingEnabled = false,
163
163
  ): DragMenuConfig[] => {
164
164
  const addOptions =
165
165
  direction === 'row'
@@ -294,15 +294,10 @@ export const getDragMenuConfig = (
294
294
  },
295
295
  )(state, dispatch);
296
296
  } else {
297
- insertColumnWithAnalytics(
298
- getEditorContainerWidth,
299
- editorAnalyticsAPI,
300
- tablePreserveWidth,
301
- )(INPUT_METHOD.TABLE_CONTEXT_MENU, (index ?? 0) + offset)(
302
- state,
303
- dispatch,
304
- editorView,
305
- );
297
+ insertColumnWithAnalytics(editorAnalyticsAPI, isTableScalingEnabled)(
298
+ INPUT_METHOD.TABLE_CONTEXT_MENU,
299
+ (index ?? 0) + offset,
300
+ )(state, dispatch, editorView);
306
301
  }
307
302
  return true;
308
303
  },
@@ -321,7 +316,7 @@ export const getDragMenuConfig = (
321
316
  state,
322
317
  editorView.domAtPos.bind(editorView),
323
318
  getEditorContainerWidth,
324
- tablePreserveWidth,
319
+ isTableScalingEnabled,
325
320
  );
326
321
 
327
322
  if (newResizeState) {
@@ -362,7 +357,7 @@ export const getDragMenuConfig = (
362
357
  !!isHeaderRowRequired,
363
358
  )(state, dispatch);
364
359
  } else {
365
- deleteColumnsWithAnalytics(editorAnalyticsAPI, tablePreserveWidth)(
360
+ deleteColumnsWithAnalytics(editorAnalyticsAPI, isTableScalingEnabled)(
366
361
  INPUT_METHOD.TABLE_CONTEXT_MENU,
367
362
  selectionRect ?? defaultSelectionRect,
368
363
  )(state, dispatch, editorView);