handsontable 0.0.0-next-fad35d5-20240924 → 0.0.0-next-d7edb4b-20240927

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 (127) hide show
  1. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.js +0 -23
  2. package/3rdparty/walkontable/src/calculator/calculationType/renderedColumns.mjs +0 -23
  3. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.js +0 -23
  4. package/3rdparty/walkontable/src/calculator/calculationType/renderedRows.mjs +0 -23
  5. package/3rdparty/walkontable/src/core/_base.js +0 -7
  6. package/3rdparty/walkontable/src/core/_base.mjs +0 -7
  7. package/3rdparty/walkontable/src/facade/core.js +0 -3
  8. package/3rdparty/walkontable/src/facade/core.mjs +0 -3
  9. package/3rdparty/walkontable/src/overlay/_base.js +0 -3
  10. package/3rdparty/walkontable/src/overlay/_base.mjs +0 -3
  11. package/3rdparty/walkontable/src/selection/border/border.js +45 -33
  12. package/3rdparty/walkontable/src/selection/border/border.mjs +46 -34
  13. package/3rdparty/walkontable/src/selection/scanner.js +11 -46
  14. package/3rdparty/walkontable/src/selection/scanner.mjs +11 -46
  15. package/3rdparty/walkontable/src/settings.js +0 -8
  16. package/3rdparty/walkontable/src/settings.mjs +0 -8
  17. package/3rdparty/walkontable/src/table/master.js +1 -1
  18. package/3rdparty/walkontable/src/table/master.mjs +2 -2
  19. package/3rdparty/walkontable/src/table.js +3 -6
  20. package/3rdparty/walkontable/src/table.mjs +3 -6
  21. package/3rdparty/walkontable/src/viewport.js +4 -26
  22. package/3rdparty/walkontable/src/viewport.mjs +4 -26
  23. package/base.js +4 -4
  24. package/base.mjs +3 -3
  25. package/core.d.ts +1 -1
  26. package/core.js +12 -13
  27. package/core.mjs +4 -5
  28. package/dataMap/metaManager/metaSchema.js +2 -68
  29. package/dataMap/metaManager/metaSchema.mjs +2 -68
  30. package/dataMap/metaManager/mods/dynamicCellMeta.js +3 -2
  31. package/dataMap/metaManager/mods/dynamicCellMeta.mjs +1 -1
  32. package/dist/handsontable.css +2 -2
  33. package/dist/handsontable.full.css +2 -2
  34. package/dist/handsontable.full.js +2685 -3046
  35. package/dist/handsontable.full.min.css +2 -2
  36. package/dist/handsontable.full.min.js +75 -75
  37. package/dist/handsontable.js +2687 -3048
  38. package/dist/handsontable.min.css +2 -2
  39. package/dist/handsontable.min.js +18 -18
  40. package/editorManager.js +2 -2
  41. package/editorManager.mjs +2 -2
  42. package/editors/autocompleteEditor/autocompleteEditor.js +31 -14
  43. package/editors/autocompleteEditor/autocompleteEditor.mjs +31 -14
  44. package/editors/baseEditor/baseEditor.js +17 -24
  45. package/editors/baseEditor/baseEditor.mjs +18 -25
  46. package/editors/dropdownEditor/dropdownEditor.js +3 -2
  47. package/editors/dropdownEditor/dropdownEditor.mjs +1 -1
  48. package/editors/handsontableEditor/handsontableEditor.js +24 -0
  49. package/editors/handsontableEditor/handsontableEditor.mjs +24 -0
  50. package/editors/registry.js +2 -2
  51. package/editors/registry.mjs +1 -1
  52. package/editors/textEditor/textEditor.js +2 -2
  53. package/editors/textEditor/textEditor.mjs +3 -3
  54. package/helpers/dom/element.js +4 -17
  55. package/helpers/dom/element.mjs +4 -16
  56. package/helpers/mixed.js +1 -1
  57. package/helpers/mixed.mjs +1 -1
  58. package/index.d.ts +1 -2
  59. package/package.json +1 -1
  60. package/{core/hooks/index.d.ts → pluginHooks.d.ts} +21 -17
  61. package/{core/hooks/constants.mjs → pluginHooks.js} +489 -16
  62. package/{core/hooks/constants.js → pluginHooks.mjs} +486 -20
  63. package/plugins/autoColumnSize/autoColumnSize.js +27 -18
  64. package/plugins/autoColumnSize/autoColumnSize.mjs +27 -18
  65. package/plugins/autoRowSize/autoRowSize.js +22 -16
  66. package/plugins/autoRowSize/autoRowSize.mjs +23 -17
  67. package/plugins/autofill/autofill.js +5 -4
  68. package/plugins/autofill/autofill.mjs +1 -1
  69. package/plugins/base/base.d.ts +1 -1
  70. package/plugins/base/base.js +0 -39
  71. package/plugins/base/base.mjs +1 -40
  72. package/plugins/base/index.js +1 -2
  73. package/plugins/base/index.mjs +1 -1
  74. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.js +5 -2
  75. package/plugins/bindRowsWithHeaders/bindRowsWithHeaders.mjs +5 -2
  76. package/plugins/columnSorting/columnSorting.js +4 -3
  77. package/plugins/columnSorting/columnSorting.mjs +1 -1
  78. package/plugins/comments/comments.js +15 -7
  79. package/plugins/comments/comments.mjs +16 -8
  80. package/plugins/contextMenu/contextMenu.js +7 -6
  81. package/plugins/contextMenu/contextMenu.mjs +1 -1
  82. package/plugins/contextMenu/menu/menu.js +1 -1
  83. package/plugins/contextMenu/menu/menu.mjs +2 -2
  84. package/plugins/contextMenu/menu/positioner.js +4 -2
  85. package/plugins/contextMenu/menu/positioner.mjs +4 -2
  86. package/plugins/copyPaste/copyPaste.js +23 -29
  87. package/plugins/copyPaste/copyPaste.mjs +15 -21
  88. package/plugins/dropdownMenu/dropdownMenu.js +7 -6
  89. package/plugins/dropdownMenu/dropdownMenu.mjs +1 -1
  90. package/plugins/formulas/formulas.js +7 -7
  91. package/plugins/formulas/formulas.mjs +1 -1
  92. package/plugins/hiddenColumns/hiddenColumns.js +30 -19
  93. package/plugins/hiddenColumns/hiddenColumns.mjs +26 -15
  94. package/plugins/hiddenRows/hiddenRows.js +29 -18
  95. package/plugins/hiddenRows/hiddenRows.mjs +25 -14
  96. package/plugins/manualColumnFreeze/manualColumnFreeze.js +5 -5
  97. package/plugins/manualColumnFreeze/manualColumnFreeze.mjs +1 -1
  98. package/plugins/manualColumnMove/manualColumnMove.js +3 -3
  99. package/plugins/manualColumnMove/manualColumnMove.mjs +1 -1
  100. package/plugins/manualRowMove/manualRowMove.js +5 -5
  101. package/plugins/manualRowMove/manualRowMove.mjs +3 -3
  102. package/plugins/mergeCells/cellsCollection.js +3 -15
  103. package/plugins/mergeCells/cellsCollection.mjs +4 -16
  104. package/plugins/mergeCells/mergeCells.d.ts +2 -6
  105. package/plugins/mergeCells/mergeCells.js +55 -78
  106. package/plugins/mergeCells/mergeCells.mjs +53 -76
  107. package/plugins/mergeCells/renderer.js +3 -13
  108. package/plugins/mergeCells/renderer.mjs +3 -13
  109. package/plugins/persistentState/persistentState.js +4 -4
  110. package/plugins/persistentState/persistentState.mjs +1 -1
  111. package/plugins/undoRedo/undoRedo.js +5 -4
  112. package/plugins/undoRedo/undoRedo.mjs +3 -3
  113. package/renderers/checkboxRenderer/checkboxRenderer.js +2 -2
  114. package/renderers/checkboxRenderer/checkboxRenderer.mjs +1 -1
  115. package/settings.d.ts +1 -3
  116. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.js +1 -1
  117. package/shortcutContexts/commands/extendCellsSelection/downByViewportHeight.mjs +1 -1
  118. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.js +1 -1
  119. package/shortcutContexts/commands/extendCellsSelection/upByViewportHeight.mjs +1 -1
  120. package/shortcutContexts/commands/scrollToFocusedCell.js +4 -4
  121. package/shortcutContexts/commands/scrollToFocusedCell.mjs +4 -4
  122. package/tableView.js +43 -38
  123. package/tableView.mjs +43 -38
  124. package/core/hooks/bucket.js +0 -180
  125. package/core/hooks/bucket.mjs +0 -176
  126. package/core/hooks/index.js +0 -385
  127. package/core/hooks/index.mjs +0 -381
@@ -1,6 +1,15 @@
1
- "use strict";
2
-
3
- exports.__esModule = true;
1
+ import "core-js/modules/es.error.cause.js";
2
+ import "core-js/modules/es.array.push.js";
3
+ import "core-js/modules/es.array.unscopables.flat-map.js";
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
+ import { arrayEach } from "./helpers/array.mjs";
8
+ import { objectEach } from "./helpers/object.mjs";
9
+ import { substitute } from "./helpers/string.mjs";
10
+ import { warn } from "./helpers/console.mjs";
11
+ import { toSingleLine } from "./helpers/templateLiteralTag.mjs";
12
+ import { fastCall } from "./helpers/function.mjs";
4
13
  /* eslint-disable jsdoc/require-description-complete-sentence */
5
14
  /**
6
15
  * @description
@@ -112,8 +121,8 @@ exports.__esModule = true;
112
121
  * :::
113
122
  * ...
114
123
  */
115
-
116
- const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-sentence */
124
+ // @TODO: Move plugin description hooks to plugin?
125
+ const REGISTERED_HOOKS = [/* eslint-disable jsdoc/require-description-complete-sentence */
117
126
  /**
118
127
  * Fired after resetting a cell's meta. This happens when the {@link Core#updateSettings} method is called.
119
128
  *
@@ -1456,22 +1465,9 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
1456
1465
  * @param {boolean} topmost If set to `true`, it returns the TD element from the topmost overlay. For example,
1457
1466
  * if the wanted cell is in the range of fixed rows, it will return a TD element
1458
1467
  * from the `top` overlay.
1459
- * @param {string} source String that identifies how this coords change will be processed. Possible values:
1460
- * `meta` the change will affect the cell meta and data; `render` the change will affect the
1461
- * DOM element that will be returned by the `getCell` method.
1462
1468
  * @returns {undefined|number[]}
1463
1469
  */
1464
1470
  'modifyGetCellCoords',
1465
- /**
1466
- * Used to modify the returned cell coordinates of clicked cells (TD or TH elements).
1467
- *
1468
- * @event Hooks#modifyGetCoordsElement
1469
- * @since 14.6.0
1470
- * @param {number} row Visual row index.
1471
- * @param {number} column Visual column index.
1472
- * @returns {undefined|number[]}
1473
- */
1474
- 'modifyGetCoordsElement',
1475
1471
  /**
1476
1472
  * Used to modify the cell coordinates when the table is activated (going into the listen mode).
1477
1473
  *
@@ -2635,6 +2631,15 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
2635
2631
  */
2636
2632
  'modifyAutoColumnSizeSeed'];
2637
2633
 
2634
+ /**
2635
+ * Template warning message for removed hooks.
2636
+ *
2637
+ * @type {string}
2638
+ */
2639
+ const REMOVED_MESSAGE = toSingleLine`The plugin hook "[hookName]" was removed in Handsontable [removedInVersion].\x20
2640
+ Please consult release notes https://github.com/handsontable/handsontable/releases/tag/[removedInVersion] to\x20
2641
+ learn about the migration path.`;
2642
+
2638
2643
  /**
2639
2644
  * The list of the hooks which are removed from the API. The warning message is printed out in
2640
2645
  * the developer console when the hook is used.
@@ -2644,7 +2649,7 @@ const REGISTERED_HOOKS = exports.REGISTERED_HOOKS = [/* eslint-disable jsdoc/req
2644
2649
  *
2645
2650
  * @type {Map<string, string>}
2646
2651
  */
2647
- const REMOVED_HOOKS = exports.REMOVED_HOOKS = new Map([['modifyRow', '8.0.0'], ['modifyCol', '8.0.0'], ['unmodifyRow', '8.0.0'], ['unmodifyCol', '8.0.0'], ['skipLengthCache', '8.0.0'], ['hiddenColumn', '8.0.0'], ['hiddenRow', '8.0.0']]);
2652
+ const REMOVED_HOOKS = new Map([['modifyRow', '8.0.0'], ['modifyCol', '8.0.0'], ['unmodifyRow', '8.0.0'], ['unmodifyCol', '8.0.0'], ['skipLengthCache', '8.0.0'], ['hiddenColumn', '8.0.0'], ['hiddenRow', '8.0.0']]);
2648
2653
 
2649
2654
  /* eslint-disable jsdoc/require-description-complete-sentence */
2650
2655
  /**
@@ -2667,4 +2672,465 @@ const REMOVED_HOOKS = exports.REMOVED_HOOKS = new Map([['modifyRow', '8.0.0'], [
2667
2672
  * @type {Map<string, string>}
2668
2673
  */
2669
2674
  /* eslint-enable jsdoc/require-description-complete-sentence */
2670
- const DEPRECATED_HOOKS = exports.DEPRECATED_HOOKS = new Map([[]]);
2675
+ const DEPRECATED_HOOKS = new Map([[]]);
2676
+ const callbackOrder = new WeakMap();
2677
+ class Hooks {
2678
+ static getSingleton() {
2679
+ return getGlobalSingleton();
2680
+ }
2681
+
2682
+ /**
2683
+ * @type {object}
2684
+ */
2685
+
2686
+ /**
2687
+ *
2688
+ */
2689
+ constructor() {
2690
+ _defineProperty(this, "globalBucket", void 0);
2691
+ this.globalBucket = this.createEmptyBucket();
2692
+ }
2693
+
2694
+ /**
2695
+ * Returns a new object with empty handlers related to every registered hook name.
2696
+ *
2697
+ * @returns {object} The empty bucket object.
2698
+ *
2699
+ * @example
2700
+ * ```js
2701
+ * Handsontable.hooks.createEmptyBucket();
2702
+ * // Results:
2703
+ * {
2704
+ * ...
2705
+ * afterCreateCol: [],
2706
+ * afterCreateRow: [],
2707
+ * beforeInit: [],
2708
+ * ...
2709
+ * }
2710
+ * ```
2711
+ */
2712
+ createEmptyBucket() {
2713
+ const bucket = Object.create(null);
2714
+
2715
+ // eslint-disable-next-line no-return-assign
2716
+ arrayEach(REGISTERED_HOOKS, hook => {
2717
+ bucket[hook] = [];
2718
+ this.initOrderMap(bucket, hook);
2719
+ });
2720
+ return bucket;
2721
+ }
2722
+
2723
+ /**
2724
+ * Get hook bucket based on the context of the object or if argument is `undefined`, get the global hook bucket.
2725
+ *
2726
+ * @param {object} [context=null] A Handsontable instance.
2727
+ * @returns {object} Returns a global or Handsontable instance bucket.
2728
+ */
2729
+ getBucket() {
2730
+ let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2731
+ if (context) {
2732
+ if (!context.pluginHookBucket) {
2733
+ context.pluginHookBucket = this.createEmptyBucket();
2734
+ }
2735
+ return context.pluginHookBucket;
2736
+ }
2737
+ return this.globalBucket;
2738
+ }
2739
+
2740
+ /**
2741
+ * Adds a listener (globally or locally) to a specified hook name.
2742
+ * If the `context` parameter is provided, the hook will be added only to the instance it references.
2743
+ * Otherwise, the callback will be used everytime the hook fires on any Handsontable instance.
2744
+ * You can provide an array of callback functions as the `callback` argument, this way they will all be fired
2745
+ * once the hook is triggered.
2746
+ *
2747
+ * @see Core#addHook
2748
+ * @param {string} key Hook name.
2749
+ * @param {Function|Array} callback Callback function or an array of functions.
2750
+ * @param {object} [context=null] The context for the hook callback to be added - a Handsontable instance or leave empty.
2751
+ * @param {number} [orderIndex] Order index of the callback.
2752
+ * If > 0, the callback will be added after the others, for example, with an index of 1, the callback will be added before the ones with an index of 2, 3, etc., but after the ones with an index of 0 and lower.
2753
+ * If < 0, the callback will be added before the others, for example, with an index of -1, the callback will be added after the ones with an index of -2, -3, etc., but before the ones with an index of 0 and higher.
2754
+ * If 0 or no order index is provided, the callback will be added between the "negative" and "positive" indexes.
2755
+ * @returns {Hooks} Instance of Hooks.
2756
+ *
2757
+ * @example
2758
+ * ```js
2759
+ * // single callback, added locally
2760
+ * Handsontable.hooks.add('beforeInit', myCallback, hotInstance);
2761
+ *
2762
+ * // single callback, added globally
2763
+ * Handsontable.hooks.add('beforeInit', myCallback);
2764
+ *
2765
+ * // multiple callbacks, added locally
2766
+ * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback], hotInstance);
2767
+ *
2768
+ * // multiple callbacks, added globally
2769
+ * Handsontable.hooks.add('beforeInit', [myCallback, anotherCallback]);
2770
+ * ```
2771
+ */
2772
+ add(key, callback) {
2773
+ let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2774
+ let orderIndex = arguments.length > 3 ? arguments[3] : undefined;
2775
+ if (Array.isArray(callback)) {
2776
+ arrayEach(callback, c => this.add(key, c, context));
2777
+ } else {
2778
+ if (REMOVED_HOOKS.has(key)) {
2779
+ warn(substitute(REMOVED_MESSAGE, {
2780
+ hookName: key,
2781
+ removedInVersion: REMOVED_HOOKS.get(key)
2782
+ }));
2783
+ }
2784
+ if (DEPRECATED_HOOKS.has(key)) {
2785
+ warn(DEPRECATED_HOOKS.get(key));
2786
+ }
2787
+ const bucket = this.getBucket(context);
2788
+ if (typeof bucket[key] === 'undefined') {
2789
+ this.register(key);
2790
+ bucket[key] = [];
2791
+ this.initOrderMap(bucket, key);
2792
+ }
2793
+ callback.skip = false;
2794
+ if (bucket[key].indexOf(callback) === -1) {
2795
+ // only add a hook if it has not already been added (adding the same hook twice is now silently ignored)
2796
+ let foundInitialHook = false;
2797
+ if (callback.initialHook) {
2798
+ arrayEach(bucket[key], (cb, i) => {
2799
+ if (cb.initialHook) {
2800
+ bucket[key][i] = callback;
2801
+ foundInitialHook = true;
2802
+ return false;
2803
+ }
2804
+ });
2805
+ }
2806
+ if (!foundInitialHook) {
2807
+ bucket[key].push(callback);
2808
+ }
2809
+ }
2810
+ this.setCallbackOrderIndex(bucket, key, callback, orderIndex);
2811
+ this.orderBucketByOrderIndex(bucket, key);
2812
+ }
2813
+ return this;
2814
+ }
2815
+
2816
+ /**
2817
+ * Adds a listener to a specified hook. After the hook runs this listener will be automatically removed from the bucket.
2818
+ *
2819
+ * @see Core#addHookOnce
2820
+ * @param {string} key Hook/Event name.
2821
+ * @param {Function|Array} callback Callback function.
2822
+ * @param {object} [context=null] A Handsontable instance.
2823
+ * @param {number} [orderIndex] Order index of the callback.
2824
+ * If > 0, the callback will be added after the others, for example, with an index of 1, the callback will be added before the ones with an index of 2, 3, etc., but after the ones with an index of 0 and lower.
2825
+ * If < 0, the callback will be added before the others, for example, with an index of -1, the callback will be added after the ones with an index of -2, -3, etc., but before the ones with an index of 0 and higher.
2826
+ * If 0 or no order index is provided, the callback will be added between the "negative" and "positive" indexes.
2827
+ *
2828
+ * @example
2829
+ * ```js
2830
+ * Handsontable.hooks.once('beforeInit', myCallback, hotInstance);
2831
+ * ```
2832
+ */
2833
+ once(key, callback) {
2834
+ let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2835
+ let orderIndex = arguments.length > 3 ? arguments[3] : undefined;
2836
+ if (Array.isArray(callback)) {
2837
+ arrayEach(callback, c => this.once(key, c, context));
2838
+ } else {
2839
+ callback.runOnce = true;
2840
+ this.add(key, callback, context, orderIndex);
2841
+ }
2842
+ }
2843
+
2844
+ /**
2845
+ * Removes a listener from a hook with a given name. If the `context` argument is provided, it removes a listener from a local hook assigned to the given Handsontable instance.
2846
+ *
2847
+ * @see Core#removeHook
2848
+ * @param {string} key Hook/Event name.
2849
+ * @param {Function} callback Callback function (needs the be the function that was previously added to the hook).
2850
+ * @param {object} [context=null] Handsontable instance.
2851
+ * @returns {boolean} Returns `true` if hook was removed, `false` otherwise.
2852
+ *
2853
+ * @example
2854
+ * ```js
2855
+ * Handsontable.hooks.remove('beforeInit', myCallback);
2856
+ * ```
2857
+ */
2858
+ remove(key, callback) {
2859
+ let context = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
2860
+ const bucket = this.getBucket(context);
2861
+ if (typeof bucket[key] !== 'undefined') {
2862
+ if (bucket[key].indexOf(callback) >= 0) {
2863
+ callback.skip = true;
2864
+ return true;
2865
+ }
2866
+ }
2867
+ return false;
2868
+ }
2869
+
2870
+ /**
2871
+ * Checks whether there are any registered listeners for the provided hook name.
2872
+ * If the `context` parameter is provided, it only checks for listeners assigned to the given Handsontable instance.
2873
+ *
2874
+ * @param {string} key Hook name.
2875
+ * @param {object} [context=null] A Handsontable instance.
2876
+ * @returns {boolean} `true` for success, `false` otherwise.
2877
+ */
2878
+ has(key) {
2879
+ let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
2880
+ const bucket = this.getBucket(context);
2881
+ return !!(bucket[key] !== undefined && bucket[key].length);
2882
+ }
2883
+
2884
+ /**
2885
+ * Runs all local and global callbacks assigned to the hook identified by the `key` parameter.
2886
+ * It returns either a return value from the last called callback or the first parameter (`p1`) passed to the `run` function.
2887
+ *
2888
+ * @see Core#runHooks
2889
+ * @param {object} context Handsontable instance.
2890
+ * @param {string} key Hook/Event name.
2891
+ * @param {*} [p1] Parameter to be passed as an argument to the callback function.
2892
+ * @param {*} [p2] Parameter to be passed as an argument to the callback function.
2893
+ * @param {*} [p3] Parameter to be passed as an argument to the callback function.
2894
+ * @param {*} [p4] Parameter to be passed as an argument to the callback function.
2895
+ * @param {*} [p5] Parameter to be passed as an argument to the callback function.
2896
+ * @param {*} [p6] Parameter to be passed as an argument to the callback function.
2897
+ * @returns {*} Either a return value from the last called callback or `p1`.
2898
+ *
2899
+ * @example
2900
+ * ```js
2901
+ * Handsontable.hooks.run(hot, 'beforeInit');
2902
+ * ```
2903
+ */
2904
+ run(context, key, p1, p2, p3, p4, p5, p6) {
2905
+ {
2906
+ const globalHandlers = this.globalBucket[key];
2907
+ const length = globalHandlers ? globalHandlers.length : 0;
2908
+ let index = 0;
2909
+ if (length) {
2910
+ // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.
2911
+ while (index < length) {
2912
+ if (!globalHandlers[index] || globalHandlers[index].skip) {
2913
+ index += 1;
2914
+ /* eslint-disable no-continue */
2915
+ continue;
2916
+ }
2917
+ const res = fastCall(globalHandlers[index], context, p1, p2, p3, p4, p5, p6);
2918
+ if (res !== undefined) {
2919
+ // eslint-disable-next-line no-param-reassign
2920
+ p1 = res;
2921
+ }
2922
+ if (globalHandlers[index] && globalHandlers[index].runOnce) {
2923
+ this.remove(key, globalHandlers[index]);
2924
+ }
2925
+ index += 1;
2926
+ }
2927
+ }
2928
+ }
2929
+ {
2930
+ const localHandlers = this.getBucket(context)[key];
2931
+ const length = localHandlers ? localHandlers.length : 0;
2932
+ let index = 0;
2933
+ if (length) {
2934
+ // Do not optimise this loop with arrayEach or arrow function! If you do You'll decrease perf because of GC.
2935
+ while (index < length) {
2936
+ if (!localHandlers[index] || localHandlers[index].skip) {
2937
+ index += 1;
2938
+ /* eslint-disable no-continue */
2939
+ continue;
2940
+ }
2941
+ const res = fastCall(localHandlers[index], context, p1, p2, p3, p4, p5, p6);
2942
+ if (res !== undefined) {
2943
+ // eslint-disable-next-line no-param-reassign
2944
+ p1 = res;
2945
+ }
2946
+ if (localHandlers[index] && localHandlers[index].runOnce) {
2947
+ this.remove(key, localHandlers[index], context);
2948
+ }
2949
+ index += 1;
2950
+ }
2951
+ }
2952
+ }
2953
+ return p1;
2954
+ }
2955
+
2956
+ /**
2957
+ * Destroy all listeners connected to the context. If no context is provided, the global listeners will be destroyed.
2958
+ *
2959
+ * @param {object} [context=null] A Handsontable instance.
2960
+ * @example
2961
+ * ```js
2962
+ * // destroy the global listeners
2963
+ * Handsontable.hooks.destroy();
2964
+ *
2965
+ * // destroy the local listeners
2966
+ * Handsontable.hooks.destroy(hotInstance);
2967
+ * ```
2968
+ */
2969
+ destroy() {
2970
+ let context = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
2971
+ // eslint-disable-next-line no-return-assign
2972
+ objectEach(this.getBucket(context), (value, key, bucket) => bucket[key].length = 0);
2973
+ }
2974
+
2975
+ /**
2976
+ * Registers a hook name (adds it to the list of the known hook names). Used by plugins.
2977
+ * It is not necessary to call register, but if you use it, your plugin hook will be used returned by
2978
+ * the `getRegistered` method. (which itself is used in the [demo](@/guides/getting-started/events-and-hooks/events-and-hooks.md)).
2979
+ *
2980
+ * @param {string} key The hook name.
2981
+ *
2982
+ * @example
2983
+ * ```js
2984
+ * Handsontable.hooks.register('myHook');
2985
+ * ```
2986
+ */
2987
+ register(key) {
2988
+ if (!this.isRegistered(key)) {
2989
+ REGISTERED_HOOKS.push(key);
2990
+ }
2991
+ }
2992
+
2993
+ /**
2994
+ * Deregisters a hook name (removes it from the list of known hook names).
2995
+ *
2996
+ * @param {string} key The hook name.
2997
+ *
2998
+ * @example
2999
+ * ```js
3000
+ * Handsontable.hooks.deregister('myHook');
3001
+ * ```
3002
+ */
3003
+ deregister(key) {
3004
+ if (this.isRegistered(key)) {
3005
+ REGISTERED_HOOKS.splice(REGISTERED_HOOKS.indexOf(key), 1);
3006
+ }
3007
+ }
3008
+
3009
+ /**
3010
+ * Returns a boolean value depending on if a hook by such name has been removed or deprecated.
3011
+ *
3012
+ * @param {string} hookName The hook name to check.
3013
+ * @returns {boolean} Returns `true` if the provided hook name was marked as deprecated or
3014
+ * removed from API, `false` otherwise.
3015
+ * @example
3016
+ * ```js
3017
+ * Handsontable.hooks.isDeprecated('skipLengthCache');
3018
+ *
3019
+ * // Results:
3020
+ * true
3021
+ * ```
3022
+ */
3023
+ isDeprecated(hookName) {
3024
+ return DEPRECATED_HOOKS.has(hookName) || REMOVED_HOOKS.has(hookName);
3025
+ }
3026
+
3027
+ /**
3028
+ * Returns a boolean depending on if a hook by such name has been registered.
3029
+ *
3030
+ * @param {string} hookName The hook name to check.
3031
+ * @returns {boolean} `true` for success, `false` otherwise.
3032
+ * @example
3033
+ * ```js
3034
+ * Handsontable.hooks.isRegistered('beforeInit');
3035
+ *
3036
+ * // Results:
3037
+ * true
3038
+ * ```
3039
+ */
3040
+ isRegistered(hookName) {
3041
+ return REGISTERED_HOOKS.indexOf(hookName) >= 0;
3042
+ }
3043
+
3044
+ /**
3045
+ * Returns an array of registered hooks.
3046
+ *
3047
+ * @returns {Array} An array of registered hooks.
3048
+ *
3049
+ * @example
3050
+ * ```js
3051
+ * Handsontable.hooks.getRegistered();
3052
+ *
3053
+ * // Results:
3054
+ * [
3055
+ * ...
3056
+ * 'beforeInit',
3057
+ * 'beforeRender',
3058
+ * 'beforeSetRangeEnd',
3059
+ * 'beforeDrawBorders',
3060
+ * 'beforeChange',
3061
+ * ...
3062
+ * ]
3063
+ * ```
3064
+ */
3065
+ getRegistered() {
3066
+ return REGISTERED_HOOKS;
3067
+ }
3068
+
3069
+ /**
3070
+ * Sets the order index of the callback in the bucket object.
3071
+ *
3072
+ * @private
3073
+ * @param {object} bucket The bucket object.
3074
+ * @param {string} key Hook name.
3075
+ * @param {Function} callback Callback function.
3076
+ * @param {number|undefined} orderIndex Order index of the callback.
3077
+ */
3078
+ setCallbackOrderIndex(bucket, key, callback, orderIndex) {
3079
+ const normalizedOrderIndex = Number.isInteger(orderIndex) ? orderIndex : 0;
3080
+ const orderMap = this.getCallbackOrderMap(bucket, key);
3081
+ orderMap.set(normalizedOrderIndex, [...(orderMap.get(normalizedOrderIndex) || []), callback]);
3082
+ }
3083
+
3084
+ /**
3085
+ * Reorders the callbacks in the bucket object by their order index.
3086
+ *
3087
+ * @private
3088
+ * @param {objcet} bucket The bucket object.
3089
+ * @param {string} key Hook name.
3090
+ */
3091
+ orderBucketByOrderIndex(bucket, key) {
3092
+ const orderMap = this.getCallbackOrderMap(bucket, key);
3093
+ if (orderMap === undefined || orderMap.size === 0 || orderMap.size === 1 && orderMap.has(0)) {
3094
+ return;
3095
+ }
3096
+ bucket[key] = [...orderMap].sort((a, b) => a[0] - b[0]).flatMap(_ref => {
3097
+ let [, callbacks] = _ref;
3098
+ return callbacks;
3099
+ });
3100
+ }
3101
+
3102
+ /**
3103
+ * Extends the bucket object with the order property.
3104
+ *
3105
+ * @private
3106
+ * @param {object} bucket The bucket object.
3107
+ * @param {string} hook The hook name.
3108
+ */
3109
+ initOrderMap(bucket, hook) {
3110
+ if (!callbackOrder.has(bucket)) {
3111
+ callbackOrder.set(bucket, []);
3112
+ }
3113
+ callbackOrder.get(bucket)[hook] = new Map();
3114
+ }
3115
+
3116
+ /**
3117
+ * Returns the order map for the provided hook.
3118
+ *
3119
+ * @private
3120
+ * @param {object} bucket The bucket object.
3121
+ * @param {string} hook The hook name.
3122
+ * @returns {Map<number, Array<Function>>} Returns the order map for the provided hook.
3123
+ */
3124
+ getCallbackOrderMap(bucket, hook) {
3125
+ return callbackOrder.get(bucket)[hook];
3126
+ }
3127
+ }
3128
+ const globalSingleton = new Hooks();
3129
+
3130
+ /**
3131
+ * @returns {Hooks}
3132
+ */
3133
+ function getGlobalSingleton() {
3134
+ return globalSingleton;
3135
+ }
3136
+ export default Hooks;
@@ -6,7 +6,7 @@ require("core-js/modules/es.array.push.js");
6
6
  var _base = require("../base");
7
7
  var _feature = require("../../helpers/feature");
8
8
  var _ghostTable = _interopRequireDefault(require("../../utils/ghostTable"));
9
- var _hooks = require("../../core/hooks");
9
+ var _pluginHooks = _interopRequireDefault(require("../../pluginHooks"));
10
10
  var _object = require("../../helpers/object");
11
11
  var _number = require("../../helpers/number");
12
12
  var _samplesGenerator = _interopRequireDefault(require("../../utils/samplesGenerator"));
@@ -23,7 +23,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
23
23
  function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
24
24
  function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
25
25
  function _assertClassBrand(e, t, n) { if ("function" == typeof e ? e === t : e.has(t)) return arguments.length < 3 ? t : n; throw new TypeError("Private element is not present on this object"); }
26
- _hooks.Hooks.getSingleton().register('modifyAutoColumnSizeSeed');
26
+ _pluginHooks.default.getSingleton().register('modifyAutoColumnSizeSeed');
27
27
  const PLUGIN_KEY = exports.PLUGIN_KEY = 'autoColumnSize';
28
28
  const PLUGIN_PRIORITY = exports.PLUGIN_PRIORITY = 10;
29
29
  const COLUMN_SIZE_MAP_NAME = 'autoColumnSize';
@@ -138,13 +138,6 @@ class AutoColumnSize extends _base.BasePlugin {
138
138
  static get SETTING_KEYS() {
139
139
  return true;
140
140
  }
141
- static get DEFAULT_SETTINGS() {
142
- return {
143
- useHeaders: true,
144
- samplingRatio: null,
145
- allowSampleDuplicates: false
146
- };
147
- }
148
141
  static get CALCULATION_STEP() {
149
142
  return 50;
150
143
  }
@@ -252,12 +245,11 @@ class AutoColumnSize extends _base.BasePlugin {
252
245
  if (this.enabled) {
253
246
  return;
254
247
  }
255
- this.ghostTable.setSetting('useHeaders', this.getSetting('useHeaders'));
256
- this.samplesGenerator.setAllowDuplicates(this.getSetting('allowSampleDuplicates'));
257
- const samplingRatio = this.getSetting('samplingRatio');
258
- if (samplingRatio && !isNaN(samplingRatio)) {
259
- this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));
248
+ const setting = this.hot.getSettings()[PLUGIN_KEY];
249
+ if (setting && setting.useHeaders !== null && setting.useHeaders !== undefined) {
250
+ this.ghostTable.setSetting('useHeaders', setting.useHeaders);
260
251
  }
252
+ this.setSamplingOptions();
261
253
  this.addHook('afterLoadData', function () {
262
254
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
263
255
  args[_key] = arguments[_key];
@@ -424,6 +416,23 @@ class AutoColumnSize extends _base.BasePlugin {
424
416
  this.inProgress = false;
425
417
  }
426
418
  }
419
+ /**
420
+ * Sets the sampling options.
421
+ *
422
+ * @private
423
+ */
424
+ setSamplingOptions() {
425
+ const setting = this.hot.getSettings()[PLUGIN_KEY];
426
+ const samplingRatio = setting && (0, _object.hasOwnProperty)(setting, 'samplingRatio') ? setting.samplingRatio : undefined;
427
+ const allowSampleDuplicates = setting && (0, _object.hasOwnProperty)(setting, 'allowSampleDuplicates') ? setting.allowSampleDuplicates : undefined;
428
+ if (samplingRatio && !isNaN(samplingRatio)) {
429
+ this.samplesGenerator.setSampleCount(parseInt(samplingRatio, 10));
430
+ }
431
+ if (allowSampleDuplicates) {
432
+ this.samplesGenerator.setAllowDuplicates(allowSampleDuplicates);
433
+ }
434
+ }
435
+
427
436
  /**
428
437
  * Recalculates all columns width (overwrite cache values).
429
438
  */
@@ -485,8 +494,8 @@ class AutoColumnSize extends _base.BasePlugin {
485
494
  * @returns {number} Returns visual column index, -1 if table is not rendered or if there are no columns to base the the calculations on.
486
495
  */
487
496
  getFirstVisibleColumn() {
488
- var _this$hot$getFirstRen;
489
- return (_this$hot$getFirstRen = this.hot.getFirstRenderedVisibleColumn()) !== null && _this$hot$getFirstRen !== void 0 ? _this$hot$getFirstRen : -1;
497
+ var _this$hot$view$getFir;
498
+ return (_this$hot$view$getFir = this.hot.view.getFirstRenderedVisibleColumn()) !== null && _this$hot$view$getFir !== void 0 ? _this$hot$view$getFir : -1;
490
499
  }
491
500
 
492
501
  /**
@@ -495,8 +504,8 @@ class AutoColumnSize extends _base.BasePlugin {
495
504
  * @returns {number} Returns visual column index or -1 if table is not rendered.
496
505
  */
497
506
  getLastVisibleColumn() {
498
- var _this$hot$getLastRend;
499
- return (_this$hot$getLastRend = this.hot.getLastRenderedVisibleColumn()) !== null && _this$hot$getLastRend !== void 0 ? _this$hot$getLastRend : -1;
507
+ var _this$hot$view$getLas;
508
+ return (_this$hot$view$getLas = this.hot.view.getLastRenderedVisibleColumn()) !== null && _this$hot$view$getLas !== void 0 ? _this$hot$view$getLas : -1;
500
509
  }
501
510
 
502
511
  /**