@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.
- package/.eslintrc.js +3 -3
- package/CHANGELOG.md +16 -0
- package/dist/cjs/commands/misc.js +3 -3
- package/dist/cjs/nodeviews/TableCell.js +10 -10
- package/dist/cjs/nodeviews/TableContainer.js +83 -27
- package/dist/cjs/nodeviews/TableResizer.js +40 -19
- 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/guidelines.js +7 -4
- package/dist/cjs/utils/merged-cells.js +3 -3
- package/dist/cjs/utils/snapping.js +7 -8
- package/dist/es2019/commands/misc.js +3 -3
- package/dist/es2019/nodeviews/TableContainer.js +70 -9
- package/dist/es2019/nodeviews/TableResizer.js +42 -21
- 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/guidelines.js +5 -2
- package/dist/es2019/utils/merged-cells.js +3 -3
- package/dist/es2019/utils/snapping.js +5 -6
- package/dist/esm/commands/misc.js +3 -3
- package/dist/esm/nodeviews/TableCell.js +10 -10
- package/dist/esm/nodeviews/TableContainer.js +85 -29
- package/dist/esm/nodeviews/TableResizer.js +42 -21
- 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/guidelines.js +6 -3
- package/dist/esm/utils/merged-cells.js +3 -3
- package/dist/esm/utils/snapping.js +6 -7
- package/dist/types/nodeviews/TableResizer.d.ts +2 -1
- 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/utils/guidelines.d.ts +2 -1
- package/dist/types/utils/snapping.d.ts +3 -2
- package/dist/types-ts4.5/nodeviews/TableResizer.d.ts +2 -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/dist/types-ts4.5/utils/guidelines.d.ts +2 -1
- package/dist/types-ts4.5/utils/snapping.d.ts +3 -2
- package/docs/0-intro.tsx +9 -7
- package/package.json +3 -3
- 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 +384 -340
- package/src/nodeviews/TableNodeViewBase.ts +19 -24
- package/src/nodeviews/TableResizer.tsx +642 -653
- 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 +16 -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 +87 -100
- 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,295 +5,278 @@ import type { EditorView } from '@atlaskit/editor-prosemirror/view';
|
|
|
5
5
|
import { CellSelection } from '@atlaskit/editor-tables/cell-selection';
|
|
6
6
|
import { TableMap } from '@atlaskit/editor-tables/table-map';
|
|
7
7
|
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
findTable,
|
|
9
|
+
getSelectionRect,
|
|
10
|
+
isColumnSelected,
|
|
11
|
+
isTableSelected,
|
|
12
12
|
} from '@atlaskit/editor-tables/utils';
|
|
13
13
|
|
|
14
14
|
import { TableCssClassName as ClassName } from '../types';
|
|
15
15
|
import { tableDeleteButtonSize } from '../ui/consts';
|
|
16
16
|
|
|
17
17
|
interface CellWidthInfo {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
width: number;
|
|
19
|
+
colspan: number;
|
|
20
|
+
colwidth: string | undefined;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
|
-
export const getColumnsWidths = (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
return widths;
|
|
23
|
+
export const getColumnsWidths = (view: EditorView): Array<number | undefined> => {
|
|
24
|
+
const { selection } = view.state;
|
|
25
|
+
let widths: Array<number | undefined> = [];
|
|
26
|
+
const table = findTable(selection);
|
|
27
|
+
if (table) {
|
|
28
|
+
const map = TableMap.get(table.node);
|
|
29
|
+
const domAtPos = view.domAtPos.bind(view);
|
|
30
|
+
|
|
31
|
+
// When there is no cell we need to fill it with undefined
|
|
32
|
+
widths = Array.from({ length: map.width });
|
|
33
|
+
for (let i = 0; i < map.width; i++) {
|
|
34
|
+
if (!map.isCellMergedTopLeft(0, i)) {
|
|
35
|
+
const node = table.node.nodeAt(map.map[i])!;
|
|
36
|
+
const pos = map.map[i] + table.start;
|
|
37
|
+
const cellRef = findDomRefAtPos(pos, domAtPos) as HTMLElement;
|
|
38
|
+
const rect = cellRef.getBoundingClientRect();
|
|
39
|
+
widths[i] = (rect ? rect.width : cellRef.offsetWidth) + 1;
|
|
40
|
+
i += node.attrs.colspan - 1;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return widths;
|
|
47
45
|
};
|
|
48
46
|
|
|
49
47
|
export const isColumnDeleteButtonVisible = (selection: Selection): boolean => {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
48
|
+
if (
|
|
49
|
+
!isTableSelected(selection) &&
|
|
50
|
+
selection instanceof CellSelection &&
|
|
51
|
+
selection.isColSelection()
|
|
52
|
+
) {
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
return false;
|
|
59
57
|
};
|
|
60
58
|
|
|
61
59
|
export const getColumnDeleteButtonParams = (
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
columnsWidths: Array<number | undefined>,
|
|
61
|
+
selection: Selection,
|
|
64
62
|
): { left: number; indexes: number[] } | null => {
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
63
|
+
const rect = getSelectionRect(selection);
|
|
64
|
+
if (!rect) {
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
let width = 0;
|
|
68
|
+
let offset = 0;
|
|
69
|
+
// find the columns before the selection
|
|
70
|
+
for (let i = 0; i < rect.left; i++) {
|
|
71
|
+
const colWidth = columnsWidths[i];
|
|
72
|
+
if (colWidth) {
|
|
73
|
+
offset += colWidth - 1;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
// these are the selected columns widths
|
|
77
|
+
const indexes: number[] = [];
|
|
78
|
+
for (let i = rect.left; i < rect.right; i++) {
|
|
79
|
+
const colWidth = columnsWidths[i];
|
|
80
|
+
if (colWidth) {
|
|
81
|
+
width += colWidth;
|
|
82
|
+
indexes.push(i);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const left = offset + width / 2 - tableDeleteButtonSize / 2;
|
|
87
|
+
return { left, indexes };
|
|
90
88
|
};
|
|
91
89
|
|
|
92
90
|
export const getColumnClassNames = (
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
index: number,
|
|
92
|
+
selection: Selection,
|
|
93
|
+
hoveredColumns: number[] = [],
|
|
94
|
+
isInDanger?: boolean,
|
|
95
|
+
isResizing?: boolean,
|
|
98
96
|
): string => {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return classNames.join(' ');
|
|
97
|
+
const classNames: string[] = [];
|
|
98
|
+
if (isColumnSelected(index)(selection) || (hoveredColumns.indexOf(index) > -1 && !isResizing)) {
|
|
99
|
+
classNames.push(ClassName.HOVERED_CELL_ACTIVE);
|
|
100
|
+
if (isInDanger) {
|
|
101
|
+
classNames.push(ClassName.HOVERED_CELL_IN_DANGER);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return classNames.join(' ');
|
|
110
105
|
};
|
|
111
106
|
|
|
112
107
|
// give a row colspan and a colwidths
|
|
113
108
|
// and map to a row's colwidths
|
|
114
|
-
const mapTableColwidthsToRow = (
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
return colWidths;
|
|
109
|
+
const mapTableColwidthsToRow = (rowColSpans: number[], tableColWidths: number[]) => {
|
|
110
|
+
let curColIdx = 0;
|
|
111
|
+
const colWidths: number[] = [];
|
|
112
|
+
|
|
113
|
+
rowColSpans.forEach((cellColSpan) => {
|
|
114
|
+
const colWidth = tableColWidths
|
|
115
|
+
.slice(curColIdx, curColIdx + cellColSpan)
|
|
116
|
+
.reduce((acc, val) => acc + val, 0);
|
|
117
|
+
|
|
118
|
+
curColIdx += cellColSpan;
|
|
119
|
+
colWidths.push(colWidth);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
return colWidths;
|
|
131
123
|
};
|
|
132
124
|
|
|
133
|
-
const getRelativeDomCellWidths = ({
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
0,
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
return cellColWidths.map(
|
|
168
|
-
(cellColWidth) => width * (cellColWidth / totalCalculatedCellWidth),
|
|
169
|
-
);
|
|
125
|
+
const getRelativeDomCellWidths = ({ width, colspan, colwidth }: CellWidthInfo) => {
|
|
126
|
+
// For cells with colSpan 1
|
|
127
|
+
// or
|
|
128
|
+
// for cells in a table with unchanged column widths,
|
|
129
|
+
// these are identified by the lack of colwidth data attribute,
|
|
130
|
+
// return equally partitioned total cell width in DOM for each cell.
|
|
131
|
+
if (colspan === 1 || !colwidth) {
|
|
132
|
+
return new Array(colspan).fill(width / colspan);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// For cells that have colSpan > 1 and
|
|
136
|
+
// are part of a table with resized columns
|
|
137
|
+
// return the current total DOM width of the cell multiplied
|
|
138
|
+
// by the percentage of the each individual cell's size.
|
|
139
|
+
// The cell size percentage is calculated using individual colwidth of the cell,
|
|
140
|
+
// from data-colwidth attribute on the cell,
|
|
141
|
+
// divided by the total width of the cells from colwidths for merged cells.
|
|
142
|
+
|
|
143
|
+
// Ex:
|
|
144
|
+
// colwidth = ‘201,102’
|
|
145
|
+
// Total colWidth = 303
|
|
146
|
+
// returned cellWidths = [303 * (201/303), 303 * (102/303)]
|
|
147
|
+
|
|
148
|
+
// For merged cells we get back colwidth as `201,102`
|
|
149
|
+
const cellColWidths = colwidth.split(',').map((colwidth) => Number(colwidth));
|
|
150
|
+
const totalCalculatedCellWidth = cellColWidths.reduce(
|
|
151
|
+
(acc, cellColWidth) => acc + cellColWidth,
|
|
152
|
+
0,
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
return cellColWidths.map((cellColWidth) => width * (cellColWidth / totalCalculatedCellWidth));
|
|
170
156
|
};
|
|
171
157
|
|
|
172
158
|
export const colWidthsForRow = (tr: HTMLTableRowElement) => {
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
);
|
|
216
|
-
|
|
217
|
-
return pctWidths.map((pct) => `${pct}%`).join(' ');
|
|
159
|
+
// get the colspans
|
|
160
|
+
const rowColSpans = maphElem(tr, (cell) =>
|
|
161
|
+
Number(cell.getAttribute('colspan') || 1 /* default to span of 1 */),
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
// Chrome has trouble aligning borders with auto tables
|
|
165
|
+
// and the rest of the page grid. tables with defined
|
|
166
|
+
// column widths align fine.
|
|
167
|
+
//
|
|
168
|
+
// eg a 4x25% table might end up as 189px 190px 190px 190px
|
|
169
|
+
//
|
|
170
|
+
// prefer copying the widths via the DOM
|
|
171
|
+
// or inferring from the next row if one exists
|
|
172
|
+
const copyTarget = (tr.nextElementSibling as HTMLTableRowElement | null) || tr;
|
|
173
|
+
|
|
174
|
+
if (copyTarget) {
|
|
175
|
+
// either from the first row while it's still in the table
|
|
176
|
+
const cellInfos = maphElem(copyTarget, (cell) => ({
|
|
177
|
+
width: cell.getBoundingClientRect().width,
|
|
178
|
+
colspan: Number(cell.getAttribute('colspan') || 1),
|
|
179
|
+
colwidth: cell.dataset.colwidth,
|
|
180
|
+
}));
|
|
181
|
+
|
|
182
|
+
// reverse engineer cell widths from table widths
|
|
183
|
+
let domBasedCellWidths: number[] = [];
|
|
184
|
+
cellInfos.map((cell) => {
|
|
185
|
+
domBasedCellWidths.push(...getRelativeDomCellWidths(cell));
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
if (cellInfos.reduce((acc, cell) => acc + cell.width, 0) !== 0) {
|
|
189
|
+
const newWidths = mapTableColwidthsToRow(rowColSpans, domBasedCellWidths);
|
|
190
|
+
return newWidths.map((px) => `${px}px`).join(' ');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// as a fallback, just calculate a %, and hope that
|
|
195
|
+
// it aligns perfectly in the user's browser
|
|
196
|
+
const visualColCount = rowColSpans.reduce((acc, val) => acc + val, 0);
|
|
197
|
+
|
|
198
|
+
const pctWidths = rowColSpans.map((cellColSpan) => (cellColSpan / visualColCount) * 100);
|
|
199
|
+
|
|
200
|
+
return pctWidths.map((pct) => `${pct}%`).join(' ');
|
|
218
201
|
};
|
|
219
202
|
|
|
220
203
|
export const convertHTMLCellIndexToColumnIndex = (
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
204
|
+
htmlColIndex: number,
|
|
205
|
+
htmlRowIndex: number,
|
|
206
|
+
tableMap: TableMap,
|
|
224
207
|
): number => {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
208
|
+
// Same numbers (positions) in tableMap.map array mean that there are merged cells.
|
|
209
|
+
// Cells can be merged across columns. So we need to check if the cell on the left and current cell have the same value.
|
|
210
|
+
// Cells can be merged acroll rows. So we need to check if the cell above has the same value as current cell.
|
|
211
|
+
// When cell has the same value as the cell above it or the cell to the left of it, html cellIndex won't count it a separete column.
|
|
212
|
+
const width = tableMap.width;
|
|
213
|
+
const map = tableMap.map;
|
|
214
|
+
let htmlColCount = 0;
|
|
215
|
+
|
|
216
|
+
if (htmlRowIndex === 0) {
|
|
217
|
+
for (let colIndex = 0; colIndex < width; colIndex++) {
|
|
218
|
+
if (colIndex === 0 || map[colIndex] !== map[colIndex - 1]) {
|
|
219
|
+
htmlColCount++;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (htmlColCount - 1 === htmlColIndex) {
|
|
223
|
+
return colIndex;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
} else {
|
|
227
|
+
for (let colIndex = 0; colIndex < width; colIndex++) {
|
|
228
|
+
const currentCellMapIndex = htmlRowIndex * width + colIndex;
|
|
229
|
+
const cellAboveMapIndex = (htmlRowIndex - 1) * width + colIndex;
|
|
230
|
+
if (colIndex > 0) {
|
|
231
|
+
if (
|
|
232
|
+
map[currentCellMapIndex] !== map[currentCellMapIndex - 1] &&
|
|
233
|
+
map[currentCellMapIndex] !== map[cellAboveMapIndex]
|
|
234
|
+
) {
|
|
235
|
+
htmlColCount++;
|
|
236
|
+
}
|
|
237
|
+
} else {
|
|
238
|
+
if (map[currentCellMapIndex] !== map[cellAboveMapIndex]) {
|
|
239
|
+
htmlColCount++;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
if (htmlColCount - 1 === htmlColIndex) {
|
|
244
|
+
return colIndex;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
return 0;
|
|
267
250
|
};
|
|
268
251
|
|
|
269
252
|
// When first row has merged cells, our converted column index needs to be mapped.
|
|
270
253
|
export const getColumnIndexMappedToColumnIndexInFirstRow = (
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
254
|
+
convertedColIndex: number,
|
|
255
|
+
htmlRowIndex: number,
|
|
256
|
+
tableMap: TableMap,
|
|
274
257
|
): number => {
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
258
|
+
const width = tableMap.width;
|
|
259
|
+
const map = tableMap.map;
|
|
260
|
+
const mapColIndexToFistRowColIndex = [];
|
|
261
|
+
let htmlColCounFirstRow = 0;
|
|
262
|
+
let colSpan = 0;
|
|
263
|
+
|
|
264
|
+
if (htmlRowIndex === 0) {
|
|
265
|
+
return convertedColIndex;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
for (let colIndex = 0; colIndex < width; colIndex++) {
|
|
269
|
+
if (colIndex === 0 || map[colIndex] !== map[colIndex - 1]) {
|
|
270
|
+
if (colSpan > 0) {
|
|
271
|
+
htmlColCounFirstRow += colSpan;
|
|
272
|
+
colSpan = 0;
|
|
273
|
+
}
|
|
274
|
+
htmlColCounFirstRow++;
|
|
275
|
+
} else if (map[colIndex] === map[colIndex - 1]) {
|
|
276
|
+
colSpan++;
|
|
277
|
+
}
|
|
278
|
+
mapColIndexToFistRowColIndex[colIndex] = htmlColCounFirstRow - 1;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return mapColIndexToFistRowColIndex[convertedColIndex];
|
|
299
282
|
};
|
package/src/utils/create.ts
CHANGED
|
@@ -5,37 +5,37 @@ import { createTable } from '@atlaskit/editor-tables/utils';
|
|
|
5
5
|
import { TABLE_MAX_WIDTH } from '../pm-plugins/table-resizing/utils';
|
|
6
6
|
|
|
7
7
|
type CreateTableOverrides = {
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
tableWidth?: TableAttributes['width'];
|
|
9
|
+
layout?: TableAttributes['layout'];
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
export const createTableWithWidth =
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
13
|
+
({
|
|
14
|
+
isTableScalingEnabled,
|
|
15
|
+
isTableAlignmentEnabled,
|
|
16
|
+
isFullWidthModeEnabled,
|
|
17
|
+
createTableProps,
|
|
18
|
+
}: {
|
|
19
|
+
isTableScalingEnabled?: boolean;
|
|
20
|
+
isTableAlignmentEnabled?: boolean;
|
|
21
|
+
isFullWidthModeEnabled?: boolean;
|
|
22
|
+
createTableProps?: {
|
|
23
|
+
rowsCount?: number;
|
|
24
|
+
colsCount?: number;
|
|
25
|
+
};
|
|
26
|
+
}) =>
|
|
27
|
+
(schema: Schema) => {
|
|
28
|
+
const attrsOverrides: CreateTableOverrides = {};
|
|
29
|
+
if (isTableScalingEnabled && isFullWidthModeEnabled) {
|
|
30
|
+
attrsOverrides.tableWidth = TABLE_MAX_WIDTH;
|
|
31
|
+
}
|
|
32
|
+
if (isTableAlignmentEnabled && isFullWidthModeEnabled) {
|
|
33
|
+
attrsOverrides.layout = 'align-start';
|
|
34
|
+
}
|
|
35
35
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
36
|
+
return createTable({
|
|
37
|
+
schema,
|
|
38
|
+
...createTableProps,
|
|
39
|
+
...attrsOverrides,
|
|
40
|
+
});
|
|
41
|
+
};
|