@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.
Files changed (158) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/cell-bookmark.js +0 -10
  3. package/dist/cjs/cell-selection.js +37 -102
  4. package/dist/cjs/index.js +0 -4
  5. package/dist/cjs/pm-plugins/input.js +17 -83
  6. package/dist/cjs/pm-plugins/plugin-key.js +0 -2
  7. package/dist/cjs/pm-plugins/table-editing.js +17 -18
  8. package/dist/cjs/pm-plugins.js +0 -2
  9. package/dist/cjs/table-map.js +67 -138
  10. package/dist/cjs/utils/add-column-at.js +0 -9
  11. package/dist/cjs/utils/add-column.js +8 -24
  12. package/dist/cjs/utils/add-row-at.js +8 -37
  13. package/dist/cjs/utils/add-row.js +2 -23
  14. package/dist/cjs/utils/analytics-helpers.js +4 -15
  15. package/dist/cjs/utils/cells.js +0 -12
  16. package/dist/cjs/utils/clone-tr.js +0 -2
  17. package/dist/cjs/utils/colspan.js +2 -18
  18. package/dist/cjs/utils/copy-paste.js +51 -139
  19. package/dist/cjs/utils/create-table.js +14 -28
  20. package/dist/cjs/utils/draw-cell-selection.js +0 -4
  21. package/dist/cjs/utils/empty-cells.js +0 -6
  22. package/dist/cjs/utils/find.js +6 -18
  23. package/dist/cjs/utils/fix-tables.js +13 -56
  24. package/dist/cjs/utils/for-each-cell.js +3 -17
  25. package/dist/cjs/utils/get-cell-selection-ranges.js +2 -9
  26. package/dist/cjs/utils/get-cells-in-column.js +0 -7
  27. package/dist/cjs/utils/get-cells-in-row.js +0 -7
  28. package/dist/cjs/utils/get-cells-in-table.js +0 -8
  29. package/dist/cjs/utils/get-selection-range-in-column.js +6 -27
  30. package/dist/cjs/utils/get-selection-range-in-row.js +6 -27
  31. package/dist/cjs/utils/get-selection-rect.js +0 -7
  32. package/dist/cjs/utils/go-to-next-cell.js +3 -22
  33. package/dist/cjs/utils/handle-paste.js +5 -34
  34. package/dist/cjs/utils/is-selected.js +6 -23
  35. package/dist/cjs/utils/is-selection-type.js +0 -2
  36. package/dist/cjs/utils/move-column.js +0 -12
  37. package/dist/cjs/utils/move-row.js +0 -11
  38. package/dist/cjs/utils/normalize-selection.js +3 -27
  39. package/dist/cjs/utils/remove-column.js +10 -46
  40. package/dist/cjs/utils/remove-row.js +8 -49
  41. package/dist/cjs/utils/remove-table.js +0 -6
  42. package/dist/cjs/utils/reorder-utils.js +13 -37
  43. package/dist/cjs/utils/replace-table.js +0 -8
  44. package/dist/cjs/utils/select-nodes.js +11 -31
  45. package/dist/cjs/utils/selection-cell.js +0 -5
  46. package/dist/cjs/utils/selection-rect.js +0 -10
  47. package/dist/cjs/utils/set-cell-attrs.js +0 -4
  48. package/dist/cjs/utils/split-cell-with-type.js +2 -35
  49. package/dist/cjs/utils/split-cell.js +0 -4
  50. package/dist/cjs/utils/table-node-types.js +4 -8
  51. package/dist/cjs/utils/tables.js +0 -4
  52. package/dist/cjs/utils/test-utils.js +9 -26
  53. package/dist/cjs/utils/toggle-header.js +3 -16
  54. package/dist/cjs/utils/uuid.js +0 -3
  55. package/dist/cjs/utils.js +0 -42
  56. package/dist/cjs/version.json +1 -1
  57. package/dist/es2019/cell-bookmark.js +0 -5
  58. package/dist/es2019/cell-selection.js +37 -81
  59. package/dist/es2019/index.js +1 -0
  60. package/dist/es2019/pm-plugins/input.js +15 -67
  61. package/dist/es2019/pm-plugins/table-editing.js +3 -12
  62. package/dist/es2019/table-map.js +57 -127
  63. package/dist/es2019/utils/add-column-at.js +2 -4
  64. package/dist/es2019/utils/add-column.js +6 -16
  65. package/dist/es2019/utils/add-row-at.js +8 -22
  66. package/dist/es2019/utils/add-row.js +2 -17
  67. package/dist/es2019/utils/analytics-helpers.js +0 -5
  68. package/dist/es2019/utils/cells.js +4 -9
  69. package/dist/es2019/utils/colspan.js +6 -11
  70. package/dist/es2019/utils/copy-paste.js +41 -115
  71. package/dist/es2019/utils/create-table.js +3 -12
  72. package/dist/es2019/utils/draw-cell-selection.js +0 -1
  73. package/dist/es2019/utils/empty-cells.js +2 -3
  74. package/dist/es2019/utils/find.js +8 -8
  75. package/dist/es2019/utils/fix-tables.js +17 -47
  76. package/dist/es2019/utils/for-each-cell.js +6 -11
  77. package/dist/es2019/utils/get-cell-selection-ranges.js +2 -4
  78. package/dist/es2019/utils/get-cells-in-column.js +2 -3
  79. package/dist/es2019/utils/get-cells-in-row.js +2 -3
  80. package/dist/es2019/utils/get-cells-in-table.js +2 -4
  81. package/dist/es2019/utils/get-selection-range-in-column.js +8 -22
  82. package/dist/es2019/utils/get-selection-range-in-row.js +8 -22
  83. package/dist/es2019/utils/get-selection-rect.js +2 -2
  84. package/dist/es2019/utils/go-to-next-cell.js +3 -19
  85. package/dist/es2019/utils/handle-paste.js +3 -14
  86. package/dist/es2019/utils/is-selected.js +8 -10
  87. package/dist/es2019/utils/is-selection-type.js +0 -1
  88. package/dist/es2019/utils/move-column.js +3 -8
  89. package/dist/es2019/utils/move-row.js +3 -7
  90. package/dist/es2019/utils/normalize-selection.js +0 -16
  91. package/dist/es2019/utils/remove-column.js +10 -27
  92. package/dist/es2019/utils/remove-row.js +12 -32
  93. package/dist/es2019/utils/remove-table.js +2 -4
  94. package/dist/es2019/utils/reorder-utils.js +11 -26
  95. package/dist/es2019/utils/replace-table.js +0 -2
  96. package/dist/es2019/utils/select-nodes.js +9 -20
  97. package/dist/es2019/utils/selection-cell.js +0 -2
  98. package/dist/es2019/utils/selection-rect.js +0 -4
  99. package/dist/es2019/utils/set-cell-attrs.js +2 -2
  100. package/dist/es2019/utils/split-cell-with-type.js +8 -28
  101. package/dist/es2019/utils/split-cell.js +3 -2
  102. package/dist/es2019/utils/table-node-types.js +4 -7
  103. package/dist/es2019/utils/tables.js +0 -2
  104. package/dist/es2019/utils/test-utils.js +12 -16
  105. package/dist/es2019/utils/toggle-header.js +3 -10
  106. package/dist/es2019/utils/uuid.js +0 -2
  107. package/dist/es2019/version.json +1 -1
  108. package/dist/esm/cell-bookmark.js +0 -5
  109. package/dist/esm/cell-selection.js +37 -79
  110. package/dist/esm/index.js +1 -0
  111. package/dist/esm/pm-plugins/input.js +17 -71
  112. package/dist/esm/pm-plugins/table-editing.js +8 -13
  113. package/dist/esm/table-map.js +68 -133
  114. package/dist/esm/utils/add-column-at.js +2 -4
  115. package/dist/esm/utils/add-column.js +8 -20
  116. package/dist/esm/utils/add-row-at.js +8 -23
  117. package/dist/esm/utils/add-row.js +2 -21
  118. package/dist/esm/utils/analytics-helpers.js +4 -10
  119. package/dist/esm/utils/cells.js +0 -5
  120. package/dist/esm/utils/colspan.js +2 -14
  121. package/dist/esm/utils/copy-paste.js +44 -125
  122. package/dist/esm/utils/create-table.js +14 -25
  123. package/dist/esm/utils/draw-cell-selection.js +0 -1
  124. package/dist/esm/utils/empty-cells.js +2 -3
  125. package/dist/esm/utils/find.js +8 -8
  126. package/dist/esm/utils/fix-tables.js +13 -49
  127. package/dist/esm/utils/for-each-cell.js +6 -11
  128. package/dist/esm/utils/get-cell-selection-ranges.js +2 -4
  129. package/dist/esm/utils/get-cells-in-column.js +2 -3
  130. package/dist/esm/utils/get-cells-in-row.js +2 -3
  131. package/dist/esm/utils/get-cells-in-table.js +2 -4
  132. package/dist/esm/utils/get-selection-range-in-column.js +8 -24
  133. package/dist/esm/utils/get-selection-range-in-row.js +8 -24
  134. package/dist/esm/utils/get-selection-rect.js +2 -2
  135. package/dist/esm/utils/go-to-next-cell.js +3 -19
  136. package/dist/esm/utils/handle-paste.js +5 -23
  137. package/dist/esm/utils/is-selected.js +8 -10
  138. package/dist/esm/utils/is-selection-type.js +0 -1
  139. package/dist/esm/utils/move-column.js +3 -8
  140. package/dist/esm/utils/move-row.js +3 -7
  141. package/dist/esm/utils/normalize-selection.js +3 -22
  142. package/dist/esm/utils/remove-column.js +10 -31
  143. package/dist/esm/utils/remove-row.js +8 -35
  144. package/dist/esm/utils/remove-table.js +2 -4
  145. package/dist/esm/utils/reorder-utils.js +11 -26
  146. package/dist/esm/utils/replace-table.js +0 -2
  147. package/dist/esm/utils/select-nodes.js +11 -22
  148. package/dist/esm/utils/selection-cell.js +0 -2
  149. package/dist/esm/utils/selection-rect.js +0 -4
  150. package/dist/esm/utils/set-cell-attrs.js +2 -2
  151. package/dist/esm/utils/split-cell-with-type.js +2 -28
  152. package/dist/esm/utils/split-cell.js +3 -2
  153. package/dist/esm/utils/table-node-types.js +4 -7
  154. package/dist/esm/utils/tables.js +0 -2
  155. package/dist/esm/utils/test-utils.js +12 -16
  156. package/dist/esm/utils/toggle-header.js +3 -10
  157. package/dist/esm/version.json +1 -1
  158. 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'; // Utilities to help with copying and pasting table cells
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
- } // : (Slice) → ?{width: number, height: number, rows: [Fragment]}
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
- openStart = slice.openStart,
58
- openEnd = slice.openEnd;
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
- } // : (Schema, [Fragment]) → {width: number, height: number, rows: [Fragment]}
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
- rowspan = _row$child$attrs.rowspan,
115
- colspan = _row$child$attrs.colspan;
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
- } // : ({width: number, height: number, rows: [Fragment]}, number, number) → {width: number, height: number, rows: [Fragment]}
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
- currentHeight = _ref.height,
170
- currentRows = _ref.rows;
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
- } // Make sure a table has at least the given width and height. Return
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
- } // Make sure the given line (left, top) to (right, top) doesn't cross
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
- cellTop = _map$findCell.top,
325
- cellLeft = _map$findCell.left;
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
- } // Make sure the given line (left, top) to (left, bottom) doesn't
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
- }; // For row === 0 && col === 0 it is enabled if either are enabled
399
-
327
+ };
400
328
 
401
- setMarkup(tr, 0, 0, headerColumnEnabled || headerRowEnabled); // Header Column
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
- } // Header Row
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
- } // Insert the given set of cells (as returned by `pastedCells`) into a
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); // Get if the header row and column are enabled on the original table
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
- left = rect.left;
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
- } // Prepare the table to be large enough and not have any cells
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
- }; // Returns a table node of a given size.
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
- _ref$rowsCount = _ref.rowsCount,
18
- rowsCount = _ref$rowsCount === void 0 ? 3 : _ref$rowsCount,
19
- _ref$colsCount = _ref.colsCount,
20
- colsCount = _ref$colsCount === void 0 ? 3 : _ref$colsCount,
21
- _ref$withHeaderRow = _ref.withHeaderRow,
22
- withHeaderRow = _ref$withHeaderRow === void 0 ? true : _ref$withHeaderRow,
23
- cellContent = _ref.cellContent;
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
- tableCell = _tableNodeTypes.cell,
27
- tableHeader = _tableNodeTypes.header_cell,
28
- tableRow = _tableNodeTypes.row,
29
- table = _tableNodeTypes.table;
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);
@@ -4,7 +4,6 @@ export function drawCellSelection(state) {
4
4
  if (!(state.selection instanceof CellSelection)) {
5
5
  return null;
6
6
  }
7
-
8
7
  var cells = [];
9
8
  state.selection.forEachCell(function (node, pos) {
10
9
  cells.push(Decoration.node(pos, pos + node.nodeSize, {
@@ -1,17 +1,16 @@
1
1
  import { cloneTr } from './clone-tr';
2
- import { tableNodeTypes } from './table-node-types'; // Returns a new transaction that clears the content of a given `cell`.
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
  };
@@ -1,34 +1,34 @@
1
1
  import { findParentNode, findParentNodeClosestToPos } from 'prosemirror-utils';
2
- import { TableMap } from '../table-map'; // Iterates over parent nodes, returning the closest table node.
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
- }; // Iterates over parent nodes, returning a table node closest to a given `$pos`.
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
- }; // Iterates over parent nodes, returning a table cell or a table header node closest to a given `$pos`.
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
- }; // Returns the rectangle spanning a cell closest to a given `$pos`.
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;