handsontable 0.0.0-next-59715d3-20230523 → 0.0.0-next-93e34dc-20230601

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 (216) 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 +82 -300
  55. package/core.mjs +82 -300
  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 +12245 -9953
  61. package/dist/handsontable.full.min.css +3 -3
  62. package/dist/handsontable.full.min.js +120 -120
  63. package/dist/handsontable.js +15898 -13606
  64. package/dist/handsontable.min.css +3 -3
  65. package/dist/handsontable.min.js +4 -4
  66. package/editorManager.js +20 -82
  67. package/editorManager.mjs +25 -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.js +1 -1
  77. package/pluginHooks.mjs +1 -1
  78. package/plugins/copyPaste/copyPaste.js +5 -1
  79. package/plugins/copyPaste/copyPaste.mjs +5 -1
  80. package/plugins/customBorders/customBorders.js +18 -52
  81. package/plugins/customBorders/customBorders.mjs +19 -53
  82. package/plugins/mergeCells/mergeCells.js +5 -18
  83. package/plugins/mergeCells/mergeCells.mjs +5 -18
  84. package/plugins/nestedHeaders/nestedHeaders.js +89 -9
  85. package/plugins/nestedHeaders/nestedHeaders.mjs +89 -9
  86. package/plugins/nestedHeaders/stateManager/index.js +37 -0
  87. package/plugins/nestedHeaders/stateManager/index.mjs +37 -0
  88. package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
  89. package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
  90. package/selection/highlight/highlight.js +311 -88
  91. package/selection/highlight/highlight.mjs +301 -84
  92. package/selection/highlight/types/activeHeader.js +10 -9
  93. package/selection/highlight/types/activeHeader.mjs +10 -8
  94. package/selection/highlight/types/area.js +12 -27
  95. package/selection/highlight/types/area.mjs +16 -30
  96. package/selection/highlight/types/areaLayered.js +54 -0
  97. package/selection/highlight/types/areaLayered.mjs +49 -0
  98. package/selection/highlight/types/column.js +50 -0
  99. package/selection/highlight/types/column.mjs +45 -0
  100. package/selection/highlight/types/customSelection.js +7 -10
  101. package/selection/highlight/types/customSelection.mjs +7 -9
  102. package/selection/highlight/types/fill.js +5 -8
  103. package/selection/highlight/types/fill.mjs +5 -7
  104. package/selection/highlight/types/{cell.js → focus.js} +5 -8
  105. package/selection/highlight/types/{cell.mjs → focus.mjs} +5 -7
  106. package/selection/highlight/types/header.js +10 -20
  107. package/selection/highlight/types/header.mjs +10 -19
  108. package/selection/highlight/types/{index.js → row.js} +27 -31
  109. package/selection/highlight/types/{index.mjs → row.mjs} +24 -29
  110. package/selection/highlight/visualSelection.js +23 -28
  111. package/selection/highlight/visualSelection.mjs +23 -28
  112. package/selection/index.js +4 -7
  113. package/selection/index.mjs +2 -3
  114. package/selection/mouseEventHandler.js +1 -1
  115. package/selection/mouseEventHandler.mjs +1 -1
  116. package/selection/range.js +8 -8
  117. package/selection/range.mjs +8 -8
  118. package/selection/selection.js +296 -180
  119. package/selection/selection.mjs +291 -179
  120. package/selection/transformation.js +233 -96
  121. package/selection/transformation.mjs +230 -93
  122. package/selection/utils.js +12 -35
  123. package/selection/utils.mjs +13 -35
  124. package/settings.d.ts +1 -0
  125. package/shortcutContexts/commands/editor/closeAndSave.js +15 -0
  126. package/shortcutContexts/commands/editor/closeAndSave.mjs +10 -0
  127. package/shortcutContexts/commands/editor/closeWithoutSaving.js +13 -0
  128. package/shortcutContexts/commands/editor/closeWithoutSaving.mjs +8 -0
  129. package/shortcutContexts/commands/editor/fastOpen.js +16 -0
  130. package/shortcutContexts/commands/editor/fastOpen.mjs +11 -0
  131. package/shortcutContexts/commands/editor/index.js +16 -0
  132. package/shortcutContexts/commands/editor/index.mjs +12 -0
  133. package/shortcutContexts/commands/editor/open.js +29 -0
  134. package/shortcutContexts/commands/editor/open.mjs +24 -0
  135. package/shortcutContexts/commands/emptySelectedCells.js +12 -0
  136. package/shortcutContexts/commands/emptySelectedCells.mjs +7 -0
  137. package/shortcutContexts/commands/extendCellsSelection/down.js +15 -0
  138. package/shortcutContexts/commands/extendCellsSelection/down.mjs +10 -0
  139. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +21 -0
  140. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +16 -0
  141. package/shortcutContexts/commands/extendCellsSelection/index.js +24 -0
  142. package/shortcutContexts/commands/extendCellsSelection/index.mjs +20 -0
  143. package/shortcutContexts/commands/extendCellsSelection/left.js +15 -0
  144. package/shortcutContexts/commands/extendCellsSelection/left.mjs +10 -0
  145. package/shortcutContexts/commands/extendCellsSelection/right.js +15 -0
  146. package/shortcutContexts/commands/extendCellsSelection/right.mjs +10 -0
  147. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.js +22 -0
  148. package/shortcutContexts/commands/extendCellsSelection/toMostBottom.mjs +17 -0
  149. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.js +17 -0
  150. package/shortcutContexts/commands/extendCellsSelection/toMostInlineEnd.mjs +12 -0
  151. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.js +17 -0
  152. package/shortcutContexts/commands/extendCellsSelection/toMostInlineStart.mjs +12 -0
  153. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.js +39 -0
  154. package/shortcutContexts/commands/extendCellsSelection/toMostLeft.mjs +34 -0
  155. package/shortcutContexts/commands/extendCellsSelection/toMostRight.js +39 -0
  156. package/shortcutContexts/commands/extendCellsSelection/toMostRight.mjs +34 -0
  157. package/shortcutContexts/commands/extendCellsSelection/toMostTop.js +22 -0
  158. package/shortcutContexts/commands/extendCellsSelection/toMostTop.mjs +17 -0
  159. package/shortcutContexts/commands/extendCellsSelection/up.js +15 -0
  160. package/shortcutContexts/commands/extendCellsSelection/up.mjs +10 -0
  161. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +21 -0
  162. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +16 -0
  163. package/shortcutContexts/commands/index.js +51 -0
  164. package/shortcutContexts/commands/index.mjs +47 -0
  165. package/shortcutContexts/commands/moveCellSelection/down.js +12 -0
  166. package/shortcutContexts/commands/moveCellSelection/down.mjs +7 -0
  167. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.js +11 -0
  168. package/shortcutContexts/commands/moveCellSelection/downByViewportHeight.mjs +6 -0
  169. package/shortcutContexts/commands/moveCellSelection/index.js +28 -0
  170. package/shortcutContexts/commands/moveCellSelection/index.mjs +24 -0
  171. package/shortcutContexts/commands/moveCellSelection/inlineEnd.js +13 -0
  172. package/shortcutContexts/commands/moveCellSelection/inlineEnd.mjs +8 -0
  173. package/shortcutContexts/commands/moveCellSelection/inlineStart.js +13 -0
  174. package/shortcutContexts/commands/moveCellSelection/inlineStart.mjs +8 -0
  175. package/shortcutContexts/commands/moveCellSelection/left.js +11 -0
  176. package/shortcutContexts/commands/moveCellSelection/left.mjs +6 -0
  177. package/shortcutContexts/commands/moveCellSelection/right.js +11 -0
  178. package/shortcutContexts/commands/moveCellSelection/right.mjs +6 -0
  179. package/shortcutContexts/commands/moveCellSelection/toMostBottom.js +16 -0
  180. package/shortcutContexts/commands/moveCellSelection/toMostBottom.mjs +11 -0
  181. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.js +17 -0
  182. package/shortcutContexts/commands/moveCellSelection/toMostBottomInlineEnd.mjs +12 -0
  183. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.js +13 -0
  184. package/shortcutContexts/commands/moveCellSelection/toMostInlineEnd.mjs +8 -0
  185. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.js +16 -0
  186. package/shortcutContexts/commands/moveCellSelection/toMostInlineStart.mjs +11 -0
  187. package/shortcutContexts/commands/moveCellSelection/toMostLeft.js +35 -0
  188. package/shortcutContexts/commands/moveCellSelection/toMostLeft.mjs +30 -0
  189. package/shortcutContexts/commands/moveCellSelection/toMostRight.js +35 -0
  190. package/shortcutContexts/commands/moveCellSelection/toMostRight.mjs +30 -0
  191. package/shortcutContexts/commands/moveCellSelection/toMostTop.js +16 -0
  192. package/shortcutContexts/commands/moveCellSelection/toMostTop.mjs +11 -0
  193. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.js +18 -0
  194. package/shortcutContexts/commands/moveCellSelection/toMostTopInlineStart.mjs +13 -0
  195. package/shortcutContexts/commands/moveCellSelection/up.js +12 -0
  196. package/shortcutContexts/commands/moveCellSelection/up.mjs +7 -0
  197. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.js +11 -0
  198. package/shortcutContexts/commands/moveCellSelection/upByViewportHeight.mjs +6 -0
  199. package/shortcutContexts/commands/populateSelectedCellsData.js +35 -0
  200. package/shortcutContexts/commands/populateSelectedCellsData.mjs +30 -0
  201. package/shortcutContexts/commands/selectAll.js +11 -0
  202. package/shortcutContexts/commands/selectAll.mjs +6 -0
  203. package/shortcutContexts/constants.js +19 -0
  204. package/shortcutContexts/constants.mjs +12 -0
  205. package/shortcutContexts/editor.js +29 -0
  206. package/shortcutContexts/editor.mjs +25 -0
  207. package/shortcutContexts/grid.js +232 -0
  208. package/shortcutContexts/grid.mjs +228 -0
  209. package/shortcutContexts/index.js +29 -0
  210. package/shortcutContexts/index.mjs +15 -0
  211. package/tableView.js +58 -9
  212. package/tableView.mjs +58 -9
  213. package/3rdparty/walkontable/src/selection.js +0 -354
  214. package/3rdparty/walkontable/src/selection.mjs +0 -348
  215. package/selection/highlight/constants.js +0 -16
  216. 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();
146
136
  },
147
- countCols: function countCols() {
148
- return _this.tableProps.countColsTranslated();
137
+ countRenderableColumns: function countRenderableColumns() {
138
+ return _this.tableProps.countRenderableColumns();
139
+ },
140
+ countRowHeaders: function countRowHeaders() {
141
+ return _this.tableProps.countRowHeaders();
142
+ },
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
  },
@@ -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) {
347
370
  return void highlight.clear();
348
371
  });
349
- arrayEach(this.highlight.getActiveHeaders(), function (highlight) {
372
+ arrayEach(this.highlight.getActiveCornerHeaders(), function (highlight) {
373
+ return void highlight.clear();
374
+ });
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,48 @@ 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 {number|boolean} [rowHeaderLevel=false] If passed as `true`, it selects all row headers.
692
+ * If a value is passed as a number (from -1 to -N), then it additionally allows moving the cell
693
+ * focus (highlight) to the header (available when the `navigableHeaders` is enabled).
694
+ * @param {number|boolean} [columnHeaderLevel=false] If passed as `true`, it selects all column headers.
695
+ * If a value is passed as a number (from -1 to -N), then it additionally allows moving the cell
696
+ * focus (highlight) to the header (available when the `navigableHeaders` is enabled).
633
697
  */
634
698
  }, {
635
699
  key: "selectAll",
636
700
  value: function selectAll() {
637
- var includeRowHeaders = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
638
- var includeColumnHeaders = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
701
+ var rowHeaderLevel = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
702
+ var columnHeaderLevel = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
639
703
  var nrOfRows = this.tableProps.countRows();
640
704
  var nrOfColumns = this.tableProps.countCols();
705
+ var countRowHeaders = this.tableProps.countRowHeaders();
706
+ var countColHeaders = this.tableProps.countColHeaders();
707
+ var rowFrom = rowHeaderLevel ? -countColHeaders : 0;
708
+ if (Number.isInteger(rowHeaderLevel)) {
709
+ rowFrom = clamp(rowHeaderLevel, -countColHeaders, -1);
710
+ }
711
+ var columnFrom = columnHeaderLevel ? -countRowHeaders : 0;
712
+ if (Number.isInteger(columnHeaderLevel)) {
713
+ columnFrom = clamp(columnHeaderLevel, -countRowHeaders, -1);
714
+ }
641
715
 
642
716
  // We can't select cells when there is no data.
643
- if (!includeRowHeaders && !includeColumnHeaders && (nrOfRows === 0 || nrOfColumns === 0)) {
717
+ if (rowFrom === 0 && columnFrom === 0 && (nrOfRows === 0 || nrOfColumns === 0)) {
644
718
  return;
645
719
  }
646
- var startCoords = this.tableProps.createCellCoords(includeColumnHeaders ? -1 : 0, includeRowHeaders ? -1 : 0);
720
+ var startCoords = this.tableProps.createCellCoords(rowFrom < 0 ? -countColHeaders : 0, columnFrom < 0 ? -countRowHeaders : 0);
721
+ var highlight = this.tableProps.createCellCoords(rowFrom, columnFrom);
647
722
  var endCoords = this.tableProps.createCellCoords(nrOfRows - 1, nrOfColumns - 1);
648
723
  this.clear();
649
- this.setRangeStartOnly(startCoords);
650
- this.selectedByRowHeader.add(this.getLayerLevel());
651
- this.selectedByColumnHeader.add(this.getLayerLevel());
724
+ this.setRangeStartOnly(startCoords, void 0, highlight);
725
+ if (columnFrom < 0) {
726
+ this.selectedByRowHeader.add(this.getLayerLevel());
727
+ }
728
+ if (rowFrom < 0) {
729
+ this.selectedByColumnHeader.add(this.getLayerLevel());
730
+ }
652
731
  this.setRangeEnd(endCoords);
653
732
  this.finish();
654
733
  }
@@ -665,7 +744,7 @@ var Selection = /*#__PURE__*/function () {
665
744
  }, {
666
745
  key: "selectCells",
667
746
  value: function selectCells(selectionRanges) {
668
- var _this2 = this;
747
+ var _this4 = this;
669
748
  var selectionType = detectSelectionType(selectionRanges);
670
749
  if (selectionType === SELECTION_TYPE_EMPTY) {
671
750
  return false;
@@ -674,36 +753,33 @@ var Selection = /*#__PURE__*/function () {
674
753
  }
675
754
  var selectionSchemaNormalizer = normalizeSelectionFactory(selectionType, {
676
755
  propToCol: function propToCol(prop) {
677
- return _this2.tableProps.propToCol(prop);
756
+ return _this4.tableProps.propToCol(prop);
678
757
  },
679
758
  keepDirection: true
680
759
  });
681
- var nrOfRows = this.tableProps.countRows();
682
- var nrOfColumns = this.tableProps.countCols();
760
+ var navigableHeaders = this.settings.navigableHeaders;
761
+ var tableParams = {
762
+ countRows: this.tableProps.countRows(),
763
+ countCols: this.tableProps.countCols(),
764
+ countRowHeaders: navigableHeaders ? this.tableProps.countRowHeaders() : 0,
765
+ countColHeaders: navigableHeaders ? this.tableProps.countColHeaders() : 0
766
+ };
683
767
 
684
768
  // Check if every layer of the coordinates are valid.
685
769
  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;
770
+ var cellRange = selectionSchemaNormalizer(selection);
771
+ var rangeValidity = cellRange.isValid(tableParams);
772
+ return !(rangeValidity && !cellRange.containsHeaders() || rangeValidity && cellRange.containsHeaders() && cellRange.isSingleHeader());
694
773
  });
695
774
  if (isValid) {
696
775
  this.clear();
697
776
  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();
777
+ var _selectionSchemaNorma = selectionSchemaNormalizer(selection),
778
+ from = _selectionSchemaNorma.from,
779
+ to = _selectionSchemaNorma.to;
780
+ _this4.setRangeStartOnly(from.clone(), false);
781
+ _this4.setRangeEnd(to.clone());
782
+ _this4.finish();
707
783
  });
708
784
  }
709
785
  return isValid;
@@ -715,24 +791,36 @@ var Selection = /*#__PURE__*/function () {
715
791
  *
716
792
  * @param {number|string} startColumn Visual column index or column property from which the selection starts.
717
793
  * @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
- *
794
+ * @param {number} [headerLevel=0] The header level allows changing the cell/header highlight position. The value can
795
+ * take 0 to -N, where 0 means highlighting the cell nearest the column header, -1
796
+ * means the highlighting header starting from the header closest to the cells.
721
797
  * @returns {boolean} Returns `true` if selection was successful, `false` otherwise.
722
798
  */
723
799
  }, {
724
800
  key: "selectColumns",
725
801
  value: function selectColumns(startColumn) {
726
802
  var endColumn = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : startColumn;
727
- var headerLevel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : -1;
803
+ var headerLevel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
728
804
  var start = typeof startColumn === 'string' ? this.tableProps.propToCol(startColumn) : startColumn;
729
805
  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);
806
+ var countRows = this.tableProps.countRows();
807
+ var countCols = this.tableProps.countCols();
808
+ var countColHeaders = this.tableProps.countColHeaders();
809
+ var columnHeaderLastIndex = countColHeaders === 0 ? 0 : -countColHeaders;
810
+ var fromCoords = new CellCoords(columnHeaderLastIndex, start);
811
+ var toCoords = new CellCoords(countRows - 1, end);
812
+ var isValid = new CellRange(fromCoords, fromCoords, toCoords).isValid({
813
+ countRows: countRows,
814
+ countCols: countCols,
815
+ countRowHeaders: 0,
816
+ countColHeaders: countColHeaders
817
+ });
733
818
  if (isValid) {
734
- this.setRangeStartOnly(this.tableProps.createCellCoords(headerLevel, start));
735
- this.setRangeEnd(this.tableProps.createCellCoords(nrOfRows - 1, end));
819
+ var from = this.tableProps.createCellCoords(countColHeaders === 0 ? 0 : clamp(headerLevel, columnHeaderLastIndex, -1), start);
820
+ var highlight = this.tableProps.createCellCoords(clamp(headerLevel, columnHeaderLastIndex, 0), start);
821
+ this.setRangeStartOnly(from, void 0, highlight);
822
+ this.selectedByColumnHeader.add(this.getLayerLevel());
823
+ this.setRangeEnd(this.tableProps.createCellCoords(countRows - 1, end));
736
824
  this.finish();
737
825
  }
738
826
  return isValid;
@@ -743,22 +831,34 @@ var Selection = /*#__PURE__*/function () {
743
831
  *
744
832
  * @param {number} startRow Visual row index from which the selection starts.
745
833
  * @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.
834
+ * @param {number} [headerLevel=0] The header level allows changing the cell/header highlight position. The value can
835
+ * take 0 to -N, where 0 means highlighting the cell nearest the row header, -1
836
+ * means the highlighting header starting from the header closest to the cells.
749
837
  * @returns {boolean} Returns `true` if selection was successful, `false` otherwise.
750
838
  */
751
839
  }, {
752
840
  key: "selectRows",
753
841
  value: function selectRows(startRow) {
754
842
  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);
843
+ var headerLevel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
844
+ var countRows = this.tableProps.countRows();
845
+ var countCols = this.tableProps.countCols();
846
+ var countRowHeaders = this.tableProps.countRowHeaders();
847
+ var rowHeaderLastIndex = countRowHeaders === 0 ? 0 : -countRowHeaders;
848
+ var fromCoords = new CellCoords(startRow, rowHeaderLastIndex);
849
+ var toCoords = new CellCoords(endRow, countCols - 1);
850
+ var isValid = new CellRange(fromCoords, fromCoords, toCoords).isValid({
851
+ countRows: countRows,
852
+ countCols: countCols,
853
+ countRowHeaders: countRowHeaders,
854
+ countColHeaders: 0
855
+ });
759
856
  if (isValid) {
760
- this.setRangeStartOnly(this.tableProps.createCellCoords(startRow, headerLevel));
761
- this.setRangeEnd(this.tableProps.createCellCoords(endRow, nrOfColumns - 1));
857
+ var from = this.tableProps.createCellCoords(startRow, countRowHeaders === 0 ? 0 : clamp(headerLevel, rowHeaderLastIndex, -1));
858
+ var highlight = this.tableProps.createCellCoords(startRow, clamp(headerLevel, rowHeaderLastIndex, 0));
859
+ this.setRangeStartOnly(from, void 0, highlight);
860
+ this.selectedByRowHeader.add(this.getLayerLevel());
861
+ this.setRangeEnd(this.tableProps.createCellCoords(endRow, countCols - 1));
762
862
  this.finish();
763
863
  }
764
864
  return isValid;
@@ -777,19 +877,31 @@ var Selection = /*#__PURE__*/function () {
777
877
  if (!this.isSelected()) {
778
878
  return;
779
879
  }
780
- var cellHighlight = this.highlight.getCell();
880
+ var focusHighlight = this.highlight.getFocus();
781
881
  var currentLayer = this.getLayerLevel();
782
- cellHighlight.commit().syncWith(this.selectedRange.current());
882
+ focusHighlight.commit().syncWith(this.selectedRange.current());
783
883
 
784
884
  // Rewriting rendered ranges going through all layers.
785
885
  for (var layerLevel = 0; layerLevel < this.selectedRange.size(); layerLevel += 1) {
786
886
  this.highlight.useLayerLevel(layerLevel);
787
- var areaHighlight = this.highlight.createOrGetArea();
788
- var headerHighlight = this.highlight.createOrGetHeader();
789
- var activeHeaderHighlight = this.highlight.createOrGetActiveHeader();
887
+ var areaHighlight = this.highlight.createArea();
888
+ var areaLayeredHighlight = this.highlight.createLayeredArea();
889
+ var rowHeaderHighlight = this.highlight.createRowHeader();
890
+ var columnHeaderHighlight = this.highlight.createColumnHeader();
891
+ var activeRowHeaderHighlight = this.highlight.createActiveRowHeader();
892
+ var activeColumnHeaderHighlight = this.highlight.createActiveColumnHeader();
893
+ var activeCornerHeaderHighlight = this.highlight.createActiveCornerHeader();
894
+ var rowHighlight = this.highlight.createRowHighlight();
895
+ var columnHighlight = this.highlight.createColumnHighlight();
790
896
  areaHighlight.commit();
791
- headerHighlight.commit();
792
- activeHeaderHighlight.commit();
897
+ areaLayeredHighlight.commit();
898
+ rowHeaderHighlight.commit();
899
+ columnHeaderHighlight.commit();
900
+ activeRowHeaderHighlight.commit();
901
+ activeColumnHeaderHighlight.commit();
902
+ activeCornerHeaderHighlight.commit();
903
+ rowHighlight.commit();
904
+ columnHighlight.commit();
793
905
  }
794
906
 
795
907
  // Reverting starting layer for the Highlight.