@atlaskit/editor-plugin-table 7.16.10 → 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 +1836 -1831
- 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 +19 -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 +808 -814
- 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 +19 -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 +5 -4
- 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 +881 -903
- 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
- package/tsconfig.app.json +107 -107
- package/tsconfig.dev.json +47 -47
package/src/utils/nodes.ts
CHANGED
|
@@ -1,155 +1,143 @@
|
|
|
1
1
|
import { mapChildren } from '@atlaskit/editor-common/utils';
|
|
2
2
|
import type { Node as PmNode } from '@atlaskit/editor-prosemirror/model';
|
|
3
|
-
import type {
|
|
4
|
-
EditorState,
|
|
5
|
-
Selection,
|
|
6
|
-
} from '@atlaskit/editor-prosemirror/state';
|
|
3
|
+
import type { EditorState, Selection } from '@atlaskit/editor-prosemirror/state';
|
|
7
4
|
import { TableMap } from '@atlaskit/editor-tables/table-map';
|
|
8
5
|
import { findTable } from '@atlaskit/editor-tables/utils';
|
|
9
6
|
|
|
10
7
|
export const isIsolating = (node: PmNode): boolean => {
|
|
11
|
-
|
|
8
|
+
return !!node.type.spec.isolating;
|
|
12
9
|
};
|
|
13
10
|
|
|
14
11
|
export const containsHeaderColumn = (table: PmNode): boolean => {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
12
|
+
const map = TableMap.get(table);
|
|
13
|
+
// Get cell positions for first column.
|
|
14
|
+
const cellPositions = map.cellsInRect({
|
|
15
|
+
left: 0,
|
|
16
|
+
top: 0,
|
|
17
|
+
right: 1,
|
|
18
|
+
bottom: map.height,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
for (let i = 0; i < cellPositions.length; i++) {
|
|
22
|
+
try {
|
|
23
|
+
const cell = table.nodeAt(cellPositions[i]);
|
|
24
|
+
if (cell && cell.type !== table.type.schema.nodes.tableHeader) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
} catch (e) {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return true;
|
|
36
33
|
};
|
|
37
34
|
|
|
38
35
|
export const containsHeaderRow = (table: PmNode): boolean => {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
36
|
+
const map = TableMap.get(table);
|
|
37
|
+
for (let i = 0; i < map.width; i++) {
|
|
38
|
+
const cell = table.nodeAt(map.map[i]);
|
|
39
|
+
if (cell && cell.type !== table.type.schema.nodes.tableHeader) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return true;
|
|
47
44
|
};
|
|
48
45
|
|
|
49
46
|
export const checkIfHeaderColumnEnabled = (selection: Selection): boolean =>
|
|
50
|
-
|
|
47
|
+
filterNearSelection(selection, findTable, containsHeaderColumn, false);
|
|
51
48
|
|
|
52
49
|
export const checkIfHeaderRowEnabled = (selection: Selection): boolean =>
|
|
53
|
-
|
|
50
|
+
filterNearSelection(selection, findTable, containsHeaderRow, false);
|
|
54
51
|
|
|
55
52
|
export const checkIfNumberColumnEnabled = (selection: Selection): boolean =>
|
|
56
|
-
|
|
57
|
-
selection,
|
|
58
|
-
findTable,
|
|
59
|
-
(table) => !!table.attrs.isNumberColumnEnabled,
|
|
60
|
-
false,
|
|
61
|
-
);
|
|
53
|
+
filterNearSelection(selection, findTable, (table) => !!table.attrs.isNumberColumnEnabled, false);
|
|
62
54
|
|
|
63
55
|
export const getTableWidth = (node: PmNode) => {
|
|
64
|
-
|
|
56
|
+
return getTableWidths(node).reduce((acc, current) => acc + current, 0);
|
|
65
57
|
};
|
|
66
58
|
|
|
67
59
|
export const tablesHaveDifferentColumnWidths = (
|
|
68
|
-
|
|
69
|
-
|
|
60
|
+
currentTable: PmNode,
|
|
61
|
+
previousTable: PmNode,
|
|
70
62
|
): boolean => {
|
|
71
|
-
|
|
72
|
-
|
|
63
|
+
let currentTableWidths = getTableWidths(currentTable);
|
|
64
|
+
let previousTableWidths = getTableWidths(previousTable);
|
|
73
65
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
66
|
+
if (currentTableWidths.length !== previousTableWidths.length) {
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
77
69
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
},
|
|
82
|
-
);
|
|
70
|
+
const sameWidths = currentTableWidths.every((value: number, index: number) => {
|
|
71
|
+
return value === previousTableWidths[index];
|
|
72
|
+
});
|
|
83
73
|
|
|
84
|
-
|
|
74
|
+
return sameWidths === false;
|
|
85
75
|
};
|
|
86
76
|
|
|
87
77
|
export const tablesHaveDifferentNoOfColumns = (
|
|
88
|
-
|
|
89
|
-
|
|
78
|
+
currentTable: PmNode,
|
|
79
|
+
previousTable: PmNode,
|
|
90
80
|
): boolean => {
|
|
91
|
-
|
|
92
|
-
|
|
81
|
+
const prevMap = TableMap.get(previousTable);
|
|
82
|
+
const currentMap = TableMap.get(currentTable);
|
|
93
83
|
|
|
94
|
-
|
|
84
|
+
return prevMap.width !== currentMap.width;
|
|
95
85
|
};
|
|
96
86
|
|
|
97
87
|
export const tablesHaveDifferentNoOfRows = (
|
|
98
|
-
|
|
99
|
-
|
|
88
|
+
currentTable: PmNode,
|
|
89
|
+
previousTable: PmNode,
|
|
100
90
|
): boolean => {
|
|
101
|
-
|
|
102
|
-
|
|
91
|
+
const prevMap = TableMap.get(previousTable);
|
|
92
|
+
const currentMap = TableMap.get(currentTable);
|
|
103
93
|
|
|
104
|
-
|
|
94
|
+
return prevMap.height !== currentMap.height;
|
|
105
95
|
};
|
|
106
96
|
|
|
107
97
|
function filterNearSelection<T, U>(
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
98
|
+
selection: Selection,
|
|
99
|
+
findNode: (selection: Selection) => { pos: number; node: PmNode } | undefined,
|
|
100
|
+
predicate: (node: PmNode, pos?: number) => T,
|
|
101
|
+
defaultValue: U,
|
|
112
102
|
): T | U {
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
103
|
+
const found = findNode(selection);
|
|
104
|
+
if (!found) {
|
|
105
|
+
return defaultValue;
|
|
106
|
+
}
|
|
117
107
|
|
|
118
|
-
|
|
108
|
+
return predicate(found.node, found.pos);
|
|
119
109
|
}
|
|
120
110
|
|
|
121
111
|
function getTableWidths(node: PmNode): number[] {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
112
|
+
if (!node.content.firstChild) {
|
|
113
|
+
return [];
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let tableWidths: Array<number> = [];
|
|
117
|
+
node.content.firstChild.content.forEach((cell) => {
|
|
118
|
+
if (Array.isArray(cell.attrs.colwidth)) {
|
|
119
|
+
const colspan = cell.attrs.colspan || 1;
|
|
120
|
+
tableWidths.push(...cell.attrs.colwidth.slice(0, colspan));
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
return tableWidths;
|
|
135
125
|
}
|
|
136
126
|
|
|
137
127
|
export const isTableNested = (state: EditorState, tablePos = 0): boolean => {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
128
|
+
const parent = state.doc.resolve(tablePos).parent;
|
|
129
|
+
const nodeTypes = state.schema.nodes;
|
|
130
|
+
|
|
131
|
+
return (
|
|
132
|
+
parent.type === nodeTypes.layoutColumn ||
|
|
133
|
+
parent.type === nodeTypes.expand ||
|
|
134
|
+
parent.type === nodeTypes.bodiedExtension ||
|
|
135
|
+
parent.type === nodeTypes.extensionFrame
|
|
136
|
+
);
|
|
147
137
|
};
|
|
148
138
|
|
|
149
139
|
export const anyChildCellMergedAcrossRow = (node: PmNode): boolean =>
|
|
150
|
-
|
|
151
|
-
(rowspan) => rowspan > 1,
|
|
152
|
-
);
|
|
140
|
+
mapChildren(node, (child) => child.attrs.rowspan || 0).some((rowspan) => rowspan > 1);
|
|
153
141
|
|
|
154
142
|
/**
|
|
155
143
|
* Check if a given node is a header row with this definition:
|
|
@@ -160,12 +148,9 @@ export const anyChildCellMergedAcrossRow = (node: PmNode): boolean =>
|
|
|
160
148
|
* @return boolean if it meets definition
|
|
161
149
|
*/
|
|
162
150
|
export const supportedHeaderRow = (node: PmNode): boolean => {
|
|
163
|
-
|
|
164
|
-
node,
|
|
165
|
-
(child) => child.type.name === 'tableHeader',
|
|
166
|
-
).every(Boolean);
|
|
151
|
+
const allHeaders = mapChildren(node, (child) => child.type.name === 'tableHeader').every(Boolean);
|
|
167
152
|
|
|
168
|
-
|
|
153
|
+
const someMerged = anyChildCellMergedAcrossRow(node);
|
|
169
154
|
|
|
170
|
-
|
|
155
|
+
return allHeaders && !someMerged;
|
|
171
156
|
};
|
package/src/utils/paste.ts
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
1
|
import { flatmap, mapSlice } from '@atlaskit/editor-common/utils';
|
|
2
|
-
import type {
|
|
3
|
-
Node as PMNode,
|
|
4
|
-
Schema,
|
|
5
|
-
} from '@atlaskit/editor-prosemirror/model';
|
|
2
|
+
import type { Node as PMNode, Schema } from '@atlaskit/editor-prosemirror/model';
|
|
6
3
|
import { Fragment, Slice } from '@atlaskit/editor-prosemirror/model';
|
|
7
4
|
import type { EditorState } from '@atlaskit/editor-prosemirror/state';
|
|
8
5
|
import { flatten } from '@atlaskit/editor-prosemirror/utils';
|
|
@@ -10,37 +7,32 @@ import { flatten } from '@atlaskit/editor-prosemirror/utils';
|
|
|
10
7
|
import { getPluginState } from '../pm-plugins/plugin-factory';
|
|
11
8
|
|
|
12
9
|
// lifts up the content of each cell, returning an array of nodes
|
|
13
|
-
export const unwrapContentFromTable = (
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
28
|
-
return maybeTable;
|
|
10
|
+
export const unwrapContentFromTable = (maybeTable: PMNode): PMNode | PMNode[] => {
|
|
11
|
+
const { schema } = maybeTable.type;
|
|
12
|
+
if (maybeTable.type === schema.nodes.table) {
|
|
13
|
+
const content: PMNode[] = [];
|
|
14
|
+
const { tableCell, tableHeader } = schema.nodes;
|
|
15
|
+
maybeTable.descendants((maybeCell) => {
|
|
16
|
+
if (maybeCell.type === tableCell || maybeCell.type === tableHeader) {
|
|
17
|
+
content.push(...flatten(maybeCell, false).map((child) => child.node));
|
|
18
|
+
}
|
|
19
|
+
return true;
|
|
20
|
+
});
|
|
21
|
+
return content;
|
|
22
|
+
}
|
|
23
|
+
return maybeTable;
|
|
29
24
|
};
|
|
30
25
|
|
|
31
|
-
export const removeTableFromFirstChild = (
|
|
32
|
-
|
|
33
|
-
i: number,
|
|
34
|
-
): PMNode | PMNode[] => {
|
|
35
|
-
return i === 0 ? unwrapContentFromTable(node) : node;
|
|
26
|
+
export const removeTableFromFirstChild = (node: PMNode, i: number): PMNode | PMNode[] => {
|
|
27
|
+
return i === 0 ? unwrapContentFromTable(node) : node;
|
|
36
28
|
};
|
|
37
29
|
|
|
38
30
|
export const removeTableFromLastChild = (
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
node: PMNode,
|
|
32
|
+
i: number,
|
|
33
|
+
fragment: Fragment,
|
|
42
34
|
): PMNode | PMNode[] => {
|
|
43
|
-
|
|
35
|
+
return i === fragment.childCount - 1 ? unwrapContentFromTable(node) : node;
|
|
44
36
|
};
|
|
45
37
|
|
|
46
38
|
/**
|
|
@@ -49,118 +41,110 @@ export const removeTableFromLastChild = (
|
|
|
49
41
|
* This code will look for that pattern and fix it.
|
|
50
42
|
*/
|
|
51
43
|
export const transformSliceToFixHardBreakProblemOnCopyFromCell = (
|
|
52
|
-
|
|
53
|
-
|
|
44
|
+
slice: Slice,
|
|
45
|
+
schema: Schema,
|
|
54
46
|
): Slice => {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
return slice;
|
|
47
|
+
const { paragraph, table, hardBreak } = schema.nodes;
|
|
48
|
+
const emptyParagraphNode = paragraph.createAndFill();
|
|
49
|
+
|
|
50
|
+
const hardBreakNode = hardBreak?.createAndFill();
|
|
51
|
+
const paragraphNodeSize = emptyParagraphNode ? emptyParagraphNode.nodeSize : 0;
|
|
52
|
+
const hardBreakNodeSize = hardBreakNode ? hardBreakNode.nodeSize : 0;
|
|
53
|
+
const paragraphWithHardBreakSize = paragraphNodeSize + hardBreakNodeSize;
|
|
54
|
+
|
|
55
|
+
if (
|
|
56
|
+
slice.content.childCount === 2 &&
|
|
57
|
+
slice.content.firstChild &&
|
|
58
|
+
slice.content.lastChild &&
|
|
59
|
+
slice.content.firstChild.type === table &&
|
|
60
|
+
slice.content.lastChild.type === paragraph &&
|
|
61
|
+
slice.content.lastChild.nodeSize === paragraphWithHardBreakSize
|
|
62
|
+
) {
|
|
63
|
+
const nodes = unwrapContentFromTable(slice.content.firstChild);
|
|
64
|
+
if (nodes instanceof Array) {
|
|
65
|
+
return new Slice(
|
|
66
|
+
Fragment.from(
|
|
67
|
+
// keep only the content and discard the hardBreak
|
|
68
|
+
nodes[0],
|
|
69
|
+
),
|
|
70
|
+
slice.openStart,
|
|
71
|
+
slice.openEnd,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
return slice;
|
|
87
77
|
};
|
|
88
78
|
|
|
89
|
-
export const transformSliceToRemoveOpenTable = (
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
return slice;
|
|
79
|
+
export const transformSliceToRemoveOpenTable = (slice: Slice, schema: Schema): Slice => {
|
|
80
|
+
// we're removing the table, tableRow and tableCell reducing the open depth by 3
|
|
81
|
+
const depthDecrement = 3;
|
|
82
|
+
|
|
83
|
+
// Case 1: A slice entirely within a single CELL
|
|
84
|
+
if (
|
|
85
|
+
// starts and ends inside of a cell
|
|
86
|
+
slice.openStart >= 4 &&
|
|
87
|
+
slice.openEnd >= 4 &&
|
|
88
|
+
// slice is a table node
|
|
89
|
+
slice.content.childCount === 1 &&
|
|
90
|
+
slice.content.firstChild!.type === schema.nodes.table
|
|
91
|
+
) {
|
|
92
|
+
// prosemirror-view has a bug that it duplicates table entry when selecting multiple paragraphs in a table cell.
|
|
93
|
+
// https://github.com/ProseMirror/prosemirror/issues/1270
|
|
94
|
+
// The structure becomes
|
|
95
|
+
// table(genuine) > tableRow(genuine) > table(duplicated) > tableRow(duplicated) > tableCell/tableHeader(genuine) > contents(genuine)
|
|
96
|
+
// As we are removing wrapping table anyway, we keep duplicated table and tableRow for simplicity
|
|
97
|
+
let cleaned = slice;
|
|
98
|
+
if (
|
|
99
|
+
slice.content.firstChild?.content?.firstChild?.content?.firstChild?.type ===
|
|
100
|
+
schema.nodes.table
|
|
101
|
+
) {
|
|
102
|
+
cleaned = new Slice(
|
|
103
|
+
slice.content.firstChild.content.firstChild.content,
|
|
104
|
+
slice.openStart - 2,
|
|
105
|
+
slice.openEnd - 2,
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return new Slice(
|
|
110
|
+
flatmap(cleaned.content, unwrapContentFromTable),
|
|
111
|
+
cleaned.openStart - depthDecrement,
|
|
112
|
+
cleaned.openEnd - depthDecrement,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Case 2: A slice starting within a CELL and ending outside the table
|
|
117
|
+
if (
|
|
118
|
+
// starts inside of a cell but ends outside of the starting table
|
|
119
|
+
slice.openStart >= 4 &&
|
|
120
|
+
// slice starts from a table node (and spans across more than one node)
|
|
121
|
+
slice.content.childCount > 1 &&
|
|
122
|
+
slice.content.firstChild?.type === schema.nodes.table
|
|
123
|
+
) {
|
|
124
|
+
// repoint the slice's cutting depth so that cell content where the slice starts
|
|
125
|
+
// does not get lifted out of the cell on paste
|
|
126
|
+
return new Slice(slice.content, 1, slice.openEnd);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return slice;
|
|
143
130
|
};
|
|
144
131
|
|
|
145
|
-
export const transformSliceToCorrectEmptyTableCells = (
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
return node;
|
|
160
|
-
});
|
|
132
|
+
export const transformSliceToCorrectEmptyTableCells = (slice: Slice, schema: Schema): Slice => {
|
|
133
|
+
const { tableCell, tableHeader } = schema.nodes;
|
|
134
|
+
return mapSlice(slice, (node) => {
|
|
135
|
+
if (
|
|
136
|
+
node &&
|
|
137
|
+
(node.type === tableCell || node.type === tableHeader) &&
|
|
138
|
+
!node.content.childCount
|
|
139
|
+
) {
|
|
140
|
+
return node.type.createAndFill(node.attrs) || node;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return node;
|
|
144
|
+
});
|
|
161
145
|
};
|
|
162
146
|
|
|
163
147
|
export function isHeaderRowRequired(state: EditorState) {
|
|
164
|
-
|
|
165
|
-
|
|
148
|
+
const tableState = getPluginState(state);
|
|
149
|
+
return tableState && tableState.pluginConfig.isHeaderRowRequired;
|
|
166
150
|
}
|