@keenthemes/ktui 1.2.3 → 1.2.4

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.
Files changed (141) hide show
  1. package/dist/ktui.js +1681 -957
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +110 -1
  5. package/lib/cjs/components/context-menu/context-menu.d.ts +66 -0
  6. package/lib/cjs/components/context-menu/context-menu.d.ts.map +1 -0
  7. package/lib/cjs/components/context-menu/context-menu.js +423 -0
  8. package/lib/cjs/components/context-menu/context-menu.js.map +1 -0
  9. package/lib/cjs/components/context-menu/index.d.ts +7 -0
  10. package/lib/cjs/components/context-menu/index.d.ts.map +1 -0
  11. package/lib/cjs/components/context-menu/index.js +10 -0
  12. package/lib/cjs/components/context-menu/index.js.map +1 -0
  13. package/lib/cjs/components/context-menu/types.d.ts +30 -0
  14. package/lib/cjs/components/context-menu/types.d.ts.map +1 -0
  15. package/lib/cjs/components/context-menu/types.js +7 -0
  16. package/lib/cjs/components/context-menu/types.js.map +1 -0
  17. package/lib/cjs/components/datatable/datatable-contracts.d.ts +66 -0
  18. package/lib/cjs/components/datatable/datatable-contracts.d.ts.map +1 -0
  19. package/lib/cjs/components/datatable/datatable-contracts.js +7 -0
  20. package/lib/cjs/components/datatable/datatable-contracts.js.map +1 -0
  21. package/lib/cjs/components/datatable/datatable-event-adapter.d.ts +7 -0
  22. package/lib/cjs/components/datatable/datatable-event-adapter.d.ts.map +1 -0
  23. package/lib/cjs/components/datatable/datatable-event-adapter.js +16 -0
  24. package/lib/cjs/components/datatable/datatable-event-adapter.js.map +1 -0
  25. package/lib/cjs/components/datatable/datatable-local-provider.d.ts +25 -0
  26. package/lib/cjs/components/datatable/datatable-local-provider.d.ts.map +1 -0
  27. package/lib/cjs/components/datatable/datatable-local-provider.js +184 -0
  28. package/lib/cjs/components/datatable/datatable-local-provider.js.map +1 -0
  29. package/lib/cjs/components/datatable/datatable-pagination-renderer.d.ts +15 -0
  30. package/lib/cjs/components/datatable/datatable-pagination-renderer.d.ts.map +1 -0
  31. package/lib/cjs/components/datatable/datatable-pagination-renderer.js +128 -0
  32. package/lib/cjs/components/datatable/datatable-pagination-renderer.js.map +1 -0
  33. package/lib/cjs/components/datatable/datatable-remote-provider.d.ts +25 -0
  34. package/lib/cjs/components/datatable/datatable-remote-provider.d.ts.map +1 -0
  35. package/lib/cjs/components/datatable/datatable-remote-provider.js +188 -0
  36. package/lib/cjs/components/datatable/datatable-remote-provider.js.map +1 -0
  37. package/lib/cjs/components/datatable/datatable-state-store.d.ts +21 -0
  38. package/lib/cjs/components/datatable/datatable-state-store.d.ts.map +1 -0
  39. package/lib/cjs/components/datatable/datatable-state-store.js +81 -0
  40. package/lib/cjs/components/datatable/datatable-state-store.js.map +1 -0
  41. package/lib/cjs/components/datatable/datatable-table-renderer.d.ts +16 -0
  42. package/lib/cjs/components/datatable/datatable-table-renderer.d.ts.map +1 -0
  43. package/lib/cjs/components/datatable/datatable-table-renderer.js +133 -0
  44. package/lib/cjs/components/datatable/datatable-table-renderer.js.map +1 -0
  45. package/lib/cjs/components/datatable/datatable.d.ts +9 -87
  46. package/lib/cjs/components/datatable/datatable.d.ts.map +1 -1
  47. package/lib/cjs/components/datatable/datatable.js +114 -686
  48. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  49. package/lib/cjs/components/select/index.d.ts +1 -1
  50. package/lib/cjs/components/select/index.d.ts.map +1 -1
  51. package/lib/cjs/index.d.ts +5 -1
  52. package/lib/cjs/index.d.ts.map +1 -1
  53. package/lib/cjs/index.js +7 -7
  54. package/lib/cjs/index.js.map +1 -1
  55. package/lib/cjs/init-all.d.ts +6 -0
  56. package/lib/cjs/init-all.d.ts.map +1 -0
  57. package/lib/cjs/init-all.js +17 -0
  58. package/lib/cjs/init-all.js.map +1 -0
  59. package/lib/cjs/legacy.d.ts +8 -0
  60. package/lib/cjs/legacy.d.ts.map +1 -0
  61. package/lib/cjs/legacy.js +26 -0
  62. package/lib/cjs/legacy.js.map +1 -0
  63. package/lib/esm/components/context-menu/context-menu.d.ts +66 -0
  64. package/lib/esm/components/context-menu/context-menu.d.ts.map +1 -0
  65. package/lib/esm/components/context-menu/context-menu.js +420 -0
  66. package/lib/esm/components/context-menu/context-menu.js.map +1 -0
  67. package/lib/esm/components/context-menu/index.d.ts +7 -0
  68. package/lib/esm/components/context-menu/index.d.ts.map +1 -0
  69. package/lib/esm/components/context-menu/index.js +6 -0
  70. package/lib/esm/components/context-menu/index.js.map +1 -0
  71. package/lib/esm/components/context-menu/types.d.ts +30 -0
  72. package/lib/esm/components/context-menu/types.d.ts.map +1 -0
  73. package/lib/esm/components/context-menu/types.js +6 -0
  74. package/lib/esm/components/context-menu/types.js.map +1 -0
  75. package/lib/esm/components/datatable/datatable-contracts.d.ts +66 -0
  76. package/lib/esm/components/datatable/datatable-contracts.d.ts.map +1 -0
  77. package/lib/esm/components/datatable/datatable-contracts.js +6 -0
  78. package/lib/esm/components/datatable/datatable-contracts.js.map +1 -0
  79. package/lib/esm/components/datatable/datatable-event-adapter.d.ts +7 -0
  80. package/lib/esm/components/datatable/datatable-event-adapter.d.ts.map +1 -0
  81. package/lib/esm/components/datatable/datatable-event-adapter.js +13 -0
  82. package/lib/esm/components/datatable/datatable-event-adapter.js.map +1 -0
  83. package/lib/esm/components/datatable/datatable-local-provider.d.ts +25 -0
  84. package/lib/esm/components/datatable/datatable-local-provider.d.ts.map +1 -0
  85. package/lib/esm/components/datatable/datatable-local-provider.js +181 -0
  86. package/lib/esm/components/datatable/datatable-local-provider.js.map +1 -0
  87. package/lib/esm/components/datatable/datatable-pagination-renderer.d.ts +15 -0
  88. package/lib/esm/components/datatable/datatable-pagination-renderer.d.ts.map +1 -0
  89. package/lib/esm/components/datatable/datatable-pagination-renderer.js +125 -0
  90. package/lib/esm/components/datatable/datatable-pagination-renderer.js.map +1 -0
  91. package/lib/esm/components/datatable/datatable-remote-provider.d.ts +25 -0
  92. package/lib/esm/components/datatable/datatable-remote-provider.d.ts.map +1 -0
  93. package/lib/esm/components/datatable/datatable-remote-provider.js +185 -0
  94. package/lib/esm/components/datatable/datatable-remote-provider.js.map +1 -0
  95. package/lib/esm/components/datatable/datatable-state-store.d.ts +21 -0
  96. package/lib/esm/components/datatable/datatable-state-store.d.ts.map +1 -0
  97. package/lib/esm/components/datatable/datatable-state-store.js +78 -0
  98. package/lib/esm/components/datatable/datatable-state-store.js.map +1 -0
  99. package/lib/esm/components/datatable/datatable-table-renderer.d.ts +16 -0
  100. package/lib/esm/components/datatable/datatable-table-renderer.d.ts.map +1 -0
  101. package/lib/esm/components/datatable/datatable-table-renderer.js +130 -0
  102. package/lib/esm/components/datatable/datatable-table-renderer.js.map +1 -0
  103. package/lib/esm/components/datatable/datatable.d.ts +9 -87
  104. package/lib/esm/components/datatable/datatable.d.ts.map +1 -1
  105. package/lib/esm/components/datatable/datatable.js +114 -686
  106. package/lib/esm/components/datatable/datatable.js.map +1 -1
  107. package/lib/esm/components/select/index.d.ts +1 -1
  108. package/lib/esm/components/select/index.d.ts.map +1 -1
  109. package/lib/esm/index.d.ts +5 -1
  110. package/lib/esm/index.d.ts.map +1 -1
  111. package/lib/esm/index.js +4 -5
  112. package/lib/esm/index.js.map +1 -1
  113. package/lib/esm/init-all.d.ts +6 -0
  114. package/lib/esm/init-all.d.ts.map +1 -0
  115. package/lib/esm/init-all.js +13 -0
  116. package/lib/esm/init-all.js.map +1 -0
  117. package/lib/esm/legacy.d.ts +8 -0
  118. package/lib/esm/legacy.d.ts.map +1 -0
  119. package/lib/esm/legacy.js +8 -0
  120. package/lib/esm/legacy.js.map +1 -0
  121. package/package.json +34 -4
  122. package/src/__tests__/entrypoints.test.ts +71 -0
  123. package/src/components/context-menu/__tests__/context-menu.test.ts +117 -0
  124. package/src/components/context-menu/context-menu.css +32 -0
  125. package/src/components/context-menu/context-menu.ts +529 -0
  126. package/src/components/context-menu/index.ts +10 -0
  127. package/src/components/context-menu/types.ts +32 -0
  128. package/src/components/datatable/__tests__/architecture-boundaries.test.ts +259 -0
  129. package/src/components/datatable/datatable-contracts.ts +96 -0
  130. package/src/components/datatable/datatable-event-adapter.ts +21 -0
  131. package/src/components/datatable/datatable-local-provider.ts +194 -0
  132. package/src/components/datatable/datatable-pagination-renderer.ts +211 -0
  133. package/src/components/datatable/datatable-remote-provider.ts +175 -0
  134. package/src/components/datatable/datatable-state-store.ts +94 -0
  135. package/src/components/datatable/datatable-table-renderer.ts +206 -0
  136. package/src/components/datatable/datatable.ts +128 -839
  137. package/src/components/select/index.ts +1 -1
  138. package/src/index.ts +9 -5
  139. package/src/init-all.ts +15 -0
  140. package/src/legacy.ts +9 -0
  141. package/styles.css +1 -0
package/dist/ktui.js CHANGED
@@ -4781,10 +4781,10 @@ exports["default"] = KTComponent;
4781
4781
 
4782
4782
  /***/ }),
4783
4783
 
4784
- /***/ "./src/components/datatable/datatable-checkbox.ts":
4785
- /*!********************************************************!*\
4786
- !*** ./src/components/datatable/datatable-checkbox.ts ***!
4787
- \********************************************************/
4784
+ /***/ "./src/components/context-menu/context-menu.ts":
4785
+ /*!*****************************************************!*\
4786
+ !*** ./src/components/context-menu/context-menu.ts ***!
4787
+ \*****************************************************/
4788
4788
  /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
4789
4789
 
4790
4790
 
@@ -4792,230 +4792,1233 @@ exports["default"] = KTComponent;
4792
4792
  * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
4793
4793
  * Copyright 2025 by Keenthemes Inc
4794
4794
  */
4795
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
4796
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4797
- if (ar || !(i in from)) {
4798
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
4799
- ar[i] = from[i];
4800
- }
4801
- }
4802
- return to.concat(ar || Array.prototype.slice.call(from));
4803
- };
4795
+ var __extends = (this && this.__extends) || (function () {
4796
+ var extendStatics = function (d, b) {
4797
+ extendStatics = Object.setPrototypeOf ||
4798
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
4799
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
4800
+ return extendStatics(d, b);
4801
+ };
4802
+ return function (d, b) {
4803
+ if (typeof b !== "function" && b !== null)
4804
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
4805
+ extendStatics(d, b);
4806
+ function __() { this.constructor = d; }
4807
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
4808
+ };
4809
+ })();
4804
4810
  Object.defineProperty(exports, "__esModule", ({ value: true }));
4805
- exports.createCheckboxHandler = createCheckboxHandler;
4811
+ exports.KTContextMenu = void 0;
4812
+ var core_1 = __webpack_require__(/*! @popperjs/core */ "./node_modules/@popperjs/core/lib/index.js");
4813
+ var dom_1 = __webpack_require__(/*! ../../helpers/dom */ "./src/helpers/dom.ts");
4814
+ var data_1 = __webpack_require__(/*! ../../helpers/data */ "./src/helpers/data.ts");
4806
4815
  var event_handler_1 = __webpack_require__(/*! ../../helpers/event-handler */ "./src/helpers/event-handler.ts");
4807
- // Main function to create checkbox logic for a datatable instance
4808
- function createCheckboxHandler(element, config, fireEvent) {
4809
- var _a;
4810
- var headerChecked = false;
4811
- var headerCheckElement = null;
4812
- var targetElements = null;
4813
- // Default: preserve selection across all pages
4814
- var preserveSelection = ((_a = config.checkbox) === null || _a === void 0 ? void 0 : _a.preserveSelection) !== false;
4815
- // Helper: get selectedRows from state, always as string[]
4816
- function getSelectedRows() {
4817
- if (!config._state)
4818
- config._state = {};
4819
- if (!Array.isArray(config._state.selectedRows))
4820
- config._state.selectedRows = [];
4821
- return config._state.selectedRows.map(String);
4822
- }
4823
- // Helper: set selectedRows in state
4824
- function setSelectedRows(rows) {
4825
- if (!config._state)
4826
- config._state = {};
4827
- config._state.selectedRows = Array.from(new Set(rows.map(String)));
4828
- }
4829
- // Helper: get all visible row IDs (values)
4830
- function getVisibleRowIds() {
4831
- if (!targetElements)
4832
- return [];
4833
- return Array.from(targetElements)
4834
- .map(function (el) { return el.value; })
4835
- .filter(function (v) { return v != null && v !== ''; });
4836
- }
4837
- // Listener for header checkbox
4838
- var checkboxListener = function (event) {
4839
- checkboxToggle(event);
4840
- };
4841
- function init() {
4842
- headerCheckElement = element.querySelector(config.attributes.check);
4843
- if (!headerCheckElement)
4844
- return;
4845
- headerChecked = headerCheckElement.checked;
4846
- targetElements = element.querySelectorAll(config.attributes.checkbox);
4847
- checkboxHandler();
4848
- reapplyCheckedStates();
4849
- updateHeaderCheckboxState();
4816
+ var component_1 = __webpack_require__(/*! ../component */ "./src/components/component.ts");
4817
+ var KTContextMenu = /** @class */ (function (_super) {
4818
+ __extends(KTContextMenu, _super);
4819
+ function KTContextMenu(element, config) {
4820
+ var _this = _super.call(this) || this;
4821
+ _this._name = 'context-menu';
4822
+ _this._defaultConfig = {
4823
+ zindex: 105,
4824
+ placement: 'right-start',
4825
+ placementRtl: 'left-start',
4826
+ permanent: false,
4827
+ dismiss: true,
4828
+ keyboard: true,
4829
+ offset: '0px, 4px',
4830
+ offsetRtl: '0px, 4px',
4831
+ hiddenClass: 'hidden',
4832
+ container: '',
4833
+ preventNativeMenu: true,
4834
+ flip: true,
4835
+ overflow: false,
4836
+ };
4837
+ _this._config = _this._defaultConfig;
4838
+ _this._isTransitioning = false;
4839
+ _this._isOpen = false;
4840
+ _this._shownAt = 0;
4841
+ _this._lastPoint = { x: 0, y: 0 };
4842
+ if (data_1.default.has(element, _this._name))
4843
+ return _this;
4844
+ _this._init(element);
4845
+ _this._buildConfig(config);
4846
+ if (!_this._element)
4847
+ return _this;
4848
+ _this._targetElement = _this._resolveTargetElement(_this._element);
4849
+ if (!_this._targetElement)
4850
+ return _this;
4851
+ _this._menuElement = _this._resolveMenuElement(_this._element);
4852
+ if (!_this._menuElement)
4853
+ return _this;
4854
+ data_1.default.set(_this._menuElement, 'contextMenuElement', _this._element);
4855
+ _this._setupNestedSubmenus();
4856
+ _this._handleContainer();
4857
+ return _this;
4850
4858
  }
4851
- function checkboxHandler() {
4852
- if (!headerCheckElement)
4859
+ KTContextMenu.prototype._resolveTargetElement = function (root) {
4860
+ var selector = root.getAttribute('data-kt-context-menu-target') || '';
4861
+ if (selector) {
4862
+ var target = document.querySelector(selector);
4863
+ if (target)
4864
+ return target;
4865
+ }
4866
+ var localTarget = root.querySelector('[data-kt-context-menu-trigger]');
4867
+ var localToggle = root.querySelector('[data-kt-context-menu-toggle]');
4868
+ return localTarget || localToggle || root;
4869
+ };
4870
+ KTContextMenu.prototype._resolveMenuElement = function (root) {
4871
+ var menu = root.querySelector('[data-kt-context-menu-menu]');
4872
+ return menu;
4873
+ };
4874
+ KTContextMenu.prototype._handleContainer = function () {
4875
+ var _a;
4876
+ var container = this._getOption('container');
4877
+ if (!container)
4853
4878
  return;
4854
- headerCheckElement.addEventListener('click', checkboxListener);
4855
- event_handler_1.default.on(document.body, config.attributes.checkbox, 'input', function (event) {
4856
- handleRowCheckboxChange(event);
4879
+ if (container === 'body') {
4880
+ document.body.appendChild(this._menuElement);
4881
+ }
4882
+ else {
4883
+ (_a = document
4884
+ .querySelector(container)) === null || _a === void 0 ? void 0 : _a.appendChild(this._menuElement);
4885
+ }
4886
+ };
4887
+ KTContextMenu.prototype._setupNestedSubmenus = function () {
4888
+ var submenus = this._menuElement.querySelectorAll('[data-kt-context-menu]');
4889
+ submenus.forEach(function (submenu) {
4890
+ new KTContextMenu(submenu);
4857
4891
  });
4858
- }
4859
- // When a row checkbox is changed
4860
- function handleRowCheckboxChange(event) {
4861
- var input = event.target;
4862
- if (!input)
4892
+ };
4893
+ KTContextMenu.prototype._updatePoint = function (x, y) {
4894
+ this._lastPoint = { x: x, y: y };
4895
+ };
4896
+ KTContextMenu.prototype._toggleAtEvent = function (event) {
4897
+ if (this._isOpen) {
4898
+ this._hide();
4863
4899
  return;
4864
- var value = input.value;
4865
- var selectedRows = getSelectedRows();
4866
- var wasChecked = selectedRows.includes(value);
4867
- var isNowChecked = input.checked;
4868
- // Update state first
4869
- if (isNowChecked) {
4870
- if (!wasChecked)
4871
- selectedRows.push(value);
4872
4900
  }
4873
- else {
4874
- selectedRows = selectedRows.filter(function (v) { return v !== value; });
4901
+ this._showAt(event.clientX, event.clientY);
4902
+ };
4903
+ KTContextMenu.prototype._showAtEvent = function (event) {
4904
+ event.stopPropagation();
4905
+ if (this._getOption('preventNativeMenu') === true) {
4906
+ event.preventDefault();
4875
4907
  }
4876
- setSelectedRows(selectedRows);
4877
- updateHeaderCheckboxState();
4878
- // Fire specific checked/unchecked events after state is updated
4879
- if (isNowChecked && !wasChecked) {
4880
- fireEvent('checked');
4908
+ this._toggleAtEvent(event);
4909
+ };
4910
+ KTContextMenu.prototype._showAt = function (x, y) {
4911
+ var _this = this;
4912
+ if (this._isOpen || this._isTransitioning)
4913
+ return;
4914
+ var payload = { cancel: false };
4915
+ this._fireEvent('show', payload);
4916
+ this._dispatchEvent('show', payload);
4917
+ if (payload.cancel)
4918
+ return;
4919
+ KTContextMenu.hide(this._element);
4920
+ this._updatePoint(x, y);
4921
+ var zIndex = parseInt(this._getOption('zindex'), 10);
4922
+ var parentZindex = dom_1.default.getHighestZindex(this._targetElement);
4923
+ if (parentZindex !== null && parentZindex >= zIndex) {
4924
+ zIndex = parentZindex + 1;
4881
4925
  }
4882
- else if (!isNowChecked && wasChecked) {
4883
- fireEvent('unchecked');
4926
+ if (zIndex > 0) {
4927
+ this._menuElement.style.zIndex = zIndex.toString();
4884
4928
  }
4885
- // Always fire changed event for backward compatibility
4886
- fireEvent('changed');
4887
- }
4888
- // When the header checkbox is toggled
4889
- function checkboxToggle(_event) {
4890
- var checked = !isChecked();
4891
- // Update state first, then fire events
4892
- change(checked);
4893
- // Fire checked/unchecked events after state is updated
4894
- var eventType = checked ? 'checked' : 'unchecked';
4895
- fireEvent(eventType);
4896
- }
4897
- // Change all visible checkboxes and update selectedRows
4898
- function change(checked) {
4929
+ this._menuElement.style.display = 'block';
4930
+ this._menuElement.style.opacity = '0';
4931
+ dom_1.default.reflow(this._menuElement);
4932
+ this._menuElement.style.opacity = '1';
4933
+ this._menuElement.classList.remove(this._getOption('hiddenClass'));
4934
+ this._menuElement.classList.add('open');
4935
+ this._element.classList.add('open');
4936
+ this._initPopper();
4937
+ dom_1.default.transitionEnd(this._menuElement, function () {
4938
+ _this._isTransitioning = false;
4939
+ _this._isOpen = true;
4940
+ _this._fireEvent('shown');
4941
+ _this._dispatchEvent('shown');
4942
+ });
4943
+ this._shownAt = Date.now();
4944
+ };
4945
+ KTContextMenu.prototype._hide = function () {
4946
+ var _this = this;
4947
+ if (!this._isOpen || this._isTransitioning)
4948
+ return;
4899
4949
  var payload = { cancel: false };
4900
- fireEvent('change', payload);
4901
- if (payload.cancel === true)
4950
+ this._fireEvent('hide', payload);
4951
+ this._dispatchEvent('hide', payload);
4952
+ if (payload.cancel)
4902
4953
  return;
4903
- headerChecked = checked;
4904
- if (headerCheckElement)
4905
- headerCheckElement.checked = checked;
4906
- if (targetElements) {
4907
- var visibleIds_1 = getVisibleRowIds();
4908
- var selectedRows = getSelectedRows();
4909
- if (checked) {
4910
- // Add all visible IDs to selectedRows
4911
- selectedRows = preserveSelection
4912
- ? Array.from(new Set(__spreadArray(__spreadArray([], selectedRows, true), visibleIds_1, true)))
4913
- : visibleIds_1;
4914
- }
4915
- else {
4916
- // Remove all visible IDs from selectedRows
4917
- selectedRows = preserveSelection
4918
- ? selectedRows.filter(function (v) { return !visibleIds_1.includes(v); })
4919
- : [];
4920
- }
4921
- setSelectedRows(selectedRows);
4922
- // Update visible checkboxes
4923
- targetElements.forEach(function (element) {
4924
- if (element) {
4925
- element.checked = checked;
4954
+ this._menuElement.style.opacity = '1';
4955
+ dom_1.default.reflow(this._menuElement);
4956
+ this._menuElement.style.opacity = '0';
4957
+ this._menuElement.classList.remove('open');
4958
+ this._element.classList.remove('open');
4959
+ dom_1.default.transitionEnd(this._menuElement, function () {
4960
+ _this._isTransitioning = false;
4961
+ _this._isOpen = false;
4962
+ _this._menuElement.classList.add(_this._getOption('hiddenClass'));
4963
+ _this._menuElement.style.display = '';
4964
+ _this._menuElement.style.zIndex = '';
4965
+ _this._destroyPopper();
4966
+ _this._fireEvent('hidden');
4967
+ _this._dispatchEvent('hidden');
4968
+ });
4969
+ };
4970
+ KTContextMenu.prototype._getVirtualReference = function () {
4971
+ var point = this._lastPoint;
4972
+ return {
4973
+ getBoundingClientRect: function () {
4974
+ return ({
4975
+ x: point.x,
4976
+ y: point.y,
4977
+ top: point.y,
4978
+ left: point.x,
4979
+ right: point.x,
4980
+ bottom: point.y,
4981
+ width: 0,
4982
+ height: 0,
4983
+ toJSON: function () { return ({}); },
4984
+ });
4985
+ },
4986
+ };
4987
+ };
4988
+ KTContextMenu.prototype._initPopper = function () {
4989
+ var popper = (0, core_1.createPopper)(this._getVirtualReference(), this._menuElement, this._getPopperConfig());
4990
+ data_1.default.set(this._element, 'popper', popper);
4991
+ };
4992
+ KTContextMenu.prototype._destroyPopper = function () {
4993
+ if (data_1.default.has(this._element, 'popper')) {
4994
+ data_1.default.get(this._element, 'popper').destroy();
4995
+ data_1.default.remove(this._element, 'popper');
4996
+ }
4997
+ };
4998
+ KTContextMenu.prototype._getPopperConfig = function () {
4999
+ var isRtl = dom_1.default.isRTL();
5000
+ var placement = this._getOption('placement');
5001
+ if (isRtl && this._getOption('placementRtl')) {
5002
+ placement = this._getOption('placementRtl');
5003
+ }
5004
+ var offsetValue = this._getOption('offset');
5005
+ if (isRtl && this._getOption('offsetRtl')) {
5006
+ offsetValue = this._getOption('offsetRtl');
5007
+ }
5008
+ var offset = offsetValue
5009
+ ? offsetValue
5010
+ .toString()
5011
+ .split(',')
5012
+ .map(function (value) { return parseInt(value.trim(), 10); })
5013
+ : [0, 0];
5014
+ var strategy = this._getOption('overflow') === true ? 'absolute' : 'fixed';
5015
+ var altAxis = this._getOption('flip') !== false;
5016
+ return {
5017
+ placement: placement,
5018
+ strategy: strategy,
5019
+ modifiers: [
5020
+ { name: 'offset', options: { offset: offset } },
5021
+ { name: 'preventOverflow', options: { altAxis: altAxis } },
5022
+ { name: 'flip', options: { flipVariations: false } },
5023
+ ],
5024
+ };
5025
+ };
5026
+ KTContextMenu.prototype._isContextMenuOpen = function () {
5027
+ return (this._element.classList.contains('open') &&
5028
+ this._menuElement.classList.contains('open'));
5029
+ };
5030
+ KTContextMenu.prototype.showAt = function (x, y) {
5031
+ this._showAt(x, y);
5032
+ };
5033
+ KTContextMenu.prototype.showAtEvent = function (event) {
5034
+ this._showAtEvent(event);
5035
+ };
5036
+ KTContextMenu.prototype.hide = function () {
5037
+ this._hide();
5038
+ };
5039
+ KTContextMenu.prototype.toggleAtEvent = function (event) {
5040
+ this._toggleAtEvent(event);
5041
+ };
5042
+ KTContextMenu.prototype.isOpen = function () {
5043
+ return this._isContextMenuOpen();
5044
+ };
5045
+ KTContextMenu.prototype.getMenuElement = function () {
5046
+ return this._menuElement;
5047
+ };
5048
+ KTContextMenu.prototype.getTargetElement = function () {
5049
+ return this._targetElement;
5050
+ };
5051
+ KTContextMenu.getElement = function (reference) {
5052
+ if (reference &&
5053
+ reference.hasAttribute('data-kt-context-menu-initialized')) {
5054
+ return reference;
5055
+ }
5056
+ var initializedParent = reference === null || reference === void 0 ? void 0 : reference.closest('[data-kt-context-menu-initialized]');
5057
+ if (initializedParent)
5058
+ return initializedParent;
5059
+ var container = reference === null || reference === void 0 ? void 0 : reference.closest('[data-kt-context-menu]');
5060
+ if (container)
5061
+ return container;
5062
+ if (reference &&
5063
+ reference.hasAttribute('data-kt-context-menu-menu') &&
5064
+ data_1.default.has(reference, 'contextMenuElement')) {
5065
+ return data_1.default.get(reference, 'contextMenuElement');
5066
+ }
5067
+ return null;
5068
+ };
5069
+ KTContextMenu.getInstance = function (element) {
5070
+ element = this.getElement(element);
5071
+ if (!element)
5072
+ return null;
5073
+ if (data_1.default.has(element, 'context-menu')) {
5074
+ return data_1.default.get(element, 'context-menu');
5075
+ }
5076
+ if (element.getAttribute('data-kt-context-menu-initialized') === 'true') {
5077
+ return new KTContextMenu(element);
5078
+ }
5079
+ return null;
5080
+ };
5081
+ KTContextMenu.getOrCreateInstance = function (element, config) {
5082
+ return this.getInstance(element) || new KTContextMenu(element, config);
5083
+ };
5084
+ KTContextMenu.update = function () {
5085
+ document
5086
+ .querySelectorAll('.open[data-kt-context-menu-initialized]')
5087
+ .forEach(function (item) {
5088
+ if (data_1.default.has(item, 'popper')) {
5089
+ data_1.default.get(item, 'popper').forceUpdate();
5090
+ }
5091
+ });
5092
+ };
5093
+ KTContextMenu.hide = function (skipElement) {
5094
+ document
5095
+ .querySelectorAll('.open[data-kt-context-menu-initialized]:not([data-kt-context-menu-permanent="true"])')
5096
+ .forEach(function (item) {
5097
+ if (skipElement && (skipElement === item || item.contains(skipElement)))
5098
+ return;
5099
+ var contextMenu = KTContextMenu.getInstance(item);
5100
+ if (contextMenu)
5101
+ contextMenu.hide();
5102
+ });
5103
+ };
5104
+ KTContextMenu.handleOpen = function () {
5105
+ event_handler_1.default.on(document.body, '[data-kt-context-menu-trigger], [data-kt-context-menu-target], [data-kt-context-menu]', 'contextmenu', function (event, target) {
5106
+ var contextMenu = KTContextMenu.getInstance(target);
5107
+ if (contextMenu) {
5108
+ contextMenu.showAtEvent(event);
5109
+ }
5110
+ });
5111
+ };
5112
+ KTContextMenu.handleToggle = function () {
5113
+ event_handler_1.default.on(document.body, '[data-kt-context-menu-toggle]', 'click', function (event, target) {
5114
+ event.preventDefault();
5115
+ event.stopPropagation();
5116
+ var contextMenu = KTContextMenu.getInstance(target);
5117
+ if (contextMenu) {
5118
+ var rect = target.getBoundingClientRect();
5119
+ contextMenu.showAt(rect.right, rect.top);
5120
+ }
5121
+ });
5122
+ };
5123
+ KTContextMenu.handleClickAway = function () {
5124
+ document.addEventListener('click', function (event) {
5125
+ document
5126
+ .querySelectorAll('.open[data-kt-context-menu-initialized]:not([data-kt-context-menu-permanent="true"])')
5127
+ .forEach(function (element) {
5128
+ var contextMenu = KTContextMenu.getInstance(element);
5129
+ if (!contextMenu)
5130
+ return;
5131
+ var menuElement = contextMenu.getMenuElement();
5132
+ var targetElement = contextMenu.getTargetElement();
5133
+ if (targetElement === event.target ||
5134
+ targetElement.contains(event.target) ||
5135
+ menuElement === event.target ||
5136
+ menuElement.contains(event.target)) {
5137
+ return;
5138
+ }
5139
+ contextMenu.hide();
5140
+ });
5141
+ });
5142
+ };
5143
+ KTContextMenu.handleKeyboard = function () {
5144
+ document.addEventListener('keydown', function (event) {
5145
+ var contextMenuEl = document.querySelector('.open[data-kt-context-menu-initialized]');
5146
+ var contextMenu = KTContextMenu.getInstance(contextMenuEl);
5147
+ if (!contextMenu || !contextMenu._getOption('keyboard'))
5148
+ return;
5149
+ if (event.key === 'Escape' &&
5150
+ !(event.ctrlKey || event.altKey || event.shiftKey)) {
5151
+ contextMenu.hide();
5152
+ }
5153
+ });
5154
+ };
5155
+ KTContextMenu.handleDismiss = function () {
5156
+ event_handler_1.default.on(document.body, '[data-kt-context-menu-dismiss], [data-kt-dropdown-dismiss]', 'click', function (_event, target) {
5157
+ var contextMenu = KTContextMenu.getInstance(target);
5158
+ if (contextMenu) {
5159
+ contextMenu.hide();
5160
+ }
5161
+ });
5162
+ };
5163
+ KTContextMenu.initHandlers = function () {
5164
+ this.handleOpen();
5165
+ this.handleToggle();
5166
+ this.handleClickAway();
5167
+ this.handleKeyboard();
5168
+ this.handleDismiss();
5169
+ };
5170
+ KTContextMenu.createInstances = function () {
5171
+ var elements = document.querySelectorAll('[data-kt-context-menu]');
5172
+ elements.forEach(function (element) {
5173
+ new KTContextMenu(element);
5174
+ });
5175
+ };
5176
+ KTContextMenu.init = function () {
5177
+ KTContextMenu.createInstances();
5178
+ if (window.KT_CONTEXT_MENU_INITIALIZED !== true) {
5179
+ KTContextMenu.initHandlers();
5180
+ window.KT_CONTEXT_MENU_INITIALIZED = true;
5181
+ }
5182
+ };
5183
+ KTContextMenu.reinit = function () {
5184
+ var elements = document.querySelectorAll('[data-kt-context-menu]');
5185
+ elements.forEach(function (element) {
5186
+ try {
5187
+ var instance = KTContextMenu.getInstance(element);
5188
+ if (instance && typeof instance.hide === 'function') {
5189
+ instance.hide();
5190
+ }
5191
+ data_1.default.remove(element, 'context-menu');
5192
+ data_1.default.remove(element, 'popper');
5193
+ element.removeAttribute('data-kt-context-menu-initialized');
5194
+ var menu = element.querySelector('[data-kt-context-menu-menu]');
5195
+ if (menu) {
5196
+ data_1.default.remove(menu, 'contextMenuElement');
5197
+ }
5198
+ }
5199
+ catch (_a) {
5200
+ // ignore per-element cleanup errors
5201
+ }
5202
+ });
5203
+ KTContextMenu.createInstances();
5204
+ KTContextMenu.initHandlers();
5205
+ };
5206
+ return KTContextMenu;
5207
+ }(component_1.default));
5208
+ exports.KTContextMenu = KTContextMenu;
5209
+ if (typeof window !== 'undefined') {
5210
+ window.KTContextMenu = KTContextMenu;
5211
+ }
5212
+
5213
+
5214
+ /***/ }),
5215
+
5216
+ /***/ "./src/components/context-menu/index.ts":
5217
+ /*!**********************************************!*\
5218
+ !*** ./src/components/context-menu/index.ts ***!
5219
+ \**********************************************/
5220
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
5221
+
5222
+
5223
+ /**
5224
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
5225
+ * Copyright 2025 by Keenthemes Inc
5226
+ */
5227
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5228
+ exports.KTContextMenu = void 0;
5229
+ var context_menu_1 = __webpack_require__(/*! ./context-menu */ "./src/components/context-menu/context-menu.ts");
5230
+ Object.defineProperty(exports, "KTContextMenu", ({ enumerable: true, get: function () { return context_menu_1.KTContextMenu; } }));
5231
+
5232
+
5233
+ /***/ }),
5234
+
5235
+ /***/ "./src/components/datatable/datatable-checkbox.ts":
5236
+ /*!********************************************************!*\
5237
+ !*** ./src/components/datatable/datatable-checkbox.ts ***!
5238
+ \********************************************************/
5239
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
5240
+
5241
+
5242
+ /**
5243
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
5244
+ * Copyright 2025 by Keenthemes Inc
5245
+ */
5246
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
5247
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
5248
+ if (ar || !(i in from)) {
5249
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5250
+ ar[i] = from[i];
5251
+ }
5252
+ }
5253
+ return to.concat(ar || Array.prototype.slice.call(from));
5254
+ };
5255
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5256
+ exports.createCheckboxHandler = createCheckboxHandler;
5257
+ var event_handler_1 = __webpack_require__(/*! ../../helpers/event-handler */ "./src/helpers/event-handler.ts");
5258
+ // Main function to create checkbox logic for a datatable instance
5259
+ function createCheckboxHandler(element, config, fireEvent) {
5260
+ var _a;
5261
+ var headerChecked = false;
5262
+ var headerCheckElement = null;
5263
+ var targetElements = null;
5264
+ // Default: preserve selection across all pages
5265
+ var preserveSelection = ((_a = config.checkbox) === null || _a === void 0 ? void 0 : _a.preserveSelection) !== false;
5266
+ // Helper: get selectedRows from state, always as string[]
5267
+ function getSelectedRows() {
5268
+ if (!config._state)
5269
+ config._state = {};
5270
+ if (!Array.isArray(config._state.selectedRows))
5271
+ config._state.selectedRows = [];
5272
+ return config._state.selectedRows.map(String);
5273
+ }
5274
+ // Helper: set selectedRows in state
5275
+ function setSelectedRows(rows) {
5276
+ if (!config._state)
5277
+ config._state = {};
5278
+ config._state.selectedRows = Array.from(new Set(rows.map(String)));
5279
+ }
5280
+ // Helper: get all visible row IDs (values)
5281
+ function getVisibleRowIds() {
5282
+ if (!targetElements)
5283
+ return [];
5284
+ return Array.from(targetElements)
5285
+ .map(function (el) { return el.value; })
5286
+ .filter(function (v) { return v != null && v !== ''; });
5287
+ }
5288
+ // Listener for header checkbox
5289
+ var checkboxListener = function (event) {
5290
+ checkboxToggle(event);
5291
+ };
5292
+ function init() {
5293
+ headerCheckElement = element.querySelector(config.attributes.check);
5294
+ if (!headerCheckElement)
5295
+ return;
5296
+ headerChecked = headerCheckElement.checked;
5297
+ targetElements = element.querySelectorAll(config.attributes.checkbox);
5298
+ checkboxHandler();
5299
+ reapplyCheckedStates();
5300
+ updateHeaderCheckboxState();
5301
+ }
5302
+ function checkboxHandler() {
5303
+ if (!headerCheckElement)
5304
+ return;
5305
+ headerCheckElement.addEventListener('click', checkboxListener);
5306
+ event_handler_1.default.on(document.body, config.attributes.checkbox, 'input', function (event) {
5307
+ handleRowCheckboxChange(event);
5308
+ });
5309
+ }
5310
+ // When a row checkbox is changed
5311
+ function handleRowCheckboxChange(event) {
5312
+ var input = event.target;
5313
+ if (!input)
5314
+ return;
5315
+ var value = input.value;
5316
+ var selectedRows = getSelectedRows();
5317
+ var wasChecked = selectedRows.includes(value);
5318
+ var isNowChecked = input.checked;
5319
+ // Update state first
5320
+ if (isNowChecked) {
5321
+ if (!wasChecked)
5322
+ selectedRows.push(value);
5323
+ }
5324
+ else {
5325
+ selectedRows = selectedRows.filter(function (v) { return v !== value; });
5326
+ }
5327
+ setSelectedRows(selectedRows);
5328
+ updateHeaderCheckboxState();
5329
+ // Fire specific checked/unchecked events after state is updated
5330
+ if (isNowChecked && !wasChecked) {
5331
+ fireEvent('checked');
5332
+ }
5333
+ else if (!isNowChecked && wasChecked) {
5334
+ fireEvent('unchecked');
5335
+ }
5336
+ // Always fire changed event for backward compatibility
5337
+ fireEvent('changed');
5338
+ }
5339
+ // When the header checkbox is toggled
5340
+ function checkboxToggle(_event) {
5341
+ var checked = !isChecked();
5342
+ // Update state first, then fire events
5343
+ change(checked);
5344
+ // Fire checked/unchecked events after state is updated
5345
+ var eventType = checked ? 'checked' : 'unchecked';
5346
+ fireEvent(eventType);
5347
+ }
5348
+ // Change all visible checkboxes and update selectedRows
5349
+ function change(checked) {
5350
+ var payload = { cancel: false };
5351
+ fireEvent('change', payload);
5352
+ if (payload.cancel === true)
5353
+ return;
5354
+ headerChecked = checked;
5355
+ if (headerCheckElement)
5356
+ headerCheckElement.checked = checked;
5357
+ if (targetElements) {
5358
+ var visibleIds_1 = getVisibleRowIds();
5359
+ var selectedRows = getSelectedRows();
5360
+ if (checked) {
5361
+ // Add all visible IDs to selectedRows
5362
+ selectedRows = preserveSelection
5363
+ ? Array.from(new Set(__spreadArray(__spreadArray([], selectedRows, true), visibleIds_1, true)))
5364
+ : visibleIds_1;
5365
+ }
5366
+ else {
5367
+ // Remove all visible IDs from selectedRows
5368
+ selectedRows = preserveSelection
5369
+ ? selectedRows.filter(function (v) { return !visibleIds_1.includes(v); })
5370
+ : [];
5371
+ }
5372
+ setSelectedRows(selectedRows);
5373
+ // Update visible checkboxes
5374
+ targetElements.forEach(function (element) {
5375
+ if (element) {
5376
+ element.checked = checked;
5377
+ }
5378
+ });
5379
+ }
5380
+ updateHeaderCheckboxState();
5381
+ fireEvent('changed');
5382
+ }
5383
+ // Reapply checked state to visible checkboxes based on selectedRows
5384
+ function reapplyCheckedStates() {
5385
+ var selectedRows = getSelectedRows();
5386
+ if (!targetElements)
5387
+ return;
5388
+ targetElements.forEach(function (element) {
5389
+ var _a;
5390
+ if (!element)
5391
+ return;
5392
+ var value = element.value;
5393
+ element.checked = selectedRows.includes(value);
5394
+ // Update row class
5395
+ var row = element.closest('tr');
5396
+ if (row && ((_a = config.checkbox) === null || _a === void 0 ? void 0 : _a.checkedClass)) {
5397
+ if (element.checked) {
5398
+ row.classList.add(config.checkbox.checkedClass);
5399
+ }
5400
+ else {
5401
+ row.classList.remove(config.checkbox.checkedClass);
5402
+ }
5403
+ }
5404
+ });
5405
+ }
5406
+ // Update header checkbox state (checked/indeterminate/unchecked)
5407
+ function updateHeaderCheckboxState() {
5408
+ if (!headerCheckElement || !targetElements)
5409
+ return;
5410
+ var total = targetElements.length;
5411
+ var checked = 0;
5412
+ for (var i = 0; i < total; i++) {
5413
+ if (targetElements[i].checked)
5414
+ checked++;
5415
+ }
5416
+ if (checked === 0) {
5417
+ headerCheckElement.indeterminate = false;
5418
+ headerCheckElement.checked = false;
5419
+ headerChecked = false;
5420
+ }
5421
+ else if (checked > 0 && checked < total) {
5422
+ headerCheckElement.indeterminate = true;
5423
+ headerCheckElement.checked = false;
5424
+ headerChecked = false;
5425
+ }
5426
+ else if (checked === total) {
5427
+ headerCheckElement.indeterminate = false;
5428
+ headerCheckElement.checked = true;
5429
+ headerChecked = true;
5430
+ }
5431
+ }
5432
+ // Fix: isChecked() implementation
5433
+ function isChecked() {
5434
+ return headerChecked;
5435
+ }
5436
+ function getChecked() {
5437
+ return getSelectedRows();
5438
+ }
5439
+ function check() {
5440
+ change(true);
5441
+ reapplyCheckedStates();
5442
+ updateHeaderCheckboxState();
5443
+ }
5444
+ function uncheck() {
5445
+ change(false);
5446
+ reapplyCheckedStates();
5447
+ updateHeaderCheckboxState();
5448
+ }
5449
+ function toggle() {
5450
+ checkboxToggle();
5451
+ reapplyCheckedStates();
5452
+ updateHeaderCheckboxState();
5453
+ }
5454
+ function updateState() {
5455
+ // Called after redraw/pagination
5456
+ targetElements = element.querySelectorAll(config.attributes.checkbox);
5457
+ reapplyCheckedStates();
5458
+ updateHeaderCheckboxState();
5459
+ }
5460
+ return {
5461
+ init: init,
5462
+ check: check,
5463
+ uncheck: uncheck,
5464
+ toggle: toggle,
5465
+ isChecked: isChecked,
5466
+ getChecked: getChecked,
5467
+ updateState: updateState,
5468
+ };
5469
+ }
5470
+
5471
+
5472
+ /***/ }),
5473
+
5474
+ /***/ "./src/components/datatable/datatable-event-adapter.ts":
5475
+ /*!*************************************************************!*\
5476
+ !*** ./src/components/datatable/datatable-event-adapter.ts ***!
5477
+ \*************************************************************/
5478
+ /***/ (function(__unused_webpack_module, exports) {
5479
+
5480
+
5481
+ /**
5482
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
5483
+ * Copyright 2025 by Keenthemes Inc
5484
+ */
5485
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5486
+ exports.createDataTableEventAdapter = createDataTableEventAdapter;
5487
+ function createDataTableEventAdapter(fireEvent, dispatchEvent) {
5488
+ return {
5489
+ emit: function (eventName, eventData) {
5490
+ fireEvent(eventName, eventData);
5491
+ dispatchEvent(eventName, eventData);
5492
+ },
5493
+ };
5494
+ }
5495
+
5496
+
5497
+ /***/ }),
5498
+
5499
+ /***/ "./src/components/datatable/datatable-local-provider.ts":
5500
+ /*!**************************************************************!*\
5501
+ !*** ./src/components/datatable/datatable-local-provider.ts ***!
5502
+ \**************************************************************/
5503
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
5504
+
5505
+
5506
+ /**
5507
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
5508
+ * Copyright 2025 by Keenthemes Inc
5509
+ */
5510
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5511
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5512
+ return new (P || (P = Promise))(function (resolve, reject) {
5513
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5514
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
5515
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
5516
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
5517
+ });
5518
+ };
5519
+ var __generator = (this && this.__generator) || function (thisArg, body) {
5520
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
5521
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
5522
+ function verb(n) { return function (v) { return step([n, v]); }; }
5523
+ function step(op) {
5524
+ if (f) throw new TypeError("Generator is already executing.");
5525
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
5526
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
5527
+ if (y = 0, t) op = [op[0] & 2, t.value];
5528
+ switch (op[0]) {
5529
+ case 0: case 1: t = op; break;
5530
+ case 4: _.label++; return { value: op[1], done: false };
5531
+ case 5: _.label++; y = op[1]; op = [0]; continue;
5532
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
5533
+ default:
5534
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
5535
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
5536
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
5537
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
5538
+ if (t[2]) _.ops.pop();
5539
+ _.trys.pop(); continue;
5540
+ }
5541
+ op = body.call(thisArg, _);
5542
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
5543
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
5544
+ }
5545
+ };
5546
+ var __rest = (this && this.__rest) || function (s, e) {
5547
+ var t = {};
5548
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5549
+ t[p] = s[p];
5550
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
5551
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
5552
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
5553
+ t[p[i]] = s[p[i]];
5554
+ }
5555
+ return t;
5556
+ };
5557
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
5558
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
5559
+ if (ar || !(i in from)) {
5560
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5561
+ ar[i] = from[i];
5562
+ }
5563
+ }
5564
+ return to.concat(ar || Array.prototype.slice.call(from));
5565
+ };
5566
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5567
+ exports.KTDataTableLocalDataProvider = void 0;
5568
+ var utils_1 = __webpack_require__(/*! ../../helpers/utils */ "./src/helpers/utils.ts");
5569
+ var KTDataTableLocalDataProvider = /** @class */ (function () {
5570
+ function KTDataTableLocalDataProvider(options) {
5571
+ this.options = options;
5572
+ }
5573
+ KTDataTableLocalDataProvider.prototype.fetch = function () {
5574
+ return __awaiter(this, void 0, void 0, function () {
5575
+ return __generator(this, function (_a) {
5576
+ return [2 /*return*/, this.fetchSync()];
5577
+ });
5578
+ });
5579
+ };
5580
+ KTDataTableLocalDataProvider.prototype.fetchSync = function () {
5581
+ var state = this.options.stateStore.getState();
5582
+ var originalData = state.originalData;
5583
+ if (!this.options.elements().tableElement ||
5584
+ originalData === undefined ||
5585
+ this.tableConfigInvalidate() ||
5586
+ this.localTableHeaderInvalidate() ||
5587
+ this.localTableContentInvalidate()) {
5588
+ var _a = this.localExtractTableContent(), originalData_1 = _a.originalData, originalDataAttributes = _a.originalDataAttributes;
5589
+ this.options.stateStore.setOriginalData(originalData_1, originalDataAttributes);
5590
+ }
5591
+ originalData = this.options.stateStore.getState().originalData;
5592
+ var data = __spreadArray([], originalData, true);
5593
+ var filteredData = data;
5594
+ var _b = this.options.stateStore.getState(), sortField = _b.sortField, sortOrder = _b.sortOrder, page = _b.page, pageSize = _b.pageSize, search = _b.search;
5595
+ if (search) {
5596
+ var searchTerm = typeof search === 'string' ? search : '';
5597
+ filteredData = data = this.options.config.search.callback.call(this, data, searchTerm);
5598
+ }
5599
+ if (sortField !== undefined &&
5600
+ sortOrder !== undefined &&
5601
+ sortOrder !== '' &&
5602
+ typeof this.options.config.sort.callback === 'function') {
5603
+ data = this.options.config.sort.callback.call(this, data, sortField, sortOrder);
5604
+ }
5605
+ if ((data === null || data === void 0 ? void 0 : data.length) > 0) {
5606
+ var startIndex = (page - 1) * pageSize;
5607
+ var endIndex = startIndex + pageSize;
5608
+ data = data.slice(startIndex, endIndex);
5609
+ }
5610
+ return {
5611
+ data: data,
5612
+ totalItems: filteredData.length,
5613
+ };
5614
+ };
5615
+ KTDataTableLocalDataProvider.prototype.localTableContentInvalidate = function () {
5616
+ var tbodyElement = this.options.elements().tbodyElement;
5617
+ var checksum = utils_1.default.checksum(JSON.stringify(tbodyElement.innerHTML));
5618
+ if (this.options.stateStore.getState()._contentChecksum !== checksum) {
5619
+ this.options.stateStore.patchState({ _contentChecksum: checksum });
5620
+ return true;
5621
+ }
5622
+ return false;
5623
+ };
5624
+ KTDataTableLocalDataProvider.prototype.tableConfigInvalidate = function () {
5625
+ var _a = this.options.config, _state = _a._state, restConfig = __rest(_a, ["_state"]);
5626
+ var checksum = utils_1.default.checksum(JSON.stringify(restConfig));
5627
+ if (_state._configChecksum !== checksum) {
5628
+ this.options.stateStore.patchState({ _configChecksum: checksum });
5629
+ return true;
5630
+ }
5631
+ return false;
5632
+ };
5633
+ KTDataTableLocalDataProvider.prototype.localExtractTableContent = function () {
5634
+ var originalData = [];
5635
+ var originalDataAttributes = [];
5636
+ var _a = this.options.elements(), tbodyElement = _a.tbodyElement, theadElement = _a.theadElement;
5637
+ this.options.storeOriginalClasses();
5638
+ var rows = tbodyElement.querySelectorAll('tr');
5639
+ var allThs = theadElement
5640
+ ? theadElement.querySelectorAll('th')
5641
+ : [];
5642
+ var ths = Array.from(allThs).filter(function (th) {
5643
+ return th.hasAttribute('data-kt-datatable-column');
5644
+ });
5645
+ var columnsByIndex = ths.length > 0 && ths.length !== allThs.length ? Array.from(allThs) : ths;
5646
+ rows.forEach(function (row) {
5647
+ var dataRow = {};
5648
+ var dataRowAttribute = {};
5649
+ row.querySelectorAll('td').forEach(function (td, index) {
5650
+ var _a, _b, _c;
5651
+ var colName = (_a = columnsByIndex[index]) === null || _a === void 0 ? void 0 : _a.getAttribute('data-kt-datatable-column');
5652
+ if (colName) {
5653
+ dataRow[colName] = (_b = td.innerHTML) === null || _b === void 0 ? void 0 : _b.trim();
5654
+ }
5655
+ else {
5656
+ dataRow[index] = (_c = td.innerHTML) === null || _c === void 0 ? void 0 : _c.trim();
5657
+ }
5658
+ });
5659
+ if (Object.keys(dataRow).length > 0) {
5660
+ originalData.push(dataRow);
5661
+ originalDataAttributes.push(dataRowAttribute);
5662
+ }
5663
+ });
5664
+ return { originalData: originalData, originalDataAttributes: originalDataAttributes };
5665
+ };
5666
+ KTDataTableLocalDataProvider.prototype.localTableHeaderInvalidate = function () {
5667
+ var originalData = this.options.stateStore.getState().originalData;
5668
+ var theadElement = this.options.elements().theadElement;
5669
+ var totalColumns = originalData.length
5670
+ ? Object.keys(originalData[0]).length
5671
+ : 0;
5672
+ var allThs = theadElement
5673
+ ? theadElement.querySelectorAll('th')
5674
+ : [];
5675
+ var thsWithColumn = Array.from(allThs).filter(function (th) {
5676
+ return th.hasAttribute('data-kt-datatable-column');
5677
+ });
5678
+ var currentTableHeaders = thsWithColumn.length > 0
5679
+ ? thsWithColumn.length !== allThs.length
5680
+ ? allThs.length
5681
+ : thsWithColumn.length
5682
+ : this.options.getLogicalColumnCount();
5683
+ return currentTableHeaders !== totalColumns;
5684
+ };
5685
+ return KTDataTableLocalDataProvider;
5686
+ }());
5687
+ exports.KTDataTableLocalDataProvider = KTDataTableLocalDataProvider;
5688
+
5689
+
5690
+ /***/ }),
5691
+
5692
+ /***/ "./src/components/datatable/datatable-pagination-renderer.ts":
5693
+ /*!*******************************************************************!*\
5694
+ !*** ./src/components/datatable/datatable-pagination-renderer.ts ***!
5695
+ \*******************************************************************/
5696
+ /***/ (function(__unused_webpack_module, exports) {
5697
+
5698
+
5699
+ /**
5700
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
5701
+ * Copyright 2025 by Keenthemes Inc
5702
+ */
5703
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5704
+ exports.KTDataTableDomPaginationRenderer = void 0;
5705
+ var KTDataTableDomPaginationRenderer = /** @class */ (function () {
5706
+ function KTDataTableDomPaginationRenderer() {
5707
+ }
5708
+ KTDataTableDomPaginationRenderer.prototype.render = function (input) {
5709
+ var _this = this;
5710
+ this.removeChildElements(input.sizeElement);
5711
+ this.createPageSizeControls(input);
5712
+ this.removeChildElements(input.paginationElement);
5713
+ this.createPaginationControls(input);
5714
+ return function () {
5715
+ if (input.sizeElement) {
5716
+ input.sizeElement.onchange = null;
5717
+ }
5718
+ _this.removeChildElements(input.paginationElement);
5719
+ };
5720
+ };
5721
+ KTDataTableDomPaginationRenderer.prototype.removeChildElements = function (container) {
5722
+ if (!container) {
5723
+ return;
5724
+ }
5725
+ while (container.firstChild) {
5726
+ container.removeChild(container.firstChild);
5727
+ }
5728
+ };
5729
+ KTDataTableDomPaginationRenderer.prototype.createPageSizeControls = function (input) {
5730
+ if (!input.sizeElement) {
5731
+ return input.sizeElement;
5732
+ }
5733
+ setTimeout(function () {
5734
+ var _a;
5735
+ var options = input.config.pageSizes.map(function (size) {
5736
+ var option = document.createElement('option');
5737
+ option.value = String(size);
5738
+ option.text = String(size);
5739
+ option.selected = input.state.pageSize === size;
5740
+ return option;
5741
+ });
5742
+ (_a = input.sizeElement).append.apply(_a, options);
5743
+ }, 100);
5744
+ input.sizeElement.onchange = function (event) {
5745
+ input.reloadPageSize(Number(event.target.value), 1);
5746
+ };
5747
+ return input.sizeElement;
5748
+ };
5749
+ KTDataTableDomPaginationRenderer.prototype.createPaginationControls = function (input) {
5750
+ if (!input.infoElement ||
5751
+ !input.paginationElement ||
5752
+ input.dataLength === 0) {
5753
+ return null;
5754
+ }
5755
+ this.setPaginationInfoText(input);
5756
+ this.createPaginationButtons(input.paginationElement, input);
5757
+ return input.paginationElement;
5758
+ };
5759
+ KTDataTableDomPaginationRenderer.prototype.setPaginationInfoText = function (input) {
5760
+ input.infoElement.textContent = input.config.info
5761
+ .replace('{start}', (input.state.page - 1) * input.state.pageSize + 1 + '')
5762
+ .replace('{end}', Math.min(input.state.page * input.state.pageSize, input.state.totalItems) + '')
5763
+ .replace('{total}', input.state.totalItems + '');
5764
+ };
5765
+ KTDataTableDomPaginationRenderer.prototype.createPaginationButtons = function (paginationContainer, input) {
5766
+ var _a = input.state, currentPage = _a.page, totalPages = _a.totalPages;
5767
+ var _b = input.config.pagination, previous = _b.previous, next = _b.next, number = _b.number, more = _b.more;
5768
+ var createButton = function (text, className, disabled, handleClick) {
5769
+ var button = document.createElement('button');
5770
+ button.className = className;
5771
+ button.innerHTML = text;
5772
+ button.disabled = disabled;
5773
+ button.onclick = handleClick;
5774
+ return button;
5775
+ };
5776
+ paginationContainer.appendChild(createButton(previous.text, "".concat(previous.class).concat(currentPage === 1 ? ' disabled' : ''), currentPage === 1, function () { return input.paginateData(currentPage - 1); }));
5777
+ if (input.config.pageMore) {
5778
+ var range_1 = this.calculatePageRange(currentPage, totalPages, input.config.pageMoreLimit);
5779
+ if (range_1.start > 1) {
5780
+ paginationContainer.appendChild(createButton(more.text, more.class, false, function () {
5781
+ return input.paginateData(Math.max(1, range_1.start - 1));
5782
+ }));
5783
+ }
5784
+ var _loop_1 = function (i) {
5785
+ paginationContainer.appendChild(createButton(number.text.replace('{page}', i.toString()), "".concat(number.class).concat(currentPage === i ? ' active disabled' : ''), currentPage === i, function () { return input.paginateData(i); }));
5786
+ };
5787
+ for (var i = range_1.start; i <= range_1.end; i++) {
5788
+ _loop_1(i);
5789
+ }
5790
+ if (range_1.end < totalPages) {
5791
+ paginationContainer.appendChild(createButton(more.text, more.class, false, function () {
5792
+ return input.paginateData(Math.min(totalPages, range_1.end + 1));
5793
+ }));
5794
+ }
5795
+ }
5796
+ else {
5797
+ var _loop_2 = function (i) {
5798
+ paginationContainer.appendChild(createButton(number.text.replace('{page}', i.toString()), "".concat(number.class).concat(currentPage === i ? ' active disabled' : ''), currentPage === i, function () { return input.paginateData(i); }));
5799
+ };
5800
+ for (var i = 1; i <= totalPages; i++) {
5801
+ _loop_2(i);
5802
+ }
5803
+ }
5804
+ paginationContainer.appendChild(createButton(next.text, "".concat(next.class).concat(currentPage === totalPages ? ' disabled' : ''), currentPage === totalPages, function () { return input.paginateData(currentPage + 1); }));
5805
+ };
5806
+ KTDataTableDomPaginationRenderer.prototype.calculatePageRange = function (currentPage, totalPages, maxButtons) {
5807
+ var startPage, endPage;
5808
+ var halfMaxButtons = Math.floor(maxButtons / 2);
5809
+ if (totalPages <= maxButtons) {
5810
+ startPage = 1;
5811
+ endPage = totalPages;
5812
+ }
5813
+ else {
5814
+ startPage = Math.max(currentPage - halfMaxButtons, 1);
5815
+ endPage = Math.min(startPage + maxButtons - 1, totalPages);
5816
+ if (endPage - startPage < maxButtons - 1) {
5817
+ startPage = Math.max(endPage - maxButtons + 1, 1);
5818
+ }
5819
+ }
5820
+ return { start: startPage, end: endPage };
5821
+ };
5822
+ return KTDataTableDomPaginationRenderer;
5823
+ }());
5824
+ exports.KTDataTableDomPaginationRenderer = KTDataTableDomPaginationRenderer;
5825
+
5826
+
5827
+ /***/ }),
5828
+
5829
+ /***/ "./src/components/datatable/datatable-remote-provider.ts":
5830
+ /*!***************************************************************!*\
5831
+ !*** ./src/components/datatable/datatable-remote-provider.ts ***!
5832
+ \***************************************************************/
5833
+ /***/ (function(__unused_webpack_module, exports) {
5834
+
5835
+
5836
+ /**
5837
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
5838
+ * Copyright 2025 by Keenthemes Inc
5839
+ */
5840
+ var __assign = (this && this.__assign) || function () {
5841
+ __assign = Object.assign || function(t) {
5842
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5843
+ s = arguments[i];
5844
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
5845
+ t[p] = s[p];
5846
+ }
5847
+ return t;
5848
+ };
5849
+ return __assign.apply(this, arguments);
5850
+ };
5851
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
5852
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5853
+ return new (P || (P = Promise))(function (resolve, reject) {
5854
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5855
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
5856
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
5857
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
5858
+ });
5859
+ };
5860
+ var __generator = (this && this.__generator) || function (thisArg, body) {
5861
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
5862
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
5863
+ function verb(n) { return function (v) { return step([n, v]); }; }
5864
+ function step(op) {
5865
+ if (f) throw new TypeError("Generator is already executing.");
5866
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
5867
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
5868
+ if (y = 0, t) op = [op[0] & 2, t.value];
5869
+ switch (op[0]) {
5870
+ case 0: case 1: t = op; break;
5871
+ case 4: _.label++; return { value: op[1], done: false };
5872
+ case 5: _.label++; y = op[1]; op = [0]; continue;
5873
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
5874
+ default:
5875
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
5876
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
5877
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
5878
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
5879
+ if (t[2]) _.ops.pop();
5880
+ _.trys.pop(); continue;
5881
+ }
5882
+ op = body.call(thisArg, _);
5883
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
5884
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
5885
+ }
5886
+ };
5887
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
5888
+ exports.KTDataTableRemoteDataProvider = void 0;
5889
+ var KTDataTableRemoteDataProvider = /** @class */ (function () {
5890
+ function KTDataTableRemoteDataProvider(options) {
5891
+ this.options = options;
5892
+ this.abortController = null;
5893
+ this.requestId = 0;
5894
+ }
5895
+ KTDataTableRemoteDataProvider.prototype.dispose = function () {
5896
+ if (this.abortController) {
5897
+ this.abortController.abort();
5898
+ this.abortController = null;
5899
+ }
5900
+ };
5901
+ KTDataTableRemoteDataProvider.prototype.fetch = function () {
5902
+ return __awaiter(this, void 0, void 0, function () {
5903
+ var currentRequestId, queryParams, response, error_1, responseData, error_2;
5904
+ return __generator(this, function (_a) {
5905
+ switch (_a.label) {
5906
+ case 0:
5907
+ currentRequestId = ++this.requestId;
5908
+ queryParams = this.getQueryParamsForFetchRequest();
5909
+ _a.label = 1;
5910
+ case 1:
5911
+ _a.trys.push([1, 3, , 4]);
5912
+ return [4 /*yield*/, this.performFetchRequest(queryParams)];
5913
+ case 2:
5914
+ response = _a.sent();
5915
+ return [3 /*break*/, 4];
5916
+ case 3:
5917
+ error_1 = _a.sent();
5918
+ if (error_1.name === 'AbortError') {
5919
+ return [2 /*return*/, { data: [], totalItems: 0, skipped: true }];
5920
+ }
5921
+ throw error_1;
5922
+ case 4:
5923
+ if (currentRequestId !== this.requestId) {
5924
+ return [2 /*return*/, { data: [], totalItems: 0, skipped: true }];
5925
+ }
5926
+ responseData = null;
5927
+ _a.label = 5;
5928
+ case 5:
5929
+ _a.trys.push([5, 7, , 8]);
5930
+ return [4 /*yield*/, response.json()];
5931
+ case 6:
5932
+ responseData = _a.sent();
5933
+ return [3 /*break*/, 8];
5934
+ case 7:
5935
+ error_2 = _a.sent();
5936
+ this.options.eventAdapter.emit('parseError', {
5937
+ response: response,
5938
+ error: String(error_2),
5939
+ status: response.status,
5940
+ statusText: response.statusText,
5941
+ });
5942
+ return [2 /*return*/, { data: [], totalItems: 0, skipped: true }];
5943
+ case 8:
5944
+ if (currentRequestId !== this.requestId) {
5945
+ return [2 /*return*/, { data: [], totalItems: 0, skipped: true }];
5946
+ }
5947
+ this.options.eventAdapter.emit('fetched', { response: responseData });
5948
+ if (typeof this.options.config.mapResponse === 'function') {
5949
+ responseData = this.options.config.mapResponse.call(this, responseData);
5950
+ }
5951
+ return [2 /*return*/, {
5952
+ data: responseData.data,
5953
+ totalItems: responseData.totalCount,
5954
+ response: responseData,
5955
+ }];
4926
5956
  }
4927
5957
  });
4928
- }
4929
- updateHeaderCheckboxState();
4930
- fireEvent('changed');
4931
- }
4932
- // Reapply checked state to visible checkboxes based on selectedRows
4933
- function reapplyCheckedStates() {
4934
- var selectedRows = getSelectedRows();
4935
- if (!targetElements)
4936
- return;
4937
- targetElements.forEach(function (element) {
4938
- var _a;
4939
- if (!element)
4940
- return;
4941
- var value = element.value;
4942
- element.checked = selectedRows.includes(value);
4943
- // Update row class
4944
- var row = element.closest('tr');
4945
- if (row && ((_a = config.checkbox) === null || _a === void 0 ? void 0 : _a.checkedClass)) {
4946
- if (element.checked) {
4947
- row.classList.add(config.checkbox.checkedClass);
4948
- }
4949
- else {
4950
- row.classList.remove(config.checkbox.checkedClass);
4951
- }
4952
- }
4953
5958
  });
4954
- }
4955
- // Update header checkbox state (checked/indeterminate/unchecked)
4956
- function updateHeaderCheckboxState() {
4957
- if (!headerCheckElement || !targetElements)
4958
- return;
4959
- var total = targetElements.length;
4960
- var checked = 0;
4961
- for (var i = 0; i < total; i++) {
4962
- if (targetElements[i].checked)
4963
- checked++;
5959
+ };
5960
+ KTDataTableRemoteDataProvider.prototype.getQueryParamsForFetchRequest = function () {
5961
+ var _a = this.options.stateStore.getState(), page = _a.page, pageSize = _a.pageSize, sortField = _a.sortField, sortOrder = _a.sortOrder, filters = _a.filters, search = _a.search;
5962
+ var queryParams = new URLSearchParams();
5963
+ queryParams.set('page', String(page));
5964
+ queryParams.set('size', String(pageSize));
5965
+ if (sortOrder !== undefined) {
5966
+ queryParams.set('sortOrder', String(sortOrder));
4964
5967
  }
4965
- if (checked === 0) {
4966
- headerCheckElement.indeterminate = false;
4967
- headerCheckElement.checked = false;
4968
- headerChecked = false;
5968
+ if (sortField !== undefined) {
5969
+ queryParams.set('sortField', String(sortField));
4969
5970
  }
4970
- else if (checked > 0 && checked < total) {
4971
- headerCheckElement.indeterminate = true;
4972
- headerCheckElement.checked = false;
4973
- headerChecked = false;
5971
+ if (Array.isArray(filters) && filters.length) {
5972
+ queryParams.set('filters', JSON.stringify(filters.map(function (filter) { return ({
5973
+ column: filter.column,
5974
+ type: filter.type,
5975
+ value: filter.value,
5976
+ }); })));
4974
5977
  }
4975
- else if (checked === total) {
4976
- headerCheckElement.indeterminate = false;
4977
- headerCheckElement.checked = true;
4978
- headerChecked = true;
5978
+ if (search) {
5979
+ queryParams.set('search', typeof search === 'object' ? JSON.stringify(search) : search);
4979
5980
  }
4980
- }
4981
- // Fix: isChecked() implementation
4982
- function isChecked() {
4983
- return headerChecked;
4984
- }
4985
- function getChecked() {
4986
- return getSelectedRows();
4987
- }
4988
- function check() {
4989
- change(true);
4990
- reapplyCheckedStates();
4991
- updateHeaderCheckboxState();
4992
- }
4993
- function uncheck() {
4994
- change(false);
4995
- reapplyCheckedStates();
4996
- updateHeaderCheckboxState();
4997
- }
4998
- function toggle() {
4999
- checkboxToggle();
5000
- reapplyCheckedStates();
5001
- updateHeaderCheckboxState();
5002
- }
5003
- function updateState() {
5004
- // Called after redraw/pagination
5005
- targetElements = element.querySelectorAll(config.attributes.checkbox);
5006
- reapplyCheckedStates();
5007
- updateHeaderCheckboxState();
5008
- }
5009
- return {
5010
- init: init,
5011
- check: check,
5012
- uncheck: uncheck,
5013
- toggle: toggle,
5014
- isChecked: isChecked,
5015
- getChecked: getChecked,
5016
- updateState: updateState,
5981
+ if (typeof this.options.config.mapRequest === 'function') {
5982
+ queryParams = this.options.config.mapRequest.call(this, queryParams);
5983
+ }
5984
+ return queryParams;
5017
5985
  };
5018
- }
5986
+ KTDataTableRemoteDataProvider.prototype.performFetchRequest = function (queryParams) {
5987
+ return __awaiter(this, void 0, void 0, function () {
5988
+ var requestMethod, requestBody, apiEndpoint, apiEndpointWithQueryParams;
5989
+ var _this = this;
5990
+ return __generator(this, function (_a) {
5991
+ requestMethod = this.options.config.requestMethod;
5992
+ requestBody = undefined;
5993
+ apiEndpoint = this.options.config.apiEndpoint;
5994
+ if (this.abortController) {
5995
+ this.abortController.abort();
5996
+ }
5997
+ this.abortController = new AbortController();
5998
+ if (requestMethod === 'POST') {
5999
+ requestBody = queryParams;
6000
+ }
6001
+ else if (requestMethod === 'GET') {
6002
+ apiEndpointWithQueryParams = this.options.createUrl(apiEndpoint);
6003
+ apiEndpointWithQueryParams.search = queryParams.toString();
6004
+ apiEndpoint = apiEndpointWithQueryParams.toString();
6005
+ }
6006
+ return [2 /*return*/, fetch(apiEndpoint, __assign(__assign({ method: requestMethod, body: requestBody, headers: this.options.config.requestHeaders }, (this.options.config.requestCredentials && {
6007
+ credentials: this.options.config.requestCredentials,
6008
+ })), (this.abortController && { signal: this.abortController.signal }))).catch(function (error) {
6009
+ if (error.name === 'AbortError') {
6010
+ return Promise.reject(error);
6011
+ }
6012
+ _this.options.eventAdapter.emit('error', { error: error });
6013
+ _this.options.noticeOnTable('Error performing fetch request: ' + String(error));
6014
+ throw error;
6015
+ })];
6016
+ });
6017
+ });
6018
+ };
6019
+ return KTDataTableRemoteDataProvider;
6020
+ }());
6021
+ exports.KTDataTableRemoteDataProvider = KTDataTableRemoteDataProvider;
5019
6022
 
5020
6023
 
5021
6024
  /***/ }),
@@ -5186,9 +6189,241 @@ function createSortHandler(config, theadElement, getState, setState, fireEvent,
5186
6189
  updateData();
5187
6190
  });
5188
6191
  });
5189
- }
5190
- return { initSort: initSort, sortData: sortData, toggleSortOrder: toggleSortOrder, setSortIcon: setSortIcon };
5191
- }
6192
+ }
6193
+ return { initSort: initSort, sortData: sortData, toggleSortOrder: toggleSortOrder, setSortIcon: setSortIcon };
6194
+ }
6195
+
6196
+
6197
+ /***/ }),
6198
+
6199
+ /***/ "./src/components/datatable/datatable-state-store.ts":
6200
+ /*!***********************************************************!*\
6201
+ !*** ./src/components/datatable/datatable-state-store.ts ***!
6202
+ \***********************************************************/
6203
+ /***/ (function(__unused_webpack_module, exports) {
6204
+
6205
+
6206
+ /**
6207
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
6208
+ * Copyright 2025 by Keenthemes Inc
6209
+ */
6210
+ var __assign = (this && this.__assign) || function () {
6211
+ __assign = Object.assign || function(t) {
6212
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
6213
+ s = arguments[i];
6214
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6215
+ t[p] = s[p];
6216
+ }
6217
+ return t;
6218
+ };
6219
+ return __assign.apply(this, arguments);
6220
+ };
6221
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
6222
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
6223
+ if (ar || !(i in from)) {
6224
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6225
+ ar[i] = from[i];
6226
+ }
6227
+ }
6228
+ return to.concat(ar || Array.prototype.slice.call(from));
6229
+ };
6230
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
6231
+ exports.KTDataTableConfigStateStore = void 0;
6232
+ var KTDataTableConfigStateStore = /** @class */ (function () {
6233
+ function KTDataTableConfigStateStore(config) {
6234
+ this.config = config;
6235
+ this.ensureState();
6236
+ }
6237
+ KTDataTableConfigStateStore.prototype.getState = function () {
6238
+ this.ensureState();
6239
+ return __assign({ page: 1, sortField: null, sortOrder: '', pageSize: this.config.pageSize, filters: [] }, this.config._state);
6240
+ };
6241
+ KTDataTableConfigStateStore.prototype.replaceState = function (state) {
6242
+ this.config._state = state;
6243
+ this.ensureState();
6244
+ };
6245
+ KTDataTableConfigStateStore.prototype.patchState = function (state) {
6246
+ this.ensureState();
6247
+ this.config._state = __assign(__assign({}, this.config._state), state);
6248
+ };
6249
+ KTDataTableConfigStateStore.prototype.setPage = function (page) {
6250
+ this.patchState({ page: page });
6251
+ };
6252
+ KTDataTableConfigStateStore.prototype.setPageSize = function (pageSize, page) {
6253
+ if (page === void 0) { page = 1; }
6254
+ this.patchState({ pageSize: pageSize, page: page });
6255
+ };
6256
+ KTDataTableConfigStateStore.prototype.setSort = function (field, order) {
6257
+ this.patchState({
6258
+ sortField: field,
6259
+ sortOrder: order,
6260
+ });
6261
+ };
6262
+ KTDataTableConfigStateStore.prototype.setSearch = function (search) {
6263
+ this.patchState({ search: search, page: 1 });
6264
+ };
6265
+ KTDataTableConfigStateStore.prototype.setFilter = function (filter) {
6266
+ var filters = __spreadArray(__spreadArray([], (this.getState().filters || []).filter(function (currentFilter) { return currentFilter.column !== filter.column; }), true), [
6267
+ filter,
6268
+ ], false);
6269
+ this.patchState({ filters: filters, page: 1 });
6270
+ };
6271
+ KTDataTableConfigStateStore.prototype.setOriginalData = function (originalData, originalDataAttributes) {
6272
+ this.patchState({
6273
+ originalData: originalData,
6274
+ originalDataAttributes: originalDataAttributes,
6275
+ });
6276
+ };
6277
+ KTDataTableConfigStateStore.prototype.ensureState = function () {
6278
+ if (!this.config._state) {
6279
+ this.config._state = {};
6280
+ }
6281
+ };
6282
+ return KTDataTableConfigStateStore;
6283
+ }());
6284
+ exports.KTDataTableConfigStateStore = KTDataTableConfigStateStore;
6285
+
6286
+
6287
+ /***/ }),
6288
+
6289
+ /***/ "./src/components/datatable/datatable-table-renderer.ts":
6290
+ /*!**************************************************************!*\
6291
+ !*** ./src/components/datatable/datatable-table-renderer.ts ***!
6292
+ \**************************************************************/
6293
+ /***/ (function(__unused_webpack_module, exports) {
6294
+
6295
+
6296
+ /**
6297
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
6298
+ * Copyright 2025 by Keenthemes Inc
6299
+ */
6300
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
6301
+ exports.KTDataTableDomTableRenderer = void 0;
6302
+ var KTDataTableDomTableRenderer = /** @class */ (function () {
6303
+ function KTDataTableDomTableRenderer() {
6304
+ }
6305
+ KTDataTableDomTableRenderer.prototype.render = function (input) {
6306
+ while (input.tableElement.tBodies.length) {
6307
+ input.tableElement.removeChild(input.tableElement.tBodies[0]);
6308
+ }
6309
+ var tbodyElement = input.tableElement.createTBody();
6310
+ if (input.originalTbodyClass) {
6311
+ tbodyElement.className = input.originalTbodyClass;
6312
+ }
6313
+ this.renderContent(input, tbodyElement);
6314
+ return tbodyElement;
6315
+ };
6316
+ KTDataTableDomTableRenderer.prototype.notice = function (tableElement, getLogicalColumnCount, message) {
6317
+ if (message === void 0) { message = ''; }
6318
+ var row = tableElement.tBodies[0].insertRow();
6319
+ var cell = row.insertCell();
6320
+ var logicalCount = getLogicalColumnCount();
6321
+ cell.colSpan = logicalCount > 0 ? logicalCount : 1;
6322
+ cell.innerHTML = message;
6323
+ };
6324
+ KTDataTableDomTableRenderer.prototype.renderContent = function (input, tbodyElement) {
6325
+ var _this = this;
6326
+ var fragment = document.createDocumentFragment();
6327
+ tbodyElement.textContent = '';
6328
+ if (input.data.length === 0) {
6329
+ this.notice(input.tableElement, input.getLogicalColumnCount, input.config.infoEmpty || '');
6330
+ return tbodyElement;
6331
+ }
6332
+ var allThs = input.theadElement
6333
+ ? input.theadElement.querySelectorAll('th')
6334
+ : [];
6335
+ var ths = Array.from(allThs).filter(function (th) {
6336
+ return th.hasAttribute('data-kt-datatable-column');
6337
+ });
6338
+ var columnsToRender = ths.length > 0 && ths.length !== allThs.length ? Array.from(allThs) : ths;
6339
+ var logicalColumnCount = columnsToRender.length > 0
6340
+ ? columnsToRender.length
6341
+ : input.getLogicalColumnCount();
6342
+ input.data.forEach(function (item, rowIndex) {
6343
+ var row = document.createElement('tr');
6344
+ if (input.originalTrClasses && input.originalTrClasses[rowIndex]) {
6345
+ row.className = input.originalTrClasses[rowIndex];
6346
+ }
6347
+ if (!input.config.columns) {
6348
+ _this.renderImplicitColumns(input, row, item, rowIndex, {
6349
+ columnsToRender: columnsToRender,
6350
+ logicalColumnCount: logicalColumnCount,
6351
+ });
6352
+ }
6353
+ else {
6354
+ _this.renderConfiguredColumns(input, row, item, rowIndex);
6355
+ }
6356
+ fragment.appendChild(row);
6357
+ });
6358
+ tbodyElement.appendChild(fragment);
6359
+ return tbodyElement;
6360
+ };
6361
+ KTDataTableDomTableRenderer.prototype.renderImplicitColumns = function (input, row, item, rowIndex, options) {
6362
+ var dataRowAttributes = input.getState().originalDataAttributes
6363
+ ? input.getState().originalDataAttributes[rowIndex]
6364
+ : null;
6365
+ for (var colIndex = 0; colIndex < options.logicalColumnCount; colIndex++) {
6366
+ var th = options.columnsToRender[colIndex];
6367
+ var colName = th === null || th === void 0 ? void 0 : th.getAttribute('data-kt-datatable-column');
6368
+ var td = document.createElement('td');
6369
+ var value = void 0;
6370
+ if (colName && Object.prototype.hasOwnProperty.call(item, colName)) {
6371
+ value = item[colName];
6372
+ }
6373
+ else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {
6374
+ value = item[colIndex];
6375
+ }
6376
+ else {
6377
+ value = '';
6378
+ }
6379
+ td.innerHTML = value;
6380
+ this.applyOriginalTdClass(input, td, rowIndex, colIndex);
6381
+ this.applyDataRowAttributes(td, dataRowAttributes, colIndex);
6382
+ row.appendChild(td);
6383
+ }
6384
+ };
6385
+ KTDataTableDomTableRenderer.prototype.renderConfiguredColumns = function (input, row, item, rowIndex) {
6386
+ var _this = this;
6387
+ Object.keys(input.config.columns).forEach(function (key, colIndex) {
6388
+ var td = document.createElement('td');
6389
+ var columnDef = input.config.columns[key];
6390
+ _this.applyOriginalTdClass(input, td, rowIndex, colIndex);
6391
+ if (typeof columnDef.render === 'function') {
6392
+ var result = columnDef.render.call(input.context, item[key], item, input.context);
6393
+ if (result instanceof HTMLElement ||
6394
+ result instanceof DocumentFragment) {
6395
+ td.appendChild(result);
6396
+ }
6397
+ else if (typeof result === 'string') {
6398
+ td.innerHTML = result;
6399
+ }
6400
+ }
6401
+ else {
6402
+ td.textContent = item[key];
6403
+ }
6404
+ if (typeof columnDef.createdCell === 'function') {
6405
+ columnDef.createdCell.call(input.context, td, item[key], item, row);
6406
+ }
6407
+ row.appendChild(td);
6408
+ });
6409
+ };
6410
+ KTDataTableDomTableRenderer.prototype.applyOriginalTdClass = function (input, td, rowIndex, colIndex) {
6411
+ if (input.originalTdClasses &&
6412
+ input.originalTdClasses[rowIndex] &&
6413
+ input.originalTdClasses[rowIndex][colIndex]) {
6414
+ td.className = input.originalTdClasses[rowIndex][colIndex];
6415
+ }
6416
+ };
6417
+ KTDataTableDomTableRenderer.prototype.applyDataRowAttributes = function (td, dataRowAttributes, colIndex) {
6418
+ if (dataRowAttributes && dataRowAttributes[colIndex]) {
6419
+ for (var attr in dataRowAttributes[colIndex]) {
6420
+ td.setAttribute(attr, dataRowAttributes[colIndex][attr]);
6421
+ }
6422
+ }
6423
+ };
6424
+ return KTDataTableDomTableRenderer;
6425
+ }());
6426
+ exports.KTDataTableDomTableRenderer = KTDataTableDomTableRenderer;
5192
6427
 
5193
6428
 
5194
6429
  /***/ }),
@@ -5266,35 +6501,20 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
5266
6501
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
5267
6502
  }
5268
6503
  };
5269
- var __rest = (this && this.__rest) || function (s, e) {
5270
- var t = {};
5271
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5272
- t[p] = s[p];
5273
- if (s != null && typeof Object.getOwnPropertySymbols === "function")
5274
- for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
5275
- if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
5276
- t[p[i]] = s[p[i]];
5277
- }
5278
- return t;
5279
- };
5280
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
5281
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
5282
- if (ar || !(i in from)) {
5283
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
5284
- ar[i] = from[i];
5285
- }
5286
- }
5287
- return to.concat(ar || Array.prototype.slice.call(from));
5288
- };
5289
6504
  Object.defineProperty(exports, "__esModule", ({ value: true }));
5290
6505
  exports.KTDataTable = void 0;
5291
6506
  exports.initAllDataTables = initAllDataTables;
5292
6507
  var component_1 = __webpack_require__(/*! ../component */ "./src/components/component.ts");
5293
- var utils_1 = __webpack_require__(/*! ../../helpers/utils */ "./src/helpers/utils.ts");
5294
6508
  var index_1 = __webpack_require__(/*! ../../index */ "./src/index.ts");
5295
6509
  var data_1 = __webpack_require__(/*! ../../helpers/data */ "./src/helpers/data.ts");
5296
6510
  var datatable_checkbox_1 = __webpack_require__(/*! ./datatable-checkbox */ "./src/components/datatable/datatable-checkbox.ts");
5297
6511
  var datatable_sort_1 = __webpack_require__(/*! ./datatable-sort */ "./src/components/datatable/datatable-sort.ts");
6512
+ var datatable_event_adapter_1 = __webpack_require__(/*! ./datatable-event-adapter */ "./src/components/datatable/datatable-event-adapter.ts");
6513
+ var datatable_local_provider_1 = __webpack_require__(/*! ./datatable-local-provider */ "./src/components/datatable/datatable-local-provider.ts");
6514
+ var datatable_remote_provider_1 = __webpack_require__(/*! ./datatable-remote-provider */ "./src/components/datatable/datatable-remote-provider.ts");
6515
+ var datatable_state_store_1 = __webpack_require__(/*! ./datatable-state-store */ "./src/components/datatable/datatable-state-store.ts");
6516
+ var datatable_pagination_renderer_1 = __webpack_require__(/*! ./datatable-pagination-renderer */ "./src/components/datatable/datatable-pagination-renderer.ts");
6517
+ var datatable_table_renderer_1 = __webpack_require__(/*! ./datatable-table-renderer */ "./src/components/datatable/datatable-table-renderer.ts");
5298
6518
  /**
5299
6519
  * Custom DataTable plugin class with server-side API, pagination, and sorting
5300
6520
  * @classdesc A custom KTComponent class that integrates server-side API, pagination, and sorting functionality into a table.
@@ -5314,18 +6534,9 @@ var KTDataTable = /** @class */ (function (_super) {
5314
6534
  _this._originalTheadClass = ''; // Store original thead class
5315
6535
  _this._originalTdClasses = []; // Store original td classes as a 2D array [row][col]
5316
6536
  _this._originalThClasses = []; // Store original th classes
6537
+ _this._cleanupCallbacks = [];
5317
6538
  _this._data = [];
5318
6539
  _this._isFetching = false;
5319
- /**
5320
- * AbortController for cancelling previous fetch requests
5321
- * Used to prevent race conditions when multiple requests are triggered rapidly
5322
- */
5323
- _this._abortController = null;
5324
- /**
5325
- * Request ID counter for tracking request sequence
5326
- * Used to detect and ignore stale responses from older requests
5327
- */
5328
- _this._requestId = 0;
5329
6540
  if (data_1.default.has(element, _this._name)) {
5330
6541
  // Already initialized (e.g. by createInstances). Merge user config so columns/sortType etc. apply.
5331
6542
  var existing = KTDataTable.getInstance(element);
@@ -5337,21 +6548,22 @@ var KTDataTable = /** @class */ (function (_super) {
5337
6548
  _this._defaultConfig = _this._initDefaultConfig(config);
5338
6549
  _this._init(element);
5339
6550
  _this._buildConfig();
6551
+ _this._stateStore = new datatable_state_store_1.KTDataTableConfigStateStore(_this._config);
6552
+ _this._eventAdapter = (0, datatable_event_adapter_1.createDataTableEventAdapter)(_this._fireEvent.bind(_this), _this._dispatchEvent.bind(_this));
5340
6553
  // Store the instance directly on the element
5341
6554
  KTDataTable.asElementWithInstance(element).instance = _this;
5342
6555
  _this._initElements();
6556
+ _this._tableRenderer = new datatable_table_renderer_1.KTDataTableDomTableRenderer();
6557
+ _this._paginationRenderer = new datatable_pagination_renderer_1.KTDataTableDomPaginationRenderer();
6558
+ _this._initDataProviders();
5343
6559
  // Initialize checkbox handler
5344
- _this._checkbox = (0, datatable_checkbox_1.createCheckboxHandler)(_this._element, _this._config, function (eventName, eventData) {
5345
- _this._fireEvent(eventName, eventData);
5346
- _this._dispatchEvent(eventName, eventData);
5347
- });
6560
+ _this._checkbox = (0, datatable_checkbox_1.createCheckboxHandler)(_this._element, _this._config, _this._emit.bind(_this));
5348
6561
  // Initialize sort handler
5349
6562
  _this._sortHandler = (0, datatable_sort_1.createSortHandler)(_this._config, _this._theadElement, function () { return ({
5350
6563
  sortField: _this.getState().sortField,
5351
6564
  sortOrder: _this.getState().sortOrder,
5352
6565
  }); }, function (field, order) {
5353
- _this._config._state.sortField = field;
5354
- _this._config._state.sortOrder = order;
6566
+ _this._stateStore.setSort(field, order);
5355
6567
  }, _this._fireEvent.bind(_this), _this._dispatchEvent.bind(_this), _this._updateData.bind(_this));
5356
6568
  _this._sortHandler.initSort();
5357
6569
  if (_this._config.stateSave === false) {
@@ -5361,8 +6573,7 @@ var KTDataTable = /** @class */ (function (_super) {
5361
6573
  _this._loadState();
5362
6574
  }
5363
6575
  _this._updateData();
5364
- _this._fireEvent('init');
5365
- _this._dispatchEvent('init');
6576
+ _this._emit('init');
5366
6577
  return _this;
5367
6578
  }
5368
6579
  KTDataTable.asElementWithInstance = function (element) {
@@ -5371,6 +6582,30 @@ var KTDataTable = /** @class */ (function (_super) {
5371
6582
  KTDataTable.asSearchElementWithDebounce = function (element) {
5372
6583
  return element;
5373
6584
  };
6585
+ KTDataTable.prototype._emit = function (eventName, eventData) {
6586
+ this._eventAdapter.emit(eventName, eventData);
6587
+ };
6588
+ KTDataTable.prototype._initDataProviders = function () {
6589
+ var _this = this;
6590
+ this._localProvider = new datatable_local_provider_1.KTDataTableLocalDataProvider({
6591
+ config: this._config,
6592
+ elements: function () { return ({
6593
+ tableElement: _this._tableElement,
6594
+ tbodyElement: _this._tbodyElement,
6595
+ theadElement: _this._theadElement,
6596
+ }); },
6597
+ getLogicalColumnCount: this._getLogicalColumnCount.bind(this),
6598
+ storeOriginalClasses: this._storeOriginalClasses.bind(this),
6599
+ stateStore: this._stateStore,
6600
+ });
6601
+ this._remoteProvider = new datatable_remote_provider_1.KTDataTableRemoteDataProvider({
6602
+ config: this._config,
6603
+ createUrl: this._createUrl.bind(this),
6604
+ eventAdapter: this._eventAdapter,
6605
+ noticeOnTable: this._noticeOnTable.bind(this),
6606
+ stateStore: this._stateStore,
6607
+ });
6608
+ };
5374
6609
  /**
5375
6610
  * Initialize default configuration for the datatable
5376
6611
  * @param config User-provided configuration options
@@ -5640,32 +6875,39 @@ var KTDataTable = /** @class */ (function (_super) {
5640
6875
  */
5641
6876
  KTDataTable.prototype._updateData = function () {
5642
6877
  return __awaiter(this, void 0, void 0, function () {
5643
- return __generator(this, function (_a) {
5644
- switch (_a.label) {
6878
+ var result, _a;
6879
+ return __generator(this, function (_b) {
6880
+ switch (_b.label) {
5645
6881
  case 0:
5646
6882
  if (this._isFetching)
5647
6883
  return [2 /*return*/]; // Prevent duplicate fetches
5648
6884
  this._isFetching = true;
5649
- _a.label = 1;
6885
+ _b.label = 1;
5650
6886
  case 1:
5651
- _a.trys.push([1, , 8, 9]);
6887
+ _b.trys.push([1, , 8, 9]);
5652
6888
  this._showSpinner(); // Show spinner before fetching data
5653
- if (!(typeof this._config.apiEndpoint === 'undefined')) return [3 /*break*/, 4];
5654
- return [4 /*yield*/, this._fetchDataFromLocal()];
5655
- case 2:
5656
- _a.sent();
5657
- return [4 /*yield*/, this._finalize()];
6889
+ this._emit('fetch');
6890
+ if (!(typeof this._config.apiEndpoint === 'undefined')) return [3 /*break*/, 2];
6891
+ _a = this._localProvider.fetchSync();
6892
+ return [3 /*break*/, 4];
6893
+ case 2: return [4 /*yield*/, this._remoteProvider.fetch()];
5658
6894
  case 3:
5659
- _a.sent();
5660
- return [3 /*break*/, 7];
5661
- case 4: return [4 /*yield*/, this._fetchDataFromServer()];
6895
+ _a = _b.sent();
6896
+ _b.label = 4;
6897
+ case 4:
6898
+ result = _a;
6899
+ if (!!result.skipped) return [3 /*break*/, 6];
6900
+ this._data = result.data;
6901
+ this._stateStore.patchState({ totalItems: result.totalItems });
6902
+ return [4 /*yield*/, this._draw()];
5662
6903
  case 5:
5663
- _a.sent();
5664
- return [4 /*yield*/, this._finalize()];
5665
- case 6:
5666
- _a.sent();
5667
- _a.label = 7;
5668
- case 7: return [3 /*break*/, 9];
6904
+ _b.sent();
6905
+ this._emit('fetched');
6906
+ _b.label = 6;
6907
+ case 6: return [4 /*yield*/, this._finalize()];
6908
+ case 7:
6909
+ _b.sent();
6910
+ return [3 /*break*/, 9];
5669
6911
  case 8:
5670
6912
  // Finally block now correctly executes after promises resolve, not immediately
5671
6913
  this._isFetching = false;
@@ -5690,367 +6932,65 @@ var KTDataTable = /** @class */ (function (_super) {
5690
6932
  this._attachSearchEvent();
5691
6933
  if (typeof index_1.default !== 'undefined') {
5692
6934
  index_1.default.init();
5693
- }
5694
- /**
5695
- * Hide spinner
5696
- */
5697
- this._hideSpinner();
5698
- };
5699
- /**
5700
- * Attach search event to the search input element
5701
- * @returns {void}
5702
- */
5703
- KTDataTable.prototype._attachSearchEvent = function () {
5704
- var _this = this;
5705
- var tableId = this._tableId();
5706
- var searchElement = document.querySelector("[data-kt-datatable-search=\"#".concat(tableId, "\"]"));
5707
- // Get search state
5708
- var search = this.getState().search;
5709
- // Set search value
5710
- if (searchElement) {
5711
- searchElement.value =
5712
- search === undefined || search === null
5713
- ? ''
5714
- : typeof search === 'string'
5715
- ? search
5716
- : String(search);
5717
- }
5718
- if (searchElement) {
5719
- // Check if a debounced search function already exists
5720
- var searchWithDebounce = KTDataTable.asSearchElementWithDebounce(searchElement);
5721
- if (searchWithDebounce._debouncedSearch) {
5722
- // Remove the existing debounced event listener
5723
- searchElement.removeEventListener('keyup', searchWithDebounce._debouncedSearch);
5724
- }
5725
- // Create a new debounced search function
5726
- var debouncedSearch = this._debounce(function () {
5727
- _this.search(searchElement.value);
5728
- }, this._config.search.delay);
5729
- // Store the new debounced function as a property of the element
5730
- searchWithDebounce._debouncedSearch = debouncedSearch;
5731
- // Add the new debounced event listener
5732
- searchElement.addEventListener('keyup', debouncedSearch);
5733
- }
5734
- };
5735
- /**
5736
- * Fetch data from the DOM
5737
- * Fetch data from the table element and save it to the `originalData` state property.
5738
- * This method is used when the data is not fetched from the server via an API endpoint.
5739
- */
5740
- KTDataTable.prototype._fetchDataFromLocal = function () {
5741
- return __awaiter(this, void 0, void 0, function () {
5742
- var _a, sortField, sortOrder, page, pageSize, search, originalData, _b, originalData_1, originalDataAttributes, _temp, searchTerm, startIndex, endIndex;
5743
- var _c;
5744
- return __generator(this, function (_d) {
5745
- switch (_d.label) {
5746
- case 0:
5747
- this._fireEvent('fetch');
5748
- this._dispatchEvent('fetch');
5749
- _a = this.getState(), sortField = _a.sortField, sortOrder = _a.sortOrder, page = _a.page, pageSize = _a.pageSize, search = _a.search;
5750
- originalData = this.getState().originalData;
5751
- // If the table element or the original data is not defined, bail
5752
- if (!this._tableElement ||
5753
- originalData === undefined ||
5754
- this._tableConfigInvalidate() ||
5755
- this._localTableHeaderInvalidate() ||
5756
- this._localTableContentInvalidate()) {
5757
- this._deleteState();
5758
- _b = this._localExtractTableContent(), originalData_1 = _b.originalData, originalDataAttributes = _b.originalDataAttributes;
5759
- this._config._state.originalData = originalData_1;
5760
- this._config._state.originalDataAttributes = originalDataAttributes;
5761
- }
5762
- // Update the original data variable
5763
- originalData = this.getState().originalData;
5764
- _temp = (this._data = __spreadArray([], originalData, true));
5765
- if (search) {
5766
- searchTerm = typeof search === 'string' ? search : '';
5767
- _temp = this._data = this._config.search.callback.call(this, this._data, searchTerm);
5768
- }
5769
- // If sorting is defined, sort the data
5770
- if (sortField !== undefined &&
5771
- sortOrder !== undefined &&
5772
- sortOrder !== '') {
5773
- if (typeof this._config.sort.callback === 'function') {
5774
- this._data = this._config.sort.callback.call(this, this._data, sortField, sortOrder);
5775
- }
5776
- }
5777
- // If there is data, slice it to the current page size
5778
- if (((_c = this._data) === null || _c === void 0 ? void 0 : _c.length) > 0) {
5779
- startIndex = (page - 1) * pageSize;
5780
- endIndex = startIndex + pageSize;
5781
- this._data = this._data.slice(startIndex, endIndex);
5782
- }
5783
- // Determine number of total rows
5784
- this._config._state.totalItems = _temp.length;
5785
- // Draw the data
5786
- return [4 /*yield*/, this._draw()];
5787
- case 1:
5788
- // Draw the data
5789
- _d.sent();
5790
- this._fireEvent('fetched');
5791
- this._dispatchEvent('fetched');
5792
- return [2 /*return*/];
5793
- }
5794
- });
5795
- });
5796
- };
5797
- /**
5798
- * Checks if the table content has been invalidated by comparing the current checksum of the table body
5799
- * with the stored checksum in the state. If the checksums are different, the state is updated with the
5800
- * new checksum and `true` is returned. Otherwise, `false` is returned.
5801
- *
5802
- * @returns {boolean} `true` if the table content has been invalidated, `false` otherwise.
5803
- */
5804
- KTDataTable.prototype._localTableContentInvalidate = function () {
5805
- var checksum = utils_1.default.checksum(JSON.stringify(this._tbodyElement.innerHTML));
5806
- if (this.getState()._contentChecksum !== checksum) {
5807
- this._config._state._contentChecksum = checksum;
5808
- return true;
5809
- }
5810
- return false;
5811
- };
5812
- KTDataTable.prototype._tableConfigInvalidate = function () {
5813
- // Remove _data and _state from config
5814
- var _a = this._config, _state = _a._state, restConfig = __rest(_a, ["_state"]);
5815
- var checksum = utils_1.default.checksum(JSON.stringify(restConfig));
5816
- if (_state._configChecksum !== checksum) {
5817
- this._config._state._configChecksum = checksum;
5818
- return true;
5819
- }
5820
- return false;
5821
- };
5822
- /**
5823
- * Extract the table content and returns it as an object containing an array of original data and an array of original data attributes.
5824
- *
5825
- * @returns {{originalData: T[], originalDataAttributes: KTDataTableAttributeInterface[]}} - An object containing an array of original data and an array of original data attributes.
5826
- */
5827
- KTDataTable.prototype._localExtractTableContent = function () {
5828
- var originalData = [];
5829
- var originalDataAttributes = [];
5830
- this._storeOriginalClasses();
5831
- var rows = this._tbodyElement.querySelectorAll('tr');
5832
- // Filter th elements to only include those with data-kt-datatable-column attribute
5833
- var allThs = this._theadElement
5834
- ? this._theadElement.querySelectorAll('th')
5835
- : [];
5836
- var ths = Array.from(allThs).filter(function (th) {
5837
- return th.hasAttribute('data-kt-datatable-column');
5838
- });
5839
- rows.forEach(function (row) {
5840
- var dataRow = {};
5841
- var dataRowAttribute = {};
5842
- row.querySelectorAll('td').forEach(function (td, index) {
5843
- var _a, _b, _c;
5844
- var colName = (_a = ths[index]) === null || _a === void 0 ? void 0 : _a.getAttribute('data-kt-datatable-column');
5845
- if (colName) {
5846
- dataRow[colName] = (_b = td.innerHTML) === null || _b === void 0 ? void 0 : _b.trim();
5847
- }
5848
- else {
5849
- // Store the original HTML for fallback
5850
- dataRow[index] = (_c = td.innerHTML) === null || _c === void 0 ? void 0 : _c.trim();
5851
- }
5852
- });
5853
- if (Object.keys(dataRow).length > 0) {
5854
- originalData.push(dataRow);
5855
- originalDataAttributes.push(dataRowAttribute);
5856
- }
5857
- });
5858
- return { originalData: originalData, originalDataAttributes: originalDataAttributes };
5859
- };
5860
- /**
5861
- * Check if the table header is invalidated
5862
- * @returns {boolean} - Returns true if the table header is invalidated, false otherwise
5863
- */
5864
- KTDataTable.prototype._localTableHeaderInvalidate = function () {
5865
- var originalData = this.getState().originalData;
5866
- var totalColumns = originalData.length
5867
- ? Object.keys(originalData[0]).length
5868
- : 0;
5869
- // 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
5870
- var allThs = this._theadElement
5871
- ? this._theadElement.querySelectorAll('th')
5872
- : [];
5873
- var thsWithColumn = Array.from(allThs).filter(function (th) {
5874
- return th.hasAttribute('data-kt-datatable-column');
5875
- });
5876
- var currentTableHeaders = thsWithColumn.length > 0
5877
- ? thsWithColumn.length
5878
- : this._getLogicalColumnCount();
5879
- return currentTableHeaders !== totalColumns;
5880
- };
5881
- /**
5882
- * Returns the logical data column count (number of data columns), used for multi-row headers
5883
- * where querySelectorAll('th') would overcount. Prefers state.originalData, then first tbody row td count.
5884
- * @returns {number} Number of data columns, or 0 if unknown
5885
- */
5886
- KTDataTable.prototype._getLogicalColumnCount = function () {
5887
- var originalData = this.getState().originalData;
5888
- if (originalData && originalData.length > 0) {
5889
- return Object.keys(originalData[0]).length;
5890
- }
5891
- if (this._tbodyElement) {
5892
- var firstRow = this._tbodyElement.querySelector('tr');
5893
- if (firstRow) {
5894
- return firstRow.querySelectorAll('td').length;
5895
- }
5896
- }
5897
- return 0;
5898
- };
5899
- /**
5900
- * Fetch data from the server
5901
- */
5902
- KTDataTable.prototype._fetchDataFromServer = function () {
5903
- return __awaiter(this, void 0, void 0, function () {
5904
- var currentRequestId, queryParams, response, error_1, responseData, error_2;
5905
- return __generator(this, function (_a) {
5906
- switch (_a.label) {
5907
- case 0:
5908
- currentRequestId = ++this._requestId;
5909
- this._fireEvent('fetch');
5910
- this._dispatchEvent('fetch');
5911
- queryParams = this._getQueryParamsForFetchRequest();
5912
- _a.label = 1;
5913
- case 1:
5914
- _a.trys.push([1, 3, , 4]);
5915
- return [4 /*yield*/, this._performFetchRequest(queryParams)];
5916
- case 2:
5917
- response = _a.sent();
5918
- return [3 /*break*/, 4];
5919
- case 3:
5920
- error_1 = _a.sent();
5921
- // Silently ignore AbortError - request was cancelled
5922
- if (error_1.name === 'AbortError') {
5923
- return [2 /*return*/];
5924
- }
5925
- throw error_1;
5926
- case 4:
5927
- // Check if this response is stale (a newer request has been initiated)
5928
- if (currentRequestId !== this._requestId) {
5929
- // Ignore stale response - a more recent request is in progress or has completed
5930
- return [2 /*return*/];
5931
- }
5932
- responseData = null;
5933
- _a.label = 5;
5934
- case 5:
5935
- _a.trys.push([5, 7, , 8]);
5936
- return [4 /*yield*/, response.json()];
5937
- case 6:
5938
- responseData = _a.sent();
5939
- return [3 /*break*/, 8];
5940
- case 7:
5941
- error_2 = _a.sent();
5942
- // Fire event with complete error context for application handling
5943
- this._fireEvent('parseError', {
5944
- response: response,
5945
- error: String(error_2),
5946
- status: response.status,
5947
- statusText: response.statusText,
5948
- });
5949
- this._dispatchEvent('parseError', {
5950
- response: response,
5951
- error: String(error_2),
5952
- status: response.status,
5953
- statusText: response.statusText,
5954
- });
5955
- return [2 /*return*/];
5956
- case 8:
5957
- // Double-check request ID after JSON parsing (additional safety)
5958
- if (currentRequestId !== this._requestId) {
5959
- return [2 /*return*/];
5960
- }
5961
- this._fireEvent('fetched', { response: responseData });
5962
- this._dispatchEvent('fetched', { response: responseData });
5963
- // Use the mapResponse function to transform the data if provided
5964
- if (typeof this._config.mapResponse === 'function') {
5965
- responseData = this._config.mapResponse.call(this, responseData);
5966
- }
5967
- this._data = responseData.data;
5968
- this._config._state.totalItems = responseData.totalCount;
5969
- return [4 /*yield*/, this._draw()];
5970
- case 9:
5971
- _a.sent();
5972
- this._fireEvent('fetched');
5973
- this._dispatchEvent('fetched');
5974
- return [2 /*return*/];
5975
- }
5976
- });
5977
- });
6935
+ }
6936
+ /**
6937
+ * Hide spinner
6938
+ */
6939
+ this._hideSpinner();
5978
6940
  };
5979
6941
  /**
5980
- * Get the query params for a fetch request
5981
- * @returns The query params for the fetch request
6942
+ * Attach search event to the search input element
6943
+ * @returns {void}
5982
6944
  */
5983
- KTDataTable.prototype._getQueryParamsForFetchRequest = function () {
5984
- // Get the current state of the datatable
5985
- var _a = this.getState(), page = _a.page, pageSize = _a.pageSize, sortField = _a.sortField, sortOrder = _a.sortOrder, filters = _a.filters, search = _a.search;
5986
- // Create a new URLSearchParams object to store the query params
5987
- var queryParams = new URLSearchParams();
5988
- // Add the current page number and page size to the query params
5989
- queryParams.set('page', String(page));
5990
- queryParams.set('size', String(pageSize));
5991
- // If there is a sort order and field set, add them to the query params
5992
- if (sortOrder !== undefined) {
5993
- queryParams.set('sortOrder', String(sortOrder));
5994
- }
5995
- if (sortField !== undefined) {
5996
- queryParams.set('sortField', String(sortField));
6945
+ KTDataTable.prototype._attachSearchEvent = function () {
6946
+ var _this = this;
6947
+ var tableId = this._tableId();
6948
+ var searchElement = document.querySelector("[data-kt-datatable-search=\"#".concat(tableId, "\"]"));
6949
+ // Get search state
6950
+ var search = this.getState().search;
6951
+ // Set search value
6952
+ if (searchElement) {
6953
+ searchElement.value =
6954
+ search === undefined || search === null
6955
+ ? ''
6956
+ : typeof search === 'string'
6957
+ ? search
6958
+ : String(search);
5997
6959
  }
5998
- // If there are any filters set, add them to the query params
5999
- if (Array.isArray(filters) && filters.length) {
6000
- queryParams.set('filters', JSON.stringify(filters.map(function (filter) { return ({
6001
- // Map the filter object to a simpler object with just the necessary properties
6002
- column: filter.column,
6003
- type: filter.type,
6004
- value: filter.value,
6005
- }); })));
6960
+ if (searchElement) {
6961
+ // Check if a debounced search function already exists
6962
+ var searchWithDebounce = KTDataTable.asSearchElementWithDebounce(searchElement);
6963
+ if (searchWithDebounce._debouncedSearch) {
6964
+ // Remove the existing debounced event listener
6965
+ searchElement.removeEventListener('keyup', searchWithDebounce._debouncedSearch);
6966
+ }
6967
+ // Create a new debounced search function
6968
+ var debouncedSearch = this._debounce(function () {
6969
+ _this.search(searchElement.value);
6970
+ }, this._config.search.delay);
6971
+ // Store the new debounced function as a property of the element
6972
+ searchWithDebounce._debouncedSearch = debouncedSearch;
6973
+ // Add the new debounced event listener
6974
+ searchElement.addEventListener('keyup', debouncedSearch);
6006
6975
  }
6007
- if (search) {
6008
- queryParams.set('search', typeof search === 'object' ? JSON.stringify(search) : search);
6976
+ };
6977
+ /**
6978
+ * Returns the logical data column count (number of data columns), used for multi-row headers
6979
+ * where querySelectorAll('th') would overcount. Prefers state.originalData, then first tbody row td count.
6980
+ * @returns {number} Number of data columns, or 0 if unknown
6981
+ */
6982
+ KTDataTable.prototype._getLogicalColumnCount = function () {
6983
+ var originalData = this.getState().originalData;
6984
+ if (originalData && originalData.length > 0) {
6985
+ return Object.keys(originalData[0]).length;
6009
6986
  }
6010
- // If a mapRequest function is provided, call it with the query params object
6011
- if (typeof this._config.mapRequest === 'function') {
6012
- queryParams = this._config.mapRequest.call(this, queryParams);
6987
+ if (this._tbodyElement) {
6988
+ var firstRow = this._tbodyElement.querySelector('tr');
6989
+ if (firstRow) {
6990
+ return firstRow.querySelectorAll('td').length;
6991
+ }
6013
6992
  }
6014
- // Return the query params object
6015
- return queryParams;
6016
- };
6017
- KTDataTable.prototype._performFetchRequest = function (queryParams) {
6018
- return __awaiter(this, void 0, void 0, function () {
6019
- var requestMethod, requestBody, apiEndpointWithQueryParams;
6020
- var _this = this;
6021
- return __generator(this, function (_a) {
6022
- requestMethod = this._config.requestMethod;
6023
- requestBody = undefined;
6024
- // Cancel previous request to prevent race conditions
6025
- if (this._abortController) {
6026
- this._abortController.abort();
6027
- }
6028
- // Create new AbortController for this request
6029
- this._abortController = new AbortController();
6030
- // If the request method is POST, send the query params as the request body
6031
- if (requestMethod === 'POST') {
6032
- requestBody = queryParams;
6033
- }
6034
- else if (requestMethod === 'GET') {
6035
- apiEndpointWithQueryParams = this._createUrl(this._config.apiEndpoint);
6036
- apiEndpointWithQueryParams.search = queryParams.toString();
6037
- this._config.apiEndpoint = apiEndpointWithQueryParams.toString();
6038
- }
6039
- return [2 /*return*/, fetch(this._config.apiEndpoint, __assign(__assign({ method: requestMethod, body: requestBody, headers: this._config.requestHeaders }, (this._config.requestCredentials && {
6040
- credentials: this._config.requestCredentials,
6041
- })), (this._abortController && { signal: this._abortController.signal }))).catch(function (error) {
6042
- // Silently ignore AbortError - this is expected when requests are cancelled
6043
- if (error.name === 'AbortError') {
6044
- return Promise.reject(error);
6045
- }
6046
- // Trigger an error event for non-abort errors
6047
- _this._fireEvent('error', { error: error });
6048
- _this._dispatchEvent('error', { error: error });
6049
- _this._noticeOnTable('Error performing fetch request: ' + String(error));
6050
- throw error;
6051
- })];
6052
- });
6053
- });
6993
+ return 0;
6054
6994
  };
6055
6995
  /**
6056
6996
  * Creates a complete URL from a relative path or a full URL.
@@ -6086,10 +7026,10 @@ var KTDataTable = /** @class */ (function (_super) {
6086
7026
  KTDataTable.prototype._draw = function () {
6087
7027
  return __awaiter(this, void 0, void 0, function () {
6088
7028
  return __generator(this, function (_a) {
6089
- this._config._state.totalPages =
6090
- Math.ceil(this.getState().totalItems / this.getState().pageSize) || 0;
6091
- this._fireEvent('draw');
6092
- this._dispatchEvent('draw');
7029
+ this._stateStore.patchState({
7030
+ totalPages: Math.ceil(this.getState().totalItems / this.getState().pageSize) || 0,
7031
+ });
7032
+ this._emit('draw');
6093
7033
  this._dispose();
6094
7034
  // Update the table and pagination controls
6095
7035
  if (this._theadElement && this._tbodyElement) {
@@ -6098,8 +7038,7 @@ var KTDataTable = /** @class */ (function (_super) {
6098
7038
  if (this._infoElement && this._paginationElement) {
6099
7039
  this._updatePagination();
6100
7040
  }
6101
- this._fireEvent('drew');
6102
- this._dispatchEvent('drew');
7041
+ this._emit('drew');
6103
7042
  // Spinner is hidden in _finalize() to ensure it stays visible until the entire request completes
6104
7043
  // Removed duplicate _hideSpinner() call here to prevent premature hiding
6105
7044
  if (this._config.stateSave) {
@@ -6114,115 +7053,18 @@ var KTDataTable = /** @class */ (function (_super) {
6114
7053
  * @returns {HTMLTableSectionElement} The new table body element
6115
7054
  */
6116
7055
  KTDataTable.prototype._updateTable = function () {
6117
- // Clear the existing table contents using a more efficient method
6118
- while (this._tableElement.tBodies.length) {
6119
- this._tableElement.removeChild(this._tableElement.tBodies[0]);
6120
- }
6121
- // Create the table body with the new data
6122
- var tbodyElement = this._tableElement.createTBody();
6123
- // Apply the original class to the new tbody element
6124
- if (this._originalTbodyClass) {
6125
- tbodyElement.className = this._originalTbodyClass;
6126
- }
6127
- this._updateTableContent(tbodyElement);
6128
- return tbodyElement;
6129
- };
6130
- /**
6131
- * Update the table content
6132
- * @param tbodyElement The table body element
6133
- * @returns {HTMLTableSectionElement} The updated table body element
6134
- */
6135
- KTDataTable.prototype._updateTableContent = function (tbodyElement) {
6136
- var _this = this;
6137
- var fragment = document.createDocumentFragment();
6138
- tbodyElement.textContent = ''; // Clear the tbody element
6139
- if (this._data.length === 0) {
6140
- this._noticeOnTable(this._config.infoEmpty || '');
6141
- return tbodyElement;
6142
- }
6143
- // Filter th elements to only include those with data-kt-datatable-column attribute
6144
- // This prevents creating blank td elements for merged header cells (colspan/rowspan)
6145
- var allThs = this._theadElement
6146
- ? this._theadElement.querySelectorAll('th')
6147
- : [];
6148
- var ths = Array.from(allThs).filter(function (th) {
6149
- return th.hasAttribute('data-kt-datatable-column');
6150
- });
6151
- // 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
6152
- var columnsToRender = ths.length > 0 ? ths : [];
6153
- var logicalColumnCount = ths.length > 0 ? ths.length : this._getLogicalColumnCount();
6154
- this._data.forEach(function (item, rowIndex) {
6155
- var row = document.createElement('tr');
6156
- // Apply original tr class if available
6157
- if (_this._originalTrClasses && _this._originalTrClasses[rowIndex]) {
6158
- row.className = _this._originalTrClasses[rowIndex];
6159
- }
6160
- if (!_this._config.columns) {
6161
- var dataRowAttributes = _this.getState().originalDataAttributes
6162
- ? _this.getState().originalDataAttributes[rowIndex]
6163
- : null;
6164
- for (var colIndex = 0; colIndex < logicalColumnCount; colIndex++) {
6165
- var th = columnsToRender[colIndex];
6166
- var colName = th === null || th === void 0 ? void 0 : th.getAttribute('data-kt-datatable-column');
6167
- var td = document.createElement('td');
6168
- var value = void 0;
6169
- if (colName && Object.prototype.hasOwnProperty.call(item, colName)) {
6170
- value = item[colName];
6171
- }
6172
- else if (Object.prototype.hasOwnProperty.call(item, colIndex)) {
6173
- value = item[colIndex];
6174
- }
6175
- else {
6176
- value = '';
6177
- }
6178
- td.innerHTML = value;
6179
- // Apply original td class if available
6180
- if (_this._originalTdClasses &&
6181
- _this._originalTdClasses[rowIndex] &&
6182
- _this._originalTdClasses[rowIndex][colIndex]) {
6183
- td.className = _this._originalTdClasses[rowIndex][colIndex];
6184
- }
6185
- if (dataRowAttributes && dataRowAttributes[colIndex]) {
6186
- for (var attr in dataRowAttributes[colIndex]) {
6187
- td.setAttribute(attr, dataRowAttributes[colIndex][attr]);
6188
- }
6189
- }
6190
- row.appendChild(td);
6191
- }
6192
- }
6193
- else {
6194
- Object.keys(_this._config.columns).forEach(function (key, colIndex) {
6195
- var td = document.createElement('td');
6196
- var columnDef = _this._config.columns[key];
6197
- // Apply original td class if available
6198
- if (_this._originalTdClasses &&
6199
- _this._originalTdClasses[rowIndex] &&
6200
- _this._originalTdClasses[rowIndex][colIndex]) {
6201
- td.className = _this._originalTdClasses[rowIndex][colIndex];
6202
- }
6203
- if (typeof columnDef.render === 'function') {
6204
- var result = columnDef.render.call(_this, item[key], item, _this);
6205
- if (result instanceof HTMLElement ||
6206
- result instanceof DocumentFragment) {
6207
- td.appendChild(result);
6208
- }
6209
- else if (typeof result === 'string') {
6210
- td.innerHTML = result;
6211
- }
6212
- }
6213
- else {
6214
- td.textContent = item[key];
6215
- }
6216
- if (typeof columnDef.createdCell === 'function') {
6217
- columnDef.createdCell.call(_this, td, item[key], item, row);
6218
- }
6219
- row.appendChild(td);
6220
- });
6221
- }
6222
- fragment.appendChild(row);
7056
+ return this._tableRenderer.render({
7057
+ config: this._config,
7058
+ context: this,
7059
+ data: this._data,
7060
+ getLogicalColumnCount: this._getLogicalColumnCount.bind(this),
7061
+ getState: this.getState.bind(this),
7062
+ originalTbodyClass: this._originalTbodyClass,
7063
+ originalTrClasses: this._originalTrClasses,
7064
+ originalTdClasses: this._originalTdClasses,
7065
+ tableElement: this._tableElement,
7066
+ theadElement: this._theadElement,
6223
7067
  });
6224
- tbodyElement.appendChild(fragment);
6225
- return tbodyElement;
6226
7068
  };
6227
7069
  /**
6228
7070
  * Show a notice on the table
@@ -6231,66 +7073,22 @@ var KTDataTable = /** @class */ (function (_super) {
6231
7073
  */
6232
7074
  KTDataTable.prototype._noticeOnTable = function (message) {
6233
7075
  if (message === void 0) { message = ''; }
6234
- var row = this._tableElement.tBodies[0].insertRow();
6235
- var cell = row.insertCell();
6236
- var logicalCount = this._getLogicalColumnCount();
6237
- // Use logical column count so multi-row headers don't overcount; fallback to 1 when 0 so message still displays
6238
- cell.colSpan = logicalCount > 0 ? logicalCount : 1;
6239
- cell.innerHTML = message;
7076
+ this._tableRenderer.notice(this._tableElement, this._getLogicalColumnCount.bind(this), message);
6240
7077
  };
6241
7078
  KTDataTable.prototype._updatePagination = function () {
6242
- this._removeChildElements(this._sizeElement);
6243
- this._createPageSizeControls(this._sizeElement);
6244
- this._removeChildElements(this._paginationElement);
6245
- this._createPaginationControls(this._infoElement, this._paginationElement);
6246
- };
6247
- /**
6248
- * Removes all child elements from the given container element.
6249
- * @param container The container element to remove the child elements from.
6250
- */
6251
- KTDataTable.prototype._removeChildElements = function (container) {
6252
- if (!container) {
6253
- return;
6254
- }
6255
- // Loop through all child elements of the container and remove them one by one
6256
- while (container.firstChild) {
6257
- // Remove the first child element (which is the first element in the list of child elements)
6258
- container.removeChild(container.firstChild);
6259
- }
6260
- };
6261
- /**
6262
- * Creates a container element for the items per page selector.
6263
- * @param _sizeElement The element to create the page size controls in.
6264
- * @returns The container element.
6265
- */
6266
- KTDataTable.prototype._createPageSizeControls = function (_sizeElement) {
6267
- var _this = this;
6268
- // If no element is provided, return early
6269
- if (!_sizeElement) {
6270
- return _sizeElement;
7079
+ var cleanup = this._paginationRenderer.render({
7080
+ config: this._config,
7081
+ dataLength: this._data.length,
7082
+ infoElement: this._infoElement,
7083
+ paginateData: this._paginateData.bind(this),
7084
+ paginationElement: this._paginationElement,
7085
+ reloadPageSize: this._reloadPageSize.bind(this),
7086
+ sizeElement: this._sizeElement,
7087
+ state: this.getState(),
7088
+ });
7089
+ if (typeof cleanup === 'function') {
7090
+ this._cleanupCallbacks.push(cleanup);
6271
7091
  }
6272
- // Wait for the element to be attached to the DOM
6273
- setTimeout(function () {
6274
- // Create <option> elements for each page size option
6275
- var options = _this._config.pageSizes.map(function (size) {
6276
- var option = document.createElement('option');
6277
- option.value = String(size);
6278
- option.text = String(size);
6279
- option.selected = _this.getState().pageSize === size;
6280
- return option;
6281
- });
6282
- // Add the <option> elements to the provided element
6283
- _sizeElement.append.apply(_sizeElement, options);
6284
- }, 100);
6285
- // Create an event listener for the "change" event on the element
6286
- var _pageSizeControlsEvent = function (event) {
6287
- // When the element changes, reload the page with the new page size and page number 1
6288
- _this._reloadPageSize(Number(event.target.value), 1);
6289
- };
6290
- // Bind the event listener to the component instance
6291
- _sizeElement.onchange = _pageSizeControlsEvent.bind(this);
6292
- // Return the element
6293
- return _sizeElement;
6294
7092
  };
6295
7093
  /**
6296
7094
  * Reloads the data with the specified page size and optional page number.
@@ -6300,120 +7098,10 @@ var KTDataTable = /** @class */ (function (_super) {
6300
7098
  KTDataTable.prototype._reloadPageSize = function (pageSize, page) {
6301
7099
  if (page === void 0) { page = 1; }
6302
7100
  // Update the page size and page number in the state
6303
- this._config._state.pageSize = pageSize;
6304
- this._config._state.page = page;
7101
+ this._stateStore.setPageSize(pageSize, page);
6305
7102
  // Update the data with the new page size and page number
6306
7103
  this._updateData();
6307
7104
  };
6308
- /**
6309
- * Creates the pagination controls for the component.
6310
- * @param _infoElement The element to set the info text in.
6311
- * @param _paginationElement The element to create the pagination controls in.
6312
- * @return {HTMLElement} The element containing the pagination controls.
6313
- */
6314
- KTDataTable.prototype._createPaginationControls = function (_infoElement, _paginationElement) {
6315
- if (!_infoElement || !_paginationElement || this._data.length === 0) {
6316
- return null;
6317
- }
6318
- this._setPaginationInfoText(_infoElement);
6319
- var paginationContainer = this._createPaginationContainer(_paginationElement);
6320
- if (paginationContainer) {
6321
- this._createPaginationButtons(paginationContainer);
6322
- }
6323
- return paginationContainer;
6324
- };
6325
- /**
6326
- * Sets the info text for the pagination controls.
6327
- * @param _infoElement The element to set the info text in.
6328
- */
6329
- KTDataTable.prototype._setPaginationInfoText = function (_infoElement) {
6330
- _infoElement.textContent = this._config.info
6331
- .replace('{start}', (this.getState().page - 1) * this.getState().pageSize + 1 + '')
6332
- .replace('{end}', Math.min(this.getState().page * this.getState().pageSize, this.getState().totalItems) + '')
6333
- .replace('{total}', this.getState().totalItems + '');
6334
- };
6335
- /**
6336
- * Creates the container element for the pagination controls.
6337
- * @param _paginationElement The element to create the pagination controls in.
6338
- * @return {HTMLElement} The container element.
6339
- */
6340
- KTDataTable.prototype._createPaginationContainer = function (_paginationElement) {
6341
- // No longer create a wrapping div. Just return the pagination element itself.
6342
- return _paginationElement;
6343
- };
6344
- /**
6345
- * Creates the pagination buttons for the component.
6346
- * @param paginationContainer The container element for the pagination controls.
6347
- */
6348
- KTDataTable.prototype._createPaginationButtons = function (paginationContainer) {
6349
- var _this = this;
6350
- var _a = this.getState(), currentPage = _a.page, totalPages = _a.totalPages;
6351
- var _b = this._config.pagination, previous = _b.previous, next = _b.next, number = _b.number, more = _b.more;
6352
- // Helper function to create a button
6353
- var createButton = function (text, className, disabled, handleClick) {
6354
- var button = document.createElement('button');
6355
- button.className = className;
6356
- button.innerHTML = text;
6357
- button.disabled = disabled;
6358
- button.onclick = handleClick;
6359
- return button;
6360
- };
6361
- // Add Previous Button
6362
- paginationContainer.appendChild(createButton(previous.text, "".concat(previous.class).concat(currentPage === 1 ? ' disabled' : ''), currentPage === 1, function () { return _this._paginateData(currentPage - 1); }));
6363
- // Calculate range of pages
6364
- var pageMoreEnabled = this._config.pageMore;
6365
- if (pageMoreEnabled) {
6366
- var maxButtons = this._config.pageMoreLimit;
6367
- var range_1 = this._calculatePageRange(currentPage, totalPages, maxButtons);
6368
- // Add start ellipsis
6369
- if (range_1.start > 1) {
6370
- paginationContainer.appendChild(createButton(more.text, more.class, false, function () {
6371
- return _this._paginateData(Math.max(1, range_1.start - 1));
6372
- }));
6373
- }
6374
- var _loop_1 = function (i) {
6375
- paginationContainer.appendChild(createButton(number.text.replace('{page}', i.toString()), "".concat(number.class).concat(currentPage === i ? ' active disabled' : ''), currentPage === i, function () { return _this._paginateData(i); }));
6376
- };
6377
- // Add page buttons
6378
- for (var i = range_1.start; i <= range_1.end; i++) {
6379
- _loop_1(i);
6380
- }
6381
- // Add end ellipsis
6382
- if (pageMoreEnabled && range_1.end < totalPages) {
6383
- paginationContainer.appendChild(createButton(more.text, more.class, false, function () {
6384
- return _this._paginateData(Math.min(totalPages, range_1.end + 1));
6385
- }));
6386
- }
6387
- }
6388
- else {
6389
- var _loop_2 = function (i) {
6390
- paginationContainer.appendChild(createButton(number.text.replace('{page}', i.toString()), "".concat(number.class).concat(currentPage === i ? ' active disabled' : ''), currentPage === i, function () { return _this._paginateData(i); }));
6391
- };
6392
- // Add page buttons
6393
- for (var i = 1; i <= totalPages; i++) {
6394
- _loop_2(i);
6395
- }
6396
- }
6397
- // Add Next Button
6398
- paginationContainer.appendChild(createButton(next.text, "".concat(next.class).concat(currentPage === totalPages ? ' disabled' : ''), currentPage === totalPages, function () { return _this._paginateData(currentPage + 1); }));
6399
- };
6400
- // New helper method to calculate page range
6401
- KTDataTable.prototype._calculatePageRange = function (currentPage, totalPages, maxButtons) {
6402
- var startPage, endPage;
6403
- var halfMaxButtons = Math.floor(maxButtons / 2);
6404
- if (totalPages <= maxButtons) {
6405
- startPage = 1;
6406
- endPage = totalPages;
6407
- }
6408
- else {
6409
- startPage = Math.max(currentPage - halfMaxButtons, 1);
6410
- endPage = Math.min(startPage + maxButtons - 1, totalPages);
6411
- if (endPage - startPage < maxButtons - 1) {
6412
- startPage = Math.max(endPage - maxButtons + 1, 1);
6413
- }
6414
- }
6415
- return { start: startPage, end: endPage };
6416
- };
6417
7105
  /**
6418
7106
  * Method for handling pagination
6419
7107
  * @param page - The page number to navigate to
@@ -6422,10 +7110,9 @@ var KTDataTable = /** @class */ (function (_super) {
6422
7110
  if (page < 1 || !Number.isInteger(page)) {
6423
7111
  return;
6424
7112
  }
6425
- this._fireEvent('pagination', { page: page });
6426
- this._dispatchEvent('pagination', { page: page });
7113
+ this._emit('pagination', { page: page });
6427
7114
  if (page >= 1 && page <= this.getState().totalPages) {
6428
- this._config._state.page = page;
7115
+ this._stateStore.setPage(page);
6429
7116
  this._updateData();
6430
7117
  }
6431
7118
  };
@@ -6464,8 +7151,7 @@ var KTDataTable = /** @class */ (function (_super) {
6464
7151
  * @returns {void}
6465
7152
  */
6466
7153
  KTDataTable.prototype._saveState = function () {
6467
- this._fireEvent('stateSave');
6468
- this._dispatchEvent('stateSave');
7154
+ this._emit('stateSave');
6469
7155
  var ns = this._tableNamespace();
6470
7156
  if (ns) {
6471
7157
  localStorage.setItem(ns, JSON.stringify(this.getState()));
@@ -6482,7 +7168,7 @@ var KTDataTable = /** @class */ (function (_super) {
6482
7168
  try {
6483
7169
  var state = JSON.parse(stateString);
6484
7170
  if (state)
6485
- this._config._state = state;
7171
+ this._stateStore.replaceState(state);
6486
7172
  return state;
6487
7173
  }
6488
7174
  catch (_a) { }
@@ -6529,16 +7215,17 @@ var KTDataTable = /** @class */ (function (_super) {
6529
7215
  * This method is called before re-rendering or when disposing the component.
6530
7216
  */
6531
7217
  KTDataTable.prototype._dispose = function () {
7218
+ this._cleanupCallbacks.forEach(function (cleanup) { return cleanup(); });
7219
+ this._cleanupCallbacks = [];
6532
7220
  // --- 1. Remove search input event listener (debounced) ---
6533
7221
  var tableId = this._tableId();
6534
7222
  var searchElement = document.querySelector("[data-kt-datatable-search=\"#".concat(tableId, "\"]"));
6535
7223
  if (searchElement) {
6536
7224
  var searchWithDebounce = KTDataTable.asSearchElementWithDebounce(searchElement);
6537
- if (!searchWithDebounce._debouncedSearch) {
6538
- return;
7225
+ if (searchWithDebounce._debouncedSearch) {
7226
+ searchElement.removeEventListener('keyup', searchWithDebounce._debouncedSearch);
7227
+ delete searchWithDebounce._debouncedSearch;
6539
7228
  }
6540
- searchElement.removeEventListener('keyup', searchWithDebounce._debouncedSearch);
6541
- delete searchWithDebounce._debouncedSearch;
6542
7229
  }
6543
7230
  // --- 2. Remove page size dropdown event listener ---
6544
7231
  if (this._sizeElement && this._sizeElement.onchange) {
@@ -6606,23 +7293,7 @@ var KTDataTable = /** @class */ (function (_super) {
6606
7293
  * @returns {KTDataTableStateInterface} The current state of the table.
6607
7294
  */
6608
7295
  KTDataTable.prototype.getState = function () {
6609
- return __assign({
6610
- /**
6611
- * The current page number.
6612
- */
6613
- page: 1,
6614
- /**
6615
- * The field that the data is sorted by.
6616
- */
6617
- sortField: null,
6618
- /**
6619
- * The sort order (ascending or descending).
6620
- */
6621
- sortOrder: '',
6622
- /**
6623
- * The number of rows to display per page.
6624
- */
6625
- pageSize: this._config.pageSize, filters: [] }, this._config._state);
7296
+ return this._stateStore.getState();
6626
7297
  };
6627
7298
  /**
6628
7299
  * Sorts the data in the table by the specified field.
@@ -6633,10 +7304,8 @@ var KTDataTable = /** @class */ (function (_super) {
6633
7304
  var state = this.getState();
6634
7305
  var sortOrder = this._sortHandler.toggleSortOrder(state.sortField, state.sortOrder, field);
6635
7306
  this._sortHandler.setSortIcon(field, sortOrder);
6636
- this._config._state.sortField = field;
6637
- this._config._state.sortOrder = sortOrder;
6638
- this._fireEvent('sort', { field: field, order: sortOrder });
6639
- this._dispatchEvent('sort', { field: field, order: sortOrder });
7307
+ this._stateStore.setSort(field, sortOrder);
7308
+ this._emit('sort', { field: field, order: sortOrder });
6640
7309
  this._updateData();
6641
7310
  };
6642
7311
  /**
@@ -6669,15 +7338,13 @@ var KTDataTable = /** @class */ (function (_super) {
6669
7338
  * Triggers the 'reload' event and the 'kt.datatable.reload' custom event.
6670
7339
  */
6671
7340
  KTDataTable.prototype.reload = function () {
6672
- this._fireEvent('reload');
6673
- this._dispatchEvent('reload');
7341
+ this._emit('reload');
6674
7342
  // Fetch the data from the server using the current sort and filter settings
6675
7343
  this._updateData();
6676
7344
  };
6677
7345
  KTDataTable.prototype.redraw = function (page) {
6678
7346
  if (page === void 0) { page = 1; }
6679
- this._fireEvent('redraw');
6680
- this._dispatchEvent('redraw');
7347
+ this._emit('redraw');
6681
7348
  this._paginateData(page);
6682
7349
  };
6683
7350
  /**
@@ -6706,18 +7373,16 @@ var KTDataTable = /** @class */ (function (_super) {
6706
7373
  * @throws Error if the filter object is null or undefined.
6707
7374
  */
6708
7375
  KTDataTable.prototype.setFilter = function (filter) {
6709
- this._config._state.filters = __spreadArray(__spreadArray([], (this.getState().filters || []).filter(function (f) { return f.column !== filter.column; }), true), [
6710
- filter,
6711
- ], false);
6712
- this._config._state.page = 1;
7376
+ this._stateStore.setFilter(filter);
6713
7377
  return this;
6714
7378
  };
6715
7379
  KTDataTable.prototype.dispose = function () {
7380
+ var _a;
7381
+ (_a = this._remoteProvider) === null || _a === void 0 ? void 0 : _a.dispose();
6716
7382
  this._dispose();
6717
7383
  };
6718
7384
  KTDataTable.prototype.search = function (query) {
6719
- this._config._state.search = query;
6720
- this._config._state.page = 1;
7385
+ this._stateStore.setSearch(query);
6721
7386
  this.reload();
6722
7387
  };
6723
7388
  /**
@@ -6810,8 +7475,7 @@ var KTDataTable = /** @class */ (function (_super) {
6810
7475
  */
6811
7476
  KTDataTable.prototype.check = function () {
6812
7477
  this._checkbox.check();
6813
- this._fireEvent('checked');
6814
- this._dispatchEvent('checked');
7478
+ this._emit('checked');
6815
7479
  };
6816
7480
  /**
6817
7481
  * Uncheck all visible row checkboxes
@@ -6819,8 +7483,7 @@ var KTDataTable = /** @class */ (function (_super) {
6819
7483
  */
6820
7484
  KTDataTable.prototype.uncheck = function () {
6821
7485
  this._checkbox.uncheck();
6822
- this._fireEvent('unchecked');
6823
- this._dispatchEvent('unchecked');
7486
+ this._emit('unchecked');
6824
7487
  };
6825
7488
  /**
6826
7489
  * Get all checked row IDs (across all pages if preserveSelection is true)
@@ -18947,9 +19610,9 @@ exports["default"] = KTUtils;
18947
19610
  * Copyright 2025 by Keenthemes Inc
18948
19611
  */
18949
19612
  Object.defineProperty(exports, "__esModule", ({ value: true }));
18950
- exports.KTCarousel = exports.KTPinInput = exports.KTRangeSlider = exports.KTClipboard = exports.KTRepeater = exports.KTRating = exports.KTToast = exports.KTSelect = exports.KTDataTable = exports.KTTogglePassword = exports.KTImageInput = exports.KTThemeSwitch = exports.KTStepper = exports.KTTooltip = exports.KTToggle = exports.KTReparent = exports.KTSticky = exports.KTScrollto = exports.KTScrollable = exports.KTScrollspy = exports.KTAccordion = exports.KTTabs = exports.KTDismiss = exports.KTCollapse = exports.KTDrawer = exports.KTModal = exports.KTDropdown = void 0;
18951
- var dom_1 = __webpack_require__(/*! ./helpers/dom */ "./src/helpers/dom.ts");
19613
+ exports.KTComponents = exports.KTCarousel = exports.KTPinInput = exports.KTRangeSlider = exports.KTClipboard = exports.KTRepeater = exports.KTRating = exports.KTToast = exports.KTSelect = exports.KTDataTable = exports.KTTogglePassword = exports.KTImageInput = exports.KTThemeSwitch = exports.KTStepper = exports.KTTooltip = exports.KTToggle = exports.KTReparent = exports.KTSticky = exports.KTScrollto = exports.KTScrollable = exports.KTScrollspy = exports.KTAccordion = exports.KTTabs = exports.KTDismiss = exports.KTCollapse = exports.KTDrawer = exports.KTModal = exports.KTContextMenu = exports.KTDropdown = void 0;
18952
19614
  var dropdown_1 = __webpack_require__(/*! ./components/dropdown */ "./src/components/dropdown/index.ts");
19615
+ var context_menu_1 = __webpack_require__(/*! ./components/context-menu */ "./src/components/context-menu/index.ts");
18953
19616
  var modal_1 = __webpack_require__(/*! ./components/modal */ "./src/components/modal/index.ts");
18954
19617
  var drawer_1 = __webpack_require__(/*! ./components/drawer */ "./src/components/drawer/index.ts");
18955
19618
  var collapse_1 = __webpack_require__(/*! ./components/collapse */ "./src/components/collapse/index.ts");
@@ -18978,6 +19641,8 @@ var pin_input_1 = __webpack_require__(/*! ./components/pin-input */ "./src/compo
18978
19641
  var carousel_1 = __webpack_require__(/*! ./components/carousel */ "./src/components/carousel/index.ts");
18979
19642
  var dropdown_2 = __webpack_require__(/*! ./components/dropdown */ "./src/components/dropdown/index.ts");
18980
19643
  Object.defineProperty(exports, "KTDropdown", ({ enumerable: true, get: function () { return dropdown_2.KTDropdown; } }));
19644
+ var context_menu_2 = __webpack_require__(/*! ./components/context-menu */ "./src/components/context-menu/index.ts");
19645
+ Object.defineProperty(exports, "KTContextMenu", ({ enumerable: true, get: function () { return context_menu_2.KTContextMenu; } }));
18981
19646
  var modal_2 = __webpack_require__(/*! ./components/modal */ "./src/components/modal/index.ts");
18982
19647
  Object.defineProperty(exports, "KTModal", ({ enumerable: true, get: function () { return modal_2.KTModal; } }));
18983
19648
  var drawer_2 = __webpack_require__(/*! ./components/drawer */ "./src/components/drawer/index.ts");
@@ -19030,9 +19695,10 @@ var pin_input_2 = __webpack_require__(/*! ./components/pin-input */ "./src/compo
19030
19695
  Object.defineProperty(exports, "KTPinInput", ({ enumerable: true, get: function () { return pin_input_2.KTPinInput; } }));
19031
19696
  var carousel_2 = __webpack_require__(/*! ./components/carousel */ "./src/components/carousel/index.ts");
19032
19697
  Object.defineProperty(exports, "KTCarousel", ({ enumerable: true, get: function () { return carousel_2.KTCarousel; } }));
19033
- var KTComponents = {
19698
+ exports.KTComponents = {
19034
19699
  init: function () {
19035
19700
  dropdown_1.KTDropdown.init();
19701
+ context_menu_1.KTContextMenu.init();
19036
19702
  modal_1.KTModal.init();
19037
19703
  drawer_1.KTDrawer.init();
19038
19704
  collapse_1.KTCollapse.init();
@@ -19061,10 +19727,68 @@ var KTComponents = {
19061
19727
  carousel_1.KTCarousel.init();
19062
19728
  },
19063
19729
  };
19064
- exports["default"] = KTComponents;
19065
- dom_1.default.ready(function () {
19066
- KTComponents.init();
19067
- });
19730
+ exports["default"] = exports.KTComponents;
19731
+
19732
+
19733
+ /***/ }),
19734
+
19735
+ /***/ "./src/init-all.ts":
19736
+ /*!*************************!*\
19737
+ !*** ./src/init-all.ts ***!
19738
+ \*************************/
19739
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
19740
+
19741
+
19742
+ /**
19743
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
19744
+ * Copyright 2025 by Keenthemes Inc
19745
+ */
19746
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19747
+ exports.initAllComponents = void 0;
19748
+ var dom_1 = __webpack_require__(/*! ./helpers/dom */ "./src/helpers/dom.ts");
19749
+ var index_1 = __webpack_require__(/*! ./index */ "./src/index.ts");
19750
+ var initAllComponents = function () {
19751
+ dom_1.default.ready(function () {
19752
+ index_1.KTComponents.init();
19753
+ });
19754
+ };
19755
+ exports.initAllComponents = initAllComponents;
19756
+ (0, exports.initAllComponents)();
19757
+
19758
+
19759
+ /***/ }),
19760
+
19761
+ /***/ "./src/legacy.ts":
19762
+ /*!***********************!*\
19763
+ !*** ./src/legacy.ts ***!
19764
+ \***********************/
19765
+ /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
19766
+
19767
+
19768
+ /**
19769
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
19770
+ * Copyright 2025 by Keenthemes Inc
19771
+ */
19772
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19773
+ if (k2 === undefined) k2 = k;
19774
+ var desc = Object.getOwnPropertyDescriptor(m, k);
19775
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
19776
+ desc = { enumerable: true, get: function() { return m[k]; } };
19777
+ }
19778
+ Object.defineProperty(o, k2, desc);
19779
+ }) : (function(o, m, k, k2) {
19780
+ if (k2 === undefined) k2 = k;
19781
+ o[k2] = m[k];
19782
+ }));
19783
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19784
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
19785
+ };
19786
+ Object.defineProperty(exports, "__esModule", ({ value: true }));
19787
+ exports["default"] = void 0;
19788
+ __exportStar(__webpack_require__(/*! ./index */ "./src/index.ts"), exports);
19789
+ var index_1 = __webpack_require__(/*! ./index */ "./src/index.ts");
19790
+ Object.defineProperty(exports, "default", ({ enumerable: true, get: function () { return index_1.default; } }));
19791
+ __webpack_require__(/*! ./init-all */ "./src/init-all.ts");
19068
19792
 
19069
19793
 
19070
19794
  /***/ })
@@ -19135,7 +19859,7 @@ dom_1.default.ready(function () {
19135
19859
  /******/ // startup
19136
19860
  /******/ // Load entry module and return exports
19137
19861
  /******/ // This entry module is referenced by other modules so it can't be inlined
19138
- /******/ var __webpack_exports__ = __webpack_require__("./src/index.ts");
19862
+ /******/ var __webpack_exports__ = __webpack_require__("./src/legacy.ts");
19139
19863
  /******/
19140
19864
  /******/ return __webpack_exports__;
19141
19865
  /******/ })()