@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,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
- 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; }
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
- openStart = slice.openStart,
42
- openEnd = slice.openEnd;
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
- return ensureRectangular(schema, rows);
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
- rowspan = _row$child$attrs.rowspan,
97
- colspan = _row$child$attrs.colspan;
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
- } // : ({width: number, height: number, rows: [Fragment]}, number, number) → {width: number, height: number, rows: [Fragment]}
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
- currentHeight = _ref.height,
153
- currentRows = _ref.rows;
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
- } // Make sure a table has at least the given width and height. Return
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
- } // Make sure the given line (left, top) to (right, top) doesn't cross
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
- cellTop = _map$findCell.top,
309
- cellLeft = _map$findCell.left;
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
- } // Make sure the given line (left, top) to (left, bottom) doesn't
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
- } // Insert the given set of cells (as returned by `pastedCells`) into a
368
- // table, at the position pointed at by rect.
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
- left = rect.left;
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
- } // Prepare the table to be large enough and not have any cells
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
- }; // Returns a table node of a given size.
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
- _ref$rowsCount = _ref.rowsCount,
26
- rowsCount = _ref$rowsCount === void 0 ? 3 : _ref$rowsCount,
27
- _ref$colsCount = _ref.colsCount,
28
- colsCount = _ref$colsCount === void 0 ? 3 : _ref$colsCount,
29
- _ref$withHeaderRow = _ref.withHeaderRow,
30
- withHeaderRow = _ref$withHeaderRow === void 0 ? true : _ref$withHeaderRow,
31
- cellContent = _ref.cellContent;
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
- tableCell = _tableNodeTypes.cell,
35
- tableHeader = _tableNodeTypes.header_cell,
36
- tableRow = _tableNodeTypes.row,
37
- table = _tableNodeTypes.table;
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;