@keenthemes/ktui 1.2.3 → 1.2.5
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/dist/ktui.js +2244 -1061
- package/dist/ktui.min.js +1 -1
- package/dist/ktui.min.js.map +1 -1
- package/dist/styles.css +185 -40
- package/lib/cjs/components/context-menu/context-menu.d.ts +66 -0
- package/lib/cjs/components/context-menu/context-menu.d.ts.map +1 -0
- package/lib/cjs/components/context-menu/context-menu.js +423 -0
- package/lib/cjs/components/context-menu/context-menu.js.map +1 -0
- package/lib/cjs/components/context-menu/index.d.ts +7 -0
- package/lib/cjs/components/context-menu/index.d.ts.map +1 -0
- package/lib/cjs/components/context-menu/index.js +10 -0
- package/lib/cjs/components/context-menu/index.js.map +1 -0
- package/lib/cjs/components/context-menu/types.d.ts +30 -0
- package/lib/cjs/components/context-menu/types.d.ts.map +1 -0
- package/lib/cjs/components/context-menu/types.js +7 -0
- package/lib/cjs/components/context-menu/types.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-checkbox.d.ts.map +1 -1
- package/lib/cjs/components/datatable/datatable-checkbox.js +34 -15
- package/lib/cjs/components/datatable/datatable-checkbox.js.map +1 -1
- package/lib/cjs/components/datatable/datatable-contracts.d.ts +66 -0
- package/lib/cjs/components/datatable/datatable-contracts.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-contracts.js +7 -0
- package/lib/cjs/components/datatable/datatable-contracts.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-event-adapter.d.ts +7 -0
- package/lib/cjs/components/datatable/datatable-event-adapter.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-event-adapter.js +16 -0
- package/lib/cjs/components/datatable/datatable-event-adapter.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-local-provider.d.ts +25 -0
- package/lib/cjs/components/datatable/datatable-local-provider.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-local-provider.js +190 -0
- package/lib/cjs/components/datatable/datatable-local-provider.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-pagination-renderer.d.ts +15 -0
- package/lib/cjs/components/datatable/datatable-pagination-renderer.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-pagination-renderer.js +144 -0
- package/lib/cjs/components/datatable/datatable-pagination-renderer.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-remote-provider.d.ts +25 -0
- package/lib/cjs/components/datatable/datatable-remote-provider.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-remote-provider.js +191 -0
- package/lib/cjs/components/datatable/datatable-remote-provider.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-state-store.d.ts +21 -0
- package/lib/cjs/components/datatable/datatable-state-store.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-state-store.js +81 -0
- package/lib/cjs/components/datatable/datatable-state-store.js.map +1 -0
- package/lib/cjs/components/datatable/datatable-table-renderer.d.ts +16 -0
- package/lib/cjs/components/datatable/datatable-table-renderer.d.ts.map +1 -0
- package/lib/cjs/components/datatable/datatable-table-renderer.js +141 -0
- package/lib/cjs/components/datatable/datatable-table-renderer.js.map +1 -0
- package/lib/cjs/components/datatable/datatable.d.ts +9 -87
- package/lib/cjs/components/datatable/datatable.d.ts.map +1 -1
- package/lib/cjs/components/datatable/datatable.js +234 -740
- package/lib/cjs/components/datatable/datatable.js.map +1 -1
- package/lib/cjs/components/dropdown/dropdown.d.ts +2 -2
- package/lib/cjs/components/dropdown/dropdown.d.ts.map +1 -1
- package/lib/cjs/components/dropdown/dropdown.js +68 -31
- package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
- package/lib/cjs/components/input-number/index.d.ts +7 -0
- package/lib/cjs/components/input-number/index.d.ts.map +1 -0
- package/lib/cjs/components/input-number/index.js +10 -0
- package/lib/cjs/components/input-number/index.js.map +1 -0
- package/lib/cjs/components/input-number/input-number.d.ts +40 -0
- package/lib/cjs/components/input-number/input-number.d.ts.map +1 -0
- package/lib/cjs/components/input-number/input-number.js +248 -0
- package/lib/cjs/components/input-number/input-number.js.map +1 -0
- package/lib/cjs/components/input-number/types.d.ts +30 -0
- package/lib/cjs/components/input-number/types.d.ts.map +1 -0
- package/lib/cjs/components/input-number/types.js +7 -0
- package/lib/cjs/components/input-number/types.js.map +1 -0
- package/lib/cjs/components/select/config.d.ts +1 -0
- package/lib/cjs/components/select/config.d.ts.map +1 -1
- package/lib/cjs/components/select/config.js +2 -1
- package/lib/cjs/components/select/config.js.map +1 -1
- package/lib/cjs/components/select/index.d.ts +1 -1
- package/lib/cjs/components/select/index.d.ts.map +1 -1
- package/lib/cjs/components/select/select.d.ts +8 -1
- package/lib/cjs/components/select/select.d.ts.map +1 -1
- package/lib/cjs/components/select/select.js +14 -1
- package/lib/cjs/components/select/select.js.map +1 -1
- package/lib/cjs/components/select/tags.d.ts.map +1 -1
- package/lib/cjs/components/select/tags.js +10 -0
- package/lib/cjs/components/select/tags.js.map +1 -1
- package/lib/cjs/index.d.ts +9 -1
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +11 -7
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/init-all.d.ts +6 -0
- package/lib/cjs/init-all.d.ts.map +1 -0
- package/lib/cjs/init-all.js +17 -0
- package/lib/cjs/init-all.js.map +1 -0
- package/lib/cjs/legacy.d.ts +8 -0
- package/lib/cjs/legacy.d.ts.map +1 -0
- package/lib/cjs/legacy.js +26 -0
- package/lib/cjs/legacy.js.map +1 -0
- package/lib/esm/components/context-menu/context-menu.d.ts +66 -0
- package/lib/esm/components/context-menu/context-menu.d.ts.map +1 -0
- package/lib/esm/components/context-menu/context-menu.js +420 -0
- package/lib/esm/components/context-menu/context-menu.js.map +1 -0
- package/lib/esm/components/context-menu/index.d.ts +7 -0
- package/lib/esm/components/context-menu/index.d.ts.map +1 -0
- package/lib/esm/components/context-menu/index.js +6 -0
- package/lib/esm/components/context-menu/index.js.map +1 -0
- package/lib/esm/components/context-menu/types.d.ts +30 -0
- package/lib/esm/components/context-menu/types.d.ts.map +1 -0
- package/lib/esm/components/context-menu/types.js +6 -0
- package/lib/esm/components/context-menu/types.js.map +1 -0
- package/lib/esm/components/datatable/datatable-checkbox.d.ts.map +1 -1
- package/lib/esm/components/datatable/datatable-checkbox.js +34 -15
- package/lib/esm/components/datatable/datatable-checkbox.js.map +1 -1
- package/lib/esm/components/datatable/datatable-contracts.d.ts +66 -0
- package/lib/esm/components/datatable/datatable-contracts.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-contracts.js +6 -0
- package/lib/esm/components/datatable/datatable-contracts.js.map +1 -0
- package/lib/esm/components/datatable/datatable-event-adapter.d.ts +7 -0
- package/lib/esm/components/datatable/datatable-event-adapter.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-event-adapter.js +13 -0
- package/lib/esm/components/datatable/datatable-event-adapter.js.map +1 -0
- package/lib/esm/components/datatable/datatable-local-provider.d.ts +25 -0
- package/lib/esm/components/datatable/datatable-local-provider.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-local-provider.js +187 -0
- package/lib/esm/components/datatable/datatable-local-provider.js.map +1 -0
- package/lib/esm/components/datatable/datatable-pagination-renderer.d.ts +15 -0
- package/lib/esm/components/datatable/datatable-pagination-renderer.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-pagination-renderer.js +141 -0
- package/lib/esm/components/datatable/datatable-pagination-renderer.js.map +1 -0
- package/lib/esm/components/datatable/datatable-remote-provider.d.ts +25 -0
- package/lib/esm/components/datatable/datatable-remote-provider.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-remote-provider.js +188 -0
- package/lib/esm/components/datatable/datatable-remote-provider.js.map +1 -0
- package/lib/esm/components/datatable/datatable-state-store.d.ts +21 -0
- package/lib/esm/components/datatable/datatable-state-store.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-state-store.js +78 -0
- package/lib/esm/components/datatable/datatable-state-store.js.map +1 -0
- package/lib/esm/components/datatable/datatable-table-renderer.d.ts +16 -0
- package/lib/esm/components/datatable/datatable-table-renderer.d.ts.map +1 -0
- package/lib/esm/components/datatable/datatable-table-renderer.js +138 -0
- package/lib/esm/components/datatable/datatable-table-renderer.js.map +1 -0
- package/lib/esm/components/datatable/datatable.d.ts +9 -87
- package/lib/esm/components/datatable/datatable.d.ts.map +1 -1
- package/lib/esm/components/datatable/datatable.js +234 -740
- package/lib/esm/components/datatable/datatable.js.map +1 -1
- package/lib/esm/components/dropdown/dropdown.d.ts +2 -2
- package/lib/esm/components/dropdown/dropdown.d.ts.map +1 -1
- package/lib/esm/components/dropdown/dropdown.js +68 -31
- package/lib/esm/components/dropdown/dropdown.js.map +1 -1
- package/lib/esm/components/input-number/index.d.ts +7 -0
- package/lib/esm/components/input-number/index.d.ts.map +1 -0
- package/lib/esm/components/input-number/index.js +6 -0
- package/lib/esm/components/input-number/index.js.map +1 -0
- package/lib/esm/components/input-number/input-number.d.ts +40 -0
- package/lib/esm/components/input-number/input-number.d.ts.map +1 -0
- package/lib/esm/components/input-number/input-number.js +245 -0
- package/lib/esm/components/input-number/input-number.js.map +1 -0
- package/lib/esm/components/input-number/types.d.ts +30 -0
- package/lib/esm/components/input-number/types.d.ts.map +1 -0
- package/lib/esm/components/input-number/types.js +6 -0
- package/lib/esm/components/input-number/types.js.map +1 -0
- package/lib/esm/components/select/config.d.ts +1 -0
- package/lib/esm/components/select/config.d.ts.map +1 -1
- package/lib/esm/components/select/config.js +2 -1
- package/lib/esm/components/select/config.js.map +1 -1
- package/lib/esm/components/select/index.d.ts +1 -1
- package/lib/esm/components/select/index.d.ts.map +1 -1
- package/lib/esm/components/select/select.d.ts +8 -1
- package/lib/esm/components/select/select.d.ts.map +1 -1
- package/lib/esm/components/select/select.js +14 -1
- package/lib/esm/components/select/select.js.map +1 -1
- package/lib/esm/components/select/tags.d.ts.map +1 -1
- package/lib/esm/components/select/tags.js +11 -1
- package/lib/esm/components/select/tags.js.map +1 -1
- package/lib/esm/index.d.ts +9 -1
- package/lib/esm/index.d.ts.map +1 -1
- package/lib/esm/index.js +7 -5
- package/lib/esm/index.js.map +1 -1
- package/lib/esm/init-all.d.ts +6 -0
- package/lib/esm/init-all.d.ts.map +1 -0
- package/lib/esm/init-all.js +13 -0
- package/lib/esm/init-all.js.map +1 -0
- package/lib/esm/legacy.d.ts +8 -0
- package/lib/esm/legacy.d.ts.map +1 -0
- package/lib/esm/legacy.js +8 -0
- package/lib/esm/legacy.js.map +1 -0
- package/package.json +35 -11
- package/src/__tests__/entrypoints.test.ts +71 -0
- package/src/components/context-menu/__tests__/context-menu.test.ts +117 -0
- package/src/components/context-menu/context-menu.css +32 -0
- package/src/components/context-menu/context-menu.ts +529 -0
- package/src/components/context-menu/index.ts +10 -0
- package/src/components/context-menu/types.ts +32 -0
- package/src/components/datatable/__tests__/architecture-boundaries.test.ts +259 -0
- package/src/components/datatable/datatable-checkbox.ts +34 -23
- package/src/components/datatable/datatable-contracts.ts +96 -0
- package/src/components/datatable/datatable-event-adapter.ts +21 -0
- package/src/components/datatable/datatable-local-provider.ts +193 -0
- package/src/components/datatable/datatable-pagination-renderer.ts +225 -0
- package/src/components/datatable/datatable-remote-provider.ts +178 -0
- package/src/components/datatable/datatable-state-store.ts +94 -0
- package/src/components/datatable/datatable-table-renderer.ts +214 -0
- package/src/components/datatable/datatable.ts +250 -918
- package/src/components/dropdown/dropdown.ts +86 -58
- package/src/components/input/input-group.css +14 -1
- package/src/components/input-number/__tests__/input-number.test.ts +278 -0
- package/src/components/input-number/index.ts +11 -0
- package/src/components/input-number/input-number.ts +267 -0
- package/src/components/input-number/types.ts +32 -0
- package/src/components/select/__tests__/ux-behaviors.test.ts +72 -0
- package/src/components/select/config.ts +3 -1
- package/src/components/select/index.ts +1 -1
- package/src/components/select/select.css +23 -20
- package/src/components/select/select.ts +15 -1
- package/src/components/select/tags.ts +14 -1
- package/src/index.ts +18 -5
- package/src/init-all.ts +15 -0
- package/src/legacy.ts +9 -0
- package/styles.css +1 -0
|
@@ -65,35 +65,20 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
65
65
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
66
66
|
}
|
|
67
67
|
};
|
|
68
|
-
var __rest = (this && this.__rest) || function (s, e) {
|
|
69
|
-
var t = {};
|
|
70
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
71
|
-
t[p] = s[p];
|
|
72
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
73
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
74
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
75
|
-
t[p[i]] = s[p[i]];
|
|
76
|
-
}
|
|
77
|
-
return t;
|
|
78
|
-
};
|
|
79
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
80
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
81
|
-
if (ar || !(i in from)) {
|
|
82
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
83
|
-
ar[i] = from[i];
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
87
|
-
};
|
|
88
68
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
89
69
|
exports.KTDataTable = void 0;
|
|
90
70
|
exports.initAllDataTables = initAllDataTables;
|
|
91
71
|
var component_1 = require("../component");
|
|
92
|
-
var utils_1 = require("../../helpers/utils");
|
|
93
72
|
var index_1 = require("../../index");
|
|
94
73
|
var data_1 = require("../../helpers/data");
|
|
95
74
|
var datatable_checkbox_1 = require("./datatable-checkbox");
|
|
96
75
|
var datatable_sort_1 = require("./datatable-sort");
|
|
76
|
+
var datatable_event_adapter_1 = require("./datatable-event-adapter");
|
|
77
|
+
var datatable_local_provider_1 = require("./datatable-local-provider");
|
|
78
|
+
var datatable_remote_provider_1 = require("./datatable-remote-provider");
|
|
79
|
+
var datatable_state_store_1 = require("./datatable-state-store");
|
|
80
|
+
var datatable_pagination_renderer_1 = require("./datatable-pagination-renderer");
|
|
81
|
+
var datatable_table_renderer_1 = require("./datatable-table-renderer");
|
|
97
82
|
/**
|
|
98
83
|
* Custom DataTable plugin class with server-side API, pagination, and sorting
|
|
99
84
|
* @classdesc A custom KTComponent class that integrates server-side API, pagination, and sorting functionality into a table.
|
|
@@ -113,18 +98,12 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
113
98
|
_this._originalTheadClass = ''; // Store original thead class
|
|
114
99
|
_this._originalTdClasses = []; // Store original td classes as a 2D array [row][col]
|
|
115
100
|
_this._originalThClasses = []; // Store original th classes
|
|
101
|
+
_this._infoElement = null;
|
|
102
|
+
_this._sizeElement = null;
|
|
103
|
+
_this._paginationElement = null;
|
|
104
|
+
_this._cleanupCallbacks = [];
|
|
116
105
|
_this._data = [];
|
|
117
106
|
_this._isFetching = false;
|
|
118
|
-
/**
|
|
119
|
-
* AbortController for cancelling previous fetch requests
|
|
120
|
-
* Used to prevent race conditions when multiple requests are triggered rapidly
|
|
121
|
-
*/
|
|
122
|
-
_this._abortController = null;
|
|
123
|
-
/**
|
|
124
|
-
* Request ID counter for tracking request sequence
|
|
125
|
-
* Used to detect and ignore stale responses from older requests
|
|
126
|
-
*/
|
|
127
|
-
_this._requestId = 0;
|
|
128
107
|
if (data_1.default.has(element, _this._name)) {
|
|
129
108
|
// Already initialized (e.g. by createInstances). Merge user config so columns/sortType etc. apply.
|
|
130
109
|
var existing = KTDataTable.getInstance(element);
|
|
@@ -135,22 +114,26 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
135
114
|
}
|
|
136
115
|
_this._defaultConfig = _this._initDefaultConfig(config);
|
|
137
116
|
_this._init(element);
|
|
117
|
+
if (!_this._element) {
|
|
118
|
+
return _this;
|
|
119
|
+
}
|
|
138
120
|
_this._buildConfig();
|
|
121
|
+
_this._stateStore = new datatable_state_store_1.KTDataTableConfigStateStore(_this._config);
|
|
122
|
+
_this._eventAdapter = (0, datatable_event_adapter_1.createDataTableEventAdapter)(_this._fireEvent.bind(_this), _this._dispatchEvent.bind(_this));
|
|
139
123
|
// Store the instance directly on the element
|
|
140
124
|
KTDataTable.asElementWithInstance(element).instance = _this;
|
|
141
125
|
_this._initElements();
|
|
126
|
+
_this._tableRenderer = new datatable_table_renderer_1.KTDataTableDomTableRenderer();
|
|
127
|
+
_this._paginationRenderer = new datatable_pagination_renderer_1.KTDataTableDomPaginationRenderer();
|
|
128
|
+
_this._initDataProviders();
|
|
142
129
|
// Initialize checkbox handler
|
|
143
|
-
_this._checkbox = (0, datatable_checkbox_1.createCheckboxHandler)(_this._element, _this._config,
|
|
144
|
-
_this._fireEvent(eventName, eventData);
|
|
145
|
-
_this._dispatchEvent(eventName, eventData);
|
|
146
|
-
});
|
|
130
|
+
_this._checkbox = (0, datatable_checkbox_1.createCheckboxHandler)(_this._element, _this._config, _this._emit.bind(_this));
|
|
147
131
|
// Initialize sort handler
|
|
148
132
|
_this._sortHandler = (0, datatable_sort_1.createSortHandler)(_this._config, _this._theadElement, function () { return ({
|
|
149
133
|
sortField: _this.getState().sortField,
|
|
150
134
|
sortOrder: _this.getState().sortOrder,
|
|
151
135
|
}); }, function (field, order) {
|
|
152
|
-
_this.
|
|
153
|
-
_this._config._state.sortOrder = order;
|
|
136
|
+
_this._stateStore.setSort(field, order);
|
|
154
137
|
}, _this._fireEvent.bind(_this), _this._dispatchEvent.bind(_this), _this._updateData.bind(_this));
|
|
155
138
|
_this._sortHandler.initSort();
|
|
156
139
|
if (_this._config.stateSave === false) {
|
|
@@ -160,8 +143,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
160
143
|
_this._loadState();
|
|
161
144
|
}
|
|
162
145
|
_this._updateData();
|
|
163
|
-
_this.
|
|
164
|
-
_this._dispatchEvent('init');
|
|
146
|
+
_this._emit('init');
|
|
165
147
|
return _this;
|
|
166
148
|
}
|
|
167
149
|
KTDataTable.asElementWithInstance = function (element) {
|
|
@@ -170,6 +152,30 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
170
152
|
KTDataTable.asSearchElementWithDebounce = function (element) {
|
|
171
153
|
return element;
|
|
172
154
|
};
|
|
155
|
+
KTDataTable.prototype._emit = function (eventName, eventData) {
|
|
156
|
+
this._eventAdapter.emit(eventName, eventData);
|
|
157
|
+
};
|
|
158
|
+
KTDataTable.prototype._initDataProviders = function () {
|
|
159
|
+
var _this = this;
|
|
160
|
+
this._localProvider = new datatable_local_provider_1.KTDataTableLocalDataProvider({
|
|
161
|
+
config: this._config,
|
|
162
|
+
elements: function () { return ({
|
|
163
|
+
tableElement: _this._tableElement,
|
|
164
|
+
tbodyElement: _this._tbodyElement,
|
|
165
|
+
theadElement: _this._theadElement,
|
|
166
|
+
}); },
|
|
167
|
+
getLogicalColumnCount: this._getLogicalColumnCount.bind(this),
|
|
168
|
+
storeOriginalClasses: this._storeOriginalClasses.bind(this),
|
|
169
|
+
stateStore: this._stateStore,
|
|
170
|
+
});
|
|
171
|
+
this._remoteProvider = new datatable_remote_provider_1.KTDataTableRemoteDataProvider({
|
|
172
|
+
config: this._config,
|
|
173
|
+
createUrl: this._createUrl.bind(this),
|
|
174
|
+
eventAdapter: this._eventAdapter,
|
|
175
|
+
noticeOnTable: this._noticeOnTable.bind(this),
|
|
176
|
+
stateStore: this._stateStore,
|
|
177
|
+
});
|
|
178
|
+
};
|
|
173
179
|
/**
|
|
174
180
|
* Initialize default configuration for the datatable
|
|
175
181
|
* @param config User-provided configuration options
|
|
@@ -376,33 +382,31 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
376
382
|
* @returns {void}
|
|
377
383
|
*/
|
|
378
384
|
KTDataTable.prototype._initElements = function () {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
385
|
+
var _a;
|
|
386
|
+
var root = this._element;
|
|
387
|
+
var attrs = this._config.attributes;
|
|
388
|
+
if (!root || !(attrs === null || attrs === void 0 ? void 0 : attrs.table)) {
|
|
389
|
+
throw new Error('KTDataTable: root element and table selector are required');
|
|
390
|
+
}
|
|
391
|
+
var tableEl = root.querySelector(attrs.table);
|
|
392
|
+
if (!tableEl) {
|
|
393
|
+
throw new Error("KTDataTable: table element not found (".concat(attrs.table, ")"));
|
|
394
|
+
}
|
|
395
|
+
this._tableElement = tableEl;
|
|
386
396
|
this._tbodyElement =
|
|
387
397
|
this._tableElement.tBodies[0] || this._tableElement.createTBody();
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
*/
|
|
391
|
-
this._theadElement = this._tableElement.tHead;
|
|
392
|
-
// Store original classes
|
|
398
|
+
this._theadElement =
|
|
399
|
+
(_a = this._tableElement.tHead) !== null && _a !== void 0 ? _a : this._tableElement.createTHead();
|
|
393
400
|
this._storeOriginalClasses();
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
this.
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
* Pagination element
|
|
404
|
-
*/
|
|
405
|
-
this._paginationElement = this._element.querySelector(this._config.attributes.pagination);
|
|
401
|
+
this._infoElement = attrs.info
|
|
402
|
+
? root.querySelector(attrs.info)
|
|
403
|
+
: null;
|
|
404
|
+
this._sizeElement = attrs.size
|
|
405
|
+
? root.querySelector(attrs.size)
|
|
406
|
+
: null;
|
|
407
|
+
this._paginationElement = attrs.pagination
|
|
408
|
+
? root.querySelector(attrs.pagination)
|
|
409
|
+
: null;
|
|
406
410
|
};
|
|
407
411
|
/**
|
|
408
412
|
* Store original classes from table elements
|
|
@@ -439,32 +443,39 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
439
443
|
*/
|
|
440
444
|
KTDataTable.prototype._updateData = function () {
|
|
441
445
|
return __awaiter(this, void 0, void 0, function () {
|
|
442
|
-
|
|
443
|
-
|
|
446
|
+
var result, _a;
|
|
447
|
+
return __generator(this, function (_b) {
|
|
448
|
+
switch (_b.label) {
|
|
444
449
|
case 0:
|
|
445
450
|
if (this._isFetching)
|
|
446
451
|
return [2 /*return*/]; // Prevent duplicate fetches
|
|
447
452
|
this._isFetching = true;
|
|
448
|
-
|
|
453
|
+
_b.label = 1;
|
|
449
454
|
case 1:
|
|
450
|
-
|
|
455
|
+
_b.trys.push([1, , 8, 9]);
|
|
451
456
|
this._showSpinner(); // Show spinner before fetching data
|
|
452
|
-
|
|
453
|
-
return [
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
+
this._emit('fetch');
|
|
458
|
+
if (!(typeof this._config.apiEndpoint === 'undefined')) return [3 /*break*/, 2];
|
|
459
|
+
_a = this._localProvider.fetchSync();
|
|
460
|
+
return [3 /*break*/, 4];
|
|
461
|
+
case 2: return [4 /*yield*/, this._remoteProvider.fetch()];
|
|
457
462
|
case 3:
|
|
458
|
-
_a.sent();
|
|
459
|
-
|
|
460
|
-
case 4:
|
|
463
|
+
_a = _b.sent();
|
|
464
|
+
_b.label = 4;
|
|
465
|
+
case 4:
|
|
466
|
+
result = _a;
|
|
467
|
+
if (!!result.skipped) return [3 /*break*/, 6];
|
|
468
|
+
this._data = result.data;
|
|
469
|
+
this._stateStore.patchState({ totalItems: result.totalItems });
|
|
470
|
+
return [4 /*yield*/, this._draw()];
|
|
461
471
|
case 5:
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
472
|
+
_b.sent();
|
|
473
|
+
this._emit('fetched');
|
|
474
|
+
_b.label = 6;
|
|
475
|
+
case 6: return [4 /*yield*/, this._finalize()];
|
|
476
|
+
case 7:
|
|
477
|
+
_b.sent();
|
|
478
|
+
return [3 /*break*/, 9];
|
|
468
479
|
case 8:
|
|
469
480
|
// Finally block now correctly executes after promises resolve, not immediately
|
|
470
481
|
this._isFetching = false;
|
|
@@ -479,7 +490,8 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
479
490
|
* @returns {void}
|
|
480
491
|
*/
|
|
481
492
|
KTDataTable.prototype._finalize = function () {
|
|
482
|
-
|
|
493
|
+
var _a;
|
|
494
|
+
(_a = this._element) === null || _a === void 0 ? void 0 : _a.classList.add('datatable-initialized');
|
|
483
495
|
// Initialize checkbox logic
|
|
484
496
|
this._checkbox.init();
|
|
485
497
|
// Re-initialize sort handler to restore click listeners after table redraw
|
|
@@ -501,6 +513,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
501
513
|
*/
|
|
502
514
|
KTDataTable.prototype._attachSearchEvent = function () {
|
|
503
515
|
var _this = this;
|
|
516
|
+
var _a, _b;
|
|
504
517
|
var tableId = this._tableId();
|
|
505
518
|
var searchElement = document.querySelector("[data-kt-datatable-search=\"#".concat(tableId, "\"]"));
|
|
506
519
|
// Get search state
|
|
@@ -524,159 +537,13 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
524
537
|
// Create a new debounced search function
|
|
525
538
|
var debouncedSearch = this._debounce(function () {
|
|
526
539
|
_this.search(searchElement.value);
|
|
527
|
-
}, this._config.search.delay);
|
|
540
|
+
}, (_b = (_a = this._config.search) === null || _a === void 0 ? void 0 : _a.delay) !== null && _b !== void 0 ? _b : 500);
|
|
528
541
|
// Store the new debounced function as a property of the element
|
|
529
542
|
searchWithDebounce._debouncedSearch = debouncedSearch;
|
|
530
543
|
// Add the new debounced event listener
|
|
531
544
|
searchElement.addEventListener('keyup', debouncedSearch);
|
|
532
545
|
}
|
|
533
546
|
};
|
|
534
|
-
/**
|
|
535
|
-
* Fetch data from the DOM
|
|
536
|
-
* Fetch data from the table element and save it to the `originalData` state property.
|
|
537
|
-
* This method is used when the data is not fetched from the server via an API endpoint.
|
|
538
|
-
*/
|
|
539
|
-
KTDataTable.prototype._fetchDataFromLocal = function () {
|
|
540
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
541
|
-
var _a, sortField, sortOrder, page, pageSize, search, originalData, _b, originalData_1, originalDataAttributes, _temp, searchTerm, startIndex, endIndex;
|
|
542
|
-
var _c;
|
|
543
|
-
return __generator(this, function (_d) {
|
|
544
|
-
switch (_d.label) {
|
|
545
|
-
case 0:
|
|
546
|
-
this._fireEvent('fetch');
|
|
547
|
-
this._dispatchEvent('fetch');
|
|
548
|
-
_a = this.getState(), sortField = _a.sortField, sortOrder = _a.sortOrder, page = _a.page, pageSize = _a.pageSize, search = _a.search;
|
|
549
|
-
originalData = this.getState().originalData;
|
|
550
|
-
// If the table element or the original data is not defined, bail
|
|
551
|
-
if (!this._tableElement ||
|
|
552
|
-
originalData === undefined ||
|
|
553
|
-
this._tableConfigInvalidate() ||
|
|
554
|
-
this._localTableHeaderInvalidate() ||
|
|
555
|
-
this._localTableContentInvalidate()) {
|
|
556
|
-
this._deleteState();
|
|
557
|
-
_b = this._localExtractTableContent(), originalData_1 = _b.originalData, originalDataAttributes = _b.originalDataAttributes;
|
|
558
|
-
this._config._state.originalData = originalData_1;
|
|
559
|
-
this._config._state.originalDataAttributes = originalDataAttributes;
|
|
560
|
-
}
|
|
561
|
-
// Update the original data variable
|
|
562
|
-
originalData = this.getState().originalData;
|
|
563
|
-
_temp = (this._data = __spreadArray([], originalData, true));
|
|
564
|
-
if (search) {
|
|
565
|
-
searchTerm = typeof search === 'string' ? search : '';
|
|
566
|
-
_temp = this._data = this._config.search.callback.call(this, this._data, searchTerm);
|
|
567
|
-
}
|
|
568
|
-
// If sorting is defined, sort the data
|
|
569
|
-
if (sortField !== undefined &&
|
|
570
|
-
sortOrder !== undefined &&
|
|
571
|
-
sortOrder !== '') {
|
|
572
|
-
if (typeof this._config.sort.callback === 'function') {
|
|
573
|
-
this._data = this._config.sort.callback.call(this, this._data, sortField, sortOrder);
|
|
574
|
-
}
|
|
575
|
-
}
|
|
576
|
-
// If there is data, slice it to the current page size
|
|
577
|
-
if (((_c = this._data) === null || _c === void 0 ? void 0 : _c.length) > 0) {
|
|
578
|
-
startIndex = (page - 1) * pageSize;
|
|
579
|
-
endIndex = startIndex + pageSize;
|
|
580
|
-
this._data = this._data.slice(startIndex, endIndex);
|
|
581
|
-
}
|
|
582
|
-
// Determine number of total rows
|
|
583
|
-
this._config._state.totalItems = _temp.length;
|
|
584
|
-
// Draw the data
|
|
585
|
-
return [4 /*yield*/, this._draw()];
|
|
586
|
-
case 1:
|
|
587
|
-
// Draw the data
|
|
588
|
-
_d.sent();
|
|
589
|
-
this._fireEvent('fetched');
|
|
590
|
-
this._dispatchEvent('fetched');
|
|
591
|
-
return [2 /*return*/];
|
|
592
|
-
}
|
|
593
|
-
});
|
|
594
|
-
});
|
|
595
|
-
};
|
|
596
|
-
/**
|
|
597
|
-
* Checks if the table content has been invalidated by comparing the current checksum of the table body
|
|
598
|
-
* with the stored checksum in the state. If the checksums are different, the state is updated with the
|
|
599
|
-
* new checksum and `true` is returned. Otherwise, `false` is returned.
|
|
600
|
-
*
|
|
601
|
-
* @returns {boolean} `true` if the table content has been invalidated, `false` otherwise.
|
|
602
|
-
*/
|
|
603
|
-
KTDataTable.prototype._localTableContentInvalidate = function () {
|
|
604
|
-
var checksum = utils_1.default.checksum(JSON.stringify(this._tbodyElement.innerHTML));
|
|
605
|
-
if (this.getState()._contentChecksum !== checksum) {
|
|
606
|
-
this._config._state._contentChecksum = checksum;
|
|
607
|
-
return true;
|
|
608
|
-
}
|
|
609
|
-
return false;
|
|
610
|
-
};
|
|
611
|
-
KTDataTable.prototype._tableConfigInvalidate = function () {
|
|
612
|
-
// Remove _data and _state from config
|
|
613
|
-
var _a = this._config, _state = _a._state, restConfig = __rest(_a, ["_state"]);
|
|
614
|
-
var checksum = utils_1.default.checksum(JSON.stringify(restConfig));
|
|
615
|
-
if (_state._configChecksum !== checksum) {
|
|
616
|
-
this._config._state._configChecksum = checksum;
|
|
617
|
-
return true;
|
|
618
|
-
}
|
|
619
|
-
return false;
|
|
620
|
-
};
|
|
621
|
-
/**
|
|
622
|
-
* Extract the table content and returns it as an object containing an array of original data and an array of original data attributes.
|
|
623
|
-
*
|
|
624
|
-
* @returns {{originalData: T[], originalDataAttributes: KTDataTableAttributeInterface[]}} - An object containing an array of original data and an array of original data attributes.
|
|
625
|
-
*/
|
|
626
|
-
KTDataTable.prototype._localExtractTableContent = function () {
|
|
627
|
-
var originalData = [];
|
|
628
|
-
var originalDataAttributes = [];
|
|
629
|
-
this._storeOriginalClasses();
|
|
630
|
-
var rows = this._tbodyElement.querySelectorAll('tr');
|
|
631
|
-
// Filter th elements to only include those with data-kt-datatable-column attribute
|
|
632
|
-
var allThs = this._theadElement
|
|
633
|
-
? this._theadElement.querySelectorAll('th')
|
|
634
|
-
: [];
|
|
635
|
-
var ths = Array.from(allThs).filter(function (th) {
|
|
636
|
-
return th.hasAttribute('data-kt-datatable-column');
|
|
637
|
-
});
|
|
638
|
-
rows.forEach(function (row) {
|
|
639
|
-
var dataRow = {};
|
|
640
|
-
var dataRowAttribute = {};
|
|
641
|
-
row.querySelectorAll('td').forEach(function (td, index) {
|
|
642
|
-
var _a, _b, _c;
|
|
643
|
-
var colName = (_a = ths[index]) === null || _a === void 0 ? void 0 : _a.getAttribute('data-kt-datatable-column');
|
|
644
|
-
if (colName) {
|
|
645
|
-
dataRow[colName] = (_b = td.innerHTML) === null || _b === void 0 ? void 0 : _b.trim();
|
|
646
|
-
}
|
|
647
|
-
else {
|
|
648
|
-
// Store the original HTML for fallback
|
|
649
|
-
dataRow[index] = (_c = td.innerHTML) === null || _c === void 0 ? void 0 : _c.trim();
|
|
650
|
-
}
|
|
651
|
-
});
|
|
652
|
-
if (Object.keys(dataRow).length > 0) {
|
|
653
|
-
originalData.push(dataRow);
|
|
654
|
-
originalDataAttributes.push(dataRowAttribute);
|
|
655
|
-
}
|
|
656
|
-
});
|
|
657
|
-
return { originalData: originalData, originalDataAttributes: originalDataAttributes };
|
|
658
|
-
};
|
|
659
|
-
/**
|
|
660
|
-
* Check if the table header is invalidated
|
|
661
|
-
* @returns {boolean} - Returns true if the table header is invalidated, false otherwise
|
|
662
|
-
*/
|
|
663
|
-
KTDataTable.prototype._localTableHeaderInvalidate = function () {
|
|
664
|
-
var originalData = this.getState().originalData;
|
|
665
|
-
var totalColumns = originalData.length
|
|
666
|
-
? Object.keys(originalData[0]).length
|
|
667
|
-
: 0;
|
|
668
|
-
// Count th elements with data-kt-datatable-column; when none (e.g. multi-row headers), use logical column count so we don't falsely invalidate
|
|
669
|
-
var allThs = this._theadElement
|
|
670
|
-
? this._theadElement.querySelectorAll('th')
|
|
671
|
-
: [];
|
|
672
|
-
var thsWithColumn = Array.from(allThs).filter(function (th) {
|
|
673
|
-
return th.hasAttribute('data-kt-datatable-column');
|
|
674
|
-
});
|
|
675
|
-
var currentTableHeaders = thsWithColumn.length > 0
|
|
676
|
-
? thsWithColumn.length
|
|
677
|
-
: this._getLogicalColumnCount();
|
|
678
|
-
return currentTableHeaders !== totalColumns;
|
|
679
|
-
};
|
|
680
547
|
/**
|
|
681
548
|
* Returns the logical data column count (number of data columns), used for multi-row headers
|
|
682
549
|
* where querySelectorAll('th') would overcount. Prefers state.originalData, then first tbody row td count.
|
|
@@ -695,162 +562,6 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
695
562
|
}
|
|
696
563
|
return 0;
|
|
697
564
|
};
|
|
698
|
-
/**
|
|
699
|
-
* Fetch data from the server
|
|
700
|
-
*/
|
|
701
|
-
KTDataTable.prototype._fetchDataFromServer = function () {
|
|
702
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
703
|
-
var currentRequestId, queryParams, response, error_1, responseData, error_2;
|
|
704
|
-
return __generator(this, function (_a) {
|
|
705
|
-
switch (_a.label) {
|
|
706
|
-
case 0:
|
|
707
|
-
currentRequestId = ++this._requestId;
|
|
708
|
-
this._fireEvent('fetch');
|
|
709
|
-
this._dispatchEvent('fetch');
|
|
710
|
-
queryParams = this._getQueryParamsForFetchRequest();
|
|
711
|
-
_a.label = 1;
|
|
712
|
-
case 1:
|
|
713
|
-
_a.trys.push([1, 3, , 4]);
|
|
714
|
-
return [4 /*yield*/, this._performFetchRequest(queryParams)];
|
|
715
|
-
case 2:
|
|
716
|
-
response = _a.sent();
|
|
717
|
-
return [3 /*break*/, 4];
|
|
718
|
-
case 3:
|
|
719
|
-
error_1 = _a.sent();
|
|
720
|
-
// Silently ignore AbortError - request was cancelled
|
|
721
|
-
if (error_1.name === 'AbortError') {
|
|
722
|
-
return [2 /*return*/];
|
|
723
|
-
}
|
|
724
|
-
throw error_1;
|
|
725
|
-
case 4:
|
|
726
|
-
// Check if this response is stale (a newer request has been initiated)
|
|
727
|
-
if (currentRequestId !== this._requestId) {
|
|
728
|
-
// Ignore stale response - a more recent request is in progress or has completed
|
|
729
|
-
return [2 /*return*/];
|
|
730
|
-
}
|
|
731
|
-
responseData = null;
|
|
732
|
-
_a.label = 5;
|
|
733
|
-
case 5:
|
|
734
|
-
_a.trys.push([5, 7, , 8]);
|
|
735
|
-
return [4 /*yield*/, response.json()];
|
|
736
|
-
case 6:
|
|
737
|
-
responseData = _a.sent();
|
|
738
|
-
return [3 /*break*/, 8];
|
|
739
|
-
case 7:
|
|
740
|
-
error_2 = _a.sent();
|
|
741
|
-
// Fire event with complete error context for application handling
|
|
742
|
-
this._fireEvent('parseError', {
|
|
743
|
-
response: response,
|
|
744
|
-
error: String(error_2),
|
|
745
|
-
status: response.status,
|
|
746
|
-
statusText: response.statusText,
|
|
747
|
-
});
|
|
748
|
-
this._dispatchEvent('parseError', {
|
|
749
|
-
response: response,
|
|
750
|
-
error: String(error_2),
|
|
751
|
-
status: response.status,
|
|
752
|
-
statusText: response.statusText,
|
|
753
|
-
});
|
|
754
|
-
return [2 /*return*/];
|
|
755
|
-
case 8:
|
|
756
|
-
// Double-check request ID after JSON parsing (additional safety)
|
|
757
|
-
if (currentRequestId !== this._requestId) {
|
|
758
|
-
return [2 /*return*/];
|
|
759
|
-
}
|
|
760
|
-
this._fireEvent('fetched', { response: responseData });
|
|
761
|
-
this._dispatchEvent('fetched', { response: responseData });
|
|
762
|
-
// Use the mapResponse function to transform the data if provided
|
|
763
|
-
if (typeof this._config.mapResponse === 'function') {
|
|
764
|
-
responseData = this._config.mapResponse.call(this, responseData);
|
|
765
|
-
}
|
|
766
|
-
this._data = responseData.data;
|
|
767
|
-
this._config._state.totalItems = responseData.totalCount;
|
|
768
|
-
return [4 /*yield*/, this._draw()];
|
|
769
|
-
case 9:
|
|
770
|
-
_a.sent();
|
|
771
|
-
this._fireEvent('fetched');
|
|
772
|
-
this._dispatchEvent('fetched');
|
|
773
|
-
return [2 /*return*/];
|
|
774
|
-
}
|
|
775
|
-
});
|
|
776
|
-
});
|
|
777
|
-
};
|
|
778
|
-
/**
|
|
779
|
-
* Get the query params for a fetch request
|
|
780
|
-
* @returns The query params for the fetch request
|
|
781
|
-
*/
|
|
782
|
-
KTDataTable.prototype._getQueryParamsForFetchRequest = function () {
|
|
783
|
-
// Get the current state of the datatable
|
|
784
|
-
var _a = this.getState(), page = _a.page, pageSize = _a.pageSize, sortField = _a.sortField, sortOrder = _a.sortOrder, filters = _a.filters, search = _a.search;
|
|
785
|
-
// Create a new URLSearchParams object to store the query params
|
|
786
|
-
var queryParams = new URLSearchParams();
|
|
787
|
-
// Add the current page number and page size to the query params
|
|
788
|
-
queryParams.set('page', String(page));
|
|
789
|
-
queryParams.set('size', String(pageSize));
|
|
790
|
-
// If there is a sort order and field set, add them to the query params
|
|
791
|
-
if (sortOrder !== undefined) {
|
|
792
|
-
queryParams.set('sortOrder', String(sortOrder));
|
|
793
|
-
}
|
|
794
|
-
if (sortField !== undefined) {
|
|
795
|
-
queryParams.set('sortField', String(sortField));
|
|
796
|
-
}
|
|
797
|
-
// If there are any filters set, add them to the query params
|
|
798
|
-
if (Array.isArray(filters) && filters.length) {
|
|
799
|
-
queryParams.set('filters', JSON.stringify(filters.map(function (filter) { return ({
|
|
800
|
-
// Map the filter object to a simpler object with just the necessary properties
|
|
801
|
-
column: filter.column,
|
|
802
|
-
type: filter.type,
|
|
803
|
-
value: filter.value,
|
|
804
|
-
}); })));
|
|
805
|
-
}
|
|
806
|
-
if (search) {
|
|
807
|
-
queryParams.set('search', typeof search === 'object' ? JSON.stringify(search) : search);
|
|
808
|
-
}
|
|
809
|
-
// If a mapRequest function is provided, call it with the query params object
|
|
810
|
-
if (typeof this._config.mapRequest === 'function') {
|
|
811
|
-
queryParams = this._config.mapRequest.call(this, queryParams);
|
|
812
|
-
}
|
|
813
|
-
// Return the query params object
|
|
814
|
-
return queryParams;
|
|
815
|
-
};
|
|
816
|
-
KTDataTable.prototype._performFetchRequest = function (queryParams) {
|
|
817
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
818
|
-
var requestMethod, requestBody, apiEndpointWithQueryParams;
|
|
819
|
-
var _this = this;
|
|
820
|
-
return __generator(this, function (_a) {
|
|
821
|
-
requestMethod = this._config.requestMethod;
|
|
822
|
-
requestBody = undefined;
|
|
823
|
-
// Cancel previous request to prevent race conditions
|
|
824
|
-
if (this._abortController) {
|
|
825
|
-
this._abortController.abort();
|
|
826
|
-
}
|
|
827
|
-
// Create new AbortController for this request
|
|
828
|
-
this._abortController = new AbortController();
|
|
829
|
-
// If the request method is POST, send the query params as the request body
|
|
830
|
-
if (requestMethod === 'POST') {
|
|
831
|
-
requestBody = queryParams;
|
|
832
|
-
}
|
|
833
|
-
else if (requestMethod === 'GET') {
|
|
834
|
-
apiEndpointWithQueryParams = this._createUrl(this._config.apiEndpoint);
|
|
835
|
-
apiEndpointWithQueryParams.search = queryParams.toString();
|
|
836
|
-
this._config.apiEndpoint = apiEndpointWithQueryParams.toString();
|
|
837
|
-
}
|
|
838
|
-
return [2 /*return*/, fetch(this._config.apiEndpoint, __assign(__assign({ method: requestMethod, body: requestBody, headers: this._config.requestHeaders }, (this._config.requestCredentials && {
|
|
839
|
-
credentials: this._config.requestCredentials,
|
|
840
|
-
})), (this._abortController && { signal: this._abortController.signal }))).catch(function (error) {
|
|
841
|
-
// Silently ignore AbortError - this is expected when requests are cancelled
|
|
842
|
-
if (error.name === 'AbortError') {
|
|
843
|
-
return Promise.reject(error);
|
|
844
|
-
}
|
|
845
|
-
// Trigger an error event for non-abort errors
|
|
846
|
-
_this._fireEvent('error', { error: error });
|
|
847
|
-
_this._dispatchEvent('error', { error: error });
|
|
848
|
-
_this._noticeOnTable('Error performing fetch request: ' + String(error));
|
|
849
|
-
throw error;
|
|
850
|
-
})];
|
|
851
|
-
});
|
|
852
|
-
});
|
|
853
|
-
};
|
|
854
565
|
/**
|
|
855
566
|
* Creates a complete URL from a relative path or a full URL.
|
|
856
567
|
*
|
|
@@ -866,7 +577,10 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
866
577
|
* @returns {URL} The resulting URL object.
|
|
867
578
|
*/
|
|
868
579
|
KTDataTable.prototype._createUrl = function (pathOrUrl, baseUrl) {
|
|
869
|
-
|
|
580
|
+
var _a;
|
|
581
|
+
if (baseUrl === void 0) { baseUrl = typeof window !== 'undefined'
|
|
582
|
+
? window.location.origin
|
|
583
|
+
: null; }
|
|
870
584
|
// Regular expression to check if the input is a full URL
|
|
871
585
|
var isFullUrl = /^[a-zA-Z][a-zA-Z\d+\-.]*:\/\//.test(pathOrUrl);
|
|
872
586
|
if (isFullUrl) {
|
|
@@ -876,7 +590,38 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
876
590
|
var normalizedPath = pathOrUrl.startsWith('/')
|
|
877
591
|
? pathOrUrl
|
|
878
592
|
: "/".concat(pathOrUrl);
|
|
879
|
-
|
|
593
|
+
// Opaque origins (e.g. srcdoc iframes) serialize as the string "null", which is not a valid URL base.
|
|
594
|
+
var bases = [];
|
|
595
|
+
if (baseUrl && baseUrl !== 'null') {
|
|
596
|
+
bases.push(baseUrl);
|
|
597
|
+
}
|
|
598
|
+
if (typeof window !== 'undefined') {
|
|
599
|
+
var href = window.location.href;
|
|
600
|
+
if (href && !bases.includes(href)) {
|
|
601
|
+
bases.push(href);
|
|
602
|
+
}
|
|
603
|
+
try {
|
|
604
|
+
if (window.parent !== window && ((_a = window.parent.location) === null || _a === void 0 ? void 0 : _a.href)) {
|
|
605
|
+
var parentHref = window.parent.location.href;
|
|
606
|
+
if (parentHref && !bases.includes(parentHref)) {
|
|
607
|
+
bases.push(parentHref);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
catch (_b) {
|
|
612
|
+
// parent is cross-origin
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
for (var _i = 0, bases_1 = bases; _i < bases_1.length; _i++) {
|
|
616
|
+
var base = bases_1[_i];
|
|
617
|
+
try {
|
|
618
|
+
return new URL(normalizedPath, base);
|
|
619
|
+
}
|
|
620
|
+
catch (_c) {
|
|
621
|
+
// try next base
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
throw new Error("KTDataTable: cannot resolve relative apiEndpoint \"".concat(pathOrUrl, "\" (no valid base URL; use an absolute apiEndpoint)."));
|
|
880
625
|
};
|
|
881
626
|
/**
|
|
882
627
|
* Update the table and pagination controls with new data
|
|
@@ -885,20 +630,19 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
885
630
|
KTDataTable.prototype._draw = function () {
|
|
886
631
|
return __awaiter(this, void 0, void 0, function () {
|
|
887
632
|
return __generator(this, function (_a) {
|
|
888
|
-
this.
|
|
889
|
-
Math.ceil(this.getState().totalItems / this.getState().pageSize) || 0
|
|
890
|
-
|
|
891
|
-
this.
|
|
633
|
+
this._stateStore.patchState({
|
|
634
|
+
totalPages: Math.ceil(this.getState().totalItems / this.getState().pageSize) || 0,
|
|
635
|
+
});
|
|
636
|
+
this._emit('draw');
|
|
892
637
|
this._dispose();
|
|
893
638
|
// Update the table and pagination controls
|
|
894
639
|
if (this._theadElement && this._tbodyElement) {
|
|
895
640
|
this._updateTable();
|
|
896
641
|
}
|
|
897
|
-
if (this._infoElement
|
|
642
|
+
if (this._infoElement || this._sizeElement || this._paginationElement) {
|
|
898
643
|
this._updatePagination();
|
|
899
644
|
}
|
|
900
|
-
this.
|
|
901
|
-
this._dispatchEvent('drew');
|
|
645
|
+
this._emit('drew');
|
|
902
646
|
// Spinner is hidden in _finalize() to ensure it stays visible until the entire request completes
|
|
903
647
|
// Removed duplicate _hideSpinner() call here to prevent premature hiding
|
|
904
648
|
if (this._config.stateSave) {
|
|
@@ -913,115 +657,18 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
913
657
|
* @returns {HTMLTableSectionElement} The new table body element
|
|
914
658
|
*/
|
|
915
659
|
KTDataTable.prototype._updateTable = function () {
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
this
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
return tbodyElement;
|
|
928
|
-
};
|
|
929
|
-
/**
|
|
930
|
-
* Update the table content
|
|
931
|
-
* @param tbodyElement The table body element
|
|
932
|
-
* @returns {HTMLTableSectionElement} The updated table body element
|
|
933
|
-
*/
|
|
934
|
-
KTDataTable.prototype._updateTableContent = function (tbodyElement) {
|
|
935
|
-
var _this = this;
|
|
936
|
-
var fragment = document.createDocumentFragment();
|
|
937
|
-
tbodyElement.textContent = ''; // Clear the tbody element
|
|
938
|
-
if (this._data.length === 0) {
|
|
939
|
-
this._noticeOnTable(this._config.infoEmpty || '');
|
|
940
|
-
return tbodyElement;
|
|
941
|
-
}
|
|
942
|
-
// Filter th elements to only include those with data-kt-datatable-column attribute
|
|
943
|
-
// This prevents creating blank td elements for merged header cells (colspan/rowspan)
|
|
944
|
-
var allThs = this._theadElement
|
|
945
|
-
? this._theadElement.querySelectorAll('th')
|
|
946
|
-
: [];
|
|
947
|
-
var ths = Array.from(allThs).filter(function (th) {
|
|
948
|
-
return th.hasAttribute('data-kt-datatable-column');
|
|
660
|
+
return this._tableRenderer.render({
|
|
661
|
+
config: this._config,
|
|
662
|
+
context: this,
|
|
663
|
+
data: this._data,
|
|
664
|
+
getLogicalColumnCount: this._getLogicalColumnCount.bind(this),
|
|
665
|
+
getState: this.getState.bind(this),
|
|
666
|
+
originalTbodyClass: this._originalTbodyClass,
|
|
667
|
+
originalTrClasses: this._originalTrClasses,
|
|
668
|
+
originalTdClasses: this._originalTdClasses,
|
|
669
|
+
tableElement: this._tableElement,
|
|
670
|
+
theadElement: this._theadElement,
|
|
949
671
|
});
|
|
950
|
-
// When no th has data-kt-datatable-column (e.g. multi-row headers), use logical column count from tbody so we don't overcount thead cells
|
|
951
|
-
var columnsToRender = ths.length > 0 ? ths : [];
|
|
952
|
-
var logicalColumnCount = ths.length > 0 ? ths.length : this._getLogicalColumnCount();
|
|
953
|
-
this._data.forEach(function (item, rowIndex) {
|
|
954
|
-
var row = document.createElement('tr');
|
|
955
|
-
// Apply original tr class if available
|
|
956
|
-
if (_this._originalTrClasses && _this._originalTrClasses[rowIndex]) {
|
|
957
|
-
row.className = _this._originalTrClasses[rowIndex];
|
|
958
|
-
}
|
|
959
|
-
if (!_this._config.columns) {
|
|
960
|
-
var dataRowAttributes = _this.getState().originalDataAttributes
|
|
961
|
-
? _this.getState().originalDataAttributes[rowIndex]
|
|
962
|
-
: null;
|
|
963
|
-
for (var colIndex = 0; colIndex < logicalColumnCount; colIndex++) {
|
|
964
|
-
var th = columnsToRender[colIndex];
|
|
965
|
-
var colName = th === null || th === void 0 ? void 0 : th.getAttribute('data-kt-datatable-column');
|
|
966
|
-
var td = document.createElement('td');
|
|
967
|
-
var value = void 0;
|
|
968
|
-
if (colName && Object.prototype.hasOwnProperty.call(item, colName)) {
|
|
969
|
-
value = item[colName];
|
|
970
|
-
}
|
|
971
|
-
else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {
|
|
972
|
-
value = item[colIndex];
|
|
973
|
-
}
|
|
974
|
-
else {
|
|
975
|
-
value = '';
|
|
976
|
-
}
|
|
977
|
-
td.innerHTML = value;
|
|
978
|
-
// Apply original td class if available
|
|
979
|
-
if (_this._originalTdClasses &&
|
|
980
|
-
_this._originalTdClasses[rowIndex] &&
|
|
981
|
-
_this._originalTdClasses[rowIndex][colIndex]) {
|
|
982
|
-
td.className = _this._originalTdClasses[rowIndex][colIndex];
|
|
983
|
-
}
|
|
984
|
-
if (dataRowAttributes && dataRowAttributes[colIndex]) {
|
|
985
|
-
for (var attr in dataRowAttributes[colIndex]) {
|
|
986
|
-
td.setAttribute(attr, dataRowAttributes[colIndex][attr]);
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
row.appendChild(td);
|
|
990
|
-
}
|
|
991
|
-
}
|
|
992
|
-
else {
|
|
993
|
-
Object.keys(_this._config.columns).forEach(function (key, colIndex) {
|
|
994
|
-
var td = document.createElement('td');
|
|
995
|
-
var columnDef = _this._config.columns[key];
|
|
996
|
-
// Apply original td class if available
|
|
997
|
-
if (_this._originalTdClasses &&
|
|
998
|
-
_this._originalTdClasses[rowIndex] &&
|
|
999
|
-
_this._originalTdClasses[rowIndex][colIndex]) {
|
|
1000
|
-
td.className = _this._originalTdClasses[rowIndex][colIndex];
|
|
1001
|
-
}
|
|
1002
|
-
if (typeof columnDef.render === 'function') {
|
|
1003
|
-
var result = columnDef.render.call(_this, item[key], item, _this);
|
|
1004
|
-
if (result instanceof HTMLElement ||
|
|
1005
|
-
result instanceof DocumentFragment) {
|
|
1006
|
-
td.appendChild(result);
|
|
1007
|
-
}
|
|
1008
|
-
else if (typeof result === 'string') {
|
|
1009
|
-
td.innerHTML = result;
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
else {
|
|
1013
|
-
td.textContent = item[key];
|
|
1014
|
-
}
|
|
1015
|
-
if (typeof columnDef.createdCell === 'function') {
|
|
1016
|
-
columnDef.createdCell.call(_this, td, item[key], item, row);
|
|
1017
|
-
}
|
|
1018
|
-
row.appendChild(td);
|
|
1019
|
-
});
|
|
1020
|
-
}
|
|
1021
|
-
fragment.appendChild(row);
|
|
1022
|
-
});
|
|
1023
|
-
tbodyElement.appendChild(fragment);
|
|
1024
|
-
return tbodyElement;
|
|
1025
672
|
};
|
|
1026
673
|
/**
|
|
1027
674
|
* Show a notice on the table
|
|
@@ -1030,66 +677,22 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1030
677
|
*/
|
|
1031
678
|
KTDataTable.prototype._noticeOnTable = function (message) {
|
|
1032
679
|
if (message === void 0) { message = ''; }
|
|
1033
|
-
|
|
1034
|
-
var cell = row.insertCell();
|
|
1035
|
-
var logicalCount = this._getLogicalColumnCount();
|
|
1036
|
-
// Use logical column count so multi-row headers don't overcount; fallback to 1 when 0 so message still displays
|
|
1037
|
-
cell.colSpan = logicalCount > 0 ? logicalCount : 1;
|
|
1038
|
-
cell.innerHTML = message;
|
|
680
|
+
this._tableRenderer.notice(this._tableElement, this._getLogicalColumnCount.bind(this), message);
|
|
1039
681
|
};
|
|
1040
682
|
KTDataTable.prototype._updatePagination = function () {
|
|
1041
|
-
this.
|
|
1042
|
-
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1047
|
-
|
|
1048
|
-
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
if (
|
|
1052
|
-
|
|
1053
|
-
}
|
|
1054
|
-
// Loop through all child elements of the container and remove them one by one
|
|
1055
|
-
while (container.firstChild) {
|
|
1056
|
-
// Remove the first child element (which is the first element in the list of child elements)
|
|
1057
|
-
container.removeChild(container.firstChild);
|
|
1058
|
-
}
|
|
1059
|
-
};
|
|
1060
|
-
/**
|
|
1061
|
-
* Creates a container element for the items per page selector.
|
|
1062
|
-
* @param _sizeElement The element to create the page size controls in.
|
|
1063
|
-
* @returns The container element.
|
|
1064
|
-
*/
|
|
1065
|
-
KTDataTable.prototype._createPageSizeControls = function (_sizeElement) {
|
|
1066
|
-
var _this = this;
|
|
1067
|
-
// If no element is provided, return early
|
|
1068
|
-
if (!_sizeElement) {
|
|
1069
|
-
return _sizeElement;
|
|
683
|
+
var cleanup = this._paginationRenderer.render({
|
|
684
|
+
config: this._config,
|
|
685
|
+
dataLength: this._data.length,
|
|
686
|
+
infoElement: this._infoElement,
|
|
687
|
+
paginateData: this._paginateData.bind(this),
|
|
688
|
+
paginationElement: this._paginationElement,
|
|
689
|
+
reloadPageSize: this._reloadPageSize.bind(this),
|
|
690
|
+
sizeElement: this._sizeElement,
|
|
691
|
+
state: this.getState(),
|
|
692
|
+
});
|
|
693
|
+
if (typeof cleanup === 'function') {
|
|
694
|
+
this._cleanupCallbacks.push(cleanup);
|
|
1070
695
|
}
|
|
1071
|
-
// Wait for the element to be attached to the DOM
|
|
1072
|
-
setTimeout(function () {
|
|
1073
|
-
// Create <option> elements for each page size option
|
|
1074
|
-
var options = _this._config.pageSizes.map(function (size) {
|
|
1075
|
-
var option = document.createElement('option');
|
|
1076
|
-
option.value = String(size);
|
|
1077
|
-
option.text = String(size);
|
|
1078
|
-
option.selected = _this.getState().pageSize === size;
|
|
1079
|
-
return option;
|
|
1080
|
-
});
|
|
1081
|
-
// Add the <option> elements to the provided element
|
|
1082
|
-
_sizeElement.append.apply(_sizeElement, options);
|
|
1083
|
-
}, 100);
|
|
1084
|
-
// Create an event listener for the "change" event on the element
|
|
1085
|
-
var _pageSizeControlsEvent = function (event) {
|
|
1086
|
-
// When the element changes, reload the page with the new page size and page number 1
|
|
1087
|
-
_this._reloadPageSize(Number(event.target.value), 1);
|
|
1088
|
-
};
|
|
1089
|
-
// Bind the event listener to the component instance
|
|
1090
|
-
_sizeElement.onchange = _pageSizeControlsEvent.bind(this);
|
|
1091
|
-
// Return the element
|
|
1092
|
-
return _sizeElement;
|
|
1093
696
|
};
|
|
1094
697
|
/**
|
|
1095
698
|
* Reloads the data with the specified page size and optional page number.
|
|
@@ -1099,120 +702,10 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1099
702
|
KTDataTable.prototype._reloadPageSize = function (pageSize, page) {
|
|
1100
703
|
if (page === void 0) { page = 1; }
|
|
1101
704
|
// Update the page size and page number in the state
|
|
1102
|
-
this.
|
|
1103
|
-
this._config._state.page = page;
|
|
705
|
+
this._stateStore.setPageSize(pageSize, page);
|
|
1104
706
|
// Update the data with the new page size and page number
|
|
1105
707
|
this._updateData();
|
|
1106
708
|
};
|
|
1107
|
-
/**
|
|
1108
|
-
* Creates the pagination controls for the component.
|
|
1109
|
-
* @param _infoElement The element to set the info text in.
|
|
1110
|
-
* @param _paginationElement The element to create the pagination controls in.
|
|
1111
|
-
* @return {HTMLElement} The element containing the pagination controls.
|
|
1112
|
-
*/
|
|
1113
|
-
KTDataTable.prototype._createPaginationControls = function (_infoElement, _paginationElement) {
|
|
1114
|
-
if (!_infoElement || !_paginationElement || this._data.length === 0) {
|
|
1115
|
-
return null;
|
|
1116
|
-
}
|
|
1117
|
-
this._setPaginationInfoText(_infoElement);
|
|
1118
|
-
var paginationContainer = this._createPaginationContainer(_paginationElement);
|
|
1119
|
-
if (paginationContainer) {
|
|
1120
|
-
this._createPaginationButtons(paginationContainer);
|
|
1121
|
-
}
|
|
1122
|
-
return paginationContainer;
|
|
1123
|
-
};
|
|
1124
|
-
/**
|
|
1125
|
-
* Sets the info text for the pagination controls.
|
|
1126
|
-
* @param _infoElement The element to set the info text in.
|
|
1127
|
-
*/
|
|
1128
|
-
KTDataTable.prototype._setPaginationInfoText = function (_infoElement) {
|
|
1129
|
-
_infoElement.textContent = this._config.info
|
|
1130
|
-
.replace('{start}', (this.getState().page - 1) * this.getState().pageSize + 1 + '')
|
|
1131
|
-
.replace('{end}', Math.min(this.getState().page * this.getState().pageSize, this.getState().totalItems) + '')
|
|
1132
|
-
.replace('{total}', this.getState().totalItems + '');
|
|
1133
|
-
};
|
|
1134
|
-
/**
|
|
1135
|
-
* Creates the container element for the pagination controls.
|
|
1136
|
-
* @param _paginationElement The element to create the pagination controls in.
|
|
1137
|
-
* @return {HTMLElement} The container element.
|
|
1138
|
-
*/
|
|
1139
|
-
KTDataTable.prototype._createPaginationContainer = function (_paginationElement) {
|
|
1140
|
-
// No longer create a wrapping div. Just return the pagination element itself.
|
|
1141
|
-
return _paginationElement;
|
|
1142
|
-
};
|
|
1143
|
-
/**
|
|
1144
|
-
* Creates the pagination buttons for the component.
|
|
1145
|
-
* @param paginationContainer The container element for the pagination controls.
|
|
1146
|
-
*/
|
|
1147
|
-
KTDataTable.prototype._createPaginationButtons = function (paginationContainer) {
|
|
1148
|
-
var _this = this;
|
|
1149
|
-
var _a = this.getState(), currentPage = _a.page, totalPages = _a.totalPages;
|
|
1150
|
-
var _b = this._config.pagination, previous = _b.previous, next = _b.next, number = _b.number, more = _b.more;
|
|
1151
|
-
// Helper function to create a button
|
|
1152
|
-
var createButton = function (text, className, disabled, handleClick) {
|
|
1153
|
-
var button = document.createElement('button');
|
|
1154
|
-
button.className = className;
|
|
1155
|
-
button.innerHTML = text;
|
|
1156
|
-
button.disabled = disabled;
|
|
1157
|
-
button.onclick = handleClick;
|
|
1158
|
-
return button;
|
|
1159
|
-
};
|
|
1160
|
-
// Add Previous Button
|
|
1161
|
-
paginationContainer.appendChild(createButton(previous.text, "".concat(previous.class).concat(currentPage === 1 ? ' disabled' : ''), currentPage === 1, function () { return _this._paginateData(currentPage - 1); }));
|
|
1162
|
-
// Calculate range of pages
|
|
1163
|
-
var pageMoreEnabled = this._config.pageMore;
|
|
1164
|
-
if (pageMoreEnabled) {
|
|
1165
|
-
var maxButtons = this._config.pageMoreLimit;
|
|
1166
|
-
var range_1 = this._calculatePageRange(currentPage, totalPages, maxButtons);
|
|
1167
|
-
// Add start ellipsis
|
|
1168
|
-
if (range_1.start > 1) {
|
|
1169
|
-
paginationContainer.appendChild(createButton(more.text, more.class, false, function () {
|
|
1170
|
-
return _this._paginateData(Math.max(1, range_1.start - 1));
|
|
1171
|
-
}));
|
|
1172
|
-
}
|
|
1173
|
-
var _loop_1 = function (i) {
|
|
1174
|
-
paginationContainer.appendChild(createButton(number.text.replace('{page}', i.toString()), "".concat(number.class).concat(currentPage === i ? ' active disabled' : ''), currentPage === i, function () { return _this._paginateData(i); }));
|
|
1175
|
-
};
|
|
1176
|
-
// Add page buttons
|
|
1177
|
-
for (var i = range_1.start; i <= range_1.end; i++) {
|
|
1178
|
-
_loop_1(i);
|
|
1179
|
-
}
|
|
1180
|
-
// Add end ellipsis
|
|
1181
|
-
if (pageMoreEnabled && range_1.end < totalPages) {
|
|
1182
|
-
paginationContainer.appendChild(createButton(more.text, more.class, false, function () {
|
|
1183
|
-
return _this._paginateData(Math.min(totalPages, range_1.end + 1));
|
|
1184
|
-
}));
|
|
1185
|
-
}
|
|
1186
|
-
}
|
|
1187
|
-
else {
|
|
1188
|
-
var _loop_2 = function (i) {
|
|
1189
|
-
paginationContainer.appendChild(createButton(number.text.replace('{page}', i.toString()), "".concat(number.class).concat(currentPage === i ? ' active disabled' : ''), currentPage === i, function () { return _this._paginateData(i); }));
|
|
1190
|
-
};
|
|
1191
|
-
// Add page buttons
|
|
1192
|
-
for (var i = 1; i <= totalPages; i++) {
|
|
1193
|
-
_loop_2(i);
|
|
1194
|
-
}
|
|
1195
|
-
}
|
|
1196
|
-
// Add Next Button
|
|
1197
|
-
paginationContainer.appendChild(createButton(next.text, "".concat(next.class).concat(currentPage === totalPages ? ' disabled' : ''), currentPage === totalPages, function () { return _this._paginateData(currentPage + 1); }));
|
|
1198
|
-
};
|
|
1199
|
-
// New helper method to calculate page range
|
|
1200
|
-
KTDataTable.prototype._calculatePageRange = function (currentPage, totalPages, maxButtons) {
|
|
1201
|
-
var startPage, endPage;
|
|
1202
|
-
var halfMaxButtons = Math.floor(maxButtons / 2);
|
|
1203
|
-
if (totalPages <= maxButtons) {
|
|
1204
|
-
startPage = 1;
|
|
1205
|
-
endPage = totalPages;
|
|
1206
|
-
}
|
|
1207
|
-
else {
|
|
1208
|
-
startPage = Math.max(currentPage - halfMaxButtons, 1);
|
|
1209
|
-
endPage = Math.min(startPage + maxButtons - 1, totalPages);
|
|
1210
|
-
if (endPage - startPage < maxButtons - 1) {
|
|
1211
|
-
startPage = Math.max(endPage - maxButtons + 1, 1);
|
|
1212
|
-
}
|
|
1213
|
-
}
|
|
1214
|
-
return { start: startPage, end: endPage };
|
|
1215
|
-
};
|
|
1216
709
|
/**
|
|
1217
710
|
* Method for handling pagination
|
|
1218
711
|
* @param page - The page number to navigate to
|
|
@@ -1221,39 +714,54 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1221
714
|
if (page < 1 || !Number.isInteger(page)) {
|
|
1222
715
|
return;
|
|
1223
716
|
}
|
|
1224
|
-
this.
|
|
1225
|
-
this._dispatchEvent('pagination', { page: page });
|
|
717
|
+
this._emit('pagination', { page: page });
|
|
1226
718
|
if (page >= 1 && page <= this.getState().totalPages) {
|
|
1227
|
-
this.
|
|
719
|
+
this._stateStore.setPage(page);
|
|
1228
720
|
this._updateData();
|
|
1229
721
|
}
|
|
1230
722
|
};
|
|
1231
723
|
// Method to show the loading spinner
|
|
1232
724
|
KTDataTable.prototype._showSpinner = function () {
|
|
1233
|
-
var
|
|
725
|
+
var _a, _b;
|
|
726
|
+
var root = this._element;
|
|
727
|
+
var spinnerSel = (_a = this._config.attributes) === null || _a === void 0 ? void 0 : _a.spinner;
|
|
728
|
+
var fromDom = root && spinnerSel
|
|
729
|
+
? root.querySelector(spinnerSel)
|
|
730
|
+
: null;
|
|
731
|
+
var spinner = fromDom !== null && fromDom !== void 0 ? fromDom : this._createSpinner();
|
|
1234
732
|
if (spinner) {
|
|
1235
733
|
spinner.style.display = 'block';
|
|
1236
734
|
}
|
|
1237
|
-
|
|
735
|
+
root === null || root === void 0 ? void 0 : root.classList.add((_b = this._config.loadingClass) !== null && _b !== void 0 ? _b : 'loading');
|
|
1238
736
|
};
|
|
1239
737
|
// Method to hide the loading spinner
|
|
1240
738
|
KTDataTable.prototype._hideSpinner = function () {
|
|
1241
|
-
var
|
|
739
|
+
var _a, _b;
|
|
740
|
+
var root = this._element;
|
|
741
|
+
var spinnerSel = (_a = this._config.attributes) === null || _a === void 0 ? void 0 : _a.spinner;
|
|
742
|
+
var spinner = root && spinnerSel
|
|
743
|
+
? root.querySelector(spinnerSel)
|
|
744
|
+
: null;
|
|
1242
745
|
if (spinner) {
|
|
1243
746
|
spinner.style.display = 'none';
|
|
1244
747
|
}
|
|
1245
|
-
|
|
748
|
+
root === null || root === void 0 ? void 0 : root.classList.remove((_b = this._config.loadingClass) !== null && _b !== void 0 ? _b : 'loading');
|
|
1246
749
|
};
|
|
1247
750
|
// Method to create a spinner element if it doesn't exist
|
|
1248
751
|
KTDataTable.prototype._createSpinner = function () {
|
|
1249
|
-
|
|
752
|
+
var loading = this._config.loading;
|
|
753
|
+
if (!loading) {
|
|
1250
754
|
return null;
|
|
1251
755
|
}
|
|
1252
756
|
var template = document.createElement('template');
|
|
1253
|
-
template.innerHTML =
|
|
757
|
+
template.innerHTML = loading.template
|
|
1254
758
|
.trim()
|
|
1255
|
-
.replace('{content}',
|
|
1256
|
-
var
|
|
759
|
+
.replace('{content}', loading.content);
|
|
760
|
+
var first = template.content.firstChild;
|
|
761
|
+
if (!first || !(first instanceof HTMLElement)) {
|
|
762
|
+
return null;
|
|
763
|
+
}
|
|
764
|
+
var spinner = first;
|
|
1257
765
|
spinner.setAttribute('data-kt-datatable-spinner', 'true');
|
|
1258
766
|
this._tableElement.appendChild(spinner);
|
|
1259
767
|
return spinner;
|
|
@@ -1263,8 +771,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1263
771
|
* @returns {void}
|
|
1264
772
|
*/
|
|
1265
773
|
KTDataTable.prototype._saveState = function () {
|
|
1266
|
-
this.
|
|
1267
|
-
this._dispatchEvent('stateSave');
|
|
774
|
+
this._emit('stateSave');
|
|
1268
775
|
var ns = this._tableNamespace();
|
|
1269
776
|
if (ns) {
|
|
1270
777
|
localStorage.setItem(ns, JSON.stringify(this.getState()));
|
|
@@ -1281,7 +788,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1281
788
|
try {
|
|
1282
789
|
var state = JSON.parse(stateString);
|
|
1283
790
|
if (state)
|
|
1284
|
-
this.
|
|
791
|
+
this._stateStore.replaceState(state);
|
|
1285
792
|
return state;
|
|
1286
793
|
}
|
|
1287
794
|
catch (_a) { }
|
|
@@ -1312,32 +819,37 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1312
819
|
};
|
|
1313
820
|
KTDataTable.prototype._tableId = function () {
|
|
1314
821
|
var _a, _b;
|
|
1315
|
-
var
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
id = this._tableElement.getAttribute('id');
|
|
822
|
+
var tableIdAttr = (_a = this._tableElement) === null || _a === void 0 ? void 0 : _a.getAttribute('id');
|
|
823
|
+
if (tableIdAttr) {
|
|
824
|
+
return tableIdAttr;
|
|
1319
825
|
}
|
|
1320
|
-
|
|
1321
|
-
if (
|
|
1322
|
-
|
|
826
|
+
var rootIdAttr = (_b = this._element) === null || _b === void 0 ? void 0 : _b.getAttribute('id');
|
|
827
|
+
if (rootIdAttr) {
|
|
828
|
+
return rootIdAttr;
|
|
1323
829
|
}
|
|
1324
|
-
return
|
|
830
|
+
return '';
|
|
1325
831
|
};
|
|
1326
832
|
/**
|
|
1327
833
|
* Clean up all event listeners, handlers, and DOM nodes created by this instance.
|
|
1328
834
|
* This method is called before re-rendering or when disposing the component.
|
|
1329
835
|
*/
|
|
1330
836
|
KTDataTable.prototype._dispose = function () {
|
|
837
|
+
var _a, _b, _c;
|
|
838
|
+
var root = this._element;
|
|
839
|
+
if (!root) {
|
|
840
|
+
return;
|
|
841
|
+
}
|
|
842
|
+
this._cleanupCallbacks.forEach(function (cleanup) { return cleanup(); });
|
|
843
|
+
this._cleanupCallbacks = [];
|
|
1331
844
|
// --- 1. Remove search input event listener (debounced) ---
|
|
1332
845
|
var tableId = this._tableId();
|
|
1333
846
|
var searchElement = document.querySelector("[data-kt-datatable-search=\"#".concat(tableId, "\"]"));
|
|
1334
847
|
if (searchElement) {
|
|
1335
848
|
var searchWithDebounce = KTDataTable.asSearchElementWithDebounce(searchElement);
|
|
1336
|
-
if (
|
|
1337
|
-
|
|
849
|
+
if (searchWithDebounce._debouncedSearch) {
|
|
850
|
+
searchElement.removeEventListener('keyup', searchWithDebounce._debouncedSearch);
|
|
851
|
+
delete searchWithDebounce._debouncedSearch;
|
|
1338
852
|
}
|
|
1339
|
-
searchElement.removeEventListener('keyup', searchWithDebounce._debouncedSearch);
|
|
1340
|
-
delete searchWithDebounce._debouncedSearch;
|
|
1341
853
|
}
|
|
1342
854
|
// --- 2. Remove page size dropdown event listener ---
|
|
1343
855
|
if (this._sizeElement && this._sizeElement.onchange) {
|
|
@@ -1357,10 +869,12 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1357
869
|
checkboxWithDispose.dispose();
|
|
1358
870
|
}
|
|
1359
871
|
else {
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
872
|
+
var checkSel = (_a = this._config.attributes) === null || _a === void 0 ? void 0 : _a.check;
|
|
873
|
+
if (checkSel) {
|
|
874
|
+
var headerCheckElement = root.querySelector(checkSel);
|
|
875
|
+
if (headerCheckElement) {
|
|
876
|
+
headerCheckElement.replaceWith(headerCheckElement.cloneNode(true));
|
|
877
|
+
}
|
|
1364
878
|
}
|
|
1365
879
|
}
|
|
1366
880
|
// KTDataTableSortAPI does not have a dispose method, but we can remove th click listeners by replacing them
|
|
@@ -1371,16 +885,20 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1371
885
|
});
|
|
1372
886
|
}
|
|
1373
887
|
// --- 5. Remove spinner DOM node if it exists ---
|
|
1374
|
-
var
|
|
1375
|
-
if (
|
|
1376
|
-
spinner.
|
|
888
|
+
var spinnerSel = (_b = this._config.attributes) === null || _b === void 0 ? void 0 : _b.spinner;
|
|
889
|
+
if (spinnerSel) {
|
|
890
|
+
var spinner = root.querySelector(spinnerSel);
|
|
891
|
+
if (spinner === null || spinner === void 0 ? void 0 : spinner.parentNode) {
|
|
892
|
+
spinner.parentNode.removeChild(spinner);
|
|
893
|
+
}
|
|
1377
894
|
}
|
|
1378
|
-
|
|
895
|
+
root.classList.remove((_c = this._config.loadingClass) !== null && _c !== void 0 ? _c : 'loading');
|
|
1379
896
|
// --- 6. Remove instance reference from the DOM element ---
|
|
1380
|
-
var elementWithInstance = KTDataTable.asElementWithInstance(
|
|
897
|
+
var elementWithInstance = KTDataTable.asElementWithInstance(root);
|
|
1381
898
|
if (elementWithInstance.instance) {
|
|
1382
899
|
delete elementWithInstance.instance;
|
|
1383
900
|
}
|
|
901
|
+
data_1.default.remove(root, this._name);
|
|
1384
902
|
// --- 7. (Optional) Clear localStorage state ---
|
|
1385
903
|
// Uncomment the following line if you want to clear state on dispose:
|
|
1386
904
|
// this._deleteState();
|
|
@@ -1405,23 +923,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1405
923
|
* @returns {KTDataTableStateInterface} The current state of the table.
|
|
1406
924
|
*/
|
|
1407
925
|
KTDataTable.prototype.getState = function () {
|
|
1408
|
-
return
|
|
1409
|
-
/**
|
|
1410
|
-
* The current page number.
|
|
1411
|
-
*/
|
|
1412
|
-
page: 1,
|
|
1413
|
-
/**
|
|
1414
|
-
* The field that the data is sorted by.
|
|
1415
|
-
*/
|
|
1416
|
-
sortField: null,
|
|
1417
|
-
/**
|
|
1418
|
-
* The sort order (ascending or descending).
|
|
1419
|
-
*/
|
|
1420
|
-
sortOrder: '',
|
|
1421
|
-
/**
|
|
1422
|
-
* The number of rows to display per page.
|
|
1423
|
-
*/
|
|
1424
|
-
pageSize: this._config.pageSize, filters: [] }, this._config._state);
|
|
926
|
+
return this._stateStore.getState();
|
|
1425
927
|
};
|
|
1426
928
|
/**
|
|
1427
929
|
* Sorts the data in the table by the specified field.
|
|
@@ -1432,10 +934,8 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1432
934
|
var state = this.getState();
|
|
1433
935
|
var sortOrder = this._sortHandler.toggleSortOrder(state.sortField, state.sortOrder, field);
|
|
1434
936
|
this._sortHandler.setSortIcon(field, sortOrder);
|
|
1435
|
-
this.
|
|
1436
|
-
this.
|
|
1437
|
-
this._fireEvent('sort', { field: field, order: sortOrder });
|
|
1438
|
-
this._dispatchEvent('sort', { field: field, order: sortOrder });
|
|
937
|
+
this._stateStore.setSort(field, sortOrder);
|
|
938
|
+
this._emit('sort', { field: field, order: sortOrder });
|
|
1439
939
|
this._updateData();
|
|
1440
940
|
};
|
|
1441
941
|
/**
|
|
@@ -1468,15 +968,13 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1468
968
|
* Triggers the 'reload' event and the 'kt.datatable.reload' custom event.
|
|
1469
969
|
*/
|
|
1470
970
|
KTDataTable.prototype.reload = function () {
|
|
1471
|
-
this.
|
|
1472
|
-
this._dispatchEvent('reload');
|
|
971
|
+
this._emit('reload');
|
|
1473
972
|
// Fetch the data from the server using the current sort and filter settings
|
|
1474
973
|
this._updateData();
|
|
1475
974
|
};
|
|
1476
975
|
KTDataTable.prototype.redraw = function (page) {
|
|
1477
976
|
if (page === void 0) { page = 1; }
|
|
1478
|
-
this.
|
|
1479
|
-
this._dispatchEvent('redraw');
|
|
977
|
+
this._emit('redraw');
|
|
1480
978
|
this._paginateData(page);
|
|
1481
979
|
};
|
|
1482
980
|
/**
|
|
@@ -1505,18 +1003,16 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1505
1003
|
* @throws Error if the filter object is null or undefined.
|
|
1506
1004
|
*/
|
|
1507
1005
|
KTDataTable.prototype.setFilter = function (filter) {
|
|
1508
|
-
this.
|
|
1509
|
-
filter,
|
|
1510
|
-
], false);
|
|
1511
|
-
this._config._state.page = 1;
|
|
1006
|
+
this._stateStore.setFilter(filter);
|
|
1512
1007
|
return this;
|
|
1513
1008
|
};
|
|
1514
1009
|
KTDataTable.prototype.dispose = function () {
|
|
1010
|
+
var _a;
|
|
1011
|
+
(_a = this._remoteProvider) === null || _a === void 0 ? void 0 : _a.dispose();
|
|
1515
1012
|
this._dispose();
|
|
1516
1013
|
};
|
|
1517
1014
|
KTDataTable.prototype.search = function (query) {
|
|
1518
|
-
this.
|
|
1519
|
-
this._config._state.page = 1;
|
|
1015
|
+
this._stateStore.setSearch(query);
|
|
1520
1016
|
this.reload();
|
|
1521
1017
|
};
|
|
1522
1018
|
/**
|
|
@@ -1609,8 +1105,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1609
1105
|
*/
|
|
1610
1106
|
KTDataTable.prototype.check = function () {
|
|
1611
1107
|
this._checkbox.check();
|
|
1612
|
-
this.
|
|
1613
|
-
this._dispatchEvent('checked');
|
|
1108
|
+
this._emit('checked');
|
|
1614
1109
|
};
|
|
1615
1110
|
/**
|
|
1616
1111
|
* Uncheck all visible row checkboxes
|
|
@@ -1618,8 +1113,7 @@ var KTDataTable = /** @class */ (function (_super) {
|
|
|
1618
1113
|
*/
|
|
1619
1114
|
KTDataTable.prototype.uncheck = function () {
|
|
1620
1115
|
this._checkbox.uncheck();
|
|
1621
|
-
this.
|
|
1622
|
-
this._dispatchEvent('unchecked');
|
|
1116
|
+
this._emit('unchecked');
|
|
1623
1117
|
};
|
|
1624
1118
|
/**
|
|
1625
1119
|
* Get all checked row IDs (across all pages if preserveSelection is true)
|