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