@atlaskit/editor-tables 2.2.4 → 2.2.6
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 +12 -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 +17 -83
- 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 +67 -138
- 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 +51 -139
- 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 +5 -34
- 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 +3 -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 +15 -67
- package/dist/es2019/pm-plugins/table-editing.js +3 -12
- package/dist/es2019/table-map.js +57 -127
- 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 +41 -115
- 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 +3 -10
- 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 +17 -71
- package/dist/esm/pm-plugins/table-editing.js +8 -13
- package/dist/esm/table-map.js +68 -133
- 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 +44 -125
- 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 +5 -23
- 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 +3 -10
- package/dist/esm/version.json +1 -1
- package/package.json +6 -4
|
@@ -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,6 +12,7 @@ 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';
|
|
@@ -22,7 +20,9 @@ import { TableMap } from '../table-map';
|
|
|
22
20
|
import { removeColSpan } from './colspan';
|
|
23
21
|
import { selectedRect } from './selection-rect';
|
|
24
22
|
import { tableNodeTypes } from './table-node-types';
|
|
25
|
-
import { isHeaderEnabledByType } from './toggle-header';
|
|
23
|
+
import { isHeaderEnabledByType } from './toggle-header';
|
|
24
|
+
|
|
25
|
+
// Utilities to help with copying and pasting table cells
|
|
26
26
|
|
|
27
27
|
/**
|
|
28
28
|
* Replace any header cells with table cells.
|
|
@@ -31,61 +31,51 @@ import { isHeaderEnabledByType } from './toggle-header'; // Utilities to help wi
|
|
|
31
31
|
* @param cells
|
|
32
32
|
* @returns Fragment with header cells converted to table cells
|
|
33
33
|
*/
|
|
34
|
-
|
|
35
34
|
function stripHeaderType(schema, cells) {
|
|
36
35
|
var newCells = [];
|
|
37
36
|
cells.forEach(function (cell) {
|
|
38
37
|
var _cellNodeType$createA;
|
|
39
|
-
|
|
40
38
|
// Convert to cell type if not already
|
|
41
39
|
var cellNodeType = tableNodeTypes(schema).cell;
|
|
42
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;
|
|
43
41
|
newCells.push(tableCell);
|
|
44
42
|
});
|
|
45
43
|
return Fragment.from(newCells);
|
|
46
|
-
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// : (Slice) → ?{width: number, height: number, rows: [Fragment]}
|
|
47
47
|
// Get a rectangular area of cells from a slice, or null if the outer
|
|
48
48
|
// nodes of the slice aren't table cells or rows.
|
|
49
|
-
|
|
50
|
-
|
|
51
49
|
export function pastedCells(slice) {
|
|
52
50
|
if (!slice.size) {
|
|
53
51
|
return null;
|
|
54
52
|
}
|
|
55
|
-
|
|
56
53
|
var content = slice.content,
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
54
|
+
openStart = slice.openStart,
|
|
55
|
+
openEnd = slice.openEnd;
|
|
60
56
|
if (!content.firstChild) {
|
|
61
57
|
throw new Error('pastedCells: no firstChild defined for content');
|
|
62
58
|
}
|
|
63
|
-
|
|
64
59
|
while (content.childCount === 1 && (openStart > 0 && openEnd > 0 || content.firstChild.type.spec.tableRole === 'table')) {
|
|
65
60
|
openStart--;
|
|
66
61
|
openEnd--;
|
|
67
62
|
content = content.firstChild.content;
|
|
68
|
-
|
|
69
63
|
if (!content.firstChild) {
|
|
70
64
|
throw new Error('pastedCells: no firstChild defined for content');
|
|
71
65
|
}
|
|
72
66
|
}
|
|
73
|
-
|
|
74
67
|
var first = content.firstChild;
|
|
75
68
|
var role = first.type.spec.tableRole;
|
|
76
69
|
var schema = first.type.schema;
|
|
77
70
|
var rows = [];
|
|
78
|
-
|
|
79
71
|
if (role === 'row') {
|
|
80
72
|
for (var i = 0; i < content.childCount; i++) {
|
|
81
73
|
var cells = content.child(i).content;
|
|
82
74
|
var left = i ? 0 : Math.max(0, openStart - 1);
|
|
83
75
|
var right = i < content.childCount - 1 ? 0 : Math.max(0, openEnd - 1);
|
|
84
|
-
|
|
85
76
|
if (left || right) {
|
|
86
77
|
cells = fitSlice(tableNodeTypes(schema).row, new Slice(cells, left, right)).content;
|
|
87
78
|
}
|
|
88
|
-
|
|
89
79
|
rows.push(cells);
|
|
90
80
|
}
|
|
91
81
|
} else if (role === 'cell' || role === 'header_cell') {
|
|
@@ -93,385 +83,314 @@ export function pastedCells(slice) {
|
|
|
93
83
|
} else {
|
|
94
84
|
return null;
|
|
95
85
|
}
|
|
96
|
-
|
|
97
86
|
var rowsWithoutHeaders = rows.map(function (row) {
|
|
98
87
|
return stripHeaderType(schema, row);
|
|
99
88
|
});
|
|
100
89
|
return ensureRectangular(schema, rowsWithoutHeaders);
|
|
101
|
-
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// : (Schema, [Fragment]) → {width: number, height: number, rows: [Fragment]}
|
|
102
93
|
// Compute the width and height of a set of cells, and make sure each
|
|
103
94
|
// row has the same number of cells.
|
|
104
|
-
|
|
105
95
|
function ensureRectangular(schema, rowsFragment) {
|
|
106
96
|
var rows = rowsFragment;
|
|
107
97
|
var widths = [];
|
|
108
|
-
|
|
109
98
|
for (var i = 0; i < rows.length; i++) {
|
|
110
99
|
var row = rows[i];
|
|
111
|
-
|
|
112
100
|
for (var j = row.childCount - 1; j >= 0; j--) {
|
|
113
101
|
var _row$child$attrs = row.child(j).attrs,
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
102
|
+
rowspan = _row$child$attrs.rowspan,
|
|
103
|
+
colspan = _row$child$attrs.colspan;
|
|
117
104
|
for (var r = i; r < i + rowspan; r++) {
|
|
118
105
|
widths[r] = (widths[r] || 0) + colspan;
|
|
119
106
|
}
|
|
120
107
|
}
|
|
121
108
|
}
|
|
122
|
-
|
|
123
109
|
var width = 0;
|
|
124
|
-
|
|
125
110
|
for (var _r = 0; _r < widths.length; _r++) {
|
|
126
111
|
width = Math.max(width, widths[_r]);
|
|
127
112
|
}
|
|
128
|
-
|
|
129
113
|
for (var _r2 = 0; _r2 < widths.length; _r2++) {
|
|
130
114
|
if (_r2 >= rows.length) {
|
|
131
115
|
rows.push(Fragment.empty);
|
|
132
116
|
}
|
|
133
|
-
|
|
134
117
|
if (widths[_r2] < width) {
|
|
135
118
|
var empty = tableNodeTypes(schema).cell.createAndFill();
|
|
136
119
|
var cells = [];
|
|
137
|
-
|
|
138
120
|
for (var _i = widths[_r2]; _i < width; _i++) {
|
|
139
121
|
cells.push(empty);
|
|
140
122
|
}
|
|
141
|
-
|
|
142
123
|
rows[_r2] = rows[_r2].append(Fragment.from(cells));
|
|
143
124
|
}
|
|
144
125
|
}
|
|
145
|
-
|
|
146
126
|
return {
|
|
147
127
|
height: rows.length,
|
|
148
128
|
width: width,
|
|
149
129
|
rows: rows
|
|
150
130
|
};
|
|
151
131
|
}
|
|
152
|
-
|
|
153
132
|
export function fitSlice(nodeType, slice) {
|
|
154
133
|
var node = nodeType.createAndFill();
|
|
155
|
-
|
|
156
134
|
if (!node) {
|
|
157
135
|
throw new Error("fitSlice: unable to create node");
|
|
158
136
|
}
|
|
159
|
-
|
|
160
137
|
var tr = new Transform(node).replace(0, node.content.size, slice);
|
|
161
138
|
return tr.doc;
|
|
162
|
-
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// : ({width: number, height: number, rows: [Fragment]}, number, number) → {width: number, height: number, rows: [Fragment]}
|
|
163
142
|
// Clip or extend (repeat) the given set of cells to cover the given
|
|
164
143
|
// width and height. Will clip rowspan/colspan cells at the edges when
|
|
165
144
|
// they stick out.
|
|
166
|
-
|
|
167
145
|
export function clipCells(_ref, newWidth, newHeight) {
|
|
168
146
|
var currentWidth = _ref.width,
|
|
169
|
-
|
|
170
|
-
|
|
147
|
+
currentHeight = _ref.height,
|
|
148
|
+
currentRows = _ref.rows;
|
|
171
149
|
var rows = currentRows;
|
|
172
150
|
var width = currentWidth;
|
|
173
151
|
var height = currentHeight;
|
|
174
|
-
|
|
175
152
|
if (width !== newWidth) {
|
|
176
153
|
var added = [];
|
|
177
154
|
var newRows = [];
|
|
178
|
-
|
|
179
155
|
for (var row = 0; row < rows.length; row++) {
|
|
180
156
|
var frag = rows[row];
|
|
181
157
|
var cells = [];
|
|
182
|
-
|
|
183
158
|
for (var col = added[row] || 0, i = 0; col < newWidth; i++) {
|
|
184
159
|
var cell = frag.child(i % frag.childCount);
|
|
185
|
-
|
|
186
160
|
if (col + cell.attrs.colspan > newWidth) {
|
|
187
161
|
cell = cell.type.create(removeColSpan(cell.attrs, cell.attrs.colspan, col + cell.attrs.colspan - newWidth), cell.content);
|
|
188
162
|
}
|
|
189
|
-
|
|
190
163
|
cells.push(cell);
|
|
191
164
|
col += cell.attrs.colspan;
|
|
192
|
-
|
|
193
165
|
for (var j = 1; j < cell.attrs.rowspan; j++) {
|
|
194
166
|
added[row + j] = (added[row + j] || 0) + cell.attrs.colspan;
|
|
195
167
|
}
|
|
196
168
|
}
|
|
197
|
-
|
|
198
169
|
newRows.push(Fragment.from(cells));
|
|
199
170
|
}
|
|
200
|
-
|
|
201
171
|
rows = newRows;
|
|
202
172
|
width = newWidth;
|
|
203
173
|
}
|
|
204
|
-
|
|
205
174
|
if (height !== newHeight) {
|
|
206
175
|
var _newRows = [];
|
|
207
|
-
|
|
208
176
|
for (var _row = 0, _i2 = 0; _row < newHeight; _row++, _i2++) {
|
|
209
177
|
var _cells = [];
|
|
210
178
|
var source = rows[_i2 % height];
|
|
211
|
-
|
|
212
179
|
for (var _j = 0; _j < source.childCount; _j++) {
|
|
213
180
|
var _cell = source.child(_j);
|
|
214
|
-
|
|
215
181
|
if (_row + _cell.attrs.rowspan > newHeight) {
|
|
216
182
|
_cell = _cell.type.create(_objectSpread(_objectSpread({}, _cell.attrs), {}, {
|
|
217
183
|
rowspan: Math.max(1, newHeight - _cell.attrs.rowspan)
|
|
218
184
|
}), _cell.content);
|
|
219
185
|
}
|
|
220
|
-
|
|
221
186
|
_cells.push(_cell);
|
|
222
187
|
}
|
|
223
|
-
|
|
224
188
|
_newRows.push(Fragment.from(_cells));
|
|
225
189
|
}
|
|
226
|
-
|
|
227
190
|
rows = _newRows;
|
|
228
191
|
height = newHeight;
|
|
229
192
|
}
|
|
230
|
-
|
|
231
193
|
return {
|
|
232
194
|
width: width,
|
|
233
195
|
height: height,
|
|
234
196
|
rows: rows
|
|
235
197
|
};
|
|
236
|
-
}
|
|
237
|
-
// true if something was changed.
|
|
198
|
+
}
|
|
238
199
|
|
|
200
|
+
// Make sure a table has at least the given width and height. Return
|
|
201
|
+
// true if something was changed.
|
|
239
202
|
function growTable(tr, map, table, start, width, height, mapFrom) {
|
|
240
203
|
var schema = tr.doc.type.schema;
|
|
241
204
|
var types = tableNodeTypes(schema);
|
|
242
205
|
var empty;
|
|
243
206
|
var emptyHead;
|
|
244
|
-
|
|
245
207
|
if (width > map.width) {
|
|
246
208
|
for (var row = 0, rowEnd = 0; row < map.height; row++) {
|
|
247
209
|
var rowNode = table.child(row);
|
|
248
210
|
rowEnd += rowNode.nodeSize;
|
|
249
211
|
var cells = [];
|
|
250
212
|
var add = void 0;
|
|
251
|
-
|
|
252
213
|
if (rowNode.lastChild == null || rowNode.lastChild.type === types.cell) {
|
|
253
214
|
add = empty || (empty = types.cell.createAndFill());
|
|
254
215
|
} else {
|
|
255
216
|
add = emptyHead || (emptyHead = types.header_cell.createAndFill());
|
|
256
217
|
}
|
|
257
|
-
|
|
258
218
|
for (var i = map.width; i < width; i++) {
|
|
259
219
|
cells.push(add);
|
|
260
220
|
}
|
|
261
|
-
|
|
262
221
|
tr.insert(tr.mapping.slice(mapFrom).map(rowEnd - 1 + start), cells);
|
|
263
222
|
}
|
|
264
223
|
}
|
|
265
|
-
|
|
266
224
|
if (height > map.height) {
|
|
267
225
|
var _cells2 = [];
|
|
268
|
-
|
|
269
226
|
for (var _i3 = 0, k = (map.height - 1) * map.width; _i3 < Math.max(map.width, width); _i3++) {
|
|
270
227
|
var header = void 0;
|
|
271
|
-
|
|
272
228
|
if (_i3 >= map.width) {
|
|
273
229
|
header = false;
|
|
274
230
|
} else {
|
|
275
231
|
var mappedPos = map.map[k + _i3];
|
|
276
232
|
var node = table.nodeAt(mappedPos);
|
|
277
|
-
|
|
278
233
|
if (!node) {
|
|
279
234
|
throw new Error("growTable: no node found at pos ".concat(mappedPos));
|
|
280
235
|
}
|
|
281
|
-
|
|
282
236
|
header = node.type === types.header_cell;
|
|
283
237
|
}
|
|
284
|
-
|
|
285
238
|
_cells2.push(header ? emptyHead || (emptyHead = types.header_cell.createAndFill()) : empty || (empty = types.cell.createAndFill()));
|
|
286
239
|
}
|
|
287
|
-
|
|
288
240
|
var emptyRow = types.row.create(null, Fragment.from(_cells2));
|
|
289
241
|
var rows = [];
|
|
290
|
-
|
|
291
242
|
for (var _i4 = map.height; _i4 < height; _i4++) {
|
|
292
243
|
rows.push(emptyRow);
|
|
293
244
|
}
|
|
294
|
-
|
|
295
245
|
tr.insert(tr.mapping.slice(mapFrom).map(start + table.nodeSize - 2), rows);
|
|
296
246
|
}
|
|
297
|
-
|
|
298
247
|
return !!(empty || emptyHead);
|
|
299
|
-
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Make sure the given line (left, top) to (right, top) doesn't cross
|
|
300
251
|
// any rowspan cells by splitting cells that cross it. Return true if
|
|
301
252
|
// something changed.
|
|
302
|
-
|
|
303
|
-
|
|
304
253
|
function isolateHorizontal(tr, map, table, start, left, right, top, mapFrom) {
|
|
305
254
|
if (top === 0 || top === map.height) {
|
|
306
255
|
return false;
|
|
307
256
|
}
|
|
308
|
-
|
|
309
257
|
var found = false;
|
|
310
|
-
|
|
311
258
|
for (var col = left; col < right; col++) {
|
|
312
259
|
var index = top * map.width + col;
|
|
313
260
|
var pos = map.map[index];
|
|
314
|
-
|
|
315
261
|
if (map.map[index - map.width] === pos) {
|
|
316
262
|
found = true;
|
|
317
263
|
var cell = table.nodeAt(pos);
|
|
318
|
-
|
|
319
264
|
if (!cell) {
|
|
320
265
|
throw new Error("isolateHorizontal: no cell found at pos ".concat(pos));
|
|
321
266
|
}
|
|
322
|
-
|
|
323
267
|
var _map$findCell = map.findCell(pos),
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
268
|
+
cellTop = _map$findCell.top,
|
|
269
|
+
cellLeft = _map$findCell.left;
|
|
327
270
|
tr.setNodeMarkup(tr.mapping.slice(mapFrom).map(pos + start), undefined, _objectSpread(_objectSpread({}, cell.attrs), {}, {
|
|
328
271
|
rowspan: top - cellTop
|
|
329
272
|
}));
|
|
330
273
|
var newCell = cell.type.createAndFill(_objectSpread(_objectSpread({}, cell.attrs), {}, {
|
|
331
274
|
rowspan: cellTop + cell.attrs.rowspan - top
|
|
332
275
|
}));
|
|
333
|
-
|
|
334
276
|
if (!newCell) {
|
|
335
277
|
throw new Error('isolateHorizontal: failed to create cell');
|
|
336
278
|
}
|
|
337
|
-
|
|
338
279
|
tr.insert(tr.mapping.slice(mapFrom).map(map.positionAt(top, cellLeft, table)), newCell);
|
|
339
280
|
col += cell.attrs.colspan - 1;
|
|
340
281
|
}
|
|
341
282
|
}
|
|
342
|
-
|
|
343
283
|
return found;
|
|
344
|
-
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// Make sure the given line (left, top) to (left, bottom) doesn't
|
|
345
287
|
// cross any colspan cells by splitting cells that cross it. Return
|
|
346
288
|
// true if something changed.
|
|
347
|
-
|
|
348
|
-
|
|
349
289
|
function isolateVertical(tr, map, table, start, top, bottom, left, mapFrom) {
|
|
350
290
|
if (left === 0 || left === map.width) {
|
|
351
291
|
return false;
|
|
352
292
|
}
|
|
353
|
-
|
|
354
293
|
var found = false;
|
|
355
|
-
|
|
356
294
|
for (var row = top; row < bottom; row++) {
|
|
357
295
|
var index = row * map.width + left;
|
|
358
296
|
var pos = map.map[index];
|
|
359
|
-
|
|
360
297
|
if (map.map[index - 1] === pos) {
|
|
361
298
|
found = true;
|
|
362
299
|
var cell = table.nodeAt(pos);
|
|
363
|
-
|
|
364
300
|
if (!cell) {
|
|
365
301
|
throw new Error("isolateVertical: could not find cell at pos ".concat(pos));
|
|
366
302
|
}
|
|
367
|
-
|
|
368
303
|
var cellLeft = map.colCount(pos);
|
|
369
304
|
var updatePos = tr.mapping.slice(mapFrom).map(pos + start);
|
|
370
305
|
tr.setNodeMarkup(updatePos, undefined, removeColSpan(cell.attrs, left - cellLeft, cell.attrs.colspan - (left - cellLeft)));
|
|
371
306
|
var newCell = cell.type.createAndFill(removeColSpan(cell.attrs, 0, left - cellLeft));
|
|
372
|
-
|
|
373
307
|
if (!newCell) {
|
|
374
308
|
throw new Error('isolateVertical: failed to create cell');
|
|
375
309
|
}
|
|
376
|
-
|
|
377
310
|
tr.insert(updatePos + cell.nodeSize, newCell);
|
|
378
311
|
row += cell.attrs.rowspan - 1;
|
|
379
312
|
}
|
|
380
313
|
}
|
|
381
|
-
|
|
382
314
|
return found;
|
|
383
315
|
}
|
|
384
|
-
|
|
385
316
|
function applyHeaderCells(tr, tableMap, state, tableStart, table, headerRowEnabled, headerColumnEnabled) {
|
|
386
317
|
var schema = state.schema;
|
|
387
|
-
|
|
388
318
|
var setMarkup = function setMarkup(tr, row, col, headerEnabled) {
|
|
389
319
|
var cellPos = tableStart + tableMap.positionAt(row, col, table);
|
|
390
320
|
var cell = tr.doc.nodeAt(cellPos);
|
|
391
321
|
var newType = headerEnabled ? schema.nodes.tableHeader : schema.nodes.tableCell;
|
|
392
322
|
var isCellTypeChanged = newType !== (cell === null || cell === void 0 ? void 0 : cell.type);
|
|
393
323
|
var isCellTypeValid = [schema.nodes.tableCell, schema.nodes.tableHeader].includes(cell === null || cell === void 0 ? void 0 : cell.type);
|
|
394
|
-
|
|
395
324
|
if (isCellTypeChanged && isCellTypeValid) {
|
|
396
325
|
tr.setNodeMarkup(cellPos, newType, cell === null || cell === void 0 ? void 0 : cell.attrs, cell === null || cell === void 0 ? void 0 : cell.marks);
|
|
397
326
|
}
|
|
398
|
-
};
|
|
399
|
-
|
|
327
|
+
};
|
|
400
328
|
|
|
401
|
-
|
|
329
|
+
// For row === 0 && col === 0 it is enabled if either are enabled
|
|
330
|
+
setMarkup(tr, 0, 0, headerColumnEnabled || headerRowEnabled);
|
|
402
331
|
|
|
332
|
+
// Header Column
|
|
403
333
|
for (var col = 1; col < tableMap.width; col++) {
|
|
404
334
|
setMarkup(tr, 0, col, headerRowEnabled);
|
|
405
|
-
}
|
|
406
|
-
|
|
407
|
-
|
|
335
|
+
}
|
|
336
|
+
// Header Row
|
|
408
337
|
for (var row = 1; row < tableMap.height; row++) {
|
|
409
338
|
setMarkup(tr, row, 0, headerColumnEnabled);
|
|
410
339
|
}
|
|
411
|
-
}
|
|
412
|
-
// table, at the position pointed at by rect.
|
|
413
|
-
|
|
340
|
+
}
|
|
414
341
|
|
|
342
|
+
// Insert the given set of cells (as returned by `pastedCells`) into a
|
|
343
|
+
// table, at the position pointed at by rect.
|
|
415
344
|
export function insertCells(state, dispatch, tableStart, rect, cells) {
|
|
416
345
|
var table = state.doc;
|
|
417
346
|
var newRect = selectedRect(state);
|
|
418
|
-
var types = tableNodeTypes(state.schema);
|
|
347
|
+
var types = tableNodeTypes(state.schema);
|
|
419
348
|
|
|
349
|
+
// Get if the header row and column are enabled on the original table
|
|
420
350
|
var headerRowEnabled = isHeaderEnabledByType('row', newRect, types);
|
|
421
351
|
var headerColumnEnabled = isHeaderEnabledByType('column', newRect, types);
|
|
422
|
-
|
|
423
352
|
if (tableStart) {
|
|
424
353
|
table = state.doc.nodeAt(tableStart - 1);
|
|
425
|
-
|
|
426
354
|
if (!table) {
|
|
427
355
|
throw new Error("insertCells: could not find table at pos ".concat(tableStart - 1));
|
|
428
356
|
}
|
|
429
357
|
}
|
|
430
|
-
|
|
431
358
|
var map = TableMap.get(table);
|
|
432
359
|
var top = rect.top,
|
|
433
|
-
|
|
360
|
+
left = rect.left;
|
|
434
361
|
var right = left + cells.width;
|
|
435
362
|
var bottom = top + cells.height;
|
|
436
363
|
var tr = state.tr;
|
|
437
364
|
var mapFrom = 0;
|
|
438
|
-
|
|
439
365
|
function recomp() {
|
|
440
366
|
table = tableStart ? tr.doc.nodeAt(tableStart - 1) : tr.doc;
|
|
441
367
|
map = TableMap.get(table);
|
|
442
368
|
mapFrom = tr.mapping.maps.length;
|
|
443
|
-
}
|
|
369
|
+
}
|
|
370
|
+
// Prepare the table to be large enough and not have any cells
|
|
444
371
|
// crossing the boundaries of the rectangle that we want to
|
|
445
372
|
// insert into. If anything about it changes, recompute the table
|
|
446
373
|
// map so that subsequent operations can see the current shape.
|
|
447
|
-
|
|
448
|
-
|
|
449
374
|
if (growTable(tr, map, table, tableStart, right, bottom, mapFrom)) {
|
|
450
375
|
recomp();
|
|
451
376
|
}
|
|
452
|
-
|
|
453
377
|
if (isolateHorizontal(tr, map, table, tableStart, left, right, top, mapFrom)) {
|
|
454
378
|
recomp();
|
|
455
379
|
}
|
|
456
|
-
|
|
457
380
|
if (isolateHorizontal(tr, map, table, tableStart, left, right, bottom, mapFrom)) {
|
|
458
381
|
recomp();
|
|
459
382
|
}
|
|
460
|
-
|
|
461
383
|
if (isolateVertical(tr, map, table, tableStart, top, bottom, left, mapFrom)) {
|
|
462
384
|
recomp();
|
|
463
385
|
}
|
|
464
|
-
|
|
465
386
|
if (isolateVertical(tr, map, table, tableStart, top, bottom, right, mapFrom)) {
|
|
466
387
|
recomp();
|
|
467
388
|
}
|
|
468
|
-
|
|
469
389
|
for (var row = top; row < bottom; row++) {
|
|
470
390
|
var from = map.positionAt(row, left, table);
|
|
471
391
|
var to = map.positionAt(row, right, table);
|
|
472
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));
|
|
473
393
|
}
|
|
474
|
-
|
|
475
394
|
recomp();
|
|
476
395
|
applyHeaderCells(tr, map, state, tableStart, table, headerRowEnabled, headerColumnEnabled);
|
|
477
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))));
|
|
@@ -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;
|