handsontable 16.1.1-next-895fbb8-20250923 → 16.2.0-next-216dbd0-20251112
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/3rdparty/walkontable/src/overlays.js +1 -1
- package/3rdparty/walkontable/src/overlays.mjs +1 -1
- package/3rdparty/walkontable/src/selection/border/border.js +19 -3
- package/3rdparty/walkontable/src/selection/border/border.mjs +19 -3
- package/CHANGELOG.md +40 -0
- package/base.js +2 -2
- package/base.mjs +2 -2
- package/core/coordsMapper/index.js +11 -0
- package/core/coordsMapper/index.mjs +1 -0
- package/core/hooks/bucket.js +7 -1
- package/core/hooks/bucket.mjs +7 -1
- package/core/hooks/constants.js +54 -0
- package/core/hooks/constants.mjs +54 -0
- package/core/hooks/index.d.ts +6 -0
- package/core/index.js +10 -4
- package/core/index.mjs +2 -1
- package/core.d.ts +3 -2
- package/core.js +67 -26
- package/core.mjs +56 -15
- package/dataMap/metaManager/metaSchema.js +197 -20
- package/dataMap/metaManager/metaSchema.mjs +197 -20
- package/dist/handsontable.css +175 -3
- package/dist/handsontable.full.css +175 -3
- package/dist/handsontable.full.js +10940 -8445
- package/dist/handsontable.full.min.css +5 -4
- package/dist/handsontable.full.min.js +193 -192
- package/dist/handsontable.js +6472 -4116
- package/dist/handsontable.min.css +4 -4
- package/dist/handsontable.min.js +43 -42
- package/dist/languages/all.js +168 -21
- package/dist/languages/all.min.js +1 -1
- package/dist/languages/ar-AR.js +8 -1
- package/dist/languages/ar-AR.min.js +1 -1
- package/dist/languages/cs-CZ.js +8 -1
- package/dist/languages/cs-CZ.min.js +1 -1
- package/dist/languages/de-CH.js +8 -1
- package/dist/languages/de-CH.min.js +1 -1
- package/dist/languages/de-DE.js +8 -1
- package/dist/languages/de-DE.min.js +1 -1
- package/dist/languages/en-US.js +8 -1
- package/dist/languages/en-US.min.js +1 -1
- package/dist/languages/es-MX.js +8 -1
- package/dist/languages/es-MX.min.js +1 -1
- package/dist/languages/fa-IR.js +8 -1
- package/dist/languages/fa-IR.min.js +1 -1
- package/dist/languages/fr-FR.js +8 -1
- package/dist/languages/fr-FR.min.js +1 -1
- package/dist/languages/hr-HR.js +8 -1
- package/dist/languages/hr-HR.min.js +1 -1
- package/dist/languages/it-IT.js +8 -1
- package/dist/languages/it-IT.min.js +1 -1
- package/dist/languages/ja-JP.js +8 -1
- package/dist/languages/ja-JP.min.js +1 -1
- package/dist/languages/ko-KR.js +8 -1
- package/dist/languages/ko-KR.min.js +1 -1
- package/dist/languages/lv-LV.js +8 -1
- package/dist/languages/lv-LV.min.js +1 -1
- package/dist/languages/nb-NO.js +8 -1
- package/dist/languages/nb-NO.min.js +1 -1
- package/dist/languages/nl-NL.js +8 -1
- package/dist/languages/nl-NL.min.js +1 -1
- package/dist/languages/pl-PL.js +8 -1
- package/dist/languages/pl-PL.min.js +1 -1
- package/dist/languages/pt-BR.js +8 -1
- package/dist/languages/pt-BR.min.js +1 -1
- package/dist/languages/ru-RU.js +8 -1
- package/dist/languages/ru-RU.min.js +1 -1
- package/dist/languages/sr-SP.js +8 -1
- package/dist/languages/sr-SP.min.js +1 -1
- package/dist/languages/zh-CN.js +8 -1
- package/dist/languages/zh-CN.min.js +1 -1
- package/dist/languages/zh-TW.js +8 -1
- package/dist/languages/zh-TW.min.js +1 -1
- package/editors/autocompleteEditor/autocompleteEditor.js +21 -1
- package/editors/autocompleteEditor/autocompleteEditor.mjs +22 -2
- package/focusManager/constants.js +25 -0
- package/focusManager/constants.mjs +22 -0
- package/focusManager/eventListener.js +107 -0
- package/focusManager/eventListener.mjs +103 -0
- package/{focusManager.d.ts → focusManager/grid.d.ts} +1 -1
- package/{focusManager.js → focusManager/grid.js} +48 -17
- package/{focusManager.mjs → focusManager/grid.mjs} +47 -16
- package/focusManager/index.d.ts +2 -0
- package/focusManager/index.js +20 -0
- package/focusManager/index.mjs +20 -0
- package/focusManager/scope.js +133 -0
- package/focusManager/scope.mjs +129 -0
- package/focusManager/scopeManager.d.ts +19 -0
- package/focusManager/scopeManager.js +268 -0
- package/focusManager/scopeManager.mjs +263 -0
- package/focusManager/scopes/grid.js +120 -0
- package/focusManager/scopes/grid.mjs +116 -0
- package/focusManager/scopes/index.js +13 -0
- package/focusManager/scopes/index.mjs +9 -0
- package/{utils → focusManager/utils}/focusDetector.js +21 -31
- package/{utils → focusManager/utils}/focusDetector.mjs +21 -31
- package/focusManager/utils/utils.js +95 -0
- package/focusManager/utils/utils.mjs +89 -0
- package/helpers/dom/element.js +1 -1
- package/helpers/dom/element.mjs +2 -2
- package/helpers/dom/event.js +1 -1
- package/helpers/dom/event.mjs +1 -1
- package/helpers/mixed.js +2 -65
- package/helpers/mixed.mjs +2 -63
- package/i18n/constants.js +10 -1
- package/i18n/constants.mjs +10 -1
- package/i18n/languages/ar-AR.js +8 -1
- package/i18n/languages/ar-AR.mjs +8 -1
- package/i18n/languages/cs-CZ.js +8 -1
- package/i18n/languages/cs-CZ.mjs +8 -1
- package/i18n/languages/de-CH.js +8 -1
- package/i18n/languages/de-CH.mjs +8 -1
- package/i18n/languages/de-DE.js +8 -1
- package/i18n/languages/de-DE.mjs +8 -1
- package/i18n/languages/en-US.js +8 -1
- package/i18n/languages/en-US.mjs +8 -1
- package/i18n/languages/es-MX.js +8 -1
- package/i18n/languages/es-MX.mjs +8 -1
- package/i18n/languages/fa-IR.js +8 -1
- package/i18n/languages/fa-IR.mjs +8 -1
- package/i18n/languages/fr-FR.js +8 -1
- package/i18n/languages/fr-FR.mjs +8 -1
- package/i18n/languages/hr-HR.js +8 -1
- package/i18n/languages/hr-HR.mjs +8 -1
- package/i18n/languages/it-IT.js +8 -1
- package/i18n/languages/it-IT.mjs +8 -1
- package/i18n/languages/ja-JP.js +8 -1
- package/i18n/languages/ja-JP.mjs +8 -1
- package/i18n/languages/ko-KR.js +8 -1
- package/i18n/languages/ko-KR.mjs +8 -1
- package/i18n/languages/lv-LV.js +8 -1
- package/i18n/languages/lv-LV.mjs +8 -1
- package/i18n/languages/nb-NO.js +8 -1
- package/i18n/languages/nb-NO.mjs +8 -1
- package/i18n/languages/nl-NL.js +8 -1
- package/i18n/languages/nl-NL.mjs +8 -1
- package/i18n/languages/pl-PL.js +8 -1
- package/i18n/languages/pl-PL.mjs +8 -1
- package/i18n/languages/pt-BR.js +8 -1
- package/i18n/languages/pt-BR.mjs +8 -1
- package/i18n/languages/ru-RU.js +8 -1
- package/i18n/languages/ru-RU.mjs +8 -1
- package/i18n/languages/sr-SP.js +8 -1
- package/i18n/languages/sr-SP.mjs +8 -1
- package/i18n/languages/zh-CN.js +8 -1
- package/i18n/languages/zh-CN.mjs +8 -1
- package/i18n/languages/zh-TW.js +8 -1
- package/i18n/languages/zh-TW.mjs +8 -1
- package/index.d.ts +9 -0
- package/languages/all.js +168 -21
- package/languages/ar-AR.js +8 -1
- package/languages/ar-AR.mjs +8 -1
- package/languages/cs-CZ.js +8 -1
- package/languages/cs-CZ.mjs +8 -1
- package/languages/de-CH.js +8 -1
- package/languages/de-CH.mjs +8 -1
- package/languages/de-DE.js +8 -1
- package/languages/de-DE.mjs +8 -1
- package/languages/en-US.js +8 -1
- package/languages/en-US.mjs +8 -1
- package/languages/es-MX.js +8 -1
- package/languages/es-MX.mjs +8 -1
- package/languages/fa-IR.js +8 -1
- package/languages/fa-IR.mjs +8 -1
- package/languages/fr-FR.js +8 -1
- package/languages/fr-FR.mjs +8 -1
- package/languages/hr-HR.js +8 -1
- package/languages/hr-HR.mjs +8 -1
- package/languages/index.js +168 -21
- package/languages/it-IT.js +8 -1
- package/languages/it-IT.mjs +8 -1
- package/languages/ja-JP.js +8 -1
- package/languages/ja-JP.mjs +8 -1
- package/languages/ko-KR.js +8 -1
- package/languages/ko-KR.mjs +8 -1
- package/languages/lv-LV.js +8 -1
- package/languages/lv-LV.mjs +8 -1
- package/languages/nb-NO.js +8 -1
- package/languages/nb-NO.mjs +8 -1
- package/languages/nl-NL.js +8 -1
- package/languages/nl-NL.mjs +8 -1
- package/languages/pl-PL.js +8 -1
- package/languages/pl-PL.mjs +8 -1
- package/languages/pt-BR.js +8 -1
- package/languages/pt-BR.mjs +8 -1
- package/languages/ru-RU.js +8 -1
- package/languages/ru-RU.mjs +8 -1
- package/languages/sr-SP.js +8 -1
- package/languages/sr-SP.mjs +8 -1
- package/languages/zh-CN.js +8 -1
- package/languages/zh-CN.mjs +8 -1
- package/languages/zh-TW.js +8 -1
- package/languages/zh-TW.mjs +8 -1
- package/package.json +25 -7
- package/plugins/autoRowSize/autoRowSize.js +8 -1
- package/plugins/autoRowSize/autoRowSize.mjs +8 -1
- package/plugins/base/base.js +36 -10
- package/plugins/base/base.mjs +36 -10
- package/plugins/columnSummary/columnSummary.d.ts +2 -2
- package/plugins/columnSummary/columnSummary.js +44 -10
- package/plugins/columnSummary/columnSummary.mjs +44 -10
- package/plugins/columnSummary/endpoints.js +15 -13
- package/plugins/columnSummary/endpoints.mjs +15 -13
- package/plugins/columnSummary/utils.js +31 -0
- package/plugins/columnSummary/utils.mjs +30 -0
- package/plugins/customBorders/customBorders.d.ts +1 -0
- package/plugins/customBorders/customBorders.js +32 -2
- package/plugins/customBorders/customBorders.mjs +32 -2
- package/plugins/dialog/constants.js +7 -0
- package/plugins/dialog/constants.mjs +4 -0
- package/plugins/dialog/dialog.d.ts +22 -2
- package/plugins/dialog/dialog.js +197 -81
- package/plugins/dialog/dialog.mjs +196 -81
- package/plugins/dialog/templates/base.js +60 -0
- package/plugins/dialog/templates/base.mjs +56 -0
- package/plugins/dialog/templates/confirm.js +106 -0
- package/plugins/dialog/templates/confirm.mjs +102 -0
- package/plugins/dialog/templates/index.js +6 -0
- package/plugins/dialog/templates/index.mjs +4 -0
- package/plugins/dialog/ui.js +125 -41
- package/plugins/dialog/ui.mjs +119 -35
- package/plugins/emptyDataState/emptyDataState.d.ts +24 -0
- package/plugins/emptyDataState/emptyDataState.js +526 -0
- package/plugins/emptyDataState/emptyDataState.mjs +521 -0
- package/plugins/emptyDataState/index.d.ts +1 -0
- package/plugins/emptyDataState/index.js +7 -0
- package/plugins/emptyDataState/index.mjs +1 -0
- package/plugins/emptyDataState/ui.js +282 -0
- package/plugins/emptyDataState/ui.mjs +278 -0
- package/plugins/filters/component/value.js +16 -1
- package/plugins/filters/component/value.mjs +16 -1
- package/plugins/filters/filters.d.ts +5 -1
- package/plugins/filters/filters.js +22 -1
- package/plugins/filters/filters.mjs +22 -1
- package/plugins/filters/ui/multipleSelect.js +90 -79
- package/plugins/filters/ui/multipleSelect.mjs +90 -79
- package/plugins/index.d.ts +3 -0
- package/plugins/index.js +3 -0
- package/plugins/index.mjs +3 -1
- package/plugins/mergeCells/utils.js +1 -5
- package/plugins/mergeCells/utils.mjs +1 -5
- package/plugins/pagination/pagination.js +37 -175
- package/plugins/pagination/pagination.mjs +37 -175
- package/plugins/pagination/strategies/autoPageSize.js +2 -2
- package/plugins/pagination/strategies/autoPageSize.mjs +2 -2
- package/plugins/pagination/ui.js +6 -10
- package/plugins/pagination/ui.mjs +7 -11
- package/plugins/stretchColumns/calculator.js +3 -1
- package/plugins/stretchColumns/calculator.mjs +3 -1
- package/plugins/undoRedo/undoRedo.js +16 -6
- package/plugins/undoRedo/undoRedo.mjs +16 -5
- package/renderers/checkboxRenderer/checkboxRenderer.js +12 -15
- package/renderers/checkboxRenderer/checkboxRenderer.mjs +12 -15
- package/selection/selection.js +1 -1
- package/selection/selection.mjs +1 -1
- package/settings.d.ts +3 -0
- package/shortcutContexts/commands/index.js +2 -1
- package/shortcutContexts/commands/index.mjs +2 -1
- package/shortcutContexts/commands/tabNavigation.js +51 -0
- package/shortcutContexts/commands/tabNavigation.mjs +48 -0
- package/shortcutContexts/constants.js +16 -1
- package/shortcutContexts/constants.mjs +16 -1
- package/shortcutContexts/editor.js +2 -2
- package/shortcutContexts/editor.mjs +3 -3
- package/shortcutContexts/grid.js +19 -3
- package/shortcutContexts/grid.mjs +20 -4
- package/shortcuts/manager.d.ts +1 -0
- package/shortcuts/manager.js +17 -2
- package/shortcuts/manager.mjs +17 -2
- package/styles/handsontable.css +192 -35
- package/styles/handsontable.min.css +3 -3
- package/styles/ht-icons-horizon.css +233 -0
- package/styles/ht-icons-horizon.min.css +30 -0
- package/styles/ht-icons-main.css +233 -0
- package/styles/ht-icons-main.min.css +30 -0
- package/styles/ht-theme-classic-no-icons.css +399 -0
- package/styles/ht-theme-classic-no-icons.min.css +30 -0
- package/styles/ht-theme-classic.css +308 -556
- package/styles/ht-theme-classic.min.css +3 -3
- package/styles/ht-theme-horizon-no-icons.css +405 -0
- package/styles/ht-theme-horizon-no-icons.min.css +30 -0
- package/styles/ht-theme-horizon.css +312 -556
- package/styles/ht-theme-horizon.min.css +3 -3
- package/styles/ht-theme-main-no-icons.css +396 -0
- package/styles/ht-theme-main-no-icons.min.css +30 -0
- package/styles/ht-theme-main.css +303 -556
- package/styles/ht-theme-main.min.css +3 -3
- package/tableView.js +23 -5
- package/tableView.mjs +23 -5
- package/utils/dataStructures/uniqueMap.js +10 -0
- package/utils/dataStructures/uniqueMap.mjs +10 -0
- package/utils/ghostTable.js +0 -3
- package/utils/ghostTable.mjs +0 -3
- package/utils/stylesHandler.js +19 -4
- package/utils/stylesHandler.mjs +19 -4
- package/core/focusCatcher/index.js +0 -131
- package/core/focusCatcher/index.mjs +0 -127
- package/core/focusCatcher/utils.js +0 -31
- package/core/focusCatcher/utils.mjs +0 -27
- package/plugins/pagination/focusController.js +0 -27
- package/plugins/pagination/focusController.mjs +0 -23
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
require("core-js/modules/es.error.cause.js");
|
|
4
|
+
exports.__esModule = true;
|
|
5
|
+
require("core-js/modules/esnext.iterator.constructor.js");
|
|
6
|
+
require("core-js/modules/esnext.iterator.for-each.js");
|
|
7
|
+
require("core-js/modules/esnext.iterator.map.js");
|
|
8
|
+
var _templateLiteralTag = require("../../helpers/templateLiteralTag");
|
|
9
|
+
var _element = require("../../helpers/dom/element");
|
|
10
|
+
var _a11y = require("../../helpers/a11y");
|
|
11
|
+
var _string = require("../../helpers/string");
|
|
12
|
+
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
|
13
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
14
|
+
function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
|
|
15
|
+
function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
|
|
16
|
+
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"); }
|
|
17
|
+
const EMPTY_DATA_STATE_CLASS_NAME = 'ht-empty-data-state';
|
|
18
|
+
const MIN_HEIGHT = 150;
|
|
19
|
+
const TEMPLATE = `<div data-ref="emptyDataStateElement" class="${EMPTY_DATA_STATE_CLASS_NAME} handsontable">
|
|
20
|
+
<div class="${EMPTY_DATA_STATE_CLASS_NAME}__content-wrapper">
|
|
21
|
+
<div data-ref="emptyDataStateInner" class="${EMPTY_DATA_STATE_CLASS_NAME}__content-wrapper-inner"></div>
|
|
22
|
+
</div>
|
|
23
|
+
</div>`;
|
|
24
|
+
const templateContent = _ref => {
|
|
25
|
+
let {
|
|
26
|
+
title,
|
|
27
|
+
description,
|
|
28
|
+
buttons
|
|
29
|
+
} = _ref;
|
|
30
|
+
return `
|
|
31
|
+
<div class="${EMPTY_DATA_STATE_CLASS_NAME}__content">
|
|
32
|
+
${title ? `<h2 class="${EMPTY_DATA_STATE_CLASS_NAME}__title">${(0, _string.stripTags)(title)}</h2>` : ''}
|
|
33
|
+
${description ? `<p class="${EMPTY_DATA_STATE_CLASS_NAME}__description">${(0, _string.stripTags)(description)}</p>` : ''}
|
|
34
|
+
</div>
|
|
35
|
+
<div
|
|
36
|
+
data-ref="emptyDataStateButtons"
|
|
37
|
+
class="${EMPTY_DATA_STATE_CLASS_NAME}__buttons${(buttons === null || buttons === void 0 ? void 0 : buttons.length) > 0 ? ` ${EMPTY_DATA_STATE_CLASS_NAME}__buttons--has-buttons` : ''}"
|
|
38
|
+
>${(buttons === null || buttons === void 0 ? void 0 : buttons.length) > 0 ? buttons.map(button => `<button class="ht-button ht-button--${button.type}">${(0, _string.stripTags)(button.text)}</button>`).join('') : ''}</div>`;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* EmptyDataStateUI is a UI component that renders and manages empty data state elements.
|
|
43
|
+
*
|
|
44
|
+
* @private
|
|
45
|
+
* @class EmptyDataStateUI
|
|
46
|
+
*/
|
|
47
|
+
var _rootElement = /*#__PURE__*/new WeakMap();
|
|
48
|
+
var _rootDocument = /*#__PURE__*/new WeakMap();
|
|
49
|
+
var _refs = /*#__PURE__*/new WeakMap();
|
|
50
|
+
var _placeholderElement = /*#__PURE__*/new WeakMap();
|
|
51
|
+
class EmptyDataStateUI {
|
|
52
|
+
constructor(_ref2) {
|
|
53
|
+
let {
|
|
54
|
+
rootElement,
|
|
55
|
+
rootDocument
|
|
56
|
+
} = _ref2;
|
|
57
|
+
/**
|
|
58
|
+
* The root element where the emptyDataState UI will be installed.
|
|
59
|
+
*
|
|
60
|
+
* @type {HTMLElement}
|
|
61
|
+
*/
|
|
62
|
+
_classPrivateFieldInitSpec(this, _rootElement, void 0);
|
|
63
|
+
/**
|
|
64
|
+
* The root document where the emptyDataState UI will be installed.
|
|
65
|
+
*
|
|
66
|
+
* @type {Document}
|
|
67
|
+
*/
|
|
68
|
+
_classPrivateFieldInitSpec(this, _rootDocument, void 0);
|
|
69
|
+
/**
|
|
70
|
+
* The references to the UI elements.
|
|
71
|
+
*
|
|
72
|
+
* @type {object}
|
|
73
|
+
*/
|
|
74
|
+
_classPrivateFieldInitSpec(this, _refs, void 0);
|
|
75
|
+
/**
|
|
76
|
+
* The placeholder element.
|
|
77
|
+
*
|
|
78
|
+
* @type {HTMLElement}
|
|
79
|
+
*/
|
|
80
|
+
_classPrivateFieldInitSpec(this, _placeholderElement, void 0);
|
|
81
|
+
_classPrivateFieldSet(_rootElement, this, rootElement);
|
|
82
|
+
_classPrivateFieldSet(_rootDocument, this, rootDocument);
|
|
83
|
+
this.install();
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Creates the emptyDataState UI elements and sets up the structure.
|
|
88
|
+
*/
|
|
89
|
+
install() {
|
|
90
|
+
var _classPrivateFieldGet2;
|
|
91
|
+
if ((_classPrivateFieldGet2 = _classPrivateFieldGet(_refs, this)) !== null && _classPrivateFieldGet2 !== void 0 && _classPrivateFieldGet2.emptyDataStateElement) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
const elements = (0, _templateLiteralTag.html)`${TEMPLATE}`;
|
|
95
|
+
_classPrivateFieldSet(_refs, this, elements.refs);
|
|
96
|
+
const {
|
|
97
|
+
emptyDataStateInner,
|
|
98
|
+
emptyDataStateElement
|
|
99
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
100
|
+
(0, _element.setAttribute)(emptyDataStateInner, [(0, _a11y.A11Y_TABINDEX)(-1)]);
|
|
101
|
+
(0, _element.setAttribute)(emptyDataStateElement, [(0, _a11y.A11Y_TABINDEX)(-1)]);
|
|
102
|
+
_classPrivateFieldGet(_rootElement, this).after(elements.fragment);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Gets the emptyDataState element.
|
|
107
|
+
*
|
|
108
|
+
* @returns {HTMLElement} The empty data state element.
|
|
109
|
+
*/
|
|
110
|
+
getElement() {
|
|
111
|
+
var _classPrivateFieldGet3;
|
|
112
|
+
return (_classPrivateFieldGet3 = _classPrivateFieldGet(_refs, this)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.emptyDataStateElement;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Gets the focusable elements of the emptyDataState element.
|
|
117
|
+
*
|
|
118
|
+
* @returns {HTMLElement[]} The focusable elements.
|
|
119
|
+
*/
|
|
120
|
+
getFocusableElements() {
|
|
121
|
+
const {
|
|
122
|
+
emptyDataStateButtons,
|
|
123
|
+
emptyDataStateInner
|
|
124
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
125
|
+
const emptyDataStateButtonsElements = Array.from(emptyDataStateButtons === null || emptyDataStateButtons === void 0 ? void 0 : emptyDataStateButtons.children);
|
|
126
|
+
if (emptyDataStateButtonsElements.length === 0) {
|
|
127
|
+
return [emptyDataStateInner];
|
|
128
|
+
}
|
|
129
|
+
return emptyDataStateButtonsElements;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Shows the emptyDataState element.
|
|
134
|
+
*/
|
|
135
|
+
show() {
|
|
136
|
+
var _classPrivateFieldGet4;
|
|
137
|
+
if (!((_classPrivateFieldGet4 = _classPrivateFieldGet(_refs, this)) !== null && _classPrivateFieldGet4 !== void 0 && _classPrivateFieldGet4.emptyDataStateElement)) {
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
_classPrivateFieldGet(_refs, this).emptyDataStateElement.style.display = 'block';
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Hides the emptyDataState element.
|
|
145
|
+
*/
|
|
146
|
+
hide() {
|
|
147
|
+
var _classPrivateFieldGet5, _classPrivateFieldGet6;
|
|
148
|
+
if (!((_classPrivateFieldGet5 = _classPrivateFieldGet(_refs, this)) !== null && _classPrivateFieldGet5 !== void 0 && _classPrivateFieldGet5.emptyDataStateElement)) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
(_classPrivateFieldGet6 = _classPrivateFieldGet(_placeholderElement, this)) === null || _classPrivateFieldGet6 === void 0 || _classPrivateFieldGet6.remove();
|
|
152
|
+
_classPrivateFieldSet(_placeholderElement, this, null);
|
|
153
|
+
_classPrivateFieldGet(_refs, this).emptyDataStateElement.style.display = 'none';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Updates the content of the emptyDataState element.
|
|
158
|
+
*
|
|
159
|
+
* @param {string | object} message - The message to update.
|
|
160
|
+
*/
|
|
161
|
+
updateContent(message) {
|
|
162
|
+
var _content$buttons;
|
|
163
|
+
const {
|
|
164
|
+
emptyDataStateInner
|
|
165
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
166
|
+
let content = '';
|
|
167
|
+
if (typeof message === 'string') {
|
|
168
|
+
content = {
|
|
169
|
+
title: message
|
|
170
|
+
};
|
|
171
|
+
} else {
|
|
172
|
+
content = {
|
|
173
|
+
title: message === null || message === void 0 ? void 0 : message.title,
|
|
174
|
+
description: message === null || message === void 0 ? void 0 : message.description,
|
|
175
|
+
buttons: message === null || message === void 0 ? void 0 : message.buttons
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const template = (0, _templateLiteralTag.html)`${templateContent(content)}`;
|
|
179
|
+
_classPrivateFieldSet(_refs, this, {
|
|
180
|
+
..._classPrivateFieldGet(_refs, this),
|
|
181
|
+
...template.refs
|
|
182
|
+
});
|
|
183
|
+
emptyDataStateInner.innerHTML = '';
|
|
184
|
+
emptyDataStateInner.appendChild(template.fragment);
|
|
185
|
+
if (((_content$buttons = content.buttons) === null || _content$buttons === void 0 ? void 0 : _content$buttons.length) > 0) {
|
|
186
|
+
Array.from(_classPrivateFieldGet(_refs, this).emptyDataStateButtons.children).forEach((button, index) => {
|
|
187
|
+
button.addEventListener('click', content.buttons[index].callback);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Updates the class names of the emptyDataState element.
|
|
194
|
+
*
|
|
195
|
+
* @param {View} view - The view instance.
|
|
196
|
+
*/
|
|
197
|
+
updateClassNames(view) {
|
|
198
|
+
const {
|
|
199
|
+
emptyDataStateElement
|
|
200
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
201
|
+
if (view.countRenderableColumns() > 0 && view.getColumnHeadersCount() > 0) {
|
|
202
|
+
(0, _element.addClass)(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-top-border`);
|
|
203
|
+
} else {
|
|
204
|
+
(0, _element.removeClass)(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-top-border`);
|
|
205
|
+
}
|
|
206
|
+
if (view.countRenderableRows() > 0 && view.getRowHeadersCount() > 0) {
|
|
207
|
+
(0, _element.addClass)(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-inline-border`);
|
|
208
|
+
} else {
|
|
209
|
+
(0, _element.removeClass)(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-inline-border`);
|
|
210
|
+
}
|
|
211
|
+
if (view.hasHorizontalScroll() && !view.isHorizontallyScrollableByWindow()) {
|
|
212
|
+
(0, _element.addClass)(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-bottom-border`);
|
|
213
|
+
} else {
|
|
214
|
+
(0, _element.removeClass)(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-bottom-border`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Updates the size of the emptyDataState element.
|
|
220
|
+
*
|
|
221
|
+
* @param {View} view - The view instance.
|
|
222
|
+
*/
|
|
223
|
+
updateSize(view) {
|
|
224
|
+
const {
|
|
225
|
+
emptyDataStateElement
|
|
226
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
227
|
+
const scrollbarSize = view.hasHorizontalScroll() ? (0, _element.getScrollbarWidth)(view.hot.rootDocument) : 0;
|
|
228
|
+
const rows = view.countRenderableRows();
|
|
229
|
+
const cols = view.countRenderableColumns();
|
|
230
|
+
emptyDataStateElement.style.top = cols > 0 ? `${view.getColumnHeaderHeight()}px` : '0px';
|
|
231
|
+
emptyDataStateElement.style.insetInlineStart = rows > 0 ? `${view.getRowHeaderWidth()}px` : '0px';
|
|
232
|
+
if (rows === 0) {
|
|
233
|
+
if (!_classPrivateFieldGet(_placeholderElement, this)) {
|
|
234
|
+
_classPrivateFieldSet(_placeholderElement, this, _classPrivateFieldGet(_rootDocument, this).createElement('div'));
|
|
235
|
+
_classPrivateFieldGet(_placeholderElement, this).classList.add(`${EMPTY_DATA_STATE_CLASS_NAME}-placeholder`);
|
|
236
|
+
view._wt.wtTable.holder.appendChild(_classPrivateFieldGet(_placeholderElement, this));
|
|
237
|
+
}
|
|
238
|
+
_classPrivateFieldGet(_placeholderElement, this).style.width = '100%';
|
|
239
|
+
_classPrivateFieldGet(_placeholderElement, this).style.height = `${MIN_HEIGHT}px`;
|
|
240
|
+
} else {
|
|
241
|
+
var _classPrivateFieldGet7;
|
|
242
|
+
(_classPrivateFieldGet7 = _classPrivateFieldGet(_placeholderElement, this)) === null || _classPrivateFieldGet7 === void 0 || _classPrivateFieldGet7.remove();
|
|
243
|
+
_classPrivateFieldSet(_placeholderElement, this, null);
|
|
244
|
+
}
|
|
245
|
+
let width = view.getWorkspaceWidth();
|
|
246
|
+
let height = view.getTableHeight();
|
|
247
|
+
if (view.isHorizontallyScrollableByWindow()) {
|
|
248
|
+
if (cols > 0) {
|
|
249
|
+
width = view.getTotalTableWidth();
|
|
250
|
+
} else if (rows > 0) {
|
|
251
|
+
width = view.getViewportWidth();
|
|
252
|
+
}
|
|
253
|
+
} else if (rows > 0) {
|
|
254
|
+
width = view.getViewportWidth();
|
|
255
|
+
} else if (view.getTableWidth() - view.getRowHeaderWidth() < view.getViewportWidth() && cols > 0) {
|
|
256
|
+
width = view.getTableWidth();
|
|
257
|
+
}
|
|
258
|
+
if (view.isVerticallyScrollableByWindow() || view.hasVerticalScroll()) {
|
|
259
|
+
if (cols > 0) {
|
|
260
|
+
height = view.hot.getTableHeight() - view.getColumnHeaderHeight();
|
|
261
|
+
} else {
|
|
262
|
+
height = view.hot.getTableHeight();
|
|
263
|
+
}
|
|
264
|
+
} else if (rows === 0) {
|
|
265
|
+
height = view.getViewportHeight() - scrollbarSize;
|
|
266
|
+
}
|
|
267
|
+
emptyDataStateElement.style.width = `${width}px`;
|
|
268
|
+
emptyDataStateElement.style.height = `${height}px`;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/**
|
|
272
|
+
* Removes the emptyDataState UI elements from the DOM and clears the refs.
|
|
273
|
+
*/
|
|
274
|
+
destroy() {
|
|
275
|
+
var _classPrivateFieldGet8, _classPrivateFieldGet9;
|
|
276
|
+
(_classPrivateFieldGet8 = _classPrivateFieldGet(_refs, this)) === null || _classPrivateFieldGet8 === void 0 || (_classPrivateFieldGet8 = _classPrivateFieldGet8.emptyDataStateElement) === null || _classPrivateFieldGet8 === void 0 || _classPrivateFieldGet8.remove();
|
|
277
|
+
(_classPrivateFieldGet9 = _classPrivateFieldGet(_placeholderElement, this)) === null || _classPrivateFieldGet9 === void 0 || _classPrivateFieldGet9.remove();
|
|
278
|
+
_classPrivateFieldSet(_placeholderElement, this, null);
|
|
279
|
+
_classPrivateFieldSet(_refs, this, null);
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
exports.EmptyDataStateUI = EmptyDataStateUI;
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
function _classPrivateFieldInitSpec(e, t, a) { _checkPrivateRedeclaration(e, t), t.set(e, a); }
|
|
2
|
+
function _checkPrivateRedeclaration(e, t) { if (t.has(e)) throw new TypeError("Cannot initialize the same private elements twice on an object"); }
|
|
3
|
+
function _classPrivateFieldGet(s, a) { return s.get(_assertClassBrand(s, a)); }
|
|
4
|
+
function _classPrivateFieldSet(s, a, r) { return s.set(_assertClassBrand(s, a), r), r; }
|
|
5
|
+
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"); }
|
|
6
|
+
import "core-js/modules/es.error.cause.js";
|
|
7
|
+
import "core-js/modules/esnext.iterator.constructor.js";
|
|
8
|
+
import "core-js/modules/esnext.iterator.for-each.js";
|
|
9
|
+
import "core-js/modules/esnext.iterator.map.js";
|
|
10
|
+
import { html } from "../../helpers/templateLiteralTag.mjs";
|
|
11
|
+
import { addClass, removeClass, getScrollbarWidth, setAttribute } from "../../helpers/dom/element.mjs";
|
|
12
|
+
import { A11Y_TABINDEX } from "../../helpers/a11y.mjs";
|
|
13
|
+
import { stripTags } from "../../helpers/string.mjs";
|
|
14
|
+
const EMPTY_DATA_STATE_CLASS_NAME = 'ht-empty-data-state';
|
|
15
|
+
const MIN_HEIGHT = 150;
|
|
16
|
+
const TEMPLATE = `<div data-ref="emptyDataStateElement" class="${EMPTY_DATA_STATE_CLASS_NAME} handsontable">
|
|
17
|
+
<div class="${EMPTY_DATA_STATE_CLASS_NAME}__content-wrapper">
|
|
18
|
+
<div data-ref="emptyDataStateInner" class="${EMPTY_DATA_STATE_CLASS_NAME}__content-wrapper-inner"></div>
|
|
19
|
+
</div>
|
|
20
|
+
</div>`;
|
|
21
|
+
const templateContent = _ref => {
|
|
22
|
+
let {
|
|
23
|
+
title,
|
|
24
|
+
description,
|
|
25
|
+
buttons
|
|
26
|
+
} = _ref;
|
|
27
|
+
return `
|
|
28
|
+
<div class="${EMPTY_DATA_STATE_CLASS_NAME}__content">
|
|
29
|
+
${title ? `<h2 class="${EMPTY_DATA_STATE_CLASS_NAME}__title">${stripTags(title)}</h2>` : ''}
|
|
30
|
+
${description ? `<p class="${EMPTY_DATA_STATE_CLASS_NAME}__description">${stripTags(description)}</p>` : ''}
|
|
31
|
+
</div>
|
|
32
|
+
<div
|
|
33
|
+
data-ref="emptyDataStateButtons"
|
|
34
|
+
class="${EMPTY_DATA_STATE_CLASS_NAME}__buttons${(buttons === null || buttons === void 0 ? void 0 : buttons.length) > 0 ? ` ${EMPTY_DATA_STATE_CLASS_NAME}__buttons--has-buttons` : ''}"
|
|
35
|
+
>${(buttons === null || buttons === void 0 ? void 0 : buttons.length) > 0 ? buttons.map(button => `<button class="ht-button ht-button--${button.type}">${stripTags(button.text)}</button>`).join('') : ''}</div>`;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* EmptyDataStateUI is a UI component that renders and manages empty data state elements.
|
|
40
|
+
*
|
|
41
|
+
* @private
|
|
42
|
+
* @class EmptyDataStateUI
|
|
43
|
+
*/
|
|
44
|
+
var _rootElement = /*#__PURE__*/new WeakMap();
|
|
45
|
+
var _rootDocument = /*#__PURE__*/new WeakMap();
|
|
46
|
+
var _refs = /*#__PURE__*/new WeakMap();
|
|
47
|
+
var _placeholderElement = /*#__PURE__*/new WeakMap();
|
|
48
|
+
export class EmptyDataStateUI {
|
|
49
|
+
constructor(_ref2) {
|
|
50
|
+
let {
|
|
51
|
+
rootElement,
|
|
52
|
+
rootDocument
|
|
53
|
+
} = _ref2;
|
|
54
|
+
/**
|
|
55
|
+
* The root element where the emptyDataState UI will be installed.
|
|
56
|
+
*
|
|
57
|
+
* @type {HTMLElement}
|
|
58
|
+
*/
|
|
59
|
+
_classPrivateFieldInitSpec(this, _rootElement, void 0);
|
|
60
|
+
/**
|
|
61
|
+
* The root document where the emptyDataState UI will be installed.
|
|
62
|
+
*
|
|
63
|
+
* @type {Document}
|
|
64
|
+
*/
|
|
65
|
+
_classPrivateFieldInitSpec(this, _rootDocument, void 0);
|
|
66
|
+
/**
|
|
67
|
+
* The references to the UI elements.
|
|
68
|
+
*
|
|
69
|
+
* @type {object}
|
|
70
|
+
*/
|
|
71
|
+
_classPrivateFieldInitSpec(this, _refs, void 0);
|
|
72
|
+
/**
|
|
73
|
+
* The placeholder element.
|
|
74
|
+
*
|
|
75
|
+
* @type {HTMLElement}
|
|
76
|
+
*/
|
|
77
|
+
_classPrivateFieldInitSpec(this, _placeholderElement, void 0);
|
|
78
|
+
_classPrivateFieldSet(_rootElement, this, rootElement);
|
|
79
|
+
_classPrivateFieldSet(_rootDocument, this, rootDocument);
|
|
80
|
+
this.install();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Creates the emptyDataState UI elements and sets up the structure.
|
|
85
|
+
*/
|
|
86
|
+
install() {
|
|
87
|
+
var _classPrivateFieldGet2;
|
|
88
|
+
if ((_classPrivateFieldGet2 = _classPrivateFieldGet(_refs, this)) !== null && _classPrivateFieldGet2 !== void 0 && _classPrivateFieldGet2.emptyDataStateElement) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const elements = html`${TEMPLATE}`;
|
|
92
|
+
_classPrivateFieldSet(_refs, this, elements.refs);
|
|
93
|
+
const {
|
|
94
|
+
emptyDataStateInner,
|
|
95
|
+
emptyDataStateElement
|
|
96
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
97
|
+
setAttribute(emptyDataStateInner, [A11Y_TABINDEX(-1)]);
|
|
98
|
+
setAttribute(emptyDataStateElement, [A11Y_TABINDEX(-1)]);
|
|
99
|
+
_classPrivateFieldGet(_rootElement, this).after(elements.fragment);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Gets the emptyDataState element.
|
|
104
|
+
*
|
|
105
|
+
* @returns {HTMLElement} The empty data state element.
|
|
106
|
+
*/
|
|
107
|
+
getElement() {
|
|
108
|
+
var _classPrivateFieldGet3;
|
|
109
|
+
return (_classPrivateFieldGet3 = _classPrivateFieldGet(_refs, this)) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.emptyDataStateElement;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Gets the focusable elements of the emptyDataState element.
|
|
114
|
+
*
|
|
115
|
+
* @returns {HTMLElement[]} The focusable elements.
|
|
116
|
+
*/
|
|
117
|
+
getFocusableElements() {
|
|
118
|
+
const {
|
|
119
|
+
emptyDataStateButtons,
|
|
120
|
+
emptyDataStateInner
|
|
121
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
122
|
+
const emptyDataStateButtonsElements = Array.from(emptyDataStateButtons === null || emptyDataStateButtons === void 0 ? void 0 : emptyDataStateButtons.children);
|
|
123
|
+
if (emptyDataStateButtonsElements.length === 0) {
|
|
124
|
+
return [emptyDataStateInner];
|
|
125
|
+
}
|
|
126
|
+
return emptyDataStateButtonsElements;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Shows the emptyDataState element.
|
|
131
|
+
*/
|
|
132
|
+
show() {
|
|
133
|
+
var _classPrivateFieldGet4;
|
|
134
|
+
if (!((_classPrivateFieldGet4 = _classPrivateFieldGet(_refs, this)) !== null && _classPrivateFieldGet4 !== void 0 && _classPrivateFieldGet4.emptyDataStateElement)) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
_classPrivateFieldGet(_refs, this).emptyDataStateElement.style.display = 'block';
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Hides the emptyDataState element.
|
|
142
|
+
*/
|
|
143
|
+
hide() {
|
|
144
|
+
var _classPrivateFieldGet5, _classPrivateFieldGet6;
|
|
145
|
+
if (!((_classPrivateFieldGet5 = _classPrivateFieldGet(_refs, this)) !== null && _classPrivateFieldGet5 !== void 0 && _classPrivateFieldGet5.emptyDataStateElement)) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
(_classPrivateFieldGet6 = _classPrivateFieldGet(_placeholderElement, this)) === null || _classPrivateFieldGet6 === void 0 || _classPrivateFieldGet6.remove();
|
|
149
|
+
_classPrivateFieldSet(_placeholderElement, this, null);
|
|
150
|
+
_classPrivateFieldGet(_refs, this).emptyDataStateElement.style.display = 'none';
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Updates the content of the emptyDataState element.
|
|
155
|
+
*
|
|
156
|
+
* @param {string | object} message - The message to update.
|
|
157
|
+
*/
|
|
158
|
+
updateContent(message) {
|
|
159
|
+
var _content$buttons;
|
|
160
|
+
const {
|
|
161
|
+
emptyDataStateInner
|
|
162
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
163
|
+
let content = '';
|
|
164
|
+
if (typeof message === 'string') {
|
|
165
|
+
content = {
|
|
166
|
+
title: message
|
|
167
|
+
};
|
|
168
|
+
} else {
|
|
169
|
+
content = {
|
|
170
|
+
title: message === null || message === void 0 ? void 0 : message.title,
|
|
171
|
+
description: message === null || message === void 0 ? void 0 : message.description,
|
|
172
|
+
buttons: message === null || message === void 0 ? void 0 : message.buttons
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
const template = html`${templateContent(content)}`;
|
|
176
|
+
_classPrivateFieldSet(_refs, this, {
|
|
177
|
+
..._classPrivateFieldGet(_refs, this),
|
|
178
|
+
...template.refs
|
|
179
|
+
});
|
|
180
|
+
emptyDataStateInner.innerHTML = '';
|
|
181
|
+
emptyDataStateInner.appendChild(template.fragment);
|
|
182
|
+
if (((_content$buttons = content.buttons) === null || _content$buttons === void 0 ? void 0 : _content$buttons.length) > 0) {
|
|
183
|
+
Array.from(_classPrivateFieldGet(_refs, this).emptyDataStateButtons.children).forEach((button, index) => {
|
|
184
|
+
button.addEventListener('click', content.buttons[index].callback);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Updates the class names of the emptyDataState element.
|
|
191
|
+
*
|
|
192
|
+
* @param {View} view - The view instance.
|
|
193
|
+
*/
|
|
194
|
+
updateClassNames(view) {
|
|
195
|
+
const {
|
|
196
|
+
emptyDataStateElement
|
|
197
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
198
|
+
if (view.countRenderableColumns() > 0 && view.getColumnHeadersCount() > 0) {
|
|
199
|
+
addClass(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-top-border`);
|
|
200
|
+
} else {
|
|
201
|
+
removeClass(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-top-border`);
|
|
202
|
+
}
|
|
203
|
+
if (view.countRenderableRows() > 0 && view.getRowHeadersCount() > 0) {
|
|
204
|
+
addClass(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-inline-border`);
|
|
205
|
+
} else {
|
|
206
|
+
removeClass(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-inline-border`);
|
|
207
|
+
}
|
|
208
|
+
if (view.hasHorizontalScroll() && !view.isHorizontallyScrollableByWindow()) {
|
|
209
|
+
addClass(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-bottom-border`);
|
|
210
|
+
} else {
|
|
211
|
+
removeClass(emptyDataStateElement, `${EMPTY_DATA_STATE_CLASS_NAME}--disable-bottom-border`);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Updates the size of the emptyDataState element.
|
|
217
|
+
*
|
|
218
|
+
* @param {View} view - The view instance.
|
|
219
|
+
*/
|
|
220
|
+
updateSize(view) {
|
|
221
|
+
const {
|
|
222
|
+
emptyDataStateElement
|
|
223
|
+
} = _classPrivateFieldGet(_refs, this);
|
|
224
|
+
const scrollbarSize = view.hasHorizontalScroll() ? getScrollbarWidth(view.hot.rootDocument) : 0;
|
|
225
|
+
const rows = view.countRenderableRows();
|
|
226
|
+
const cols = view.countRenderableColumns();
|
|
227
|
+
emptyDataStateElement.style.top = cols > 0 ? `${view.getColumnHeaderHeight()}px` : '0px';
|
|
228
|
+
emptyDataStateElement.style.insetInlineStart = rows > 0 ? `${view.getRowHeaderWidth()}px` : '0px';
|
|
229
|
+
if (rows === 0) {
|
|
230
|
+
if (!_classPrivateFieldGet(_placeholderElement, this)) {
|
|
231
|
+
_classPrivateFieldSet(_placeholderElement, this, _classPrivateFieldGet(_rootDocument, this).createElement('div'));
|
|
232
|
+
_classPrivateFieldGet(_placeholderElement, this).classList.add(`${EMPTY_DATA_STATE_CLASS_NAME}-placeholder`);
|
|
233
|
+
view._wt.wtTable.holder.appendChild(_classPrivateFieldGet(_placeholderElement, this));
|
|
234
|
+
}
|
|
235
|
+
_classPrivateFieldGet(_placeholderElement, this).style.width = '100%';
|
|
236
|
+
_classPrivateFieldGet(_placeholderElement, this).style.height = `${MIN_HEIGHT}px`;
|
|
237
|
+
} else {
|
|
238
|
+
var _classPrivateFieldGet7;
|
|
239
|
+
(_classPrivateFieldGet7 = _classPrivateFieldGet(_placeholderElement, this)) === null || _classPrivateFieldGet7 === void 0 || _classPrivateFieldGet7.remove();
|
|
240
|
+
_classPrivateFieldSet(_placeholderElement, this, null);
|
|
241
|
+
}
|
|
242
|
+
let width = view.getWorkspaceWidth();
|
|
243
|
+
let height = view.getTableHeight();
|
|
244
|
+
if (view.isHorizontallyScrollableByWindow()) {
|
|
245
|
+
if (cols > 0) {
|
|
246
|
+
width = view.getTotalTableWidth();
|
|
247
|
+
} else if (rows > 0) {
|
|
248
|
+
width = view.getViewportWidth();
|
|
249
|
+
}
|
|
250
|
+
} else if (rows > 0) {
|
|
251
|
+
width = view.getViewportWidth();
|
|
252
|
+
} else if (view.getTableWidth() - view.getRowHeaderWidth() < view.getViewportWidth() && cols > 0) {
|
|
253
|
+
width = view.getTableWidth();
|
|
254
|
+
}
|
|
255
|
+
if (view.isVerticallyScrollableByWindow() || view.hasVerticalScroll()) {
|
|
256
|
+
if (cols > 0) {
|
|
257
|
+
height = view.hot.getTableHeight() - view.getColumnHeaderHeight();
|
|
258
|
+
} else {
|
|
259
|
+
height = view.hot.getTableHeight();
|
|
260
|
+
}
|
|
261
|
+
} else if (rows === 0) {
|
|
262
|
+
height = view.getViewportHeight() - scrollbarSize;
|
|
263
|
+
}
|
|
264
|
+
emptyDataStateElement.style.width = `${width}px`;
|
|
265
|
+
emptyDataStateElement.style.height = `${height}px`;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Removes the emptyDataState UI elements from the DOM and clears the refs.
|
|
270
|
+
*/
|
|
271
|
+
destroy() {
|
|
272
|
+
var _classPrivateFieldGet8, _classPrivateFieldGet9;
|
|
273
|
+
(_classPrivateFieldGet8 = _classPrivateFieldGet(_refs, this)) === null || _classPrivateFieldGet8 === void 0 || (_classPrivateFieldGet8 = _classPrivateFieldGet8.emptyDataStateElement) === null || _classPrivateFieldGet8 === void 0 || _classPrivateFieldGet8.remove();
|
|
274
|
+
(_classPrivateFieldGet9 = _classPrivateFieldGet(_placeholderElement, this)) === null || _classPrivateFieldGet9 === void 0 || _classPrivateFieldGet9.remove();
|
|
275
|
+
_classPrivateFieldSet(_placeholderElement, this, null);
|
|
276
|
+
_classPrivateFieldSet(_refs, this, null);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
@@ -47,8 +47,17 @@ class ValueComponent extends _base.BaseComponent {
|
|
|
47
47
|
* @type {string}
|
|
48
48
|
*/
|
|
49
49
|
_defineProperty(this, "name", '');
|
|
50
|
+
/**
|
|
51
|
+
* Whether to uncheck filtered queries.
|
|
52
|
+
*
|
|
53
|
+
* @type {string}
|
|
54
|
+
*/
|
|
55
|
+
_defineProperty(this, "searchMode", void 0);
|
|
50
56
|
this.name = options.name;
|
|
51
|
-
this.
|
|
57
|
+
this.searchMode = options.searchMode;
|
|
58
|
+
this.elements.push(new _multipleSelect.MultipleSelectUI(this.hot, {
|
|
59
|
+
searchMode: this.searchMode
|
|
60
|
+
}));
|
|
52
61
|
this.registerHooks();
|
|
53
62
|
}
|
|
54
63
|
|
|
@@ -235,6 +244,12 @@ function _onInputKeyDown(event) {
|
|
|
235
244
|
this.runLocalHooks('cancel');
|
|
236
245
|
(0, _event.stopImmediatePropagation)(event);
|
|
237
246
|
}
|
|
247
|
+
if ((0, _unicode.isKey)(event.keyCode, 'ENTER')) {
|
|
248
|
+
if (this.searchMode === 'apply') {
|
|
249
|
+
this.runLocalHooks('accept');
|
|
250
|
+
}
|
|
251
|
+
(0, _event.stopImmediatePropagation)(event);
|
|
252
|
+
}
|
|
238
253
|
}
|
|
239
254
|
/**
|
|
240
255
|
* Trigger the `modifyFiltersMultiSelectValue` hook.
|
|
@@ -43,8 +43,17 @@ export class ValueComponent extends BaseComponent {
|
|
|
43
43
|
* @type {string}
|
|
44
44
|
*/
|
|
45
45
|
_defineProperty(this, "name", '');
|
|
46
|
+
/**
|
|
47
|
+
* Whether to uncheck filtered queries.
|
|
48
|
+
*
|
|
49
|
+
* @type {string}
|
|
50
|
+
*/
|
|
51
|
+
_defineProperty(this, "searchMode", void 0);
|
|
46
52
|
this.name = options.name;
|
|
47
|
-
this.
|
|
53
|
+
this.searchMode = options.searchMode;
|
|
54
|
+
this.elements.push(new MultipleSelectUI(this.hot, {
|
|
55
|
+
searchMode: this.searchMode
|
|
56
|
+
}));
|
|
48
57
|
this.registerHooks();
|
|
49
58
|
}
|
|
50
59
|
|
|
@@ -230,6 +239,12 @@ function _onInputKeyDown(event) {
|
|
|
230
239
|
this.runLocalHooks('cancel');
|
|
231
240
|
stopImmediatePropagation(event);
|
|
232
241
|
}
|
|
242
|
+
if (isKey(event.keyCode, 'ENTER')) {
|
|
243
|
+
if (this.searchMode === 'apply') {
|
|
244
|
+
this.runLocalHooks('accept');
|
|
245
|
+
}
|
|
246
|
+
stopImmediatePropagation(event);
|
|
247
|
+
}
|
|
233
248
|
}
|
|
234
249
|
/**
|
|
235
250
|
* Trigger the `modifyFiltersMultiSelectValue` hook.
|
|
@@ -36,7 +36,11 @@ export interface CellLikeData {
|
|
|
36
36
|
value: string;
|
|
37
37
|
}
|
|
38
38
|
|
|
39
|
-
export
|
|
39
|
+
export interface FiltersConfig {
|
|
40
|
+
searchMode: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export type Settings = boolean | FiltersConfig;
|
|
40
44
|
|
|
41
45
|
export declare class Filters extends BasePlugin {
|
|
42
46
|
constructor(hotInstance: Core);
|
|
@@ -105,6 +105,16 @@ class Filters extends _base.BasePlugin {
|
|
|
105
105
|
static get PLUGIN_PRIORITY() {
|
|
106
106
|
return PLUGIN_PRIORITY;
|
|
107
107
|
}
|
|
108
|
+
static get DEFAULT_SETTINGS() {
|
|
109
|
+
return {
|
|
110
|
+
searchMode: 'show'
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
static get SETTINGS_VALIDATORS() {
|
|
114
|
+
return {
|
|
115
|
+
searchMode: value => typeof value === 'string' && ['show', 'apply'].includes(value)
|
|
116
|
+
};
|
|
117
|
+
}
|
|
108
118
|
static get PLUGIN_DEPS() {
|
|
109
119
|
return ['plugin:DropdownMenu', 'plugin:HiddenRows', 'cell-type:checkbox'];
|
|
110
120
|
}
|
|
@@ -241,9 +251,11 @@ class Filters extends _base.BasePlugin {
|
|
|
241
251
|
this.components.set('filter_by_condition2', addConfirmationHooks(conditionComponent));
|
|
242
252
|
}
|
|
243
253
|
if (!this.components.get('filter_by_value')) {
|
|
254
|
+
const searchMode = this.getSetting('searchMode');
|
|
244
255
|
this.components.set('filter_by_value', addConfirmationHooks(new _value.ValueComponent(this.hot, {
|
|
245
256
|
id: 'filter_by_value',
|
|
246
|
-
name: filterValueLabel
|
|
257
|
+
name: filterValueLabel,
|
|
258
|
+
searchMode
|
|
247
259
|
})));
|
|
248
260
|
}
|
|
249
261
|
if (!this.components.get('filter_action_bar')) {
|
|
@@ -315,6 +327,15 @@ class Filters extends _base.BasePlugin {
|
|
|
315
327
|
super.enablePlugin();
|
|
316
328
|
}
|
|
317
329
|
|
|
330
|
+
/**
|
|
331
|
+
* Update plugin state after Handsontable settings update.
|
|
332
|
+
*/
|
|
333
|
+
updatePlugin() {
|
|
334
|
+
this.disablePlugin();
|
|
335
|
+
this.enablePlugin();
|
|
336
|
+
super.updatePlugin();
|
|
337
|
+
}
|
|
338
|
+
|
|
318
339
|
/**
|
|
319
340
|
* Disables the plugin functionality for this Handsontable instance.
|
|
320
341
|
*/
|