handsontable 0.0.0-next-acb8c02-20230620 → 0.0.0-next-6d7bdba-20230620

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 (57) hide show
  1. package/base.js +2 -2
  2. package/base.mjs +2 -2
  3. package/dist/handsontable.css +2 -2
  4. package/dist/handsontable.full.css +2 -2
  5. package/dist/handsontable.full.js +2193 -2052
  6. package/dist/handsontable.full.min.css +2 -2
  7. package/dist/handsontable.full.min.js +75 -75
  8. package/dist/handsontable.js +1985 -1844
  9. package/dist/handsontable.min.css +2 -2
  10. package/dist/handsontable.min.js +4 -4
  11. package/helpers/mixed.js +1 -1
  12. package/helpers/mixed.mjs +1 -1
  13. package/package.json +1 -1
  14. package/plugins/comments/comments.js +11 -4
  15. package/plugins/comments/comments.mjs +11 -4
  16. package/plugins/contextMenu/contextMenu.d.ts +1 -1
  17. package/plugins/contextMenu/contextMenu.js +80 -29
  18. package/plugins/contextMenu/contextMenu.mjs +81 -30
  19. package/plugins/contextMenu/predefinedItems/alignment.js +7 -0
  20. package/plugins/contextMenu/predefinedItems/alignment.mjs +7 -0
  21. package/plugins/contextMenu/predefinedItems/clearColumn.js +5 -3
  22. package/plugins/contextMenu/predefinedItems/clearColumn.mjs +5 -3
  23. package/plugins/contextMenu/predefinedItems/columnLeft.js +5 -3
  24. package/plugins/contextMenu/predefinedItems/columnLeft.mjs +5 -3
  25. package/plugins/contextMenu/predefinedItems/columnRight.js +5 -3
  26. package/plugins/contextMenu/predefinedItems/columnRight.mjs +5 -3
  27. package/plugins/contextMenu/predefinedItems/readOnly.js +7 -0
  28. package/plugins/contextMenu/predefinedItems/readOnly.mjs +7 -0
  29. package/plugins/contextMenu/predefinedItems/removeColumn.js +7 -5
  30. package/plugins/contextMenu/predefinedItems/removeColumn.mjs +5 -3
  31. package/plugins/contextMenu/predefinedItems/removeRow.js +7 -5
  32. package/plugins/contextMenu/predefinedItems/removeRow.mjs +5 -3
  33. package/plugins/contextMenu/predefinedItems/rowAbove.js +5 -3
  34. package/plugins/contextMenu/predefinedItems/rowAbove.mjs +5 -3
  35. package/plugins/contextMenu/predefinedItems/rowBelow.js +5 -3
  36. package/plugins/contextMenu/predefinedItems/rowBelow.mjs +5 -3
  37. package/plugins/contextMenu/utils.js +0 -16
  38. package/plugins/contextMenu/utils.mjs +0 -15
  39. package/plugins/copyPaste/contextMenuItem/copy.js +7 -0
  40. package/plugins/copyPaste/contextMenuItem/copy.mjs +7 -0
  41. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.js +9 -1
  42. package/plugins/copyPaste/contextMenuItem/copyColumnHeadersOnly.mjs +9 -1
  43. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.js +9 -1
  44. package/plugins/copyPaste/contextMenuItem/copyWithColumnGroupHeaders.mjs +9 -1
  45. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.js +9 -1
  46. package/plugins/copyPaste/contextMenuItem/copyWithColumnHeaders.mjs +9 -1
  47. package/plugins/copyPaste/contextMenuItem/cut.js +7 -0
  48. package/plugins/copyPaste/contextMenuItem/cut.mjs +7 -0
  49. package/plugins/customBorders/customBorders.js +7 -0
  50. package/plugins/customBorders/customBorders.mjs +7 -0
  51. package/plugins/dropdownMenu/dropdownMenu.d.ts +1 -1
  52. package/plugins/dropdownMenu/dropdownMenu.js +20 -10
  53. package/plugins/dropdownMenu/dropdownMenu.mjs +20 -10
  54. package/shortcuts/recorder.js +2 -2
  55. package/shortcuts/recorder.mjs +2 -2
  56. package/shortcuts/utils.js +21 -5
  57. package/shortcuts/utils.mjs +20 -4
@@ -36,6 +36,13 @@ export default function readOnlyItem() {
36
36
  this.render();
37
37
  },
38
38
  disabled: function disabled() {
39
+ var range = this.getSelectedRangeLast();
40
+ if (!range) {
41
+ return true;
42
+ }
43
+ if (range.isSingleHeader()) {
44
+ return true;
45
+ }
39
46
  if (this.selection.isSelectedByCorner()) {
40
47
  return true;
41
48
  }
@@ -18,8 +18,7 @@ require("core-js/modules/es.object.get-own-property-descriptor.js");
18
18
  exports.__esModule = true;
19
19
  exports.KEY = void 0;
20
20
  exports.default = removeColumnItem;
21
- var _utils = require("../utils");
22
- var _utils2 = require("../../../selection/utils");
21
+ var _utils = require("../../../selection/utils");
23
22
  var C = _interopRequireWildcard(require("../../../i18n/constants"));
24
23
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
24
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -56,14 +55,17 @@ function removeColumnItem() {
56
55
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_REMOVE_COLUMN, pluralForm);
57
56
  },
58
57
  callback: function callback() {
59
- this.alter('remove_col', (0, _utils2.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn');
58
+ this.alter('remove_col', (0, _utils.transformSelectionToColumnDistance)(this.getSelected()), null, 'ContextMenu.removeColumn');
60
59
  },
61
60
  disabled: function disabled() {
62
61
  if (!this.isColumnModificationAllowed()) {
63
62
  return true;
64
63
  }
65
- var selected = (0, _utils.getValidSelection)(this);
66
- if (!selected) {
64
+ var range = this.getSelectedRangeLast();
65
+ if (!range) {
66
+ return true;
67
+ }
68
+ if (range.isSingleHeader() && range.highlight.col < 0) {
67
69
  return true;
68
70
  }
69
71
  var totalColumns = this.countCols();
@@ -16,7 +16,6 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
16
16
  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; }
17
17
  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; } }
18
18
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
19
- import { getValidSelection } from "../utils.mjs";
20
19
  import { transformSelectionToColumnDistance } from "../../../selection/utils.mjs";
21
20
  import * as C from "../../../i18n/constants.mjs";
22
21
  export var KEY = 'remove_col';
@@ -51,8 +50,11 @@ export default function removeColumnItem() {
51
50
  if (!this.isColumnModificationAllowed()) {
52
51
  return true;
53
52
  }
54
- var selected = getValidSelection(this);
55
- if (!selected) {
53
+ var range = this.getSelectedRangeLast();
54
+ if (!range) {
55
+ return true;
56
+ }
57
+ if (range.isSingleHeader() && range.highlight.col < 0) {
56
58
  return true;
57
59
  }
58
60
  var totalColumns = this.countCols();
@@ -18,8 +18,7 @@ require("core-js/modules/es.object.get-own-property-descriptor.js");
18
18
  exports.__esModule = true;
19
19
  exports.KEY = void 0;
20
20
  exports.default = removeRowItem;
21
- var _utils = require("../utils");
22
- var _utils2 = require("../../../selection/utils");
21
+ var _utils = require("../../../selection/utils");
23
22
  var C = _interopRequireWildcard(require("../../../i18n/constants"));
24
23
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
24
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -58,11 +57,14 @@ function removeRowItem() {
58
57
  callback: function callback() {
59
58
  // TODO: Please keep in mind that below `1` may be improper. The table's way of work, before change `f1747b3912ea3b21fe423fd102ca94c87db81379` was restored.
60
59
  // There is still problem when removing more than one row.
61
- this.alter('remove_row', (0, _utils2.transformSelectionToRowDistance)(this.getSelected()), 1, 'ContextMenu.removeRow');
60
+ this.alter('remove_row', (0, _utils.transformSelectionToRowDistance)(this.getSelected()), 1, 'ContextMenu.removeRow');
62
61
  },
63
62
  disabled: function disabled() {
64
- var selected = (0, _utils.getValidSelection)(this);
65
- if (!selected) {
63
+ var range = this.getSelectedRangeLast();
64
+ if (!range) {
65
+ return true;
66
+ }
67
+ if (range.isSingleHeader() && range.highlight.row < 0) {
66
68
  return true;
67
69
  }
68
70
  var totalRows = this.countRows();
@@ -16,7 +16,6 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
16
16
  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; }
17
17
  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; } }
18
18
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
19
- import { getValidSelection } from "../utils.mjs";
20
19
  import { transformSelectionToRowDistance } from "../../../selection/utils.mjs";
21
20
  import * as C from "../../../i18n/constants.mjs";
22
21
  export var KEY = 'remove_row';
@@ -50,8 +49,11 @@ export default function removeRowItem() {
50
49
  this.alter('remove_row', transformSelectionToRowDistance(this.getSelected()), 1, 'ContextMenu.removeRow');
51
50
  },
52
51
  disabled: function disabled() {
53
- var selected = getValidSelection(this);
54
- if (!selected) {
52
+ var range = this.getSelectedRangeLast();
53
+ if (!range) {
54
+ return true;
55
+ }
56
+ if (range.isSingleHeader() && range.highlight.row < 0) {
55
57
  return true;
56
58
  }
57
59
  var totalRows = this.countRows();
@@ -13,7 +13,6 @@ require("core-js/modules/es.symbol.iterator.js");
13
13
  exports.__esModule = true;
14
14
  exports.KEY = void 0;
15
15
  exports.default = rowAboveItem;
16
- var _utils = require("../utils");
17
16
  var C = _interopRequireWildcard(require("../../../i18n/constants"));
18
17
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
18
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -34,8 +33,11 @@ function rowAboveItem() {
34
33
  this.alter('insert_row_above', latestSelection.row, 1, 'ContextMenu.rowAbove');
35
34
  },
36
35
  disabled: function disabled() {
37
- var selected = (0, _utils.getValidSelection)(this);
38
- if (!selected) {
36
+ var range = this.getSelectedRangeLast();
37
+ if (!range) {
38
+ return true;
39
+ }
40
+ if (range.isSingleHeader() && range.highlight.row < 0) {
39
41
  return true;
40
42
  }
41
43
  if (this.selection.isSelectedByCorner()) {
@@ -1,4 +1,3 @@
1
- import { getValidSelection } from "../utils.mjs";
2
1
  import * as C from "../../../i18n/constants.mjs";
3
2
  export var KEY = 'row_above';
4
3
 
@@ -16,8 +15,11 @@ export default function rowAboveItem() {
16
15
  this.alter('insert_row_above', latestSelection.row, 1, 'ContextMenu.rowAbove');
17
16
  },
18
17
  disabled: function disabled() {
19
- var selected = getValidSelection(this);
20
- if (!selected) {
18
+ var range = this.getSelectedRangeLast();
19
+ if (!range) {
20
+ return true;
21
+ }
22
+ if (range.isSingleHeader() && range.highlight.row < 0) {
21
23
  return true;
22
24
  }
23
25
  if (this.selection.isSelectedByCorner()) {
@@ -13,7 +13,6 @@ require("core-js/modules/es.symbol.iterator.js");
13
13
  exports.__esModule = true;
14
14
  exports.KEY = void 0;
15
15
  exports.default = rowBelowItem;
16
- var _utils = require("../utils");
17
16
  var C = _interopRequireWildcard(require("../../../i18n/constants"));
18
17
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
19
18
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -34,8 +33,11 @@ function rowBelowItem() {
34
33
  this.alter('insert_row_below', latestSelection.row, 1, 'ContextMenu.rowBelow');
35
34
  },
36
35
  disabled: function disabled() {
37
- var selected = (0, _utils.getValidSelection)(this);
38
- if (!selected) {
36
+ var range = this.getSelectedRangeLast();
37
+ if (!range) {
38
+ return true;
39
+ }
40
+ if (range.isSingleHeader() && range.highlight.row < 0) {
39
41
  return true;
40
42
  }
41
43
  if (this.selection.isSelectedByCorner()) {
@@ -1,4 +1,3 @@
1
- import { getValidSelection } from "../utils.mjs";
2
1
  import * as C from "../../../i18n/constants.mjs";
3
2
  export var KEY = 'row_below';
4
3
 
@@ -16,8 +15,11 @@ export default function rowBelowItem() {
16
15
  this.alter('insert_row_below', latestSelection.row, 1, 'ContextMenu.rowBelow');
17
16
  },
18
17
  disabled: function disabled() {
19
- var selected = getValidSelection(this);
20
- if (!selected) {
18
+ var range = this.getSelectedRangeLast();
19
+ if (!range) {
20
+ return true;
21
+ }
22
+ if (range.isSingleHeader() && range.highlight.row < 0) {
21
23
  return true;
22
24
  }
23
25
  if (this.selection.isSelectedByCorner()) {
@@ -6,7 +6,6 @@ exports.checkSelectionConsistency = checkSelectionConsistency;
6
6
  exports.filterSeparators = filterSeparators;
7
7
  exports.getAlignmentClasses = getAlignmentClasses;
8
8
  exports.getDocumentOffsetByElement = getDocumentOffsetByElement;
9
- exports.getValidSelection = getValidSelection;
10
9
  exports.hasSubMenu = hasSubMenu;
11
10
  exports.isDisabled = isDisabled;
12
11
  exports.isItemHidden = isItemHidden;
@@ -71,21 +70,6 @@ function isSelectionDisabled(cell) {
71
70
  return (0, _element.hasClass)(cell, 'htSelectionDisabled');
72
71
  }
73
72
 
74
- /**
75
- * @param {Core} hot The Handsontable instance.
76
- * @returns {Array[]|null}
77
- */
78
- function getValidSelection(hot) {
79
- var selected = hot.getSelected();
80
- if (!selected) {
81
- return null;
82
- }
83
- if (selected[0] < 0) {
84
- return null;
85
- }
86
- return selected;
87
- }
88
-
89
73
  /**
90
74
  * @param {string} className The full element class name to process.
91
75
  * @param {string} alignment The slignment class name to compare with.
@@ -53,21 +53,6 @@ export function isSelectionDisabled(cell) {
53
53
  return hasClass(cell, 'htSelectionDisabled');
54
54
  }
55
55
 
56
- /**
57
- * @param {Core} hot The Handsontable instance.
58
- * @returns {Array[]|null}
59
- */
60
- export function getValidSelection(hot) {
61
- var selected = hot.getSelected();
62
- if (!selected) {
63
- return null;
64
- }
65
- if (selected[0] < 0) {
66
- return null;
67
- }
68
- return selected;
69
- }
70
-
71
56
  /**
72
57
  * @param {string} className The full element class name to process.
73
58
  * @param {string} alignment The slignment class name to compare with.
@@ -20,6 +20,13 @@ function copyItem(copyPastePlugin) {
20
20
  if (this.countRows() === 0 || this.countCols() === 0) {
21
21
  return true;
22
22
  }
23
+ var range = this.getSelectedRangeLast();
24
+ if (!range) {
25
+ return true;
26
+ }
27
+ if (range.isSingleHeader()) {
28
+ return true;
29
+ }
23
30
  var selected = this.getSelected();
24
31
 
25
32
  // Disable for no selection or for non-contiguous selection.
@@ -16,6 +16,13 @@ export default function copyItem(copyPastePlugin) {
16
16
  if (this.countRows() === 0 || this.countCols() === 0) {
17
17
  return true;
18
18
  }
19
+ var range = this.getSelectedRangeLast();
20
+ if (!range) {
21
+ return true;
22
+ }
23
+ if (range.isSingleHeader()) {
24
+ return true;
25
+ }
19
26
  var selected = this.getSelected();
20
27
 
21
28
  // Disable for no selection or for non-contiguous selection.
@@ -3,6 +3,7 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = copyColumnHeadersOnlyItem;
5
5
  var _constants = require("../../../i18n/constants");
6
+ var _number = require("../../../helpers/number");
6
7
  /**
7
8
  * @param {CopyPaste} copyPastePlugin The plugin instance.
8
9
  * @returns {object}
@@ -12,7 +13,7 @@ function copyColumnHeadersOnlyItem(copyPastePlugin) {
12
13
  key: 'copy_column_headers_only',
13
14
  name: function name() {
14
15
  var selectedRange = this.getSelectedRangeLast();
15
- var nounForm = selectedRange ? Math.min(selectedRange.getWidth() - 1, 1) : 0;
16
+ var nounForm = selectedRange ? (0, _number.clamp)(selectedRange.getWidth() - 1, 0, 1) : 0;
16
17
  return this.getTranslatedPhrase(_constants.CONTEXTMENU_ITEMS_COPY_COLUMN_HEADERS_ONLY, nounForm);
17
18
  },
18
19
  callback: function callback() {
@@ -22,6 +23,13 @@ function copyColumnHeadersOnlyItem(copyPastePlugin) {
22
23
  if (!this.hasColHeaders()) {
23
24
  return true;
24
25
  }
26
+ var range = this.getSelectedRangeLast();
27
+ if (!range) {
28
+ return true;
29
+ }
30
+ if (range.isSingleHeader()) {
31
+ return true;
32
+ }
25
33
  var selected = this.getSelected();
26
34
 
27
35
  // Disable for no selection or for non-contiguous selection.
@@ -1,4 +1,5 @@
1
1
  import { CONTEXTMENU_ITEMS_COPY_COLUMN_HEADERS_ONLY } from "../../../i18n/constants.mjs";
2
+ import { clamp } from "../../../helpers/number.mjs";
2
3
  /**
3
4
  * @param {CopyPaste} copyPastePlugin The plugin instance.
4
5
  * @returns {object}
@@ -8,7 +9,7 @@ export default function copyColumnHeadersOnlyItem(copyPastePlugin) {
8
9
  key: 'copy_column_headers_only',
9
10
  name: function name() {
10
11
  var selectedRange = this.getSelectedRangeLast();
11
- var nounForm = selectedRange ? Math.min(selectedRange.getWidth() - 1, 1) : 0;
12
+ var nounForm = selectedRange ? clamp(selectedRange.getWidth() - 1, 0, 1) : 0;
12
13
  return this.getTranslatedPhrase(CONTEXTMENU_ITEMS_COPY_COLUMN_HEADERS_ONLY, nounForm);
13
14
  },
14
15
  callback: function callback() {
@@ -18,6 +19,13 @@ export default function copyColumnHeadersOnlyItem(copyPastePlugin) {
18
19
  if (!this.hasColHeaders()) {
19
20
  return true;
20
21
  }
22
+ var range = this.getSelectedRangeLast();
23
+ if (!range) {
24
+ return true;
25
+ }
26
+ if (range.isSingleHeader()) {
27
+ return true;
28
+ }
21
29
  var selected = this.getSelected();
22
30
 
23
31
  // Disable for no selection or for non-contiguous selection.
@@ -3,6 +3,7 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = copyWithColumnGroupHeadersItem;
5
5
  var _constants = require("../../../i18n/constants");
6
+ var _number = require("../../../helpers/number");
6
7
  /**
7
8
  * @param {CopyPaste} copyPastePlugin The plugin instance.
8
9
  * @returns {object}
@@ -12,7 +13,7 @@ function copyWithColumnGroupHeadersItem(copyPastePlugin) {
12
13
  key: 'copy_with_column_group_headers',
13
14
  name: function name() {
14
15
  var selectedRange = this.getSelectedRangeLast();
15
- var nounForm = selectedRange ? Math.min(selectedRange.getWidth() - 1, 1) : 0;
16
+ var nounForm = selectedRange ? (0, _number.clamp)(selectedRange.getWidth() - 1, 0, 1) : 0;
16
17
  return this.getTranslatedPhrase(_constants.CONTEXTMENU_ITEMS_COPY_WITH_COLUMN_GROUP_HEADERS, nounForm);
17
18
  },
18
19
  callback: function callback() {
@@ -22,6 +23,13 @@ function copyWithColumnGroupHeadersItem(copyPastePlugin) {
22
23
  if (!this.hasColHeaders() || !this.getSettings().nestedHeaders) {
23
24
  return true;
24
25
  }
26
+ var range = this.getSelectedRangeLast();
27
+ if (!range) {
28
+ return true;
29
+ }
30
+ if (range.isSingleHeader()) {
31
+ return true;
32
+ }
25
33
  var selected = this.getSelected();
26
34
 
27
35
  // Disable for no selection or for non-contiguous selection.
@@ -1,4 +1,5 @@
1
1
  import { CONTEXTMENU_ITEMS_COPY_WITH_COLUMN_GROUP_HEADERS } from "../../../i18n/constants.mjs";
2
+ import { clamp } from "../../../helpers/number.mjs";
2
3
  /**
3
4
  * @param {CopyPaste} copyPastePlugin The plugin instance.
4
5
  * @returns {object}
@@ -8,7 +9,7 @@ export default function copyWithColumnGroupHeadersItem(copyPastePlugin) {
8
9
  key: 'copy_with_column_group_headers',
9
10
  name: function name() {
10
11
  var selectedRange = this.getSelectedRangeLast();
11
- var nounForm = selectedRange ? Math.min(selectedRange.getWidth() - 1, 1) : 0;
12
+ var nounForm = selectedRange ? clamp(selectedRange.getWidth() - 1, 0, 1) : 0;
12
13
  return this.getTranslatedPhrase(CONTEXTMENU_ITEMS_COPY_WITH_COLUMN_GROUP_HEADERS, nounForm);
13
14
  },
14
15
  callback: function callback() {
@@ -18,6 +19,13 @@ export default function copyWithColumnGroupHeadersItem(copyPastePlugin) {
18
19
  if (!this.hasColHeaders() || !this.getSettings().nestedHeaders) {
19
20
  return true;
20
21
  }
22
+ var range = this.getSelectedRangeLast();
23
+ if (!range) {
24
+ return true;
25
+ }
26
+ if (range.isSingleHeader()) {
27
+ return true;
28
+ }
21
29
  var selected = this.getSelected();
22
30
 
23
31
  // Disable for no selection or for non-contiguous selection.
@@ -3,6 +3,7 @@
3
3
  exports.__esModule = true;
4
4
  exports.default = copyWithColumnHeadersItem;
5
5
  var _constants = require("../../../i18n/constants");
6
+ var _number = require("../../../helpers/number");
6
7
  /**
7
8
  * @param {CopyPaste} copyPastePlugin The plugin instance.
8
9
  * @returns {object}
@@ -12,7 +13,7 @@ function copyWithColumnHeadersItem(copyPastePlugin) {
12
13
  key: 'copy_with_column_headers',
13
14
  name: function name() {
14
15
  var selectedRange = this.getSelectedRangeLast();
15
- var nounForm = selectedRange ? Math.min(selectedRange.getWidth() - 1, 1) : 0;
16
+ var nounForm = selectedRange ? (0, _number.clamp)(selectedRange.getWidth() - 1, 0, 1) : 0;
16
17
  return this.getTranslatedPhrase(_constants.CONTEXTMENU_ITEMS_COPY_WITH_COLUMN_HEADERS, nounForm);
17
18
  },
18
19
  callback: function callback() {
@@ -22,6 +23,13 @@ function copyWithColumnHeadersItem(copyPastePlugin) {
22
23
  if (!this.hasColHeaders()) {
23
24
  return true;
24
25
  }
26
+ var range = this.getSelectedRangeLast();
27
+ if (!range) {
28
+ return true;
29
+ }
30
+ if (range.isSingleHeader()) {
31
+ return true;
32
+ }
25
33
  var selected = this.getSelected();
26
34
 
27
35
  // Disable for no selection or for non-contiguous selection.
@@ -1,4 +1,5 @@
1
1
  import { CONTEXTMENU_ITEMS_COPY_WITH_COLUMN_HEADERS } from "../../../i18n/constants.mjs";
2
+ import { clamp } from "../../../helpers/number.mjs";
2
3
  /**
3
4
  * @param {CopyPaste} copyPastePlugin The plugin instance.
4
5
  * @returns {object}
@@ -8,7 +9,7 @@ export default function copyWithColumnHeadersItem(copyPastePlugin) {
8
9
  key: 'copy_with_column_headers',
9
10
  name: function name() {
10
11
  var selectedRange = this.getSelectedRangeLast();
11
- var nounForm = selectedRange ? Math.min(selectedRange.getWidth() - 1, 1) : 0;
12
+ var nounForm = selectedRange ? clamp(selectedRange.getWidth() - 1, 0, 1) : 0;
12
13
  return this.getTranslatedPhrase(CONTEXTMENU_ITEMS_COPY_WITH_COLUMN_HEADERS, nounForm);
13
14
  },
14
15
  callback: function callback() {
@@ -18,6 +19,13 @@ export default function copyWithColumnHeadersItem(copyPastePlugin) {
18
19
  if (!this.hasColHeaders()) {
19
20
  return true;
20
21
  }
22
+ var range = this.getSelectedRangeLast();
23
+ if (!range) {
24
+ return true;
25
+ }
26
+ if (range.isSingleHeader()) {
27
+ return true;
28
+ }
21
29
  var selected = this.getSelected();
22
30
 
23
31
  // Disable for no selection or for non-contiguous selection.
@@ -32,6 +32,13 @@ function cutItem(copyPastePlugin) {
32
32
  if (this.countRows() === 0 || this.countCols() === 0) {
33
33
  return true;
34
34
  }
35
+ var range = this.getSelectedRangeLast();
36
+ if (!range) {
37
+ return true;
38
+ }
39
+ if (range.isSingleHeader()) {
40
+ return true;
41
+ }
35
42
  var selected = this.getSelected();
36
43
 
37
44
  // Disable for no selection or for non-contiquous selection.
@@ -16,6 +16,13 @@ export default function cutItem(copyPastePlugin) {
16
16
  if (this.countRows() === 0 || this.countCols() === 0) {
17
17
  return true;
18
18
  }
19
+ var range = this.getSelectedRangeLast();
20
+ if (!range) {
21
+ return true;
22
+ }
23
+ if (range.isSingleHeader()) {
24
+ return true;
25
+ }
19
26
  var selected = this.getSelected();
20
27
 
21
28
  // Disable for no selection or for non-contiquous selection.
@@ -814,6 +814,13 @@ var CustomBorders = /*#__PURE__*/function (_BasePlugin) {
814
814
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);
815
815
  },
816
816
  disabled: function disabled() {
817
+ var range = this.getSelectedRangeLast();
818
+ if (!range) {
819
+ return true;
820
+ }
821
+ if (range.isSingleHeader()) {
822
+ return true;
823
+ }
817
824
  return this.selection.isSelectedByCorner();
818
825
  },
819
826
  submenu: {
@@ -805,6 +805,13 @@ export var CustomBorders = /*#__PURE__*/function (_BasePlugin) {
805
805
  return this.getTranslatedPhrase(C.CONTEXTMENU_ITEMS_BORDERS);
806
806
  },
807
807
  disabled: function disabled() {
808
+ var range = this.getSelectedRangeLast();
809
+ if (!range) {
810
+ return true;
811
+ }
812
+ if (range.isSingleHeader()) {
813
+ return true;
814
+ }
808
815
  return this.selection.isSelectedByCorner();
809
816
  },
810
817
  submenu: {
@@ -18,7 +18,7 @@ export class DropdownMenu extends BasePlugin {
18
18
 
19
19
  constructor(hotInstance: Core);
20
20
  isEnabled(): boolean;
21
- open(event: Event): void;
21
+ open(position: { left: number, top: number } | Event, offset?: { above?: number, below?: number, left?: number, right?: number }): void;
22
22
  close(): void;
23
23
  executeCommand(commandName: string, ...params: any): void;
24
24
  }
@@ -22,6 +22,7 @@ require("core-js/modules/es.object.set-prototype-of.js");
22
22
  require("core-js/modules/es.object.get-prototype-of.js");
23
23
  var _base = require("../base");
24
24
  var _array = require("../../helpers/array");
25
+ var _object = require("../../helpers/object");
25
26
  var _commandExecutor = _interopRequireDefault(require("../contextMenu/commandExecutor"));
26
27
  var _utils = require("../contextMenu/utils");
27
28
  var _eventManager = _interopRequireDefault(require("../../eventManager"));
@@ -274,9 +275,9 @@ var DropdownMenu = /*#__PURE__*/function (_BasePlugin) {
274
275
  var rect = target.getBoundingClientRect();
275
276
  _this3.open({
276
277
  left: rect.left + offset.left,
277
- top: rect.top + target.offsetHeight + offset.top,
278
- width: rect.width,
279
- height: rect.height
278
+ top: rect.top + target.offsetHeight + offset.top
279
+ }, {
280
+ left: rect.width
280
281
  });
281
282
  _this3.hot._registerTimeout(function () {
282
283
  _this3.menu.selectFirstCell();
@@ -334,20 +335,29 @@ var DropdownMenu = /*#__PURE__*/function (_BasePlugin) {
334
335
  * which contains coordinates relative to the browsers viewport (without included scroll offsets).
335
336
  * Or if the native event is passed the menu will be positioned based on the `pageX` and `pageY`
336
337
  * coordinates.
338
+ * @param {{ above?: number, below?: number, left?: number, right?: number }} offset An object allows applying
339
+ * the offset to the menu position.
337
340
  * @fires Hooks#beforeDropdownMenuShow
338
341
  * @fires Hooks#afterDropdownMenuShow
339
342
  */
340
343
  }, {
341
344
  key: "open",
342
345
  value: function open(position) {
343
- var _this$menu;
346
+ var _this$menu,
347
+ _this5 = this;
348
+ var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
349
+ above: 0,
350
+ below: 0,
351
+ left: 0,
352
+ right: 0
353
+ };
344
354
  if ((_this$menu = this.menu) !== null && _this$menu !== void 0 && _this$menu.isOpened()) {
345
355
  return;
346
356
  }
347
357
  this.menu.open();
348
- if (position.width) {
349
- this.menu.setOffset('left', position.width);
350
- }
358
+ (0, _object.objectEach)(offset, function (value, key) {
359
+ _this5.menu.setOffset(key, value);
360
+ });
351
361
  this.menu.setPosition(position);
352
362
  }
353
363
 
@@ -435,9 +445,9 @@ var DropdownMenu = /*#__PURE__*/function (_BasePlugin) {
435
445
  var rect = event.target.getBoundingClientRect();
436
446
  this.open({
437
447
  left: rect.left + offset.left,
438
- top: rect.top + event.target.offsetHeight + 3 + offset.top,
439
- width: rect.width,
440
- height: rect.height
448
+ top: rect.top + event.target.offsetHeight + 3 + offset.top
449
+ }, {
450
+ left: rect.width
441
451
  });
442
452
  }
443
453
  }