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