handsontable 0.0.0-next-b7cca45-20230605 → 0.0.0-next-aa25cac-20230607

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of handsontable might be problematic. Click here for more details.

Files changed (223) hide show
  1. package/3rdparty/walkontable/src/cell/coords.d.ts +6 -1
  2. package/3rdparty/walkontable/src/cell/coords.js +61 -12
  3. package/3rdparty/walkontable/src/cell/coords.mjs +61 -12
  4. package/3rdparty/walkontable/src/cell/range.d.ts +9 -2
  5. package/3rdparty/walkontable/src/cell/range.js +44 -7
  6. package/3rdparty/walkontable/src/cell/range.mjs +44 -7
  7. package/3rdparty/walkontable/src/core/_base.js +9 -3
  8. package/3rdparty/walkontable/src/core/_base.mjs +9 -3
  9. package/3rdparty/walkontable/src/core/clone.js +2 -2
  10. package/3rdparty/walkontable/src/core/clone.mjs +2 -2
  11. package/3rdparty/walkontable/src/core/core.js +3 -2
  12. package/3rdparty/walkontable/src/core/core.mjs +3 -2
  13. package/3rdparty/walkontable/src/event.js +7 -7
  14. package/3rdparty/walkontable/src/event.mjs +7 -7
  15. package/3rdparty/walkontable/src/facade/core.js +2 -2
  16. package/3rdparty/walkontable/src/facade/core.mjs +2 -2
  17. package/3rdparty/walkontable/src/index.js +10 -2
  18. package/3rdparty/walkontable/src/index.mjs +2 -2
  19. package/3rdparty/walkontable/src/overlay/_base.js +1 -1
  20. package/3rdparty/walkontable/src/overlay/_base.mjs +1 -1
  21. package/3rdparty/walkontable/src/overlay/inlineStart.js +2 -4
  22. package/3rdparty/walkontable/src/overlay/inlineStart.mjs +2 -4
  23. package/3rdparty/walkontable/src/overlay/top.js +2 -4
  24. package/3rdparty/walkontable/src/overlay/top.mjs +2 -4
  25. package/3rdparty/walkontable/src/{border.js → selection/border/border.js} +7 -12
  26. package/3rdparty/walkontable/src/{border.mjs → selection/border/border.mjs} +7 -12
  27. package/3rdparty/walkontable/src/selection/border/constants.js +18 -0
  28. package/3rdparty/walkontable/src/selection/border/constants.mjs +13 -0
  29. package/3rdparty/walkontable/src/selection/constants.js +63 -0
  30. package/3rdparty/walkontable/src/selection/constants.mjs +51 -0
  31. package/3rdparty/walkontable/src/selection/index.js +30 -0
  32. package/3rdparty/walkontable/src/selection/index.mjs +5 -0
  33. package/3rdparty/walkontable/src/selection/manager.js +328 -0
  34. package/3rdparty/walkontable/src/selection/manager.mjs +322 -0
  35. package/3rdparty/walkontable/src/selection/scanner.js +363 -0
  36. package/3rdparty/walkontable/src/selection/scanner.mjs +359 -0
  37. package/3rdparty/walkontable/src/selection/selection.js +133 -0
  38. package/3rdparty/walkontable/src/selection/selection.mjs +127 -0
  39. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.js +9 -0
  40. package/3rdparty/walkontable/src/table/mixin/calculatedColumns.mjs +9 -0
  41. package/3rdparty/walkontable/src/table/mixin/calculatedRows.js +9 -0
  42. package/3rdparty/walkontable/src/table/mixin/calculatedRows.mjs +9 -0
  43. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.js +9 -0
  44. package/3rdparty/walkontable/src/table/mixin/stickyColumnsStart.mjs +9 -0
  45. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.js +9 -0
  46. package/3rdparty/walkontable/src/table/mixin/stickyRowsBottom.mjs +9 -0
  47. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.js +9 -0
  48. package/3rdparty/walkontable/src/table/mixin/stickyRowsTop.mjs +9 -0
  49. package/3rdparty/walkontable/src/table.js +7 -79
  50. package/3rdparty/walkontable/src/table.mjs +8 -80
  51. package/base.js +2 -2
  52. package/base.mjs +2 -2
  53. package/core.d.ts +5 -3
  54. package/core.js +123 -308
  55. package/core.mjs +123 -308
  56. package/dataMap/metaManager/metaSchema.js +15 -0
  57. package/dataMap/metaManager/metaSchema.mjs +15 -0
  58. package/dist/handsontable.css +8 -3
  59. package/dist/handsontable.full.css +8 -3
  60. package/dist/handsontable.full.js +12578 -10028
  61. package/dist/handsontable.full.min.css +3 -3
  62. package/dist/handsontable.full.min.js +120 -120
  63. package/dist/handsontable.js +18881 -16331
  64. package/dist/handsontable.min.css +3 -3
  65. package/dist/handsontable.min.js +4 -4
  66. package/editorManager.js +21 -82
  67. package/editorManager.mjs +26 -86
  68. package/editors/textEditor/textEditor.js +3 -11
  69. package/editors/textEditor/textEditor.mjs +4 -12
  70. package/helpers/mixed.js +1 -1
  71. package/helpers/mixed.mjs +1 -1
  72. package/helpers/number.d.ts +1 -0
  73. package/helpers/number.js +18 -0
  74. package/helpers/number.mjs +17 -0
  75. package/package.json +1 -1
  76. package/pluginHooks.d.ts +5 -1
  77. package/pluginHooks.js +89 -1
  78. package/pluginHooks.mjs +89 -1
  79. package/plugins/copyPaste/copyPaste.js +5 -1
  80. package/plugins/copyPaste/copyPaste.mjs +5 -1
  81. package/plugins/customBorders/customBorders.js +18 -52
  82. package/plugins/customBorders/customBorders.mjs +19 -53
  83. package/plugins/mergeCells/mergeCells.js +5 -18
  84. package/plugins/mergeCells/mergeCells.mjs +5 -18
  85. package/plugins/nestedHeaders/nestedHeaders.js +132 -10
  86. package/plugins/nestedHeaders/nestedHeaders.mjs +132 -10
  87. package/plugins/nestedHeaders/stateManager/index.js +37 -0
  88. package/plugins/nestedHeaders/stateManager/index.mjs +37 -0
  89. package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
  90. package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
  91. package/selection/highlight/highlight.js +311 -88
  92. package/selection/highlight/highlight.mjs +301 -84
  93. package/selection/highlight/types/activeHeader.js +10 -9
  94. package/selection/highlight/types/activeHeader.mjs +10 -8
  95. package/selection/highlight/types/area.js +12 -27
  96. package/selection/highlight/types/area.mjs +16 -30
  97. package/selection/highlight/types/areaLayered.js +54 -0
  98. package/selection/highlight/types/areaLayered.mjs +49 -0
  99. package/selection/highlight/types/column.js +50 -0
  100. package/selection/highlight/types/column.mjs +45 -0
  101. package/selection/highlight/types/customSelection.js +7 -10
  102. package/selection/highlight/types/customSelection.mjs +7 -9
  103. package/selection/highlight/types/fill.js +5 -8
  104. package/selection/highlight/types/fill.mjs +5 -7
  105. package/selection/highlight/types/{cell.js → focus.js} +5 -8
  106. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  107. package/selection/highlight/types/header.js +10 -20
  108. package/selection/highlight/types/header.mjs +10 -19
  109. package/selection/highlight/types/{index.js → row.js} +27 -31
  110. package/selection/highlight/types/{index.mjs → row.mjs} +24 -29
  111. package/selection/highlight/visualSelection.js +31 -27
  112. package/selection/highlight/visualSelection.mjs +31 -27
  113. package/selection/index.js +4 -7
  114. package/selection/index.mjs +2 -3
  115. package/selection/mouseEventHandler.js +1 -1
  116. package/selection/mouseEventHandler.mjs +1 -1
  117. package/selection/range.js +8 -8
  118. package/selection/range.mjs +8 -8
  119. package/selection/selection.js +315 -180
  120. package/selection/selection.mjs +310 -179
  121. package/selection/transformation.js +233 -96
  122. package/selection/transformation.mjs +230 -93
  123. package/selection/utils.js +12 -35
  124. package/selection/utils.mjs +13 -35
  125. package/settings.d.ts +1 -0
  126. package/shortcutContexts/commands/editor/closeAndSave.js +15 -0
  127. package/shortcutContexts/commands/editor/closeAndSave.mjs +10 -0
  128. package/shortcutContexts/commands/editor/closeWithoutSaving.js +13 -0
  129. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  130. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  131. package/shortcutContexts/commands/editor/fastOpen.mjs +11 -0
  132. package/shortcutContexts/commands/editor/index.js +16 -0
  133. package/shortcutContexts/commands/editor/index.mjs +12 -0
  134. package/shortcutContexts/commands/editor/open.js +29 -0
  135. package/shortcutContexts/commands/editor/open.mjs +24 -0
  136. package/shortcutContexts/commands/emptySelectedCells.js +12 -0
  137. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  138. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  139. package/shortcutContexts/commands/extendCellsSelection/down.mjs +10 -0
  140. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +21 -0
  141. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +16 -0
  142. package/shortcutContexts/commands/extendCellsSelection/index.js +26 -0
  143. package/shortcutContexts/commands/extendCellsSelection/index.mjs +22 -0
  144. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  145. package/shortcutContexts/commands/extendCellsSelection/left.mjs +10 -0
  146. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  147. package/shortcutContexts/commands/extendCellsSelection/right.mjs +10 -0
  148. package/shortcutContexts/commands/extendCellsSelection/toColumns.js +19 -0
  149. package/shortcutContexts/commands/extendCellsSelection/toColumns.mjs +14 -0
  150. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +22 -0
  151. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +17 -0
  152. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +17 -0
  153. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +12 -0
  154. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +17 -0
  155. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +12 -0
  156. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +39 -0
  157. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +34 -0
  158. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +39 -0
  159. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +34 -0
  160. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +22 -0
  161. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +17 -0
  162. package/shortcutContexts/commands/extendCellsSelection/toRows.js +19 -0
  163. package/shortcutContexts/commands/extendCellsSelection/toRows.mjs +14 -0
  164. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  165. package/shortcutContexts/commands/extendCellsSelection/up.mjs +10 -0
  166. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +21 -0
  167. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +16 -0
  168. package/shortcutContexts/commands/index.js +51 -0
  169. package/shortcutContexts/commands/index.mjs +47 -0
  170. package/shortcutContexts/commands/moveCellSelection/down.js +12 -0
  171. package/shortcutContexts/commands/moveCellSelection/down.mjs +7 -0
  172. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +11 -0
  173. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +6 -0
  174. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  175. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  176. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +13 -0
  177. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  178. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +13 -0
  179. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  180. package/shortcutContexts/commands/moveCellSelection/left.js +11 -0
  181. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  182. package/shortcutContexts/commands/moveCellSelection/right.js +11 -0
  183. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  184. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +16 -0
  185. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +11 -0
  186. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +17 -0
  187. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +12 -0
  188. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +13 -0
  189. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +8 -0
  190. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +16 -0
  191. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +11 -0
  192. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +35 -0
  193. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +30 -0
  194. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +35 -0
  195. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +30 -0
  196. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +16 -0
  197. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +11 -0
  198. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +18 -0
  199. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +13 -0
  200. package/shortcutContexts/commands/moveCellSelection/up.js +12 -0
  201. package/shortcutContexts/commands/moveCellSelection/up.mjs +7 -0
  202. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +11 -0
  203. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +6 -0
  204. package/shortcutContexts/commands/populateSelectedCellsData.js +35 -0
  205. package/shortcutContexts/commands/populateSelectedCellsData.mjs +30 -0
  206. package/shortcutContexts/commands/selectAll.js +11 -0
  207. package/shortcutContexts/commands/selectAll.mjs +6 -0
  208. package/shortcutContexts/constants.js +19 -0
  209. package/shortcutContexts/constants.mjs +12 -0
  210. package/shortcutContexts/editor.js +29 -0
  211. package/shortcutContexts/editor.mjs +25 -0
  212. package/shortcutContexts/grid.js +244 -0
  213. package/shortcutContexts/grid.mjs +240 -0
  214. package/shortcutContexts/index.js +29 -0
  215. package/shortcutContexts/index.mjs +15 -0
  216. package/shortcuts/manager.js +2 -0
  217. package/shortcuts/manager.mjs +2 -0
  218. package/tableView.js +58 -9
  219. package/tableView.mjs +58 -9
  220. package/3rdparty/walkontable/src/selection.js +0 -354
  221. package/3rdparty/walkontable/src/selection.mjs +0 -348
  222. package/selection/highlight/constants.js +0 -16
  223. package/selection/highlight/constants.mjs +0 -6
@@ -1,11 +1,5 @@
1
1
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
2
2
  var _templateObject;
3
- function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
- function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
5
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
6
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
7
- function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
8
- function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
9
3
  function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
10
4
  import "core-js/modules/es.array.iterator.js";
11
5
  import "core-js/modules/es.object.to-string.js";
@@ -26,22 +20,22 @@ import "core-js/modules/es.symbol.description.js";
26
20
  import "core-js/modules/es.array.slice.js";
27
21
  import "core-js/modules/es.object.freeze.js";
28
22
  import "core-js/modules/es.symbol.iterator.js";
29
- import "core-js/modules/es.function.name.js";
30
- import "core-js/modules/es.regexp.exec.js";
31
23
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
32
24
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
33
25
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
26
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
34
27
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
35
28
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
36
- import Highlight from "./highlight/highlight.mjs";
37
- import { AREA_TYPE, HEADER_TYPE, CELL_TYPE } from "./highlight/constants.mjs";
29
+ import { CellCoords, CellRange } from "./../3rdparty/walkontable/src/index.mjs";
30
+ import Highlight, { AREA_TYPE, HEADER_TYPE, FOCUS_TYPE } from "./highlight/highlight.mjs";
38
31
  import SelectionRange from "./range.mjs";
39
32
  import { createObjectPropListener, mixin } from "./../helpers/object.mjs";
40
33
  import { isUndefined } from "./../helpers/mixed.mjs";
34
+ import { clamp } from "./../helpers/number.mjs";
41
35
  import { arrayEach } from "./../helpers/array.mjs";
42
36
  import localHooks from "./../mixins/localHooks.mjs";
43
37
  import Transformation from "./transformation.mjs";
44
- import { detectSelectionType, isValidCoord, normalizeSelectionFactory, SELECTION_TYPE_EMPTY, SELECTION_TYPE_UNRECOGNIZED } from "./utils.mjs";
38
+ import { detectSelectionType, normalizeSelectionFactory, SELECTION_TYPE_EMPTY, SELECTION_TYPE_UNRECOGNIZED } from "./utils.mjs";
45
39
  import { toSingleLine } from "./../helpers/templateLiteralTag.mjs";
46
40
  /**
47
41
  * @class Selection
@@ -56,57 +50,62 @@ var Selection = /*#__PURE__*/function () {
56
50
  *
57
51
  * @type {GridSettings}
58
52
  */
59
- this.settings = settings;
53
+ _defineProperty(this, "settings", void 0);
60
54
  /**
61
55
  * An additional object with dynamically defined properties which describes table state.
62
56
  *
63
57
  * @type {object}
64
58
  */
65
- this.tableProps = tableProps;
59
+ _defineProperty(this, "tableProps", void 0);
66
60
  /**
67
61
  * The flag which determines if the selection is in progress.
68
62
  *
69
63
  * @type {boolean}
70
64
  */
71
- this.inProgress = false;
65
+ _defineProperty(this, "inProgress", false);
72
66
  /**
73
- * The flag indicates that selection was performed by clicking the corner overlay.
67
+ * Selection data layer (handle visual coordinates).
74
68
  *
75
- * @type {boolean}
69
+ * @type {SelectionRange}
76
70
  */
77
- this.selectedByCorner = false;
71
+ _defineProperty(this, "selectedRange", new SelectionRange(function (highlight, from, to) {
72
+ return _this.tableProps.createCellRange(highlight, from, to);
73
+ }));
78
74
  /**
79
- * The collection of the selection layer levels where the whole row was selected using the row header or
80
- * the corner header.
75
+ * Visualization layer.
81
76
  *
82
- * @type {Set.<number>}
77
+ * @type {Highlight}
83
78
  */
84
- this.selectedByRowHeader = new Set();
79
+ _defineProperty(this, "highlight", void 0);
85
80
  /**
86
- * The collection of the selection layer levels where the whole column was selected using the column header or
87
- * the corner header.
81
+ * The module for modifying coordinates.
88
82
  *
89
- * @type {Set.<number>}
83
+ * @type {Transformation}
90
84
  */
91
- this.selectedByColumnHeader = new Set();
85
+ _defineProperty(this, "transformation", void 0);
92
86
  /**
93
- * Selection data layer (handle visual coordinates).
87
+ * The collection of the selection layer levels where the whole row was selected using the row header or
88
+ * the corner header.
94
89
  *
95
- * @type {SelectionRange}
90
+ * @type {Set<number>}
96
91
  */
97
- this.selectedRange = new SelectionRange(function (highlight, from, to) {
98
- return _this.tableProps.createCellRange(highlight, from, to);
99
- });
92
+ _defineProperty(this, "selectedByRowHeader", new Set());
100
93
  /**
101
- * Visualization layer.
94
+ * The collection of the selection layer levels where the whole column was selected using the column header or
95
+ * the corner header.
102
96
  *
103
- * @type {Highlight}
97
+ * @type {Set<number>}
104
98
  */
99
+ _defineProperty(this, "selectedByColumnHeader", new Set());
100
+ this.settings = settings;
101
+ this.tableProps = tableProps;
105
102
  this.highlight = new Highlight({
106
103
  headerClassName: settings.currentHeaderClassName,
107
104
  activeHeaderClassName: settings.activeHeaderClassName,
108
105
  rowClassName: settings.currentRowClassName,
109
106
  columnClassName: settings.currentColClassName,
107
+ rowIndexMapper: this.tableProps.rowIndexMapper,
108
+ columnIndexMapper: this.tableProps.columnIndexMapper,
110
109
  disabledCellSelection: function disabledCellSelection(row, column) {
111
110
  return _this.tableProps.isDisabledCellSelection(row, column);
112
111
  },
@@ -127,25 +126,22 @@ var Selection = /*#__PURE__*/function () {
127
126
  },
128
127
  createCellRange: function createCellRange(highlight, from, to) {
129
128
  return _this.tableProps.createCellRange(highlight, from, to);
130
- },
131
- rowIndexMapper: function rowIndexMapper() {
132
- return _this.tableProps.rowIndexMapper();
133
- },
134
- columnIndexMapper: function columnIndexMapper() {
135
- return _this.tableProps.columnIndexMapper();
136
129
  }
137
130
  });
138
- /**
139
- * The module for modifying coordinates.
140
- *
141
- * @type {Transformation}
142
- */
143
131
  this.transformation = new Transformation(this.selectedRange, {
144
- countRows: function countRows() {
145
- return _this.tableProps.countRowsTranslated();
132
+ rowIndexMapper: this.tableProps.rowIndexMapper,
133
+ columnIndexMapper: this.tableProps.columnIndexMapper,
134
+ countRenderableRows: function countRenderableRows() {
135
+ return _this.tableProps.countRenderableRows();
136
+ },
137
+ countRenderableColumns: function countRenderableColumns() {
138
+ return _this.tableProps.countRenderableColumns();
139
+ },
140
+ countRowHeaders: function countRowHeaders() {
141
+ return _this.tableProps.countRowHeaders();
146
142
  },
147
- countCols: function countCols() {
148
- return _this.tableProps.countColsTranslated();
143
+ countColHeaders: function countColHeaders() {
144
+ return _this.tableProps.countColHeaders();
149
145
  },
150
146
  visualToRenderableCoords: function visualToRenderableCoords(coords) {
151
147
  return _this.tableProps.visualToRenderableCoords(coords);
@@ -156,6 +152,9 @@ var Selection = /*#__PURE__*/function () {
156
152
  createCellCoords: function createCellCoords(row, column) {
157
153
  return _this.tableProps.createCellCoords(row, column);
158
154
  },
155
+ navigableHeaders: function navigableHeaders() {
156
+ return settings.navigableHeaders;
157
+ },
159
158
  fixedRowsBottom: function fixedRowsBottom() {
160
159
  return settings.fixedRowsBottom;
161
160
  },
@@ -222,7 +221,7 @@ var Selection = /*#__PURE__*/function () {
222
221
  }
223
222
 
224
223
  /**
225
- * Indicate that selection process began. It sets internaly `.inProgress` property to `true`.
224
+ * Indicate that selection process began. It sets internally `.inProgress` property to `true`.
226
225
  */
227
226
  }, {
228
227
  key: "begin",
@@ -231,7 +230,7 @@ var Selection = /*#__PURE__*/function () {
231
230
  }
232
231
 
233
232
  /**
234
- * Indicate that selection process finished. It sets internaly `.inProgress` property to `false`.
233
+ * Indicate that selection process finished. It sets internally `.inProgress` property to `false`.
235
234
  */
236
235
  }, {
237
236
  key: "finish",
@@ -260,35 +259,27 @@ var Selection = /*#__PURE__*/function () {
260
259
  * the default trigger will be used.
261
260
  * @param {boolean} [fragment=false] If `true`, the selection will be treated as a partial selection where the
262
261
  * `setRangeEnd` method won't be called on every `setRangeStart` call.
262
+ * @param {CellCoords} [highlightCoords] If set, allows changing the coordinates of the highlight/focus cell.
263
263
  */
264
264
  }, {
265
265
  key: "setRangeStart",
266
266
  value: function setRangeStart(coords, multipleSelection) {
267
267
  var fragment = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
268
+ var highlightCoords = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : coords;
268
269
  var isMultipleMode = this.settings.selectionMode === 'multiple';
269
270
  var isMultipleSelection = isUndefined(multipleSelection) ? this.tableProps.getShortcutManager().isCtrlPressed() : multipleSelection;
270
- var isRowNegative = coords.row < 0;
271
- var isColumnNegative = coords.col < 0;
272
- var selectedByCorner = isRowNegative && isColumnNegative;
273
271
  // We are creating copy. We would like to modify just the start of the selection by below hook. Then original coords
274
272
  // should be handled by next methods.
275
273
  var coordsClone = coords.clone();
276
- this.selectedByCorner = selectedByCorner;
277
274
  this.runLocalHooks("beforeSetRangeStart".concat(fragment ? 'Only' : ''), coordsClone);
278
275
  if (!isMultipleMode || isMultipleMode && !isMultipleSelection && isUndefined(multipleSelection)) {
279
276
  this.selectedRange.clear();
280
277
  }
281
- this.selectedRange.add(coordsClone);
278
+ this.selectedRange.add(coordsClone).current().setHighlight(highlightCoords.clone());
282
279
  if (this.getLayerLevel() === 0) {
283
280
  this.selectedByRowHeader.clear();
284
281
  this.selectedByColumnHeader.clear();
285
282
  }
286
- if (!selectedByCorner && isColumnNegative) {
287
- this.selectedByRowHeader.add(this.getLayerLevel());
288
- }
289
- if (!selectedByCorner && isRowNegative) {
290
- this.selectedByColumnHeader.add(this.getLayerLevel());
291
- }
292
283
  if (!fragment) {
293
284
  this.setRangeEnd(coords);
294
285
  }
@@ -301,11 +292,13 @@ var Selection = /*#__PURE__*/function () {
301
292
  * @param {boolean} [multipleSelection] If `true`, selection will be worked in 'multiple' mode. This option works
302
293
  * only when 'selectionMode' is set as 'multiple'. If the argument is not defined
303
294
  * the default trigger will be used.
295
+ * @param {CellCoords} [highlightCoords] If set, allows changing the coordinates of the highlight/focus cell.
304
296
  */
305
297
  }, {
306
298
  key: "setRangeStartOnly",
307
299
  value: function setRangeStartOnly(coords, multipleSelection) {
308
- this.setRangeStart(coords, multipleSelection, true);
300
+ var highlightCoords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : coords;
301
+ this.setRangeStart(coords, multipleSelection, true, highlightCoords);
309
302
  }
310
303
 
311
304
  /**
@@ -319,21 +312,39 @@ var Selection = /*#__PURE__*/function () {
319
312
  if (this.selectedRange.isEmpty()) {
320
313
  return;
321
314
  }
322
-
323
- // We are creating copy. We would like to modify just the end of the selection by below hook. Then original coords
324
- // should be handled by next methods.
325
315
  var coordsClone = coords.clone();
316
+ var countRows = this.tableProps.countRows();
317
+ var countCols = this.tableProps.countCols();
318
+ var isSingle = this.selectedRange.current().clone().setTo(coords).isSingleHeader();
319
+
320
+ // Ignore processing the end range when the header selection starts overlapping the corner and
321
+ // the selection is not a single header highlight.
322
+ if ((countRows > 0 || countCols > 0) && (countRows === 0 && coordsClone.col < 0 && !isSingle || countCols === 0 && coordsClone.row < 0 && !isSingle)) {
323
+ return;
324
+ }
326
325
  this.runLocalHooks('beforeSetRangeEnd', coordsClone);
327
326
  this.begin();
328
327
  var cellRange = this.selectedRange.current();
329
- if (this.settings.selectionMode !== 'single') {
330
- cellRange.setTo(this.tableProps.createCellCoords(coordsClone.row, coordsClone.col));
328
+ if (!this.settings.navigableHeaders) {
329
+ cellRange.highlight.normalize();
330
+ }
331
+ if (this.settings.selectionMode === 'single') {
332
+ cellRange.setFrom(cellRange.highlight);
333
+ cellRange.setTo(cellRange.highlight);
334
+ } else {
335
+ cellRange.setTo(coordsClone);
331
336
  }
332
337
 
333
- // Set up current selection.
334
- this.highlight.getCell().clear();
335
- if (this.highlight.isEnabledFor(CELL_TYPE, cellRange.highlight)) {
336
- this.highlight.getCell().add(this.selectedRange.current().highlight).commit().syncWith(cellRange);
338
+ // Prevent creating "area" selection that overlaps headers.
339
+ if (countRows > 0 && countCols > 0) {
340
+ if (!this.settings.navigableHeaders || this.settings.navigableHeaders && !cellRange.isSingleHeader()) {
341
+ cellRange.to.normalize();
342
+ }
343
+ }
344
+ var focusHighlight = this.highlight.getFocus();
345
+ focusHighlight.clear();
346
+ if (this.highlight.isEnabledFor(FOCUS_TYPE, cellRange.highlight)) {
347
+ focusHighlight.add(this.selectedRange.current().highlight).commit().syncWith(cellRange);
337
348
  }
338
349
  var layerLevel = this.getLayerLevel();
339
350
 
@@ -343,73 +354,96 @@ var Selection = /*#__PURE__*/function () {
343
354
  arrayEach(this.highlight.getAreas(), function (highlight) {
344
355
  return void highlight.clear();
345
356
  });
346
- arrayEach(this.highlight.getHeaders(), function (highlight) {
357
+ arrayEach(this.highlight.getLayeredAreas(), function (highlight) {
358
+ return void highlight.clear();
359
+ });
360
+ arrayEach(this.highlight.getRowHeaders(), function (highlight) {
361
+ return void highlight.clear();
362
+ });
363
+ arrayEach(this.highlight.getColumnHeaders(), function (highlight) {
364
+ return void highlight.clear();
365
+ });
366
+ arrayEach(this.highlight.getActiveRowHeaders(), function (highlight) {
367
+ return void highlight.clear();
368
+ });
369
+ arrayEach(this.highlight.getActiveColumnHeaders(), function (highlight) {
370
+ return void highlight.clear();
371
+ });
372
+ arrayEach(this.highlight.getActiveCornerHeaders(), function (highlight) {
347
373
  return void highlight.clear();
348
374
  });
349
- arrayEach(this.highlight.getActiveHeaders(), function (highlight) {
375
+ arrayEach(this.highlight.getRowHighlights(), function (highlight) {
376
+ return void highlight.clear();
377
+ });
378
+ arrayEach(this.highlight.getColumnHighlights(), function (highlight) {
350
379
  return void highlight.clear();
351
380
  });
352
381
  }
353
382
  this.highlight.useLayerLevel(layerLevel);
354
- var areaHighlight = this.highlight.createOrGetArea();
355
- var headerHighlight = this.highlight.createOrGetHeader();
356
- var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();
383
+ var areaHighlight = this.highlight.createArea();
384
+ var layeredAreaHighlight = this.highlight.createLayeredArea();
385
+ var rowHeaderHighlight = this.highlight.createRowHeader();
386
+ var columnHeaderHighlight = this.highlight.createColumnHeader();
387
+ var activeRowHeaderHighlight = this.highlight.createActiveRowHeader();
388
+ var activeColumnHeaderHighlight = this.highlight.createActiveColumnHeader();
389
+ var activeCornerHeaderHighlight = this.highlight.createActiveCornerHeader();
390
+ var rowHighlight = this.highlight.createRowHighlight();
391
+ var columnHighlight = this.highlight.createColumnHighlight();
357
392
  areaHighlight.clear();
358
- headerHighlight.clear();
359
- activeHeaderHighlight.clear();
393
+ layeredAreaHighlight.clear();
394
+ rowHeaderHighlight.clear();
395
+ columnHeaderHighlight.clear();
396
+ activeRowHeaderHighlight.clear();
397
+ activeColumnHeaderHighlight.clear();
398
+ activeCornerHeaderHighlight.clear();
399
+ rowHighlight.clear();
400
+ columnHighlight.clear();
360
401
  if (this.highlight.isEnabledFor(AREA_TYPE, cellRange.highlight) && (this.isMultiple() || layerLevel >= 1)) {
361
402
  areaHighlight.add(cellRange.from).add(cellRange.to).commit();
403
+ layeredAreaHighlight.add(cellRange.from).add(cellRange.to).commit();
362
404
  if (layerLevel === 1) {
363
405
  // For single cell selection in the same layer, we do not create area selection to prevent blue background.
364
406
  // When non-consecutive selection is performed we have to add that missing area selection to the previous layer
365
407
  // based on previous coordinates. It only occurs when the previous selection wasn't select multiple cells.
366
408
  var previousRange = this.selectedRange.previous();
367
- this.highlight.useLayerLevel(layerLevel - 1).createOrGetArea().add(previousRange.from).commit()
409
+ this.highlight.useLayerLevel(layerLevel - 1);
410
+ this.highlight.createArea().add(previousRange.from).commit()
411
+ // Range may start with hidden indexes. Commit would not found start point (as we add just the `from` coords).
412
+ .syncWith(previousRange);
413
+ this.highlight.createLayeredArea().add(previousRange.from).commit()
368
414
  // Range may start with hidden indexes. Commit would not found start point (as we add just the `from` coords).
369
415
  .syncWith(previousRange);
370
416
  this.highlight.useLayerLevel(layerLevel);
371
417
  }
372
418
  }
373
419
  if (this.highlight.isEnabledFor(HEADER_TYPE, cellRange.highlight)) {
374
- // The header selection generally contains cell selection. In a case when all rows (or columns)
375
- // are hidden that visual coordinates are translated to renderable coordinates that do not exist.
376
- // Hence no header highlight is generated. In that case, to make a column (or a row) header
377
- // highlight, the row and column index has to point to the header (the negative value). See #7052.
378
- var areAnyRowsRendered = this.tableProps.countRowsTranslated() === 0;
379
- var areAnyColumnsRendered = this.tableProps.countColsTranslated() === 0;
380
- var headerCellRange = cellRange;
381
- if (areAnyRowsRendered || areAnyColumnsRendered) {
382
- headerCellRange = cellRange.clone();
383
- }
384
- if (areAnyRowsRendered) {
385
- headerCellRange.from.row = -1;
386
- }
387
- if (areAnyColumnsRendered) {
388
- headerCellRange.from.col = -1;
389
- }
390
- if (this.settings.selectionMode === 'single') {
391
- if (this.isSelectedByAnyHeader()) {
392
- headerCellRange.from.normalize();
420
+ if (!cellRange.isSingleHeader()) {
421
+ var rowCoordsFrom = this.tableProps.createCellCoords(Math.max(cellRange.from.row, 0), -1);
422
+ var rowCoordsTo = this.tableProps.createCellCoords(cellRange.to.row, -1);
423
+ var columnCoordsFrom = this.tableProps.createCellCoords(-1, Math.max(cellRange.from.col, 0));
424
+ var columnCoordsTo = this.tableProps.createCellCoords(-1, cellRange.to.col);
425
+ if (this.settings.selectionMode === 'single') {
426
+ rowHeaderHighlight.add(rowCoordsFrom).commit();
427
+ columnHeaderHighlight.add(columnCoordsFrom).commit();
428
+ rowHighlight.add(rowCoordsFrom).commit();
429
+ columnHighlight.add(columnCoordsFrom).commit();
430
+ } else {
431
+ rowHeaderHighlight.add(rowCoordsFrom).add(rowCoordsTo).commit();
432
+ columnHeaderHighlight.add(columnCoordsFrom).add(columnCoordsTo).commit();
433
+ rowHighlight.add(rowCoordsFrom).add(rowCoordsTo).commit();
434
+ columnHighlight.add(columnCoordsFrom).add(columnCoordsTo).commit();
393
435
  }
394
- headerHighlight.add(headerCellRange.from).commit();
395
- } else {
396
- headerHighlight.add(headerCellRange.from).add(headerCellRange.to).commit();
397
436
  }
398
- if (this.isEntireRowSelected()) {
399
- var isRowSelected = this.tableProps.countCols() === cellRange.getWidth();
400
-
401
- // Make sure that the whole row is selected (in case where selectionMode is set to 'single')
402
- if (isRowSelected) {
403
- activeHeaderHighlight.add(this.tableProps.createCellCoords(cellRange.from.row, -1)).add(this.tableProps.createCellCoords(cellRange.to.row, -1)).commit();
404
- }
437
+ var highlightRowHeaders = this.isEntireRowSelected() && (countCols > 0 && countCols === cellRange.getWidth() || countCols === 0 && (this.isSelectedByRowHeader() || this.isSelectedByCorner()));
438
+ var highlightColumnHeaders = this.isEntireColumnSelected() && (countRows > 0 && countRows === cellRange.getHeight() || countRows === 0 && (this.isSelectedByColumnHeader() || this.isSelectedByCorner()));
439
+ if (highlightRowHeaders) {
440
+ activeRowHeaderHighlight.add(this.tableProps.createCellCoords(Math.max(cellRange.from.row, 0), Math.min(-this.tableProps.countRowHeaders(), -1))).add(this.tableProps.createCellCoords(Math.max(cellRange.to.row, 0), -1)).commit();
405
441
  }
406
- if (this.isEntireColumnSelected()) {
407
- var isColumnSelected = this.tableProps.countRows() === cellRange.getHeight();
408
-
409
- // Make sure that the whole column is selected (in case where selectionMode is set to 'single')
410
- if (isColumnSelected) {
411
- activeHeaderHighlight.add(this.tableProps.createCellCoords(-1, cellRange.from.col)).add(this.tableProps.createCellCoords(-1, cellRange.to.col)).commit();
412
- }
442
+ if (highlightColumnHeaders) {
443
+ activeColumnHeaderHighlight.add(this.tableProps.createCellCoords(Math.min(-this.tableProps.countColHeaders(), -1), Math.max(cellRange.from.col, 0))).add(this.tableProps.createCellCoords(-1, Math.max(cellRange.to.col, 0))).commit();
444
+ }
445
+ if (highlightRowHeaders && highlightColumnHeaders) {
446
+ activeCornerHeaderHighlight.add(this.tableProps.createCellCoords(-this.tableProps.countColHeaders(), -this.tableProps.countRowHeaders())).add(this.tableProps.createCellCoords(-1, -1)).commit();
413
447
  }
414
448
  }
415
449
  this.runLocalHooks('afterSetRangeEnd', coords);
@@ -434,14 +468,14 @@ var Selection = /*#__PURE__*/function () {
434
468
  *
435
469
  * @param {number} rowDelta Rows number to move, value can be passed as negative number.
436
470
  * @param {number} colDelta Columns number to move, value can be passed as negative number.
437
- * @param {boolean} [force=false] If `true` the new rows/columns will be created if necessary. Otherwise, row/column will
438
- * be created according to `minSpareRows/minSpareCols` settings of Handsontable.
471
+ * @param {boolean} [createMissingRecords=false] If `true` the new rows/columns will be created if necessary.
472
+ * Otherwise, row/column will be created according to `minSpareRows/minSpareCols` settings of Handsontable.
439
473
  */
440
474
  }, {
441
475
  key: "transformStart",
442
476
  value: function transformStart(rowDelta, colDelta) {
443
- var force = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
444
- this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, force));
477
+ var createMissingRecords = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
478
+ this.setRangeStart(this.transformation.transformStart(rowDelta, colDelta, createMissingRecords));
445
479
  }
446
480
 
447
481
  /**
@@ -490,7 +524,7 @@ var Selection = /*#__PURE__*/function () {
490
524
  key: "isSelectedByRowHeader",
491
525
  value: function isSelectedByRowHeader() {
492
526
  var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();
493
- return !this.isSelectedByCorner(layerLevel) && this.isEntireRowSelected(layerLevel);
527
+ return !this.isSelectedByCorner(layerLevel) && (layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel));
494
528
  }
495
529
 
496
530
  /**
@@ -503,8 +537,22 @@ var Selection = /*#__PURE__*/function () {
503
537
  }, {
504
538
  key: "isEntireRowSelected",
505
539
  value: function isEntireRowSelected() {
540
+ var _this2 = this;
506
541
  var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();
507
- return layerLevel === -1 ? this.selectedByRowHeader.size > 0 : this.selectedByRowHeader.has(layerLevel);
542
+ var tester = function tester(range) {
543
+ var _range$getOuterTopSta = range.getOuterTopStartCorner(),
544
+ col = _range$getOuterTopSta.col;
545
+ var rowHeaders = _this2.tableProps.countRowHeaders();
546
+ var countCols = _this2.tableProps.countCols();
547
+ return (rowHeaders > 0 && col < 0 || rowHeaders === 0) && range.getWidth() === countCols;
548
+ };
549
+ if (layerLevel === -1) {
550
+ return Array.from(this.selectedRange).some(function (range) {
551
+ return tester(range);
552
+ });
553
+ }
554
+ var range = this.selectedRange.peekByIndex(layerLevel);
555
+ return range ? tester(range) : false;
508
556
  }
509
557
 
510
558
  /**
@@ -519,7 +567,7 @@ var Selection = /*#__PURE__*/function () {
519
567
  key: "isSelectedByColumnHeader",
520
568
  value: function isSelectedByColumnHeader() {
521
569
  var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();
522
- return !this.isSelectedByCorner() && this.isEntireColumnSelected(layerLevel);
570
+ return !this.isSelectedByCorner() && (layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel));
523
571
  }
524
572
 
525
573
  /**
@@ -532,8 +580,22 @@ var Selection = /*#__PURE__*/function () {
532
580
  }, {
533
581
  key: "isEntireColumnSelected",
534
582
  value: function isEntireColumnSelected() {
583
+ var _this3 = this;
535
584
  var layerLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.getLayerLevel();
536
- return layerLevel === -1 ? this.selectedByColumnHeader.size > 0 : this.selectedByColumnHeader.has(layerLevel);
585
+ var tester = function tester(range) {
586
+ var _range$getOuterTopSta2 = range.getOuterTopStartCorner(),
587
+ row = _range$getOuterTopSta2.row;
588
+ var colHeaders = _this3.tableProps.countColHeaders();
589
+ var countRows = _this3.tableProps.countRows();
590
+ return (colHeaders > 0 && row < 0 || colHeaders === 0) && range.getHeight() === countRows;
591
+ };
592
+ if (layerLevel === -1) {
593
+ return Array.from(this.selectedRange).some(function (range) {
594
+ return tester(range);
595
+ });
596
+ }
597
+ var range = this.selectedRange.peekByIndex(layerLevel);
598
+ return range ? tester(range) : false;
537
599
  }
538
600
 
539
601
  /**
@@ -555,7 +617,7 @@ var Selection = /*#__PURE__*/function () {
555
617
  }, {
556
618
  key: "isSelectedByCorner",
557
619
  value: function isSelectedByCorner() {
558
- return this.selectedByCorner;
620
+ return this.selectedByColumnHeader.has(this.getLayerLevel()) && this.selectedByRowHeader.has(this.getLayerLevel());
559
621
  }
560
622
 
561
623
  /**
@@ -624,31 +686,49 @@ var Selection = /*#__PURE__*/function () {
624
686
  }
625
687
 
626
688
  /**
627
- * Select all cells.
689
+ * Selects all cells and headers.
628
690
  *
629
- * @param {boolean} [includeRowHeaders=false] `true` If the selection should include the row headers, `false`
630
- * otherwise.
631
- * @param {boolean} [includeColumnHeaders=false] `true` If the selection should include the column headers, `false`
632
- * otherwise.
691
+ * @param {boolean} [includeRowHeaders=false] `true` If the selection should include the row headers,
692
+ * `false` otherwise.
693
+ * @param {boolean} [includeColumnHeaders=false] `true` If the selection should include the column
694
+ * headers, `false` otherwise.
695
+ * @param {{row: number, col: number}} [focusPosition] The argument allows changing the cell/header
696
+ * focus position. The value takes an object with a `row` and `col` properties from -N to N, where
697
+ * negative values point to the headers and positive values point to the cell range.
633
698
  */
634
699
  }, {
635
700
  key: "selectAll",
636
701
  value: function selectAll() {
637
702
  var includeRowHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
638
703
  var includeColumnHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
704
+ var focusPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
705
+ row: this.tableProps.countRowHeaders() > 0 ? -this.tableProps.countRowHeaders() : 0,
706
+ col: this.tableProps.countColHeaders() > 0 ? -this.tableProps.countColHeaders() : 0
707
+ };
639
708
  var nrOfRows = this.tableProps.countRows();
640
709
  var nrOfColumns = this.tableProps.countCols();
710
+ var countRowHeaders = this.tableProps.countRowHeaders();
711
+ var countColHeaders = this.tableProps.countColHeaders();
712
+ var rowFrom = includeRowHeaders ? -countColHeaders : 0;
713
+ var columnFrom = includeColumnHeaders ? -countRowHeaders : 0;
641
714
 
642
715
  // We can't select cells when there is no data.
643
- if (!includeRowHeaders && !includeColumnHeaders && (nrOfRows === 0 || nrOfColumns === 0)) {
716
+ if (rowFrom === 0 && columnFrom === 0 && (nrOfRows === 0 || nrOfColumns === 0)) {
644
717
  return;
645
718
  }
646
- var startCoords = this.tableProps.createCellCoords(includeColumnHeaders ? -1 : 0, includeRowHeaders ? -1 : 0);
719
+ var highlightRow = Number.isInteger(focusPosition.row) ? focusPosition.row : 0;
720
+ var highlightColumn = Number.isInteger(focusPosition.col) ? focusPosition.col : 0;
721
+ var startCoords = this.tableProps.createCellCoords(rowFrom, columnFrom);
722
+ var highlight = this.tableProps.createCellCoords(clamp(highlightRow, rowFrom, nrOfRows - 1), clamp(highlightColumn, columnFrom, nrOfColumns - 1));
647
723
  var endCoords = this.tableProps.createCellCoords(nrOfRows - 1, nrOfColumns - 1);
648
724
  this.clear();
649
- this.setRangeStartOnly(startCoords);
650
- this.selectedByRowHeader.add(this.getLayerLevel());
651
- this.selectedByColumnHeader.add(this.getLayerLevel());
725
+ this.setRangeStartOnly(startCoords, void 0, highlight);
726
+ if (columnFrom < 0) {
727
+ this.selectedByRowHeader.add(this.getLayerLevel());
728
+ }
729
+ if (rowFrom < 0) {
730
+ this.selectedByColumnHeader.add(this.getLayerLevel());
731
+ }
652
732
  this.setRangeEnd(endCoords);
653
733
  this.finish();
654
734
  }
@@ -665,7 +745,7 @@ var Selection = /*#__PURE__*/function () {
665
745
  }, {
666
746
  key: "selectCells",
667
747
  value: function selectCells(selectionRanges) {
668
- var _this2 = this;
748
+ var _this4 = this;
669
749
  var selectionType = detectSelectionType(selectionRanges);
670
750
  if (selectionType === SELECTION_TYPE_EMPTY) {
671
751
  return false;
@@ -674,36 +754,33 @@ var Selection = /*#__PURE__*/function () {
674
754
  }
675
755
  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType, {
676
756
  propToCol: function propToCol(prop) {
677
- return _this2.tableProps.propToCol(prop);
757
+ return _this4.tableProps.propToCol(prop);
678
758
  },
679
759
  keepDirection: true
680
760
  });
681
- var nrOfRows = this.tableProps.countRows();
682
- var nrOfColumns = this.tableProps.countCols();
761
+ var navigableHeaders = this.settings.navigableHeaders;
762
+ var tableParams = {
763
+ countRows: this.tableProps.countRows(),
764
+ countCols: this.tableProps.countCols(),
765
+ countRowHeaders: navigableHeaders ? this.tableProps.countRowHeaders() : 0,
766
+ countColHeaders: navigableHeaders ? this.tableProps.countColHeaders() : 0
767
+ };
683
768
 
684
769
  // Check if every layer of the coordinates are valid.
685
770
  var isValid = !selectionRanges.some(function (selection) {
686
- var _selectionSchemaNorma = selectionSchemaNormalizer(selection),
687
- _selectionSchemaNorma2 = _slicedToArray(_selectionSchemaNorma, 4),
688
- rowStart = _selectionSchemaNorma2[0],
689
- columnStart = _selectionSchemaNorma2[1],
690
- rowEnd = _selectionSchemaNorma2[2],
691
- columnEnd = _selectionSchemaNorma2[3];
692
- var _isValid = isValidCoord(rowStart, nrOfRows) && isValidCoord(columnStart, nrOfColumns) && isValidCoord(rowEnd, nrOfRows) && isValidCoord(columnEnd, nrOfColumns);
693
- return !_isValid;
771
+ var cellRange = selectionSchemaNormalizer(selection);
772
+ var rangeValidity = cellRange.isValid(tableParams);
773
+ return !(rangeValidity && !cellRange.containsHeaders() || rangeValidity && cellRange.containsHeaders() && cellRange.isSingleHeader());
694
774
  });
695
775
  if (isValid) {
696
776
  this.clear();
697
777
  arrayEach(selectionRanges, function (selection) {
698
- var _selectionSchemaNorma3 = selectionSchemaNormalizer(selection),
699
- _selectionSchemaNorma4 = _slicedToArray(_selectionSchemaNorma3, 4),
700
- rowStart = _selectionSchemaNorma4[0],
701
- columnStart = _selectionSchemaNorma4[1],
702
- rowEnd = _selectionSchemaNorma4[2],
703
- columnEnd = _selectionSchemaNorma4[3];
704
- _this2.setRangeStartOnly(_this2.tableProps.createCellCoords(rowStart, columnStart), false);
705
- _this2.setRangeEnd(_this2.tableProps.createCellCoords(rowEnd, columnEnd));
706
- _this2.finish();
778
+ var _selectionSchemaNorma = selectionSchemaNormalizer(selection),
779
+ from = _selectionSchemaNorma.from,
780
+ to = _selectionSchemaNorma.to;
781
+ _this4.setRangeStartOnly(from.clone(), false);
782
+ _this4.setRangeEnd(to.clone());
783
+ _this4.finish();
707
784
  });
708
785
  }
709
786
  return isValid;
@@ -715,24 +792,45 @@ var Selection = /*#__PURE__*/function () {
715
792
  *
716
793
  * @param {number|string} startColumn Visual column index or column property from which the selection starts.
717
794
  * @param {number|string} [endColumn] Visual column index or column property from to the selection finishes.
718
- * @param {number} [headerLevel=-1] A row header index that triggers the column selection. The value can
719
- * take -1 to -N, where -1 means the header closest to the cells.
720
- *
795
+ * @param {number} [focusPosition=0] The argument allows changing the cell/header focus position.
796
+ * The value can take visual row index from -N to N, where negative values
797
+ * point to the headers and positive values point to the cell range.
721
798
  * @returns {boolean} Returns `true` if selection was successful, `false` otherwise.
722
799
  */
723
800
  }, {
724
801
  key: "selectColumns",
725
802
  value: function selectColumns(startColumn) {
726
803
  var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;
727
- var headerLevel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
804
+ var focusPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
728
805
  var start = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn;
729
806
  var end = typeof endColumn === 'string' ? this.tableProps.propToCol(endColumn) : endColumn;
730
- var nrOfColumns = this.tableProps.countCols();
731
- var nrOfRows = this.tableProps.countRows();
732
- var isValid = isValidCoord(start, nrOfColumns) && isValidCoord(end, nrOfColumns);
807
+ var countRows = this.tableProps.countRows();
808
+ var countCols = this.tableProps.countCols();
809
+ var countColHeaders = this.tableProps.countColHeaders();
810
+ var columnHeaderLastIndex = countColHeaders === 0 ? 0 : -countColHeaders;
811
+ var fromCoords = new CellCoords(columnHeaderLastIndex, start);
812
+ var toCoords = new CellCoords(countRows - 1, end);
813
+ var isValid = new CellRange(fromCoords, fromCoords, toCoords).isValid({
814
+ countRows: countRows,
815
+ countCols: countCols,
816
+ countRowHeaders: 0,
817
+ countColHeaders: countColHeaders
818
+ });
733
819
  if (isValid) {
734
- this.setRangeStartOnly(this.tableProps.createCellCoords(headerLevel, start));
735
- this.setRangeEnd(this.tableProps.createCellCoords(nrOfRows - 1, end));
820
+ var fromRow = countColHeaders === 0 ? 0 : clamp(focusPosition, columnHeaderLastIndex, -1);
821
+ var toRow = countRows - 1;
822
+ var from = this.tableProps.createCellCoords(fromRow, start);
823
+ var to = this.tableProps.createCellCoords(toRow, end);
824
+ var highlight = this.tableProps.createCellCoords(clamp(focusPosition, columnHeaderLastIndex, countRows - 1), start);
825
+ this.runLocalHooks('beforeSelectColumns', from, to, highlight);
826
+
827
+ // disallow modifying row axis for that hooks
828
+ from.row = fromRow;
829
+ to.row = toRow;
830
+ this.setRangeStartOnly(from, void 0, highlight);
831
+ this.selectedByColumnHeader.add(this.getLayerLevel());
832
+ this.setRangeEnd(to);
833
+ this.runLocalHooks('afterSelectColumns', from, to, highlight);
736
834
  this.finish();
737
835
  }
738
836
  return isValid;
@@ -743,22 +841,43 @@ var Selection = /*#__PURE__*/function () {
743
841
  *
744
842
  * @param {number} startRow Visual row index from which the selection starts.
745
843
  * @param {number} [endRow] Visual row index from to the selection finishes.
746
- * @param {number} [headerLevel=-1] A column header index that triggers the row selection.
747
- * The value can take -1 to -N, where -1 means the header
748
- * closest to the cells.
844
+ * @param {number} [focusPosition=0] The argument allows changing the cell/header focus position.
845
+ * The value can take visual column index from -N to N, where negative values
846
+ * point to the headers and positive values point to the cell range.
749
847
  * @returns {boolean} Returns `true` if selection was successful, `false` otherwise.
750
848
  */
751
849
  }, {
752
850
  key: "selectRows",
753
851
  value: function selectRows(startRow) {
754
852
  var endRow = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startRow;
755
- var headerLevel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
756
- var nrOfRows = this.tableProps.countRows();
757
- var nrOfColumns = this.tableProps.countCols();
758
- var isValid = isValidCoord(startRow, nrOfRows) && isValidCoord(endRow, nrOfRows);
853
+ var focusPosition = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
854
+ var countRows = this.tableProps.countRows();
855
+ var countCols = this.tableProps.countCols();
856
+ var countRowHeaders = this.tableProps.countRowHeaders();
857
+ var rowHeaderLastIndex = countRowHeaders === 0 ? 0 : -countRowHeaders;
858
+ var fromCoords = new CellCoords(startRow, rowHeaderLastIndex);
859
+ var toCoords = new CellCoords(endRow, countCols - 1);
860
+ var isValid = new CellRange(fromCoords, fromCoords, toCoords).isValid({
861
+ countRows: countRows,
862
+ countCols: countCols,
863
+ countRowHeaders: countRowHeaders,
864
+ countColHeaders: 0
865
+ });
759
866
  if (isValid) {
760
- this.setRangeStartOnly(this.tableProps.createCellCoords(startRow, headerLevel));
761
- this.setRangeEnd(this.tableProps.createCellCoords(endRow, nrOfColumns - 1));
867
+ var fromColumn = countRowHeaders === 0 ? 0 : clamp(focusPosition, rowHeaderLastIndex, -1);
868
+ var toColumn = countCols - 1;
869
+ var from = this.tableProps.createCellCoords(startRow, fromColumn);
870
+ var to = this.tableProps.createCellCoords(endRow, toColumn);
871
+ var highlight = this.tableProps.createCellCoords(startRow, clamp(focusPosition, rowHeaderLastIndex, countCols - 1));
872
+ this.runLocalHooks('beforeSelectRows', from, to, highlight);
873
+
874
+ // disallow modifying column axis for that hooks
875
+ from.col = fromColumn;
876
+ to.col = toColumn;
877
+ this.setRangeStartOnly(from, void 0, highlight);
878
+ this.selectedByRowHeader.add(this.getLayerLevel());
879
+ this.setRangeEnd(to);
880
+ this.runLocalHooks('afterSelectRows', from, to, highlight);
762
881
  this.finish();
763
882
  }
764
883
  return isValid;
@@ -777,19 +896,31 @@ var Selection = /*#__PURE__*/function () {
777
896
  if (!this.isSelected()) {
778
897
  return;
779
898
  }
780
- var cellHighlight = this.highlight.getCell();
899
+ var focusHighlight = this.highlight.getFocus();
781
900
  var currentLayer = this.getLayerLevel();
782
- cellHighlight.commit().syncWith(this.selectedRange.current());
901
+ focusHighlight.commit().syncWith(this.selectedRange.current());
783
902
 
784
903
  // Rewriting rendered ranges going through all layers.
785
904
  for (var layerLevel = 0; layerLevel < this.selectedRange.size(); layerLevel += 1) {
786
905
  this.highlight.useLayerLevel(layerLevel);
787
- var areaHighlight = this.highlight.createOrGetArea();
788
- var headerHighlight = this.highlight.createOrGetHeader();
789
- var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();
906
+ var areaHighlight = this.highlight.createArea();
907
+ var areaLayeredHighlight = this.highlight.createLayeredArea();
908
+ var rowHeaderHighlight = this.highlight.createRowHeader();
909
+ var columnHeaderHighlight = this.highlight.createColumnHeader();
910
+ var activeRowHeaderHighlight = this.highlight.createActiveRowHeader();
911
+ var activeColumnHeaderHighlight = this.highlight.createActiveColumnHeader();
912
+ var activeCornerHeaderHighlight = this.highlight.createActiveCornerHeader();
913
+ var rowHighlight = this.highlight.createRowHighlight();
914
+ var columnHighlight = this.highlight.createColumnHighlight();
790
915
  areaHighlight.commit();
791
- headerHighlight.commit();
792
- activeHeaderHighlight.commit();
916
+ areaLayeredHighlight.commit();
917
+ rowHeaderHighlight.commit();
918
+ columnHeaderHighlight.commit();
919
+ activeRowHeaderHighlight.commit();
920
+ activeColumnHeaderHighlight.commit();
921
+ activeCornerHeaderHighlight.commit();
922
+ rowHighlight.commit();
923
+ columnHighlight.commit();
793
924
  }
794
925
 
795
926
  // Reverting starting layer for the Highlight.