@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.
- package/.eslintrc.js +3 -3
- package/CHANGELOG.md +8 -0
- package/dist/cjs/commands/misc.js +3 -3
- package/dist/cjs/nodeviews/TableCell.js +10 -10
- package/dist/cjs/nodeviews/TableContainer.js +41 -6
- package/dist/cjs/nodeviews/TableResizer.js +7 -7
- package/dist/cjs/nodeviews/TableRow.js +23 -23
- package/dist/cjs/pm-plugins/table-resizing/plugin.js +3 -3
- package/dist/cjs/pm-plugins/table-resizing/utils/resize-state.js +4 -4
- package/dist/cjs/pm-plugins/table-resizing/utils/scale-table.js +3 -3
- package/dist/cjs/ui/FloatingContextualMenu/styles.js +1 -1
- package/dist/cjs/ui/FloatingDragMenu/styles.js +1 -1
- package/dist/cjs/ui/common-styles.js +13 -13
- package/dist/cjs/ui/ui-styles.js +25 -25
- package/dist/cjs/utils/merged-cells.js +3 -3
- package/dist/es2019/commands/misc.js +3 -3
- package/dist/es2019/nodeviews/TableContainer.js +43 -5
- package/dist/es2019/nodeviews/TableResizer.js +7 -7
- package/dist/es2019/nodeviews/TableRow.js +21 -21
- package/dist/es2019/pm-plugins/table-resizing/plugin.js +3 -3
- package/dist/es2019/pm-plugins/table-resizing/utils/resize-state.js +4 -4
- package/dist/es2019/pm-plugins/table-resizing/utils/scale-table.js +3 -3
- package/dist/es2019/ui/FloatingContextualMenu/styles.js +47 -47
- package/dist/es2019/ui/FloatingDragMenu/styles.js +30 -30
- package/dist/es2019/ui/common-styles.js +802 -816
- package/dist/es2019/ui/ui-styles.js +665 -678
- package/dist/es2019/utils/merged-cells.js +3 -3
- package/dist/esm/commands/misc.js +3 -3
- package/dist/esm/nodeviews/TableCell.js +10 -10
- package/dist/esm/nodeviews/TableContainer.js +42 -7
- package/dist/esm/nodeviews/TableResizer.js +7 -7
- package/dist/esm/nodeviews/TableRow.js +23 -23
- package/dist/esm/pm-plugins/table-resizing/plugin.js +3 -3
- package/dist/esm/pm-plugins/table-resizing/utils/resize-state.js +4 -4
- package/dist/esm/pm-plugins/table-resizing/utils/scale-table.js +3 -3
- package/dist/esm/ui/FloatingContextualMenu/styles.js +1 -1
- package/dist/esm/ui/FloatingDragMenu/styles.js +1 -1
- package/dist/esm/ui/common-styles.js +13 -13
- package/dist/esm/ui/ui-styles.js +25 -25
- package/dist/esm/utils/merged-cells.js +3 -3
- package/dist/types/pm-plugins/decorations/utils/index.d.ts +1 -1
- package/dist/types/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
- package/dist/types/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
- package/dist/types/pm-plugins/table-resizing/utils/index.d.ts +1 -1
- package/dist/types/ui/ColumnResizeWidget/index.d.ts +1 -1
- package/dist/types/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
- package/dist/types/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
- package/dist/types/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
- package/dist/types/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
- package/dist/types/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
- package/dist/types-ts4.5/pm-plugins/decorations/utils/index.d.ts +1 -1
- package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/autoscrollers.d.ts +1 -1
- package/dist/types-ts4.5/pm-plugins/drag-and-drop/utils/getDragBehaviour.d.ts +1 -1
- package/dist/types-ts4.5/pm-plugins/table-resizing/utils/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/ColumnResizeWidget/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.d.ts +1 -1
- package/dist/types-ts4.5/ui/FloatingToolbarLabel/FloatingToolbarLabel.d.ts +1 -1
- package/dist/types-ts4.5/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.d.ts +1 -1
- package/dist/types-ts4.5/ui/TableFloatingControls/CornerControls/index.d.ts +1 -1
- package/dist/types-ts4.5/ui/icons/DragHandleDisabledIcon.d.ts +1 -1
- package/docs/0-intro.tsx +9 -7
- package/package.json +2 -2
- package/report.api.md +67 -66
- package/src/commands/clear.ts +36 -44
- package/src/commands/collapse.ts +8 -8
- package/src/commands/column-resize.ts +412 -452
- package/src/commands/delete.ts +14 -14
- package/src/commands/display-mode.ts +10 -11
- package/src/commands/go-to-next-cell.ts +48 -54
- package/src/commands/hover.ts +210 -227
- package/src/commands/index.ts +35 -35
- package/src/commands/insert.ts +208 -235
- package/src/commands/misc.ts +655 -748
- package/src/commands/referentiality.ts +9 -9
- package/src/commands/selection.ts +433 -563
- package/src/commands/sort.ts +68 -86
- package/src/commands/split-cell.ts +14 -14
- package/src/commands/toggle.ts +69 -67
- package/src/commands-with-analytics.ts +570 -639
- package/src/create-plugin-config.ts +13 -13
- package/src/event-handlers.ts +513 -612
- package/src/handlers.ts +120 -133
- package/src/nodeviews/ExternalDropTargets.tsx +68 -73
- package/src/nodeviews/OverflowShadowsObserver.ts +148 -157
- package/src/nodeviews/TableCell.ts +47 -54
- package/src/nodeviews/TableComponent.tsx +1018 -1112
- package/src/nodeviews/TableComponentWithSharedState.tsx +91 -94
- package/src/nodeviews/TableContainer.tsx +363 -339
- package/src/nodeviews/TableNodeViewBase.ts +19 -24
- package/src/nodeviews/TableResizer.tsx +565 -657
- package/src/nodeviews/TableRow.ts +580 -629
- package/src/nodeviews/TableStickyScrollbar.ts +173 -190
- package/src/nodeviews/__mocks__/OverflowShadowsObserver.ts +8 -8
- package/src/nodeviews/__mocks__/OverridableMock.ts +14 -15
- package/src/nodeviews/table.tsx +345 -375
- package/src/nodeviews/types.ts +21 -24
- package/src/nodeviews/update-overflow-shadows.ts +8 -14
- package/src/plugin.tsx +578 -603
- package/src/pm-plugins/analytics/actions.ts +10 -12
- package/src/pm-plugins/analytics/commands.ts +31 -37
- package/src/pm-plugins/analytics/plugin-factory.ts +4 -2
- package/src/pm-plugins/analytics/plugin-key.ts +1 -3
- package/src/pm-plugins/analytics/plugin.ts +60 -70
- package/src/pm-plugins/analytics/reducer.ts +19 -19
- package/src/pm-plugins/analytics/types.ts +10 -10
- package/src/pm-plugins/analytics/utils/moved-event.ts +38 -38
- package/src/pm-plugins/decorations/plugin.ts +58 -77
- package/src/pm-plugins/decorations/utils/column-controls.ts +59 -71
- package/src/pm-plugins/decorations/utils/column-resizing.ts +50 -57
- package/src/pm-plugins/decorations/utils/compose-decorations.ts +6 -6
- package/src/pm-plugins/decorations/utils/index.ts +3 -6
- package/src/pm-plugins/decorations/utils/types.ts +7 -12
- package/src/pm-plugins/default-table-selection.ts +3 -3
- package/src/pm-plugins/drag-and-drop/actions.ts +25 -25
- package/src/pm-plugins/drag-and-drop/commands-with-analytics.ts +158 -190
- package/src/pm-plugins/drag-and-drop/commands.ts +154 -170
- package/src/pm-plugins/drag-and-drop/consts.ts +4 -5
- package/src/pm-plugins/drag-and-drop/plugin-factory.ts +23 -20
- package/src/pm-plugins/drag-and-drop/plugin-key.ts +1 -3
- package/src/pm-plugins/drag-and-drop/plugin.ts +329 -383
- package/src/pm-plugins/drag-and-drop/reducer.ts +30 -30
- package/src/pm-plugins/drag-and-drop/types.ts +8 -8
- package/src/pm-plugins/drag-and-drop/utils/autoscrollers.ts +38 -41
- package/src/pm-plugins/drag-and-drop/utils/getDragBehaviour.ts +3 -6
- package/src/pm-plugins/drag-and-drop/utils/monitor.ts +57 -70
- package/src/pm-plugins/keymap.ts +208 -220
- package/src/pm-plugins/main.ts +348 -400
- package/src/pm-plugins/plugin-factory.ts +32 -34
- package/src/pm-plugins/safari-delete-composition-text-issue-workaround.ts +83 -97
- package/src/pm-plugins/sticky-headers/commands.ts +2 -6
- package/src/pm-plugins/sticky-headers/plugin-key.ts +1 -3
- package/src/pm-plugins/sticky-headers/plugin-state.ts +41 -44
- package/src/pm-plugins/sticky-headers/plugin.ts +4 -4
- package/src/pm-plugins/sticky-headers/types.ts +8 -8
- package/src/pm-plugins/sticky-headers/util.ts +10 -10
- package/src/pm-plugins/table-analytics.ts +70 -72
- package/src/pm-plugins/table-local-id.ts +180 -184
- package/src/pm-plugins/table-resizing/commands.ts +72 -85
- package/src/pm-plugins/table-resizing/event-handlers.ts +298 -317
- package/src/pm-plugins/table-resizing/plugin-factory.ts +10 -10
- package/src/pm-plugins/table-resizing/plugin-key.ts +1 -3
- package/src/pm-plugins/table-resizing/plugin.ts +61 -68
- package/src/pm-plugins/table-resizing/reducer.ts +30 -33
- package/src/pm-plugins/table-resizing/utils/colgroup.ts +84 -84
- package/src/pm-plugins/table-resizing/utils/column-state.ts +78 -81
- package/src/pm-plugins/table-resizing/utils/content-width.ts +94 -114
- package/src/pm-plugins/table-resizing/utils/dom.ts +93 -110
- package/src/pm-plugins/table-resizing/utils/index.ts +29 -34
- package/src/pm-plugins/table-resizing/utils/misc.ts +94 -119
- package/src/pm-plugins/table-resizing/utils/resize-column.ts +93 -106
- package/src/pm-plugins/table-resizing/utils/resize-logic.ts +240 -257
- package/src/pm-plugins/table-resizing/utils/resize-state.ts +343 -372
- package/src/pm-plugins/table-resizing/utils/scale-table.ts +202 -207
- package/src/pm-plugins/table-resizing/utils/types.ts +17 -17
- package/src/pm-plugins/table-resizing/utils/unit-to-number.ts +1 -2
- package/src/pm-plugins/table-selection-keymap.ts +25 -51
- package/src/pm-plugins/table-width.ts +191 -204
- package/src/pm-plugins/view-mode-sort/index.ts +223 -227
- package/src/pm-plugins/view-mode-sort/plugin-key.ts +3 -2
- package/src/pm-plugins/view-mode-sort/types.ts +12 -12
- package/src/pm-plugins/view-mode-sort/utils.ts +108 -117
- package/src/reducer.ts +139 -155
- package/src/toolbar.tsx +815 -905
- package/src/transforms/column-width.ts +186 -213
- package/src/transforms/delete-columns.ts +208 -222
- package/src/transforms/delete-rows.ts +117 -121
- package/src/transforms/fix-tables.ts +190 -215
- package/src/transforms/merge.ts +263 -269
- package/src/transforms/replace-table.ts +27 -43
- package/src/transforms/split.ts +65 -75
- package/src/types.ts +421 -427
- package/src/ui/ColumnResizeWidget/index.tsx +40 -47
- package/src/ui/DragHandle/HandleIconComponent.tsx +9 -13
- package/src/ui/DragHandle/index.tsx +221 -250
- package/src/ui/DragPreview/index.tsx +35 -35
- package/src/ui/FloatingAlignmentButtons/FloatingAlignmentButtons.tsx +33 -41
- package/src/ui/FloatingContextualButton/FixedButton.tsx +154 -157
- package/src/ui/FloatingContextualButton/index.tsx +109 -115
- package/src/ui/FloatingContextualButton/styles.ts +43 -46
- package/src/ui/FloatingContextualMenu/ContextualMenu.tsx +634 -694
- package/src/ui/FloatingContextualMenu/index.tsx +83 -101
- package/src/ui/FloatingContextualMenu/styles.ts +57 -65
- package/src/ui/FloatingDeleteButton/DeleteButton.tsx +37 -37
- package/src/ui/FloatingDeleteButton/getPopUpOptions.ts +47 -57
- package/src/ui/FloatingDeleteButton/index.tsx +319 -350
- package/src/ui/FloatingDragMenu/DragMenu.tsx +555 -596
- package/src/ui/FloatingDragMenu/DropdownMenu.tsx +152 -162
- package/src/ui/FloatingDragMenu/index.tsx +88 -102
- package/src/ui/FloatingDragMenu/styles.ts +51 -54
- package/src/ui/FloatingInsertButton/InsertButton.tsx +204 -217
- package/src/ui/FloatingInsertButton/getPopupOptions.ts +100 -115
- package/src/ui/FloatingInsertButton/index.tsx +248 -292
- package/src/ui/FloatingToolbarLabel/FloatingToolbarLabel.tsx +24 -29
- package/src/ui/TableFloatingColumnControls/ColumnControls/index.tsx +308 -329
- package/src/ui/TableFloatingColumnControls/ColumnDropTargets/ColumnDropTarget.tsx +85 -94
- package/src/ui/TableFloatingColumnControls/ColumnDropTargets/index.tsx +46 -46
- package/src/ui/TableFloatingColumnControls/index.tsx +116 -136
- package/src/ui/TableFloatingControls/CornerControls/ClassicCornerControls.tsx +79 -91
- package/src/ui/TableFloatingControls/CornerControls/DragCornerControls.tsx +95 -102
- package/src/ui/TableFloatingControls/CornerControls/index.tsx +1 -4
- package/src/ui/TableFloatingControls/CornerControls/types.ts +8 -8
- package/src/ui/TableFloatingControls/FloatingControlsWithSelection.tsx +50 -50
- package/src/ui/TableFloatingControls/NumberColumn/index.tsx +111 -124
- package/src/ui/TableFloatingControls/RowControls/ClassicControls.tsx +86 -105
- package/src/ui/TableFloatingControls/RowControls/DragControls.tsx +305 -341
- package/src/ui/TableFloatingControls/RowDropTarget/index.tsx +72 -75
- package/src/ui/TableFloatingControls/index.tsx +191 -193
- package/src/ui/TableFullWidthLabel/index.tsx +20 -20
- package/src/ui/common-styles.ts +880 -912
- package/src/ui/consts.ts +29 -74
- package/src/ui/icons/AddColLeftIcon.tsx +33 -39
- package/src/ui/icons/AddColRightIcon.tsx +33 -39
- package/src/ui/icons/AddRowAboveIcon.tsx +16 -22
- package/src/ui/icons/AddRowBelowIcon.tsx +33 -39
- package/src/ui/icons/DisplayModeIcon.tsx +31 -31
- package/src/ui/icons/DragHandleDisabledIcon.tsx +19 -21
- package/src/ui/icons/DragHandleIcon.tsx +12 -12
- package/src/ui/icons/DragInMotionIcon.tsx +45 -52
- package/src/ui/icons/MergeCellsIcon.tsx +22 -28
- package/src/ui/icons/MinimisedHandle.tsx +9 -9
- package/src/ui/icons/SplitCellIcon.tsx +30 -36
- package/src/ui/ui-styles.ts +769 -798
- package/src/utils/alignment.ts +1 -1
- package/src/utils/analytics.ts +192 -208
- package/src/utils/collapse.ts +55 -64
- package/src/utils/column-controls.ts +237 -254
- package/src/utils/create.ts +30 -30
- package/src/utils/decoration.ts +482 -502
- package/src/utils/dom.ts +127 -134
- package/src/utils/drag-menu.ts +322 -373
- package/src/utils/get-allow-add-column-custom-step.ts +4 -5
- package/src/utils/guidelines.ts +10 -21
- package/src/utils/index.ts +68 -68
- package/src/utils/merged-cells.ts +245 -254
- package/src/utils/nodes.ts +91 -106
- package/src/utils/paste.ts +119 -135
- package/src/utils/row-controls.ts +199 -213
- package/src/utils/selection.ts +77 -87
- package/src/utils/snapping.ts +84 -97
- package/src/utils/table.ts +44 -44
- package/src/utils/transforms.ts +5 -5
- 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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
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
|
-
|
|
155
|
-
|
|
145
|
+
colIndex: number,
|
|
146
|
+
selection: Selection,
|
|
156
147
|
) => {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
194
|
-
|
|
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
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
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
228
|
+
const map = TableMap.get(table.node);
|
|
238
229
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
230
|
+
if (!map.hasMergedCells()) {
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
242
233
|
|
|
243
|
-
|
|
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
|
-
|
|
256
|
-
|
|
257
|
-
|
|
246
|
+
indexes: number[],
|
|
247
|
+
tableMap: TableMap,
|
|
248
|
+
direction: 'row' | 'column',
|
|
258
249
|
): boolean => {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
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
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
297
|
+
if (!array) {
|
|
298
|
+
return [];
|
|
299
|
+
}
|
|
300
|
+
return array.filter((item, index) => array.indexOf(item) !== index);
|
|
310
301
|
};
|