@atlaskit/editor-plugin-table 7.16.11 → 7.16.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (254) hide show
  1. package/.eslintrc.js +3 -3
  2. package/CHANGELOG.md +16 -0
  3. package/dist/cjs/commands/misc.js +3 -3
  4. package/dist/cjs/nodeviews/TableCell.js +10 -10
  5. package/dist/cjs/nodeviews/TableContainer.js +83 -27
  6. package/dist/cjs/nodeviews/TableResizer.js +40 -19
  7. package/dist/cjs/nodeviews/TableRow.js +23 -23
  8. package/dist/cjs/pm-plugins/table-resizing/plugin.js +3 -3
  9. package/dist/cjs/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  10. package/dist/cjs/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  11. package/dist/cjs/ui/FloatingContextualMenu/styles.js +1 -1
  12. package/dist/cjs/ui/FloatingDragMenu/styles.js +1 -1
  13. package/dist/cjs/ui/common-styles.js +13 -13
  14. package/dist/cjs/ui/ui-styles.js +25 -25
  15. package/dist/cjs/utils/guidelines.js +7 -4
  16. package/dist/cjs/utils/merged-cells.js +3 -3
  17. package/dist/cjs/utils/snapping.js +7 -8
  18. package/dist/es2019/commands/misc.js +3 -3
  19. package/dist/es2019/nodeviews/TableContainer.js +70 -9
  20. package/dist/es2019/nodeviews/TableResizer.js +42 -21
  21. package/dist/es2019/nodeviews/TableRow.js +21 -21
  22. package/dist/es2019/pm-plugins/table-resizing/plugin.js +3 -3
  23. package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  24. package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  25. package/dist/es2019/ui/FloatingContextualMenu/styles.js +47 -47
  26. package/dist/es2019/ui/FloatingDragMenu/styles.js +30 -30
  27. package/dist/es2019/ui/common-styles.js +802 -816
  28. package/dist/es2019/ui/ui-styles.js +665 -678
  29. package/dist/es2019/utils/guidelines.js +5 -2
  30. package/dist/es2019/utils/merged-cells.js +3 -3
  31. package/dist/es2019/utils/snapping.js +5 -6
  32. package/dist/esm/commands/misc.js +3 -3
  33. package/dist/esm/nodeviews/TableCell.js +10 -10
  34. package/dist/esm/nodeviews/TableContainer.js +85 -29
  35. package/dist/esm/nodeviews/TableResizer.js +42 -21
  36. package/dist/esm/nodeviews/TableRow.js +23 -23
  37. package/dist/esm/pm-plugins/table-resizing/plugin.js +3 -3
  38. package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +4 -4
  39. package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +3 -3
  40. package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
  41. package/dist/esm/ui/FloatingDragMenu/styles.js +1 -1
  42. package/dist/esm/ui/common-styles.js +13 -13
  43. package/dist/esm/ui/ui-styles.js +25 -25
  44. package/dist/esm/utils/guidelines.js +6 -3
  45. package/dist/esm/utils/merged-cells.js +3 -3
  46. package/dist/esm/utils/snapping.js +6 -7
  47. package/dist/types/nodeviews/TableResizer.d.ts +2 -1
  48. package/dist/types/pm-plugins/decorations/utils/index.d.ts +1 -1
  49. package/dist/types/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  50. package/dist/types/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  51. package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  52. package/dist/types/ui/ColumnResizeWidget/index.d.ts +1 -1
  53. package/dist/types/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  54. package/dist/types/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  55. package/dist/types/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  56. package/dist/types/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  57. package/dist/types/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  58. package/dist/types/utils/guidelines.d.ts +2 -1
  59. package/dist/types/utils/snapping.d.ts +3 -2
  60. package/dist/types-ts4.5/nodeviews/TableResizer.d.ts +2 -1
  61. package/dist/types-ts4.5/pm-plugins/decorations/utils/index.d.ts +1 -1
  62. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
  63. package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
  64. package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
  65. package/dist/types-ts4.5/ui/ColumnResizeWidget/index.d.ts +1 -1
  66. package/dist/types-ts4.5/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
  67. package/dist/types-ts4.5/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
  68. package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
  69. package/dist/types-ts4.5/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
  70. package/dist/types-ts4.5/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
  71. package/dist/types-ts4.5/utils/guidelines.d.ts +2 -1
  72. package/dist/types-ts4.5/utils/snapping.d.ts +3 -2
  73. package/docs/0-intro.tsx +9 -7
  74. package/package.json +3 -3
  75. package/report.api.md +67 -66
  76. package/src/commands/clear.ts +36 -44
  77. package/src/commands/collapse.ts +8 -8
  78. package/src/commands/column-resize.ts +412 -452
  79. package/src/commands/delete.ts +14 -14
  80. package/src/commands/display-mode.ts +10 -11
  81. package/src/commands/go-to-next-cell.ts +48 -54
  82. package/src/commands/hover.ts +210 -227
  83. package/src/commands/index.ts +35 -35
  84. package/src/commands/insert.ts +208 -235
  85. package/src/commands/misc.ts +655 -748
  86. package/src/commands/referentiality.ts +9 -9
  87. package/src/commands/selection.ts +433 -563
  88. package/src/commands/sort.ts +68 -86
  89. package/src/commands/split-cell.ts +14 -14
  90. package/src/commands/toggle.ts +69 -67
  91. package/src/commands-with-analytics.ts +570 -639
  92. package/src/create-plugin-config.ts +13 -13
  93. package/src/event-handlers.ts +513 -612
  94. package/src/handlers.ts +120 -133
  95. package/src/nodeviews/ExternalDropTargets.tsx +68 -73
  96. package/src/nodeviews/OverflowShadowsObserver.ts +148 -157
  97. package/src/nodeviews/TableCell.ts +47 -54
  98. package/src/nodeviews/TableComponent.tsx +1018 -1112
  99. package/src/nodeviews/TableComponentWithSharedState.tsx +91 -94
  100. package/src/nodeviews/TableContainer.tsx +384 -340
  101. package/src/nodeviews/TableNodeViewBase.ts +19 -24
  102. package/src/nodeviews/TableResizer.tsx +642 -653
  103. package/src/nodeviews/TableRow.ts +580 -629
  104. package/src/nodeviews/TableStickyScrollbar.ts +173 -190
  105. package/src/nodeviews/__mocks__/OverflowShadowsObserver.ts +8 -8
  106. package/src/nodeviews/__mocks__/OverridableMock.ts +14 -15
  107. package/src/nodeviews/table.tsx +345 -375
  108. package/src/nodeviews/types.ts +21 -24
  109. package/src/nodeviews/update-overflow-shadows.ts +8 -14
  110. package/src/plugin.tsx +578 -603
  111. package/src/pm-plugins/analytics/actions.ts +10 -12
  112. package/src/pm-plugins/analytics/commands.ts +31 -37
  113. package/src/pm-plugins/analytics/plugin-factory.ts +4 -2
  114. package/src/pm-plugins/analytics/plugin-key.ts +1 -3
  115. package/src/pm-plugins/analytics/plugin.ts +60 -70
  116. package/src/pm-plugins/analytics/reducer.ts +19 -19
  117. package/src/pm-plugins/analytics/types.ts +10 -10
  118. package/src/pm-plugins/analytics/utils/moved-event.ts +38 -38
  119. package/src/pm-plugins/decorations/plugin.ts +58 -77
  120. package/src/pm-plugins/decorations/utils/column-controls.ts +59 -71
  121. package/src/pm-plugins/decorations/utils/column-resizing.ts +50 -57
  122. package/src/pm-plugins/decorations/utils/compose-decorations.ts +6 -6
  123. package/src/pm-plugins/decorations/utils/index.ts +3 -6
  124. package/src/pm-plugins/decorations/utils/types.ts +7 -12
  125. package/src/pm-plugins/default-table-selection.ts +3 -3
  126. package/src/pm-plugins/drag-and-drop/actions.ts +25 -25
  127. package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +158 -190
  128. package/src/pm-plugins/drag-and-drop/commands.ts +154 -170
  129. package/src/pm-plugins/drag-and-drop/consts.ts +4 -5
  130. package/src/pm-plugins/drag-and-drop/plugin-factory.ts +23 -20
  131. package/src/pm-plugins/drag-and-drop/plugin-key.ts +1 -3
  132. package/src/pm-plugins/drag-and-drop/plugin.ts +329 -383
  133. package/src/pm-plugins/drag-and-drop/reducer.ts +30 -30
  134. package/src/pm-plugins/drag-and-drop/types.ts +8 -8
  135. package/src/pm-plugins/drag-and-drop/utils/autoscrollers.ts +38 -41
  136. package/src/pm-plugins/drag-and-drop/utils/getDragBehaviour.ts +3 -6
  137. package/src/pm-plugins/drag-and-drop/utils/monitor.ts +57 -70
  138. package/src/pm-plugins/keymap.ts +208 -220
  139. package/src/pm-plugins/main.ts +348 -400
  140. package/src/pm-plugins/plugin-factory.ts +32 -34
  141. package/src/pm-plugins/safari-delete-composition-text-issue-workaround.ts +83 -97
  142. package/src/pm-plugins/sticky-headers/commands.ts +2 -6
  143. package/src/pm-plugins/sticky-headers/plugin-key.ts +1 -3
  144. package/src/pm-plugins/sticky-headers/plugin-state.ts +41 -44
  145. package/src/pm-plugins/sticky-headers/plugin.ts +4 -4
  146. package/src/pm-plugins/sticky-headers/types.ts +8 -8
  147. package/src/pm-plugins/sticky-headers/util.ts +10 -10
  148. package/src/pm-plugins/table-analytics.ts +70 -72
  149. package/src/pm-plugins/table-local-id.ts +180 -184
  150. package/src/pm-plugins/table-resizing/commands.ts +72 -85
  151. package/src/pm-plugins/table-resizing/event-handlers.ts +298 -317
  152. package/src/pm-plugins/table-resizing/plugin-factory.ts +10 -10
  153. package/src/pm-plugins/table-resizing/plugin-key.ts +1 -3
  154. package/src/pm-plugins/table-resizing/plugin.ts +61 -68
  155. package/src/pm-plugins/table-resizing/reducer.ts +30 -33
  156. package/src/pm-plugins/table-resizing/utils/colgroup.ts +84 -84
  157. package/src/pm-plugins/table-resizing/utils/column-state.ts +78 -81
  158. package/src/pm-plugins/table-resizing/utils/content-width.ts +94 -114
  159. package/src/pm-plugins/table-resizing/utils/dom.ts +93 -110
  160. package/src/pm-plugins/table-resizing/utils/index.ts +29 -34
  161. package/src/pm-plugins/table-resizing/utils/misc.ts +94 -119
  162. package/src/pm-plugins/table-resizing/utils/resize-column.ts +93 -106
  163. package/src/pm-plugins/table-resizing/utils/resize-logic.ts +240 -257
  164. package/src/pm-plugins/table-resizing/utils/resize-state.ts +343 -372
  165. package/src/pm-plugins/table-resizing/utils/scale-table.ts +202 -207
  166. package/src/pm-plugins/table-resizing/utils/types.ts +17 -17
  167. package/src/pm-plugins/table-resizing/utils/unit-to-number.ts +1 -2
  168. package/src/pm-plugins/table-selection-keymap.ts +25 -51
  169. package/src/pm-plugins/table-width.ts +191 -204
  170. package/src/pm-plugins/view-mode-sort/index.ts +223 -227
  171. package/src/pm-plugins/view-mode-sort/plugin-key.ts +3 -2
  172. package/src/pm-plugins/view-mode-sort/types.ts +12 -12
  173. package/src/pm-plugins/view-mode-sort/utils.ts +108 -117
  174. package/src/reducer.ts +139 -155
  175. package/src/toolbar.tsx +815 -905
  176. package/src/transforms/column-width.ts +186 -213
  177. package/src/transforms/delete-columns.ts +208 -222
  178. package/src/transforms/delete-rows.ts +117 -121
  179. package/src/transforms/fix-tables.ts +190 -215
  180. package/src/transforms/merge.ts +263 -269
  181. package/src/transforms/replace-table.ts +27 -43
  182. package/src/transforms/split.ts +65 -75
  183. package/src/types.ts +421 -427
  184. package/src/ui/ColumnResizeWidget/index.tsx +40 -47
  185. package/src/ui/DragHandle/HandleIconComponent.tsx +9 -13
  186. package/src/ui/DragHandle/index.tsx +221 -250
  187. package/src/ui/DragPreview/index.tsx +35 -35
  188. package/src/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.tsx +33 -41
  189. package/src/ui/FloatingContextualButton/FixedButton.tsx +154 -157
  190. package/src/ui/FloatingContextualButton/index.tsx +109 -115
  191. package/src/ui/FloatingContextualButton/styles.ts +43 -46
  192. package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +634 -694
  193. package/src/ui/FloatingContextualMenu/index.tsx +83 -101
  194. package/src/ui/FloatingContextualMenu/styles.ts +57 -65
  195. package/src/ui/FloatingDeleteButton/DeleteButton.tsx +37 -37
  196. package/src/ui/FloatingDeleteButton/getPopUpOptions.ts +47 -57
  197. package/src/ui/FloatingDeleteButton/index.tsx +319 -350
  198. package/src/ui/FloatingDragMenu/DragMenu.tsx +555 -596
  199. package/src/ui/FloatingDragMenu/DropdownMenu.tsx +152 -162
  200. package/src/ui/FloatingDragMenu/index.tsx +88 -102
  201. package/src/ui/FloatingDragMenu/styles.ts +51 -54
  202. package/src/ui/FloatingInsertButton/InsertButton.tsx +204 -217
  203. package/src/ui/FloatingInsertButton/getPopupOptions.ts +100 -115
  204. package/src/ui/FloatingInsertButton/index.tsx +248 -292
  205. package/src/ui/FloatingToolbarLabel/FloatingToolbarLabel.tsx +24 -29
  206. package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +308 -329
  207. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.tsx +85 -94
  208. package/src/ui/TableFloatingColumnControls/ColumnDropTargets/index.tsx +46 -46
  209. package/src/ui/TableFloatingColumnControls/index.tsx +116 -136
  210. package/src/ui/TableFloatingControls/CornerControls/ClassicCornerControls.tsx +79 -91
  211. package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +95 -102
  212. package/src/ui/TableFloatingControls/CornerControls/index.tsx +1 -4
  213. package/src/ui/TableFloatingControls/CornerControls/types.ts +8 -8
  214. package/src/ui/TableFloatingControls/FloatingControlsWithSelection.tsx +50 -50
  215. package/src/ui/TableFloatingControls/NumberColumn/index.tsx +111 -124
  216. package/src/ui/TableFloatingControls/RowControls/ClassicControls.tsx +86 -105
  217. package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +305 -341
  218. package/src/ui/TableFloatingControls/RowDropTarget/index.tsx +72 -75
  219. package/src/ui/TableFloatingControls/index.tsx +191 -193
  220. package/src/ui/TableFullWidthLabel/index.tsx +20 -20
  221. package/src/ui/common-styles.ts +880 -912
  222. package/src/ui/consts.ts +29 -74
  223. package/src/ui/icons/AddColLeftIcon.tsx +33 -39
  224. package/src/ui/icons/AddColRightIcon.tsx +33 -39
  225. package/src/ui/icons/AddRowAboveIcon.tsx +16 -22
  226. package/src/ui/icons/AddRowBelowIcon.tsx +33 -39
  227. package/src/ui/icons/DisplayModeIcon.tsx +31 -31
  228. package/src/ui/icons/DragHandleDisabledIcon.tsx +19 -21
  229. package/src/ui/icons/DragHandleIcon.tsx +12 -12
  230. package/src/ui/icons/DragInMotionIcon.tsx +45 -52
  231. package/src/ui/icons/MergeCellsIcon.tsx +22 -28
  232. package/src/ui/icons/MinimisedHandle.tsx +9 -9
  233. package/src/ui/icons/SplitCellIcon.tsx +30 -36
  234. package/src/ui/ui-styles.ts +769 -798
  235. package/src/utils/alignment.ts +1 -1
  236. package/src/utils/analytics.ts +192 -208
  237. package/src/utils/collapse.ts +55 -64
  238. package/src/utils/column-controls.ts +237 -254
  239. package/src/utils/create.ts +30 -30
  240. package/src/utils/decoration.ts +482 -502
  241. package/src/utils/dom.ts +127 -134
  242. package/src/utils/drag-menu.ts +322 -373
  243. package/src/utils/get-allow-add-column-custom-step.ts +4 -5
  244. package/src/utils/guidelines.ts +16 -21
  245. package/src/utils/index.ts +68 -68
  246. package/src/utils/merged-cells.ts +245 -254
  247. package/src/utils/nodes.ts +91 -106
  248. package/src/utils/paste.ts +119 -135
  249. package/src/utils/row-controls.ts +199 -213
  250. package/src/utils/selection.ts +77 -87
  251. package/src/utils/snapping.ts +87 -100
  252. package/src/utils/table.ts +44 -44
  253. package/src/utils/transforms.ts +5 -5
  254. package/src/utils/update-plugin-state-decorations.ts +5 -9
@@ -5,243 +5,234 @@ import { findTable, TableMap } from '@atlaskit/editor-tables';
5
5
  type MergeType = 'row' | 'column';
6
6
 
7
7
  const hasMergedCells =
8
- (
9
- indexes: number | number[],
10
- normalizeRect: (index: number, map: TableMap) => Rect,
11
- ) =>
12
- (selection: Selection): boolean => {
13
- const table = findTable(selection);
14
- if (!table) {
15
- return false;
16
- }
17
-
18
- const map = TableMap.get(table.node);
19
- const cellPositions = new Set<number>();
20
- const mergedCells = new Set<number>();
21
-
22
- map.map.forEach((value) => {
23
- if (cellPositions.has(value)) {
24
- mergedCells.add(value);
25
- } else {
26
- cellPositions.add(value);
27
- }
28
- });
29
-
30
- if (!mergedCells.size) {
31
- return false;
32
- }
33
-
34
- return (Array.isArray(indexes) ? indexes : [indexes])
35
- .map((index) => normalizeRect(index, map))
36
- .filter((rect) => rect.left < rect.right && rect.top < rect.bottom)
37
- .some((rect) => {
38
- const n = (rect.right - rect.left) * (rect.bottom - rect.top);
39
- const cells = map.cellsInRect(rect);
40
- if (cells.length !== n) {
41
- // We can quickly assume that if the amount of cells from the map is different to what the rect says
42
- // then there is most likely merged cells across this area which is removing cells
43
- return true;
44
- }
45
- return cells.some((nodePos) => mergedCells.has(nodePos));
46
- });
47
- };
8
+ (indexes: number | number[], normalizeRect: (index: number, map: TableMap) => Rect) =>
9
+ (selection: Selection): boolean => {
10
+ const table = findTable(selection);
11
+ if (!table) {
12
+ return false;
13
+ }
14
+
15
+ const map = TableMap.get(table.node);
16
+ const cellPositions = new Set<number>();
17
+ const mergedCells = new Set<number>();
18
+
19
+ map.map.forEach((value) => {
20
+ if (cellPositions.has(value)) {
21
+ mergedCells.add(value);
22
+ } else {
23
+ cellPositions.add(value);
24
+ }
25
+ });
26
+
27
+ if (!mergedCells.size) {
28
+ return false;
29
+ }
30
+
31
+ return (Array.isArray(indexes) ? indexes : [indexes])
32
+ .map((index) => normalizeRect(index, map))
33
+ .filter((rect) => rect.left < rect.right && rect.top < rect.bottom)
34
+ .some((rect) => {
35
+ const n = (rect.right - rect.left) * (rect.bottom - rect.top);
36
+ const cells = map.cellsInRect(rect);
37
+ if (cells.length !== n) {
38
+ // We can quickly assume that if the amount of cells from the map is different to what the rect says
39
+ // then there is most likely merged cells across this area which is removing cells
40
+ return true;
41
+ }
42
+ return cells.some((nodePos) => mergedCells.has(nodePos));
43
+ });
44
+ };
48
45
 
49
46
  export const hasMergedCellsInColumn = (columnIndexes: number | number[]) =>
50
- hasMergedCells(columnIndexes, (index: number, map: TableMap) => {
51
- const x = Math.max(Math.min(index, map.width - 1), 0); // clamped index
52
- return {
53
- left: x,
54
- right: x === index ? x + 1 : x,
55
- top: 0,
56
- bottom: map.height,
57
- };
58
- });
47
+ hasMergedCells(columnIndexes, (index: number, map: TableMap) => {
48
+ const x = Math.max(Math.min(index, map.width - 1), 0); // clamped index
49
+ return {
50
+ left: x,
51
+ right: x === index ? x + 1 : x,
52
+ top: 0,
53
+ bottom: map.height,
54
+ };
55
+ });
59
56
 
60
57
  export const hasMergedCellsInRow = (rowIndexes: number | number[]) =>
61
- hasMergedCells(rowIndexes, (index: number, map: TableMap) => {
62
- const y = Math.max(Math.min(index, map.height - 1), 0); // clamped index
63
- return {
64
- left: 0,
65
- right: map.width,
66
- top: y,
67
- bottom: y === index ? y + 1 : y,
68
- };
69
- });
58
+ hasMergedCells(rowIndexes, (index: number, map: TableMap) => {
59
+ const y = Math.max(Math.min(index, map.height - 1), 0); // clamped index
60
+ return {
61
+ left: 0,
62
+ right: map.width,
63
+ top: y,
64
+ bottom: y === index ? y + 1 : y,
65
+ };
66
+ });
70
67
 
71
68
  const getRect = (index: number, type: MergeType, map: TableMap) => {
72
- if (type === 'column') {
73
- const x = Math.max(Math.min(index, map.width - 1), 0); // clamped index
74
- return {
75
- left: x,
76
- right: x === index ? x + 1 : x,
77
- top: 0,
78
- bottom: map.height,
79
- };
80
- } else {
81
- const y = Math.max(Math.min(index, map.height - 1), 0); // clamped index
82
- return {
83
- left: 0,
84
- right: map.width,
85
- top: y,
86
- bottom: y === index ? y + 1 : y,
87
- };
88
- }
69
+ if (type === 'column') {
70
+ const x = Math.max(Math.min(index, map.width - 1), 0); // clamped index
71
+ return {
72
+ left: x,
73
+ right: x === index ? x + 1 : x,
74
+ top: 0,
75
+ bottom: map.height,
76
+ };
77
+ } else {
78
+ const y = Math.max(Math.min(index, map.height - 1), 0); // clamped index
79
+ return {
80
+ left: 0,
81
+ right: map.width,
82
+ top: y,
83
+ bottom: y === index ? y + 1 : y,
84
+ };
85
+ }
89
86
  };
90
87
 
91
88
  export const hasMergedCellsInBetween =
92
- (indexes: number[], type: MergeType) =>
93
- (selection: Selection): boolean => {
94
- const table = findTable(selection);
95
- if (!table) {
96
- return false;
97
- }
98
-
99
- const map = TableMap.get(table.node);
100
- const cellPositions = new Set<number>();
101
- const mergedCells = new Set<number>();
102
-
103
- map.map.forEach((value) => {
104
- if (cellPositions.has(value)) {
105
- mergedCells.add(value);
106
- } else {
107
- cellPositions.add(value);
108
- }
109
- });
110
-
111
- if (!mergedCells.size) {
112
- return false;
113
- }
114
-
115
- const getMergedCellsInRect = (index: number, type: MergeType) => {
116
- const rect = getRect(index, type, map);
117
- const isValidRectangle = rect.left < rect.right && rect.top < rect.bottom;
118
- if (!isValidRectangle) {
119
- return [];
120
- }
121
-
122
- const cells = map.cellsInRect(rect);
123
-
124
- let allCellsInRect = [];
125
- if (type === 'column') {
126
- allCellsInRect = map.map.filter((_, key) => key % map.width === index);
127
- } else {
128
- allCellsInRect = map.map.filter(
129
- (_, key) => Math.floor(key / map.width) === index,
130
- );
131
- }
132
- const mergedCell = allCellsInRect.filter((nodePos) => {
133
- return !cells.includes(nodePos) // cell exists in Rect but not show in the map.cellsInRect list => merged cell
134
- ? true
135
- : mergedCells.has(nodePos); // cell includes in mergedCells => merged cell
136
- });
137
-
138
- return [...new Set(mergedCell)];
139
- };
140
-
141
- const mergedCellsInRectArr = indexes.map((index) =>
142
- getMergedCellsInRect(index, type),
143
- );
144
-
145
- // Currently only support 2 indexes, but we can extend this to support more indexes in the future.
146
- return mergedCellsInRectArr[0].some((cell) =>
147
- mergedCellsInRectArr[1].includes(cell),
148
- );
149
- };
89
+ (indexes: number[], type: MergeType) =>
90
+ (selection: Selection): boolean => {
91
+ const table = findTable(selection);
92
+ if (!table) {
93
+ return false;
94
+ }
95
+
96
+ const map = TableMap.get(table.node);
97
+ const cellPositions = new Set<number>();
98
+ const mergedCells = new Set<number>();
99
+
100
+ map.map.forEach((value) => {
101
+ if (cellPositions.has(value)) {
102
+ mergedCells.add(value);
103
+ } else {
104
+ cellPositions.add(value);
105
+ }
106
+ });
107
+
108
+ if (!mergedCells.size) {
109
+ return false;
110
+ }
111
+
112
+ const getMergedCellsInRect = (index: number, type: MergeType) => {
113
+ const rect = getRect(index, type, map);
114
+ const isValidRectangle = rect.left < rect.right && rect.top < rect.bottom;
115
+ if (!isValidRectangle) {
116
+ return [];
117
+ }
118
+
119
+ const cells = map.cellsInRect(rect);
120
+
121
+ let allCellsInRect = [];
122
+ if (type === 'column') {
123
+ allCellsInRect = map.map.filter((_, key) => key % map.width === index);
124
+ } else {
125
+ allCellsInRect = map.map.filter((_, key) => Math.floor(key / map.width) === index);
126
+ }
127
+ const mergedCell = allCellsInRect.filter((nodePos) => {
128
+ return !cells.includes(nodePos) // cell exists in Rect but not show in the map.cellsInRect list => merged cell
129
+ ? true
130
+ : mergedCells.has(nodePos); // cell includes in mergedCells => merged cell
131
+ });
132
+
133
+ return [...new Set(mergedCell)];
134
+ };
135
+
136
+ const mergedCellsInRectArr = indexes.map((index) => getMergedCellsInRect(index, type));
137
+
138
+ // Currently only support 2 indexes, but we can extend this to support more indexes in the future.
139
+ return mergedCellsInRectArr[0].some((cell) => mergedCellsInRectArr[1].includes(cell));
140
+ };
150
141
 
151
142
  // Checks if any cell in the column with colIndex is merged with a cell in a column to the left or to the right of it.
152
143
  // colIndex is a logical index of the column. It starts at 0 and goes up to tableMap.width - 1.
153
144
  export const hasMergedCellsWithColumnNextToColumnIndex = (
154
- colIndex: number,
155
- selection: Selection,
145
+ colIndex: number,
146
+ selection: Selection,
156
147
  ) => {
157
- const table = findTable(selection);
158
- if (!table) {
159
- return false;
160
- }
161
-
162
- const tableMap = TableMap.get(table.node);
163
- const { width } = tableMap;
164
- if (width <= 1) {
165
- return false;
166
- }
167
-
168
- if (colIndex < 0 || colIndex > width - 1) {
169
- return false;
170
- }
171
-
172
- const { map } = tableMap;
173
- // j is an index in the tableMap.map array. tableMap.map is a flat array.
174
- // Each item of this array contains a number.
175
- // The number represents the position of the corresponding cell in the tableMap. It exists for each cell.
176
- // If there are merged cells, their positions will be represented by the same number.
177
- const isFirstColumn = colIndex === 0;
178
- const isLastColumn = colIndex === width - 1;
179
- for (let j = colIndex; j < map.length; j += width) {
180
- if (
181
- (!isFirstColumn && map[j] === map[j - 1]) || // compare with a cell in the column on the left
182
- (!isLastColumn && map[j] === map[j + 1]) // compare with a cell in the column on the right
183
- ) {
184
- return true;
185
- }
186
- }
187
-
188
- return false;
148
+ const table = findTable(selection);
149
+ if (!table) {
150
+ return false;
151
+ }
152
+
153
+ const tableMap = TableMap.get(table.node);
154
+ const { width } = tableMap;
155
+ if (width <= 1) {
156
+ return false;
157
+ }
158
+
159
+ if (colIndex < 0 || colIndex > width - 1) {
160
+ return false;
161
+ }
162
+
163
+ const { map } = tableMap;
164
+ // j is an index in the tableMap.map array. tableMap.map is a flat array.
165
+ // Each item of this array contains a number.
166
+ // The number represents the position of the corresponding cell in the tableMap. It exists for each cell.
167
+ // If there are merged cells, their positions will be represented by the same number.
168
+ const isFirstColumn = colIndex === 0;
169
+ const isLastColumn = colIndex === width - 1;
170
+ for (let j = colIndex; j < map.length; j += width) {
171
+ if (
172
+ (!isFirstColumn && map[j] === map[j - 1]) || // compare with a cell in the column on the left
173
+ (!isLastColumn && map[j] === map[j + 1]) // compare with a cell in the column on the right
174
+ ) {
175
+ return true;
176
+ }
177
+ }
178
+
179
+ return false;
189
180
  };
190
181
 
191
182
  // Checks if any cell in the row with rowIndex is merged with a cell in a row above or below it.
192
183
  export const hasMergedCellsWithRowNextToRowIndex = (
193
- rowIndex: number, // logical row index in the table. It starts at 0 and goes up to tableMap.height - 1.
194
- selection: Selection,
184
+ rowIndex: number, // logical row index in the table. It starts at 0 and goes up to tableMap.height - 1.
185
+ selection: Selection,
195
186
  ) => {
196
- const table = findTable(selection);
197
- if (!table) {
198
- return false;
199
- }
200
-
201
- const tableMap = TableMap.get(table.node);
202
- const { height } = tableMap;
203
- if (height <= 1) {
204
- return false;
205
- }
206
-
207
- if (rowIndex < 0 || rowIndex > height - 1) {
208
- return false;
209
- }
210
-
211
- const { map, width } = tableMap; // map is a flat array representing position of each cell in the table.
212
- const indexOfFirstCellInTheRow = rowIndex * width;
213
- const indexOfLastCellInTheRow = indexOfFirstCellInTheRow + width - 1;
214
- const isFirstRow = rowIndex === 0;
215
- const isLastRow = rowIndex === height - 1;
216
- // j is an index of a cell in a row
217
- for (let j = indexOfFirstCellInTheRow; j <= indexOfLastCellInTheRow; j++) {
218
- if (
219
- (!isFirstRow && map[j] === map[j - width]) || // compare with a cell in the row above
220
- (!isLastRow && map[j] === map[j + width]) // compare with a cell in the row below
221
- ) {
222
- return true;
223
- }
224
- }
225
-
226
- return false;
187
+ const table = findTable(selection);
188
+ if (!table) {
189
+ return false;
190
+ }
191
+
192
+ const tableMap = TableMap.get(table.node);
193
+ const { height } = tableMap;
194
+ if (height <= 1) {
195
+ return false;
196
+ }
197
+
198
+ if (rowIndex < 0 || rowIndex > height - 1) {
199
+ return false;
200
+ }
201
+
202
+ const { map, width } = tableMap; // map is a flat array representing position of each cell in the table.
203
+ const indexOfFirstCellInTheRow = rowIndex * width;
204
+ const indexOfLastCellInTheRow = indexOfFirstCellInTheRow + width - 1;
205
+ const isFirstRow = rowIndex === 0;
206
+ const isLastRow = rowIndex === height - 1;
207
+ // j is an index of a cell in a row
208
+ for (let j = indexOfFirstCellInTheRow; j <= indexOfLastCellInTheRow; j++) {
209
+ if (
210
+ (!isFirstRow && map[j] === map[j - width]) || // compare with a cell in the row above
211
+ (!isLastRow && map[j] === map[j + width]) // compare with a cell in the row below
212
+ ) {
213
+ return true;
214
+ }
215
+ }
216
+
217
+ return false;
227
218
  };
228
219
 
229
220
  export const hasMergedCellsInSelection =
230
- (indexes: number[], type: MergeType) =>
231
- (selection: Selection): boolean => {
232
- const table = findTable(selection);
233
- if (!table) {
234
- return false;
235
- }
221
+ (indexes: number[], type: MergeType) =>
222
+ (selection: Selection): boolean => {
223
+ const table = findTable(selection);
224
+ if (!table) {
225
+ return false;
226
+ }
236
227
 
237
- const map = TableMap.get(table.node);
228
+ const map = TableMap.get(table.node);
238
229
 
239
- if (!map.hasMergedCells()) {
240
- return false;
241
- }
230
+ if (!map.hasMergedCells()) {
231
+ return false;
232
+ }
242
233
 
243
- return checkEdgeHasMergedCells(indexes, map, type);
244
- };
234
+ return checkEdgeHasMergedCells(indexes, map, type);
235
+ };
245
236
 
246
237
  /**
247
238
  * this check the selection has merged cells with previous/next col or row.
@@ -252,48 +243,48 @@ export const hasMergedCellsInSelection =
252
243
  * @returns boolean
253
244
  */
254
245
  export const checkEdgeHasMergedCells = (
255
- indexes: number[],
256
- tableMap: TableMap,
257
- direction: 'row' | 'column',
246
+ indexes: number[],
247
+ tableMap: TableMap,
248
+ direction: 'row' | 'column',
258
249
  ): boolean => {
259
- const { mapByRow, mapByColumn } = tableMap;
260
- const map = 'row' === direction ? mapByRow : mapByColumn;
261
- const lengthLimiter = direction === 'row' ? tableMap.width : tableMap.height;
262
- let minIndex = Math.min(...indexes);
263
- let maxIndex = Math.max(...indexes);
264
- let isTopSideHaveMergedCells = false;
265
- let isBottomSideHaveMergedCells = false;
266
-
267
- /**
250
+ const { mapByRow, mapByColumn } = tableMap;
251
+ const map = 'row' === direction ? mapByRow : mapByColumn;
252
+ const lengthLimiter = direction === 'row' ? tableMap.width : tableMap.height;
253
+ let minIndex = Math.min(...indexes);
254
+ let maxIndex = Math.max(...indexes);
255
+ let isTopSideHaveMergedCells = false;
256
+ let isBottomSideHaveMergedCells = false;
257
+
258
+ /**
268
259
  * this is to check if the cell position from last focused table is overflow. since if you selection from a cell in 6th row and 7th column cell in a 7x8 table to 3x3 table, the cell position will be overflow because new table dont have this cell at all.
269
260
  TODO: ED-22335 this should better called only when hover over the drag handle.
270
261
  */
271
- let isOldMinIndex = !map[minIndex - 1] || !map[minIndex];
272
- let isOldMaxIndex = !map[maxIndex + 1] || !map[maxIndex];
273
-
274
- if (minIndex > 0 && !isOldMinIndex) {
275
- const prevSelectionSet = map[minIndex - 1];
276
- const minSelectionSet = map[minIndex];
277
- for (let i = 0; i < lengthLimiter; i++) {
278
- if (prevSelectionSet[i] === minSelectionSet[i]) {
279
- isTopSideHaveMergedCells = true;
280
- break;
281
- }
282
- }
283
- }
284
-
285
- if (maxIndex < map.length - 1 && !isOldMaxIndex) {
286
- const afterSelectionSet = map[maxIndex + 1];
287
- const maxSelectionSet = map[maxIndex];
288
-
289
- for (let i = 0; i < lengthLimiter; i++) {
290
- if (afterSelectionSet[i] === maxSelectionSet[i]) {
291
- isBottomSideHaveMergedCells = true;
292
- break;
293
- }
294
- }
295
- }
296
- return isTopSideHaveMergedCells || isBottomSideHaveMergedCells;
262
+ let isOldMinIndex = !map[minIndex - 1] || !map[minIndex];
263
+ let isOldMaxIndex = !map[maxIndex + 1] || !map[maxIndex];
264
+
265
+ if (minIndex > 0 && !isOldMinIndex) {
266
+ const prevSelectionSet = map[minIndex - 1];
267
+ const minSelectionSet = map[minIndex];
268
+ for (let i = 0; i < lengthLimiter; i++) {
269
+ if (prevSelectionSet[i] === minSelectionSet[i]) {
270
+ isTopSideHaveMergedCells = true;
271
+ break;
272
+ }
273
+ }
274
+ }
275
+
276
+ if (maxIndex < map.length - 1 && !isOldMaxIndex) {
277
+ const afterSelectionSet = map[maxIndex + 1];
278
+ const maxSelectionSet = map[maxIndex];
279
+
280
+ for (let i = 0; i < lengthLimiter; i++) {
281
+ if (afterSelectionSet[i] === maxSelectionSet[i]) {
282
+ isBottomSideHaveMergedCells = true;
283
+ break;
284
+ }
285
+ }
286
+ }
287
+ return isTopSideHaveMergedCells || isBottomSideHaveMergedCells;
297
288
  };
298
289
 
299
290
  /**
@@ -303,8 +294,8 @@ export const checkEdgeHasMergedCells = (
303
294
  * @returns []
304
295
  */
305
296
  export const findDuplicatePosition = (array: number[]): number[] => {
306
- if (!array) {
307
- return [];
308
- }
309
- return array.filter((item, index) => array.indexOf(item) !== index);
297
+ if (!array) {
298
+ return [];
299
+ }
300
+ return array.filter((item, index) => array.indexOf(item) !== index);
310
301
  };