@atlaskit/editor-tables 2.2.3 → 2.2.5
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/CHANGELOG.md +14 -0
- package/dist/cjs/cell-bookmark.js +0 -10
- package/dist/cjs/cell-selection.js +37 -102
- package/dist/cjs/index.js +0 -4
- package/dist/cjs/pm-plugins/input.js +24 -75
- package/dist/cjs/pm-plugins/plugin-key.js +0 -2
- package/dist/cjs/pm-plugins/table-editing.js +17 -18
- package/dist/cjs/pm-plugins.js +0 -2
- package/dist/cjs/table-map.js +63 -134
- package/dist/cjs/utils/add-column-at.js +0 -9
- package/dist/cjs/utils/add-column.js +8 -24
- package/dist/cjs/utils/add-row-at.js +8 -37
- package/dist/cjs/utils/add-row.js +2 -23
- package/dist/cjs/utils/analytics-helpers.js +4 -15
- package/dist/cjs/utils/cells.js +0 -12
- package/dist/cjs/utils/clone-tr.js +0 -2
- package/dist/cjs/utils/colspan.js +2 -18
- package/dist/cjs/utils/copy-paste.js +94 -120
- package/dist/cjs/utils/create-table.js +14 -28
- package/dist/cjs/utils/draw-cell-selection.js +0 -4
- package/dist/cjs/utils/empty-cells.js +0 -6
- package/dist/cjs/utils/find.js +6 -18
- package/dist/cjs/utils/fix-tables.js +13 -56
- package/dist/cjs/utils/for-each-cell.js +3 -17
- package/dist/cjs/utils/get-cell-selection-ranges.js +2 -9
- package/dist/cjs/utils/get-cells-in-column.js +0 -7
- package/dist/cjs/utils/get-cells-in-row.js +0 -7
- package/dist/cjs/utils/get-cells-in-table.js +0 -8
- package/dist/cjs/utils/get-selection-range-in-column.js +6 -27
- package/dist/cjs/utils/get-selection-range-in-row.js +6 -27
- package/dist/cjs/utils/get-selection-rect.js +0 -7
- package/dist/cjs/utils/go-to-next-cell.js +3 -22
- package/dist/cjs/utils/handle-paste.js +4 -33
- package/dist/cjs/utils/is-selected.js +6 -23
- package/dist/cjs/utils/is-selection-type.js +0 -2
- package/dist/cjs/utils/move-column.js +0 -12
- package/dist/cjs/utils/move-row.js +0 -11
- package/dist/cjs/utils/normalize-selection.js +3 -27
- package/dist/cjs/utils/remove-column.js +10 -46
- package/dist/cjs/utils/remove-row.js +8 -49
- package/dist/cjs/utils/remove-table.js +0 -6
- package/dist/cjs/utils/reorder-utils.js +13 -37
- package/dist/cjs/utils/replace-table.js +0 -8
- package/dist/cjs/utils/select-nodes.js +11 -31
- package/dist/cjs/utils/selection-cell.js +0 -5
- package/dist/cjs/utils/selection-rect.js +0 -10
- package/dist/cjs/utils/set-cell-attrs.js +0 -4
- package/dist/cjs/utils/split-cell-with-type.js +2 -35
- package/dist/cjs/utils/split-cell.js +0 -4
- package/dist/cjs/utils/table-node-types.js +4 -8
- package/dist/cjs/utils/tables.js +0 -4
- package/dist/cjs/utils/test-utils.js +9 -26
- package/dist/cjs/utils/toggle-header.js +4 -16
- package/dist/cjs/utils/uuid.js +0 -3
- package/dist/cjs/utils.js +0 -42
- package/dist/cjs/version.json +1 -1
- package/dist/es2019/cell-bookmark.js +0 -5
- package/dist/es2019/cell-selection.js +37 -81
- package/dist/es2019/index.js +1 -0
- package/dist/es2019/pm-plugins/input.js +27 -63
- package/dist/es2019/pm-plugins/table-editing.js +3 -12
- package/dist/es2019/table-map.js +54 -124
- package/dist/es2019/utils/add-column-at.js +2 -4
- package/dist/es2019/utils/add-column.js +6 -16
- package/dist/es2019/utils/add-row-at.js +8 -22
- package/dist/es2019/utils/add-row.js +2 -17
- package/dist/es2019/utils/analytics-helpers.js +0 -5
- package/dist/es2019/utils/cells.js +4 -9
- package/dist/es2019/utils/colspan.js +6 -11
- package/dist/es2019/utils/copy-paste.js +85 -99
- package/dist/es2019/utils/create-table.js +3 -12
- package/dist/es2019/utils/draw-cell-selection.js +0 -1
- package/dist/es2019/utils/empty-cells.js +2 -3
- package/dist/es2019/utils/find.js +8 -8
- package/dist/es2019/utils/fix-tables.js +17 -47
- package/dist/es2019/utils/for-each-cell.js +6 -11
- package/dist/es2019/utils/get-cell-selection-ranges.js +2 -4
- package/dist/es2019/utils/get-cells-in-column.js +2 -3
- package/dist/es2019/utils/get-cells-in-row.js +2 -3
- package/dist/es2019/utils/get-cells-in-table.js +2 -4
- package/dist/es2019/utils/get-selection-range-in-column.js +8 -22
- package/dist/es2019/utils/get-selection-range-in-row.js +8 -22
- package/dist/es2019/utils/get-selection-rect.js +2 -2
- package/dist/es2019/utils/go-to-next-cell.js +3 -19
- package/dist/es2019/utils/handle-paste.js +3 -14
- package/dist/es2019/utils/is-selected.js +8 -10
- package/dist/es2019/utils/is-selection-type.js +0 -1
- package/dist/es2019/utils/move-column.js +3 -8
- package/dist/es2019/utils/move-row.js +3 -7
- package/dist/es2019/utils/normalize-selection.js +0 -16
- package/dist/es2019/utils/remove-column.js +10 -27
- package/dist/es2019/utils/remove-row.js +12 -32
- package/dist/es2019/utils/remove-table.js +2 -4
- package/dist/es2019/utils/reorder-utils.js +11 -26
- package/dist/es2019/utils/replace-table.js +0 -2
- package/dist/es2019/utils/select-nodes.js +9 -20
- package/dist/es2019/utils/selection-cell.js +0 -2
- package/dist/es2019/utils/selection-rect.js +0 -4
- package/dist/es2019/utils/set-cell-attrs.js +2 -2
- package/dist/es2019/utils/split-cell-with-type.js +8 -28
- package/dist/es2019/utils/split-cell.js +3 -2
- package/dist/es2019/utils/table-node-types.js +4 -7
- package/dist/es2019/utils/tables.js +0 -2
- package/dist/es2019/utils/test-utils.js +12 -16
- package/dist/es2019/utils/toggle-header.js +4 -13
- package/dist/es2019/utils/uuid.js +0 -2
- package/dist/es2019/version.json +1 -1
- package/dist/esm/cell-bookmark.js +0 -5
- package/dist/esm/cell-selection.js +37 -79
- package/dist/esm/index.js +1 -0
- package/dist/esm/pm-plugins/input.js +24 -63
- package/dist/esm/pm-plugins/table-editing.js +8 -13
- package/dist/esm/table-map.js +65 -130
- package/dist/esm/utils/add-column-at.js +2 -4
- package/dist/esm/utils/add-column.js +8 -20
- package/dist/esm/utils/add-row-at.js +8 -23
- package/dist/esm/utils/add-row.js +2 -21
- package/dist/esm/utils/analytics-helpers.js +4 -10
- package/dist/esm/utils/cells.js +0 -5
- package/dist/esm/utils/colspan.js +2 -14
- package/dist/esm/utils/copy-paste.js +88 -109
- package/dist/esm/utils/create-table.js +14 -25
- package/dist/esm/utils/draw-cell-selection.js +0 -1
- package/dist/esm/utils/empty-cells.js +2 -3
- package/dist/esm/utils/find.js +8 -8
- package/dist/esm/utils/fix-tables.js +13 -49
- package/dist/esm/utils/for-each-cell.js +6 -11
- package/dist/esm/utils/get-cell-selection-ranges.js +2 -4
- package/dist/esm/utils/get-cells-in-column.js +2 -3
- package/dist/esm/utils/get-cells-in-row.js +2 -3
- package/dist/esm/utils/get-cells-in-table.js +2 -4
- package/dist/esm/utils/get-selection-range-in-column.js +8 -24
- package/dist/esm/utils/get-selection-range-in-row.js +8 -24
- package/dist/esm/utils/get-selection-rect.js +2 -2
- package/dist/esm/utils/go-to-next-cell.js +3 -19
- package/dist/esm/utils/handle-paste.js +4 -22
- package/dist/esm/utils/is-selected.js +8 -10
- package/dist/esm/utils/is-selection-type.js +0 -1
- package/dist/esm/utils/move-column.js +3 -8
- package/dist/esm/utils/move-row.js +3 -7
- package/dist/esm/utils/normalize-selection.js +3 -22
- package/dist/esm/utils/remove-column.js +10 -31
- package/dist/esm/utils/remove-row.js +8 -35
- package/dist/esm/utils/remove-table.js +2 -4
- package/dist/esm/utils/reorder-utils.js +11 -26
- package/dist/esm/utils/replace-table.js +0 -2
- package/dist/esm/utils/select-nodes.js +11 -22
- package/dist/esm/utils/selection-cell.js +0 -2
- package/dist/esm/utils/selection-rect.js +0 -4
- package/dist/esm/utils/set-cell-attrs.js +2 -2
- package/dist/esm/utils/split-cell-with-type.js +2 -28
- package/dist/esm/utils/split-cell.js +3 -2
- package/dist/esm/utils/table-node-types.js +4 -7
- package/dist/esm/utils/tables.js +0 -2
- package/dist/esm/utils/test-utils.js +12 -16
- package/dist/esm/utils/toggle-header.js +4 -13
- package/dist/esm/version.json +1 -1
- package/dist/types/utils/toggle-header.d.ts +3 -0
- package/package.json +7 -5
- package/report.api.md +11 -0
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
2
|
-
|
|
3
2
|
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
4
|
-
|
|
5
3
|
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
6
|
-
|
|
7
4
|
// Utilities used for copy/paste handling.
|
|
8
5
|
//
|
|
9
6
|
// This module handles pasting cell content into tables, or pasting
|
|
@@ -15,54 +12,70 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va
|
|
|
15
12
|
// cell selection is different, here the cells in the selection are
|
|
16
13
|
// clipped to the selection's rectangle, optionally repeating the
|
|
17
14
|
// pasted cells when they are smaller than the selection.
|
|
15
|
+
|
|
18
16
|
import { Fragment, Slice } from 'prosemirror-model';
|
|
19
17
|
import { Transform } from 'prosemirror-transform';
|
|
20
18
|
import { CellSelection } from '../cell-selection';
|
|
21
19
|
import { TableMap } from '../table-map';
|
|
22
20
|
import { removeColSpan } from './colspan';
|
|
23
|
-
import {
|
|
21
|
+
import { selectedRect } from './selection-rect';
|
|
22
|
+
import { tableNodeTypes } from './table-node-types';
|
|
23
|
+
import { isHeaderEnabledByType } from './toggle-header';
|
|
24
|
+
|
|
25
|
+
// Utilities to help with copying and pasting table cells
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Replace any header cells with table cells.
|
|
29
|
+
*
|
|
30
|
+
* @param schema
|
|
31
|
+
* @param cells
|
|
32
|
+
* @returns Fragment with header cells converted to table cells
|
|
33
|
+
*/
|
|
34
|
+
function stripHeaderType(schema, cells) {
|
|
35
|
+
var newCells = [];
|
|
36
|
+
cells.forEach(function (cell) {
|
|
37
|
+
var _cellNodeType$createA;
|
|
38
|
+
// Convert to cell type if not already
|
|
39
|
+
var cellNodeType = tableNodeTypes(schema).cell;
|
|
40
|
+
var tableCell = cell.type === cellNodeType ? cell : (_cellNodeType$createA = cellNodeType.createAndFill(cell.attrs, cell.content, cell.marks)) !== null && _cellNodeType$createA !== void 0 ? _cellNodeType$createA : cell;
|
|
41
|
+
newCells.push(tableCell);
|
|
42
|
+
});
|
|
43
|
+
return Fragment.from(newCells);
|
|
44
|
+
}
|
|
45
|
+
|
|
24
46
|
// : (Slice) → ?{width: number, height: number, rows: [Fragment]}
|
|
25
47
|
// Get a rectangular area of cells from a slice, or null if the outer
|
|
26
48
|
// nodes of the slice aren't table cells or rows.
|
|
27
|
-
|
|
28
49
|
export function pastedCells(slice) {
|
|
29
50
|
if (!slice.size) {
|
|
30
51
|
return null;
|
|
31
52
|
}
|
|
32
|
-
|
|
33
53
|
var content = slice.content,
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
54
|
+
openStart = slice.openStart,
|
|
55
|
+
openEnd = slice.openEnd;
|
|
37
56
|
if (!content.firstChild) {
|
|
38
57
|
throw new Error('pastedCells: no firstChild defined for content');
|
|
39
58
|
}
|
|
40
|
-
|
|
41
59
|
while (content.childCount === 1 && (openStart > 0 && openEnd > 0 || content.firstChild.type.spec.tableRole === 'table')) {
|
|
42
60
|
openStart--;
|
|
43
61
|
openEnd--;
|
|
44
62
|
content = content.firstChild.content;
|
|
45
|
-
|
|
46
63
|
if (!content.firstChild) {
|
|
47
64
|
throw new Error('pastedCells: no firstChild defined for content');
|
|
48
65
|
}
|
|
49
66
|
}
|
|
50
|
-
|
|
51
67
|
var first = content.firstChild;
|
|
52
68
|
var role = first.type.spec.tableRole;
|
|
53
69
|
var schema = first.type.schema;
|
|
54
70
|
var rows = [];
|
|
55
|
-
|
|
56
71
|
if (role === 'row') {
|
|
57
72
|
for (var i = 0; i < content.childCount; i++) {
|
|
58
73
|
var cells = content.child(i).content;
|
|
59
74
|
var left = i ? 0 : Math.max(0, openStart - 1);
|
|
60
75
|
var right = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1);
|
|
61
|
-
|
|
62
76
|
if (left || right) {
|
|
63
77
|
cells = fitSlice(tableNodeTypes(schema).row, new Slice(cells, left, right)).content;
|
|
64
78
|
}
|
|
65
|
-
|
|
66
79
|
rows.push(cells);
|
|
67
80
|
}
|
|
68
81
|
} else if (role === 'cell' || role === 'header_cell') {
|
|
@@ -70,350 +83,316 @@ export function pastedCells(slice) {
|
|
|
70
83
|
} else {
|
|
71
84
|
return null;
|
|
72
85
|
}
|
|
86
|
+
var rowsWithoutHeaders = rows.map(function (row) {
|
|
87
|
+
return stripHeaderType(schema, row);
|
|
88
|
+
});
|
|
89
|
+
return ensureRectangular(schema, rowsWithoutHeaders);
|
|
90
|
+
}
|
|
73
91
|
|
|
74
|
-
|
|
75
|
-
} // : (Schema, [Fragment]) → {width: number, height: number, rows: [Fragment]}
|
|
92
|
+
// : (Schema, [Fragment]) → {width: number, height: number, rows: [Fragment]}
|
|
76
93
|
// Compute the width and height of a set of cells, and make sure each
|
|
77
94
|
// row has the same number of cells.
|
|
78
|
-
|
|
79
95
|
function ensureRectangular(schema, rowsFragment) {
|
|
80
96
|
var rows = rowsFragment;
|
|
81
97
|
var widths = [];
|
|
82
|
-
|
|
83
98
|
for (var i = 0; i < rows.length; i++) {
|
|
84
99
|
var row = rows[i];
|
|
85
|
-
|
|
86
100
|
for (var j = row.childCount - 1; j >= 0; j--) {
|
|
87
101
|
var _row$child$attrs = row.child(j).attrs,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
102
|
+
rowspan = _row$child$attrs.rowspan,
|
|
103
|
+
colspan = _row$child$attrs.colspan;
|
|
91
104
|
for (var r = i; r < i + rowspan; r++) {
|
|
92
105
|
widths[r] = (widths[r] || 0) + colspan;
|
|
93
106
|
}
|
|
94
107
|
}
|
|
95
108
|
}
|
|
96
|
-
|
|
97
109
|
var width = 0;
|
|
98
|
-
|
|
99
110
|
for (var _r = 0; _r < widths.length; _r++) {
|
|
100
111
|
width = Math.max(width, widths[_r]);
|
|
101
112
|
}
|
|
102
|
-
|
|
103
113
|
for (var _r2 = 0; _r2 < widths.length; _r2++) {
|
|
104
114
|
if (_r2 >= rows.length) {
|
|
105
115
|
rows.push(Fragment.empty);
|
|
106
116
|
}
|
|
107
|
-
|
|
108
117
|
if (widths[_r2] < width) {
|
|
109
118
|
var empty = tableNodeTypes(schema).cell.createAndFill();
|
|
110
119
|
var cells = [];
|
|
111
|
-
|
|
112
120
|
for (var _i = widths[_r2]; _i < width; _i++) {
|
|
113
121
|
cells.push(empty);
|
|
114
122
|
}
|
|
115
|
-
|
|
116
123
|
rows[_r2] = rows[_r2].append(Fragment.from(cells));
|
|
117
124
|
}
|
|
118
125
|
}
|
|
119
|
-
|
|
120
126
|
return {
|
|
121
127
|
height: rows.length,
|
|
122
128
|
width: width,
|
|
123
129
|
rows: rows
|
|
124
130
|
};
|
|
125
131
|
}
|
|
126
|
-
|
|
127
132
|
export function fitSlice(nodeType, slice) {
|
|
128
133
|
var node = nodeType.createAndFill();
|
|
129
|
-
|
|
130
134
|
if (!node) {
|
|
131
135
|
throw new Error("fitSlice: unable to create node");
|
|
132
136
|
}
|
|
133
|
-
|
|
134
137
|
var tr = new Transform(node).replace(0, node.content.size, slice);
|
|
135
138
|
return tr.doc;
|
|
136
|
-
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// : ({width: number, height: number, rows: [Fragment]}, number, number) → {width: number, height: number, rows: [Fragment]}
|
|
137
142
|
// Clip or extend (repeat) the given set of cells to cover the given
|
|
138
143
|
// width and height. Will clip rowspan/colspan cells at the edges when
|
|
139
144
|
// they stick out.
|
|
140
|
-
|
|
141
145
|
export function clipCells(_ref, newWidth, newHeight) {
|
|
142
146
|
var currentWidth = _ref.width,
|
|
143
|
-
|
|
144
|
-
|
|
147
|
+
currentHeight = _ref.height,
|
|
148
|
+
currentRows = _ref.rows;
|
|
145
149
|
var rows = currentRows;
|
|
146
150
|
var width = currentWidth;
|
|
147
151
|
var height = currentHeight;
|
|
148
|
-
|
|
149
152
|
if (width !== newWidth) {
|
|
150
153
|
var added = [];
|
|
151
154
|
var newRows = [];
|
|
152
|
-
|
|
153
155
|
for (var row = 0; row < rows.length; row++) {
|
|
154
156
|
var frag = rows[row];
|
|
155
157
|
var cells = [];
|
|
156
|
-
|
|
157
158
|
for (var col = added[row] || 0, i = 0; col < newWidth; i++) {
|
|
158
159
|
var cell = frag.child(i % frag.childCount);
|
|
159
|
-
|
|
160
160
|
if (col + cell.attrs.colspan > newWidth) {
|
|
161
161
|
cell = cell.type.create(removeColSpan(cell.attrs, cell.attrs.colspan, col + cell.attrs.colspan - newWidth), cell.content);
|
|
162
162
|
}
|
|
163
|
-
|
|
164
163
|
cells.push(cell);
|
|
165
164
|
col += cell.attrs.colspan;
|
|
166
|
-
|
|
167
165
|
for (var j = 1; j < cell.attrs.rowspan; j++) {
|
|
168
166
|
added[row + j] = (added[row + j] || 0) + cell.attrs.colspan;
|
|
169
167
|
}
|
|
170
168
|
}
|
|
171
|
-
|
|
172
169
|
newRows.push(Fragment.from(cells));
|
|
173
170
|
}
|
|
174
|
-
|
|
175
171
|
rows = newRows;
|
|
176
172
|
width = newWidth;
|
|
177
173
|
}
|
|
178
|
-
|
|
179
174
|
if (height !== newHeight) {
|
|
180
175
|
var _newRows = [];
|
|
181
|
-
|
|
182
176
|
for (var _row = 0, _i2 = 0; _row < newHeight; _row++, _i2++) {
|
|
183
177
|
var _cells = [];
|
|
184
178
|
var source = rows[_i2 % height];
|
|
185
|
-
|
|
186
179
|
for (var _j = 0; _j < source.childCount; _j++) {
|
|
187
180
|
var _cell = source.child(_j);
|
|
188
|
-
|
|
189
181
|
if (_row + _cell.attrs.rowspan > newHeight) {
|
|
190
182
|
_cell = _cell.type.create(_objectSpread(_objectSpread({}, _cell.attrs), {}, {
|
|
191
183
|
rowspan: Math.max(1, newHeight - _cell.attrs.rowspan)
|
|
192
184
|
}), _cell.content);
|
|
193
185
|
}
|
|
194
|
-
|
|
195
186
|
_cells.push(_cell);
|
|
196
187
|
}
|
|
197
|
-
|
|
198
188
|
_newRows.push(Fragment.from(_cells));
|
|
199
189
|
}
|
|
200
|
-
|
|
201
190
|
rows = _newRows;
|
|
202
191
|
height = newHeight;
|
|
203
192
|
}
|
|
204
|
-
|
|
205
193
|
return {
|
|
206
194
|
width: width,
|
|
207
195
|
height: height,
|
|
208
196
|
rows: rows
|
|
209
197
|
};
|
|
210
|
-
}
|
|
211
|
-
// true if something was changed.
|
|
198
|
+
}
|
|
212
199
|
|
|
200
|
+
// Make sure a table has at least the given width and height. Return
|
|
201
|
+
// true if something was changed.
|
|
213
202
|
function growTable(tr, map, table, start, width, height, mapFrom) {
|
|
214
203
|
var schema = tr.doc.type.schema;
|
|
215
204
|
var types = tableNodeTypes(schema);
|
|
216
205
|
var empty;
|
|
217
206
|
var emptyHead;
|
|
218
|
-
|
|
219
207
|
if (width > map.width) {
|
|
220
208
|
for (var row = 0, rowEnd = 0; row < map.height; row++) {
|
|
221
209
|
var rowNode = table.child(row);
|
|
222
210
|
rowEnd += rowNode.nodeSize;
|
|
223
211
|
var cells = [];
|
|
224
212
|
var add = void 0;
|
|
225
|
-
|
|
226
213
|
if (rowNode.lastChild == null || rowNode.lastChild.type === types.cell) {
|
|
227
214
|
add = empty || (empty = types.cell.createAndFill());
|
|
228
215
|
} else {
|
|
229
216
|
add = emptyHead || (emptyHead = types.header_cell.createAndFill());
|
|
230
217
|
}
|
|
231
|
-
|
|
232
218
|
for (var i = map.width; i < width; i++) {
|
|
233
219
|
cells.push(add);
|
|
234
220
|
}
|
|
235
|
-
|
|
236
221
|
tr.insert(tr.mapping.slice(mapFrom).map(rowEnd - 1 + start), cells);
|
|
237
222
|
}
|
|
238
223
|
}
|
|
239
|
-
|
|
240
224
|
if (height > map.height) {
|
|
241
225
|
var _cells2 = [];
|
|
242
|
-
|
|
243
226
|
for (var _i3 = 0, k = (map.height - 1) * map.width; _i3 < Math.max(map.width, width); _i3++) {
|
|
244
227
|
var header = void 0;
|
|
245
|
-
|
|
246
228
|
if (_i3 >= map.width) {
|
|
247
229
|
header = false;
|
|
248
230
|
} else {
|
|
249
231
|
var mappedPos = map.map[k + _i3];
|
|
250
232
|
var node = table.nodeAt(mappedPos);
|
|
251
|
-
|
|
252
233
|
if (!node) {
|
|
253
234
|
throw new Error("growTable: no node found at pos ".concat(mappedPos));
|
|
254
235
|
}
|
|
255
|
-
|
|
256
236
|
header = node.type === types.header_cell;
|
|
257
237
|
}
|
|
258
|
-
|
|
259
238
|
_cells2.push(header ? emptyHead || (emptyHead = types.header_cell.createAndFill()) : empty || (empty = types.cell.createAndFill()));
|
|
260
239
|
}
|
|
261
|
-
|
|
262
240
|
var emptyRow = types.row.create(null, Fragment.from(_cells2));
|
|
263
241
|
var rows = [];
|
|
264
|
-
|
|
265
242
|
for (var _i4 = map.height; _i4 < height; _i4++) {
|
|
266
243
|
rows.push(emptyRow);
|
|
267
244
|
}
|
|
268
|
-
|
|
269
245
|
tr.insert(tr.mapping.slice(mapFrom).map(start + table.nodeSize - 2), rows);
|
|
270
246
|
}
|
|
271
|
-
|
|
272
247
|
return !!(empty || emptyHead);
|
|
273
|
-
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Make sure the given line (left, top) to (right, top) doesn't cross
|
|
274
251
|
// any rowspan cells by splitting cells that cross it. Return true if
|
|
275
252
|
// something changed.
|
|
276
|
-
|
|
277
|
-
|
|
278
253
|
function isolateHorizontal(tr, map, table, start, left, right, top, mapFrom) {
|
|
279
254
|
if (top === 0 || top === map.height) {
|
|
280
255
|
return false;
|
|
281
256
|
}
|
|
282
|
-
|
|
283
257
|
var found = false;
|
|
284
|
-
|
|
285
258
|
for (var col = left; col < right; col++) {
|
|
286
259
|
var index = top * map.width + col;
|
|
287
260
|
var pos = map.map[index];
|
|
288
|
-
|
|
289
261
|
if (map.map[index - map.width] === pos) {
|
|
290
262
|
found = true;
|
|
291
263
|
var cell = table.nodeAt(pos);
|
|
292
|
-
|
|
293
264
|
if (!cell) {
|
|
294
265
|
throw new Error("isolateHorizontal: no cell found at pos ".concat(pos));
|
|
295
266
|
}
|
|
296
|
-
|
|
297
267
|
var _map$findCell = map.findCell(pos),
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
268
|
+
cellTop = _map$findCell.top,
|
|
269
|
+
cellLeft = _map$findCell.left;
|
|
301
270
|
tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + start), undefined, _objectSpread(_objectSpread({}, cell.attrs), {}, {
|
|
302
271
|
rowspan: top - cellTop
|
|
303
272
|
}));
|
|
304
273
|
var newCell = cell.type.createAndFill(_objectSpread(_objectSpread({}, cell.attrs), {}, {
|
|
305
274
|
rowspan: cellTop + cell.attrs.rowspan - top
|
|
306
275
|
}));
|
|
307
|
-
|
|
308
276
|
if (!newCell) {
|
|
309
277
|
throw new Error('isolateHorizontal: failed to create cell');
|
|
310
278
|
}
|
|
311
|
-
|
|
312
279
|
tr.insert(tr.mapping.slice(mapFrom).map(map.positionAt(top, cellLeft, table)), newCell);
|
|
313
280
|
col += cell.attrs.colspan - 1;
|
|
314
281
|
}
|
|
315
282
|
}
|
|
316
|
-
|
|
317
283
|
return found;
|
|
318
|
-
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Make sure the given line (left, top) to (left, bottom) doesn't
|
|
319
287
|
// cross any colspan cells by splitting cells that cross it. Return
|
|
320
288
|
// true if something changed.
|
|
321
|
-
|
|
322
|
-
|
|
323
289
|
function isolateVertical(tr, map, table, start, top, bottom, left, mapFrom) {
|
|
324
290
|
if (left === 0 || left === map.width) {
|
|
325
291
|
return false;
|
|
326
292
|
}
|
|
327
|
-
|
|
328
293
|
var found = false;
|
|
329
|
-
|
|
330
294
|
for (var row = top; row < bottom; row++) {
|
|
331
295
|
var index = row * map.width + left;
|
|
332
296
|
var pos = map.map[index];
|
|
333
|
-
|
|
334
297
|
if (map.map[index - 1] === pos) {
|
|
335
298
|
found = true;
|
|
336
299
|
var cell = table.nodeAt(pos);
|
|
337
|
-
|
|
338
300
|
if (!cell) {
|
|
339
301
|
throw new Error("isolateVertical: could not find cell at pos ".concat(pos));
|
|
340
302
|
}
|
|
341
|
-
|
|
342
303
|
var cellLeft = map.colCount(pos);
|
|
343
304
|
var updatePos = tr.mapping.slice(mapFrom).map(pos + start);
|
|
344
305
|
tr.setNodeMarkup(updatePos, undefined, removeColSpan(cell.attrs, left - cellLeft, cell.attrs.colspan - (left - cellLeft)));
|
|
345
306
|
var newCell = cell.type.createAndFill(removeColSpan(cell.attrs, 0, left - cellLeft));
|
|
346
|
-
|
|
347
307
|
if (!newCell) {
|
|
348
308
|
throw new Error('isolateVertical: failed to create cell');
|
|
349
309
|
}
|
|
350
|
-
|
|
351
310
|
tr.insert(updatePos + cell.nodeSize, newCell);
|
|
352
311
|
row += cell.attrs.rowspan - 1;
|
|
353
312
|
}
|
|
354
313
|
}
|
|
355
|
-
|
|
356
314
|
return found;
|
|
357
|
-
}
|
|
358
|
-
|
|
315
|
+
}
|
|
316
|
+
function applyHeaderCells(tr, tableMap, state, tableStart, table, headerRowEnabled, headerColumnEnabled) {
|
|
317
|
+
var schema = state.schema;
|
|
318
|
+
var setMarkup = function setMarkup(tr, row, col, headerEnabled) {
|
|
319
|
+
var cellPos = tableStart + tableMap.positionAt(row, col, table);
|
|
320
|
+
var cell = tr.doc.nodeAt(cellPos);
|
|
321
|
+
var newType = headerEnabled ? schema.nodes.tableHeader : schema.nodes.tableCell;
|
|
322
|
+
var isCellTypeChanged = newType !== (cell === null || cell === void 0 ? void 0 : cell.type);
|
|
323
|
+
var isCellTypeValid = [schema.nodes.tableCell, schema.nodes.tableHeader].includes(cell === null || cell === void 0 ? void 0 : cell.type);
|
|
324
|
+
if (isCellTypeChanged && isCellTypeValid) {
|
|
325
|
+
tr.setNodeMarkup(cellPos, newType, cell === null || cell === void 0 ? void 0 : cell.attrs, cell === null || cell === void 0 ? void 0 : cell.marks);
|
|
326
|
+
}
|
|
327
|
+
};
|
|
359
328
|
|
|
329
|
+
// For row === 0 && col === 0 it is enabled if either are enabled
|
|
330
|
+
setMarkup(tr, 0, 0, headerColumnEnabled || headerRowEnabled);
|
|
331
|
+
|
|
332
|
+
// Header Column
|
|
333
|
+
for (var col = 1; col < tableMap.width; col++) {
|
|
334
|
+
setMarkup(tr, 0, col, headerRowEnabled);
|
|
335
|
+
}
|
|
336
|
+
// Header Row
|
|
337
|
+
for (var row = 1; row < tableMap.height; row++) {
|
|
338
|
+
setMarkup(tr, row, 0, headerColumnEnabled);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
360
341
|
|
|
342
|
+
// Insert the given set of cells (as returned by `pastedCells`) into a
|
|
343
|
+
// table, at the position pointed at by rect.
|
|
361
344
|
export function insertCells(state, dispatch, tableStart, rect, cells) {
|
|
362
345
|
var table = state.doc;
|
|
346
|
+
var newRect = selectedRect(state);
|
|
347
|
+
var types = tableNodeTypes(state.schema);
|
|
363
348
|
|
|
349
|
+
// Get if the header row and column are enabled on the original table
|
|
350
|
+
var headerRowEnabled = isHeaderEnabledByType('row', newRect, types);
|
|
351
|
+
var headerColumnEnabled = isHeaderEnabledByType('column', newRect, types);
|
|
364
352
|
if (tableStart) {
|
|
365
353
|
table = state.doc.nodeAt(tableStart - 1);
|
|
366
|
-
|
|
367
354
|
if (!table) {
|
|
368
355
|
throw new Error("insertCells: could not find table at pos ".concat(tableStart - 1));
|
|
369
356
|
}
|
|
370
357
|
}
|
|
371
|
-
|
|
372
358
|
var map = TableMap.get(table);
|
|
373
359
|
var top = rect.top,
|
|
374
|
-
|
|
360
|
+
left = rect.left;
|
|
375
361
|
var right = left + cells.width;
|
|
376
362
|
var bottom = top + cells.height;
|
|
377
363
|
var tr = state.tr;
|
|
378
364
|
var mapFrom = 0;
|
|
379
|
-
|
|
380
365
|
function recomp() {
|
|
381
366
|
table = tableStart ? tr.doc.nodeAt(tableStart - 1) : tr.doc;
|
|
382
367
|
map = TableMap.get(table);
|
|
383
368
|
mapFrom = tr.mapping.maps.length;
|
|
384
|
-
}
|
|
369
|
+
}
|
|
370
|
+
// Prepare the table to be large enough and not have any cells
|
|
385
371
|
// crossing the boundaries of the rectangle that we want to
|
|
386
372
|
// insert into. If anything about it changes, recompute the table
|
|
387
373
|
// map so that subsequent operations can see the current shape.
|
|
388
|
-
|
|
389
|
-
|
|
390
374
|
if (growTable(tr, map, table, tableStart, right, bottom, mapFrom)) {
|
|
391
375
|
recomp();
|
|
392
376
|
}
|
|
393
|
-
|
|
394
377
|
if (isolateHorizontal(tr, map, table, tableStart, left, right, top, mapFrom)) {
|
|
395
378
|
recomp();
|
|
396
379
|
}
|
|
397
|
-
|
|
398
380
|
if (isolateHorizontal(tr, map, table, tableStart, left, right, bottom, mapFrom)) {
|
|
399
381
|
recomp();
|
|
400
382
|
}
|
|
401
|
-
|
|
402
383
|
if (isolateVertical(tr, map, table, tableStart, top, bottom, left, mapFrom)) {
|
|
403
384
|
recomp();
|
|
404
385
|
}
|
|
405
|
-
|
|
406
386
|
if (isolateVertical(tr, map, table, tableStart, top, bottom, right, mapFrom)) {
|
|
407
387
|
recomp();
|
|
408
388
|
}
|
|
409
|
-
|
|
410
389
|
for (var row = top; row < bottom; row++) {
|
|
411
390
|
var from = map.positionAt(row, left, table);
|
|
412
391
|
var to = map.positionAt(row, right, table);
|
|
413
392
|
tr.replace(tr.mapping.slice(mapFrom).map(from + tableStart), tr.mapping.slice(mapFrom).map(to + tableStart), new Slice(cells.rows[row - top], 0, 0));
|
|
414
393
|
}
|
|
415
|
-
|
|
416
394
|
recomp();
|
|
395
|
+
applyHeaderCells(tr, map, state, tableStart, table, headerRowEnabled, headerColumnEnabled);
|
|
417
396
|
tr.setSelection(new CellSelection(tr.doc.resolve(tableStart + map.positionAt(top, left, table)), tr.doc.resolve(tableStart + map.positionAt(bottom - 1, right - 1, table))));
|
|
418
397
|
dispatch(tr);
|
|
419
398
|
}
|
|
@@ -1,58 +1,47 @@
|
|
|
1
1
|
import { tableNodeTypes } from './table-node-types';
|
|
2
2
|
import { uuid } from './uuid';
|
|
3
|
-
|
|
4
3
|
var createCell = function createCell(cellType, cellContent) {
|
|
5
4
|
if (cellContent) {
|
|
6
5
|
return cellType.createChecked(null, cellContent);
|
|
7
6
|
}
|
|
8
|
-
|
|
9
7
|
return cellType.createAndFill();
|
|
10
|
-
};
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
// Returns a table node of a given size.
|
|
11
11
|
// `withHeaderRow` defines whether the first row of the table will be a header row.
|
|
12
12
|
// `cellContent` defines the content of each cell.
|
|
13
|
-
|
|
14
|
-
|
|
15
13
|
export var createTable = function createTable(_ref) {
|
|
16
14
|
var schema = _ref.schema,
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
15
|
+
_ref$rowsCount = _ref.rowsCount,
|
|
16
|
+
rowsCount = _ref$rowsCount === void 0 ? 3 : _ref$rowsCount,
|
|
17
|
+
_ref$colsCount = _ref.colsCount,
|
|
18
|
+
colsCount = _ref$colsCount === void 0 ? 3 : _ref$colsCount,
|
|
19
|
+
_ref$withHeaderRow = _ref.withHeaderRow,
|
|
20
|
+
withHeaderRow = _ref$withHeaderRow === void 0 ? true : _ref$withHeaderRow,
|
|
21
|
+
cellContent = _ref.cellContent;
|
|
25
22
|
var _tableNodeTypes = tableNodeTypes(schema),
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
23
|
+
tableCell = _tableNodeTypes.cell,
|
|
24
|
+
tableHeader = _tableNodeTypes.header_cell,
|
|
25
|
+
tableRow = _tableNodeTypes.row,
|
|
26
|
+
table = _tableNodeTypes.table;
|
|
31
27
|
var cells = [];
|
|
32
28
|
var headerCells = [];
|
|
33
|
-
|
|
34
29
|
for (var i = 0; i < colsCount; i++) {
|
|
35
30
|
var cell = createCell(tableCell, cellContent);
|
|
36
|
-
|
|
37
31
|
if (cell) {
|
|
38
32
|
cells.push(cell);
|
|
39
33
|
}
|
|
40
|
-
|
|
41
34
|
if (withHeaderRow) {
|
|
42
35
|
var headerCell = createCell(tableHeader, cellContent);
|
|
43
|
-
|
|
44
36
|
if (headerCell) {
|
|
45
37
|
headerCells.push(headerCell);
|
|
46
38
|
}
|
|
47
39
|
}
|
|
48
40
|
}
|
|
49
|
-
|
|
50
41
|
var rows = [];
|
|
51
|
-
|
|
52
42
|
for (var _i = 0; _i < rowsCount; _i++) {
|
|
53
43
|
rows.push(tableRow.createChecked(null, withHeaderRow && _i === 0 ? headerCells : cells));
|
|
54
44
|
}
|
|
55
|
-
|
|
56
45
|
return table.createChecked({
|
|
57
46
|
localId: uuid.generate()
|
|
58
47
|
}, rows);
|
|
@@ -1,17 +1,16 @@
|
|
|
1
1
|
import { cloneTr } from './clone-tr';
|
|
2
|
-
import { tableNodeTypes } from './table-node-types';
|
|
2
|
+
import { tableNodeTypes } from './table-node-types';
|
|
3
3
|
|
|
4
|
+
// Returns a new transaction that clears the content of a given `cell`.
|
|
4
5
|
export var emptyCell = function emptyCell(cell, schema) {
|
|
5
6
|
return function (tr) {
|
|
6
7
|
if (cell) {
|
|
7
8
|
var node = tableNodeTypes(schema).cell.createAndFill();
|
|
8
|
-
|
|
9
9
|
if (node && !cell.node.content.eq(node.content)) {
|
|
10
10
|
tr.replaceWith(cell.pos + 1, cell.pos + cell.node.nodeSize, node.content);
|
|
11
11
|
return cloneTr(tr);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
|
|
15
14
|
return tr;
|
|
16
15
|
};
|
|
17
16
|
};
|
package/dist/esm/utils/find.js
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
1
|
import { findParentNode, findParentNodeClosestToPos } from 'prosemirror-utils';
|
|
2
|
-
import { TableMap } from '../table-map';
|
|
2
|
+
import { TableMap } from '../table-map';
|
|
3
3
|
|
|
4
|
+
// Iterates over parent nodes, returning the closest table node.
|
|
4
5
|
export var findTable = function findTable(selection) {
|
|
5
6
|
return findParentNode(function (node) {
|
|
6
7
|
return node.type.spec.tableRole && node.type.spec.tableRole === 'table';
|
|
7
8
|
})(selection);
|
|
8
|
-
};
|
|
9
|
+
};
|
|
9
10
|
|
|
11
|
+
// Iterates over parent nodes, returning a table node closest to a given `$pos`.
|
|
10
12
|
export var findTableClosestToPos = function findTableClosestToPos($pos) {
|
|
11
13
|
var predicate = function predicate(node) {
|
|
12
14
|
return node.type.spec.tableRole && node.type.spec.tableRole === 'table';
|
|
13
15
|
};
|
|
14
|
-
|
|
15
16
|
return findParentNodeClosestToPos($pos, predicate);
|
|
16
|
-
};
|
|
17
|
+
};
|
|
17
18
|
|
|
19
|
+
// Iterates over parent nodes, returning a table cell or a table header node closest to a given `$pos`.
|
|
18
20
|
export var findCellClosestToPos = function findCellClosestToPos($pos) {
|
|
19
21
|
var predicate = function predicate(node) {
|
|
20
22
|
return node.type.spec.tableRole && /cell/i.test(node.type.spec.tableRole);
|
|
21
23
|
};
|
|
22
|
-
|
|
23
24
|
return findParentNodeClosestToPos($pos, predicate);
|
|
24
|
-
};
|
|
25
|
+
};
|
|
25
26
|
|
|
27
|
+
// Returns the rectangle spanning a cell closest to a given `$pos`.
|
|
26
28
|
export var findCellRectClosestToPos = function findCellRectClosestToPos($pos) {
|
|
27
29
|
var cell = findCellClosestToPos($pos);
|
|
28
|
-
|
|
29
30
|
if (cell) {
|
|
30
31
|
var table = findTableClosestToPos($pos);
|
|
31
|
-
|
|
32
32
|
if (table) {
|
|
33
33
|
var map = TableMap.get(table.node);
|
|
34
34
|
var cellPos = cell.pos - table.start;
|