@keenthemes/ktui 1.0.29 → 1.1.1

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 (90) hide show
  1. package/dist/ktui.js +3942 -8634
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/dist/styles.css +0 -196
  5. package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js +596 -0
  6. package/lib/cjs/components/datatable/__tests__/pagination-reset.test.js.map +1 -0
  7. package/lib/cjs/components/datatable/__tests__/race-conditions.test.js +548 -0
  8. package/lib/cjs/components/datatable/__tests__/race-conditions.test.js.map +1 -0
  9. package/lib/cjs/components/datatable/__tests__/setup.js +63 -0
  10. package/lib/cjs/components/datatable/__tests__/setup.js.map +1 -0
  11. package/lib/cjs/components/datatable/datatable.js +92 -30
  12. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  13. package/lib/cjs/index.js +1 -5
  14. package/lib/cjs/index.js.map +1 -1
  15. package/lib/esm/components/datatable/__tests__/pagination-reset.test.js +594 -0
  16. package/lib/esm/components/datatable/__tests__/pagination-reset.test.js.map +1 -0
  17. package/lib/esm/components/datatable/__tests__/race-conditions.test.js +546 -0
  18. package/lib/esm/components/datatable/__tests__/race-conditions.test.js.map +1 -0
  19. package/lib/esm/components/datatable/__tests__/setup.js +58 -0
  20. package/lib/esm/components/datatable/__tests__/setup.js.map +1 -0
  21. package/lib/esm/components/datatable/datatable.js +92 -30
  22. package/lib/esm/components/datatable/datatable.js.map +1 -1
  23. package/lib/esm/index.js +0 -3
  24. package/lib/esm/index.js.map +1 -1
  25. package/package.json +9 -2
  26. package/src/components/datatable/__tests__/pagination-reset.test.ts +657 -0
  27. package/src/components/datatable/__tests__/race-conditions.test.ts +455 -0
  28. package/src/components/datatable/__tests__/setup.ts +67 -0
  29. package/src/components/datatable/datatable.ts +66 -11
  30. package/src/components/input/input.css +0 -1
  31. package/src/components/select/select.css +0 -1
  32. package/src/components/textarea/textarea.css +0 -1
  33. package/src/index.ts +0 -4
  34. package/styles.css +0 -1
  35. package/lib/cjs/components/datepicker/calendar.js +0 -1061
  36. package/lib/cjs/components/datepicker/calendar.js.map +0 -1
  37. package/lib/cjs/components/datepicker/config.js +0 -332
  38. package/lib/cjs/components/datepicker/config.js.map +0 -1
  39. package/lib/cjs/components/datepicker/datepicker.js +0 -949
  40. package/lib/cjs/components/datepicker/datepicker.js.map +0 -1
  41. package/lib/cjs/components/datepicker/dropdown.js +0 -635
  42. package/lib/cjs/components/datepicker/dropdown.js.map +0 -1
  43. package/lib/cjs/components/datepicker/events.js +0 -129
  44. package/lib/cjs/components/datepicker/events.js.map +0 -1
  45. package/lib/cjs/components/datepicker/index.js +0 -13
  46. package/lib/cjs/components/datepicker/index.js.map +0 -1
  47. package/lib/cjs/components/datepicker/keyboard.js +0 -536
  48. package/lib/cjs/components/datepicker/keyboard.js.map +0 -1
  49. package/lib/cjs/components/datepicker/locales.js +0 -78
  50. package/lib/cjs/components/datepicker/locales.js.map +0 -1
  51. package/lib/cjs/components/datepicker/templates.js +0 -403
  52. package/lib/cjs/components/datepicker/templates.js.map +0 -1
  53. package/lib/cjs/components/datepicker/types.js +0 -23
  54. package/lib/cjs/components/datepicker/types.js.map +0 -1
  55. package/lib/cjs/components/datepicker/utils.js +0 -524
  56. package/lib/cjs/components/datepicker/utils.js.map +0 -1
  57. package/lib/esm/components/datepicker/calendar.js +0 -1058
  58. package/lib/esm/components/datepicker/calendar.js.map +0 -1
  59. package/lib/esm/components/datepicker/config.js +0 -329
  60. package/lib/esm/components/datepicker/config.js.map +0 -1
  61. package/lib/esm/components/datepicker/datepicker.js +0 -946
  62. package/lib/esm/components/datepicker/datepicker.js.map +0 -1
  63. package/lib/esm/components/datepicker/dropdown.js +0 -632
  64. package/lib/esm/components/datepicker/dropdown.js.map +0 -1
  65. package/lib/esm/components/datepicker/events.js +0 -126
  66. package/lib/esm/components/datepicker/events.js.map +0 -1
  67. package/lib/esm/components/datepicker/index.js +0 -9
  68. package/lib/esm/components/datepicker/index.js.map +0 -1
  69. package/lib/esm/components/datepicker/keyboard.js +0 -533
  70. package/lib/esm/components/datepicker/keyboard.js.map +0 -1
  71. package/lib/esm/components/datepicker/locales.js +0 -74
  72. package/lib/esm/components/datepicker/locales.js.map +0 -1
  73. package/lib/esm/components/datepicker/templates.js +0 -390
  74. package/lib/esm/components/datepicker/templates.js.map +0 -1
  75. package/lib/esm/components/datepicker/types.js +0 -20
  76. package/lib/esm/components/datepicker/types.js.map +0 -1
  77. package/lib/esm/components/datepicker/utils.js +0 -508
  78. package/lib/esm/components/datepicker/utils.js.map +0 -1
  79. package/src/components/datepicker/calendar.ts +0 -1397
  80. package/src/components/datepicker/config.ts +0 -368
  81. package/src/components/datepicker/datepicker.css +0 -7
  82. package/src/components/datepicker/datepicker.ts +0 -1287
  83. package/src/components/datepicker/dropdown.ts +0 -757
  84. package/src/components/datepicker/events.ts +0 -149
  85. package/src/components/datepicker/index.ts +0 -10
  86. package/src/components/datepicker/keyboard.ts +0 -646
  87. package/src/components/datepicker/locales.ts +0 -80
  88. package/src/components/datepicker/templates.ts +0 -792
  89. package/src/components/datepicker/types.ts +0 -154
  90. package/src/components/datepicker/utils.ts +0 -631
@@ -0,0 +1,548 @@
1
+ "use strict";
2
+ /**
3
+ * Race Condition Tests for KTDataTable
4
+ * Tests the fixes for concurrent request handling, request cancellation, and stale response detection
5
+ */
6
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
7
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
8
+ return new (P || (P = Promise))(function (resolve, reject) {
9
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
10
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
11
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
12
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
13
+ });
14
+ };
15
+ var __generator = (this && this.__generator) || function (thisArg, body) {
16
+ 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);
17
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
18
+ function verb(n) { return function (v) { return step([n, v]); }; }
19
+ function step(op) {
20
+ if (f) throw new TypeError("Generator is already executing.");
21
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
22
+ 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;
23
+ if (y = 0, t) op = [op[0] & 2, t.value];
24
+ switch (op[0]) {
25
+ case 0: case 1: t = op; break;
26
+ case 4: _.label++; return { value: op[1], done: false };
27
+ case 5: _.label++; y = op[1]; op = [0]; continue;
28
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
29
+ default:
30
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
31
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
32
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
33
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
34
+ if (t[2]) _.ops.pop();
35
+ _.trys.pop(); continue;
36
+ }
37
+ op = body.call(thisArg, _);
38
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
39
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
40
+ }
41
+ };
42
+ Object.defineProperty(exports, "__esModule", { value: true });
43
+ var vitest_1 = require("vitest");
44
+ var datatable_1 = require("../datatable");
45
+ var setup_1 = require("./setup");
46
+ (0, vitest_1.describe)('KTDataTable Race Condition Fixes', function () {
47
+ var container;
48
+ var mockFetch;
49
+ var abortSignals = [];
50
+ (0, vitest_1.beforeEach)(function () {
51
+ // Setup DOM
52
+ container = document.createElement('div');
53
+ container.innerHTML = "\n\t\t\t<div data-kt-datatable=\"true\">\n\t\t\t\t<table data-kt-datatable-table=\"true\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr>\n\t\t\t\t\t\t\t<th data-kt-datatable-column=\"id\">ID</th>\n\t\t\t\t\t\t\t<th data-kt-datatable-column=\"name\">Name</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody></tbody>\n\t\t\t\t</table>\n\t\t\t\t<div data-kt-datatable-info=\"true\"></div>\n\t\t\t\t<select data-kt-datatable-size=\"true\"></select>\n\t\t\t\t<div data-kt-datatable-pagination=\"true\"></div>\n\t\t\t</div>\n\t\t";
54
+ document.body.appendChild(container);
55
+ // Mock fetch to track requests and signals
56
+ abortSignals = [];
57
+ mockFetch = vitest_1.vi.fn(function (url, options) {
58
+ // Store abort signal for verification
59
+ if (options === null || options === void 0 ? void 0 : options.signal) {
60
+ abortSignals.push(options.signal);
61
+ }
62
+ // Simulate network delay
63
+ return new Promise(function (resolve, reject) {
64
+ var timeout = setTimeout(function () {
65
+ var _a;
66
+ if ((_a = options === null || options === void 0 ? void 0 : options.signal) === null || _a === void 0 ? void 0 : _a.aborted) {
67
+ reject(new DOMException('The operation was aborted.', 'AbortError'));
68
+ }
69
+ else {
70
+ resolve(new Response(JSON.stringify({
71
+ data: [
72
+ { id: 1, name: 'Item 1' },
73
+ { id: 2, name: 'Item 2' },
74
+ ],
75
+ totalCount: 2,
76
+ }), { status: 200, headers: { 'Content-Type': 'application/json' } }));
77
+ }
78
+ }, 100); // 100ms delay
79
+ // Handle abort
80
+ if (options === null || options === void 0 ? void 0 : options.signal) {
81
+ options.signal.addEventListener('abort', function () {
82
+ clearTimeout(timeout);
83
+ reject(new DOMException('The operation was aborted.', 'AbortError'));
84
+ });
85
+ }
86
+ });
87
+ });
88
+ global.fetch = mockFetch;
89
+ });
90
+ (0, vitest_1.afterEach)(function () {
91
+ document.body.removeChild(container);
92
+ vitest_1.vi.clearAllMocks();
93
+ abortSignals = [];
94
+ });
95
+ (0, vitest_1.describe)('AbortController Integration', function () {
96
+ (0, vitest_1.it)('should create AbortController for remote data requests', function () { return __awaiter(void 0, void 0, void 0, function () {
97
+ var datatable;
98
+ return __generator(this, function (_a) {
99
+ switch (_a.label) {
100
+ case 0:
101
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
102
+ apiEndpoint: '/api/data',
103
+ });
104
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
105
+ case 1:
106
+ _a.sent();
107
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(1);
108
+ (0, vitest_1.expect)(abortSignals.length).toBe(1);
109
+ (0, vitest_1.expect)(abortSignals[0]).toBeInstanceOf(AbortSignal);
110
+ return [2 /*return*/];
111
+ }
112
+ });
113
+ }); });
114
+ (0, vitest_1.it)('should use _isFetching flag to prevent concurrent requests', function () { return __awaiter(void 0, void 0, void 0, function () {
115
+ var datatable;
116
+ return __generator(this, function (_a) {
117
+ switch (_a.label) {
118
+ case 0:
119
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
120
+ apiEndpoint: '/api/data',
121
+ });
122
+ // Try to trigger search during initial fetch
123
+ datatable.search('test'); // Should be blocked by _isFetching
124
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
125
+ case 1:
126
+ _a.sent();
127
+ // Should only have 1 request (initial) because _isFetching blocked the second
128
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(1);
129
+ return [2 /*return*/];
130
+ }
131
+ });
132
+ }); });
133
+ (0, vitest_1.it)('should allow new request after previous completes', function () { return __awaiter(void 0, void 0, void 0, function () {
134
+ var datatable;
135
+ return __generator(this, function (_a) {
136
+ switch (_a.label) {
137
+ case 0:
138
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
139
+ apiEndpoint: '/api/data',
140
+ });
141
+ // Wait for initial fetch to complete
142
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
143
+ case 1:
144
+ // Wait for initial fetch to complete
145
+ _a.sent();
146
+ // Now trigger a search - should succeed
147
+ datatable.search('test');
148
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
149
+ case 2:
150
+ _a.sent();
151
+ // Should have 2 requests total
152
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(2);
153
+ (0, vitest_1.expect)(abortSignals.length).toBe(2);
154
+ return [2 /*return*/];
155
+ }
156
+ });
157
+ }); });
158
+ (0, vitest_1.it)('should abort previous request when _performFetchRequest is called again', function () { return __awaiter(void 0, void 0, void 0, function () {
159
+ var datatable;
160
+ return __generator(this, function (_a) {
161
+ switch (_a.label) {
162
+ case 0:
163
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
164
+ apiEndpoint: '/api/data',
165
+ });
166
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
167
+ case 1:
168
+ _a.sent(); // Complete initial request
169
+ // Trigger first search
170
+ datatable.search('first');
171
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
172
+ case 2:
173
+ _a.sent();
174
+ // Trigger second search (first should complete, second starts fresh)
175
+ datatable.search('second');
176
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
177
+ case 3:
178
+ _a.sent();
179
+ // Should have 3 requests: initial + first search + second search
180
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(3);
181
+ (0, vitest_1.expect)(abortSignals.length).toBe(3);
182
+ // Each gets its own AbortController
183
+ abortSignals.forEach(function (signal) {
184
+ (0, vitest_1.expect)(signal).toBeInstanceOf(AbortSignal);
185
+ });
186
+ return [2 /*return*/];
187
+ }
188
+ });
189
+ }); });
190
+ });
191
+ (0, vitest_1.describe)('Request ID Sequencing', function () {
192
+ (0, vitest_1.it)('should assign incremental request IDs for sequential requests', function () { return __awaiter(void 0, void 0, void 0, function () {
193
+ var requestIds, callCount, datatable;
194
+ return __generator(this, function (_a) {
195
+ switch (_a.label) {
196
+ case 0:
197
+ requestIds = [];
198
+ callCount = 0;
199
+ // Mock to capture request sequence
200
+ mockFetch.mockImplementation(function (url, options) {
201
+ callCount++;
202
+ var id = callCount;
203
+ requestIds.push(id);
204
+ return new Promise(function (resolve) {
205
+ setTimeout(function () {
206
+ resolve(new Response(JSON.stringify({
207
+ data: [{ id: id, name: "Item ".concat(id) }],
208
+ totalCount: 1,
209
+ }), { status: 200 }));
210
+ }, 50);
211
+ });
212
+ });
213
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
214
+ apiEndpoint: '/api/data',
215
+ });
216
+ return [4 /*yield*/, (0, setup_1.waitFor)(100)];
217
+ case 1:
218
+ _a.sent(); // Complete initial request
219
+ datatable.search('a');
220
+ return [4 /*yield*/, (0, setup_1.waitFor)(100)];
221
+ case 2:
222
+ _a.sent(); // Complete search
223
+ datatable.search('b');
224
+ return [4 /*yield*/, (0, setup_1.waitFor)(100)];
225
+ case 3:
226
+ _a.sent(); // Complete second search
227
+ // Request IDs should be sequential: 1, 2, 3
228
+ (0, vitest_1.expect)(requestIds).toEqual([1, 2, 3]);
229
+ return [2 /*return*/];
230
+ }
231
+ });
232
+ }); });
233
+ (0, vitest_1.it)('should have request ID validation logic in place', function () { return __awaiter(void 0, void 0, void 0, function () {
234
+ var datatable, tbody;
235
+ return __generator(this, function (_a) {
236
+ switch (_a.label) {
237
+ case 0:
238
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
239
+ apiEndpoint: '/api/data',
240
+ });
241
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
242
+ case 1:
243
+ _a.sent(); // Complete initial
244
+ datatable.search('first');
245
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
246
+ case 2:
247
+ _a.sent(); // Complete first search
248
+ datatable.search('second');
249
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
250
+ case 3:
251
+ _a.sent(); // Complete second search
252
+ // All requests should complete successfully with incremental request IDs
253
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(3);
254
+ tbody = container.querySelector('tbody');
255
+ (0, vitest_1.expect)(tbody === null || tbody === void 0 ? void 0 : tbody.querySelectorAll('tr').length).toBeGreaterThan(0);
256
+ return [2 /*return*/];
257
+ }
258
+ });
259
+ }); });
260
+ });
261
+ (0, vitest_1.describe)('_isFetching Flag Management', function () {
262
+ (0, vitest_1.it)('should prevent concurrent fetch executions', function () { return __awaiter(void 0, void 0, void 0, function () {
263
+ var datatable;
264
+ return __generator(this, function (_a) {
265
+ switch (_a.label) {
266
+ case 0:
267
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
268
+ apiEndpoint: '/api/data',
269
+ });
270
+ // Try to trigger reload immediately (should be blocked by initial fetch)
271
+ datatable.reload(); // Blocked by _isFetching
272
+ datatable.reload(); // Blocked by _isFetching
273
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
274
+ case 1:
275
+ _a.sent();
276
+ // Should only have 1 request: initial
277
+ // The reload calls are blocked by _isFetching
278
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(1);
279
+ return [2 /*return*/];
280
+ }
281
+ });
282
+ }); });
283
+ (0, vitest_1.it)('should reset _isFetching flag after fetch completes', function () { return __awaiter(void 0, void 0, void 0, function () {
284
+ var datatable;
285
+ return __generator(this, function (_a) {
286
+ switch (_a.label) {
287
+ case 0:
288
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
289
+ apiEndpoint: '/api/data',
290
+ });
291
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
292
+ case 1:
293
+ _a.sent(); // Wait for initial fetch
294
+ // Should be able to trigger new fetch after previous completes
295
+ datatable.reload();
296
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
297
+ case 2:
298
+ _a.sent();
299
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(2);
300
+ return [2 /*return*/];
301
+ }
302
+ });
303
+ }); });
304
+ (0, vitest_1.it)('should reset _isFetching flag even after fetch error', function () { return __awaiter(void 0, void 0, void 0, function () {
305
+ var callCount, datatable;
306
+ return __generator(this, function (_a) {
307
+ switch (_a.label) {
308
+ case 0:
309
+ callCount = 0;
310
+ mockFetch.mockImplementation(function () {
311
+ callCount++;
312
+ if (callCount === 1) {
313
+ // Return invalid JSON to trigger parse error
314
+ return Promise.resolve(new Response('Not JSON', { status: 200 }));
315
+ }
316
+ return Promise.resolve(new Response(JSON.stringify({
317
+ data: [{ id: 1, name: 'Success' }],
318
+ totalCount: 1,
319
+ }), { status: 200 }));
320
+ });
321
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
322
+ apiEndpoint: '/api/data',
323
+ });
324
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
325
+ case 1:
326
+ _a.sent(); // Initial request triggers parse error
327
+ // Should be able to retry after error
328
+ datatable.reload();
329
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
330
+ case 2:
331
+ _a.sent();
332
+ (0, vitest_1.expect)(mockFetch).toHaveBeenCalledTimes(2);
333
+ return [2 /*return*/];
334
+ }
335
+ });
336
+ }); });
337
+ });
338
+ (0, vitest_1.describe)('Loading Spinner Management', function () {
339
+ (0, vitest_1.it)('should show spinner during fetch', function () { return __awaiter(void 0, void 0, void 0, function () {
340
+ var element, datatable;
341
+ return __generator(this, function (_a) {
342
+ switch (_a.label) {
343
+ case 0:
344
+ element = container.querySelector('[data-kt-datatable="true"]');
345
+ datatable = new datatable_1.KTDataTable(element, {
346
+ apiEndpoint: '/api/data',
347
+ });
348
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
349
+ case 1:
350
+ _a.sent(); // Spinner should be visible
351
+ (0, vitest_1.expect)(element.classList.contains('loading')).toBe(true);
352
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
353
+ case 2:
354
+ _a.sent(); // Wait for fetch to complete
355
+ (0, vitest_1.expect)(element.classList.contains('loading')).toBe(false);
356
+ return [2 /*return*/];
357
+ }
358
+ });
359
+ }); });
360
+ (0, vitest_1.it)('should keep spinner visible during overlapping requests', function () { return __awaiter(void 0, void 0, void 0, function () {
361
+ var element, datatable;
362
+ return __generator(this, function (_a) {
363
+ switch (_a.label) {
364
+ case 0:
365
+ element = container.querySelector('[data-kt-datatable="true"]');
366
+ datatable = new datatable_1.KTDataTable(element, {
367
+ apiEndpoint: '/api/data',
368
+ });
369
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
370
+ case 1:
371
+ _a.sent();
372
+ (0, vitest_1.expect)(element.classList.contains('loading')).toBe(true);
373
+ // Trigger second request while first is in progress
374
+ datatable.search('test');
375
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
376
+ case 2:
377
+ _a.sent();
378
+ // Spinner should still be visible
379
+ (0, vitest_1.expect)(element.classList.contains('loading')).toBe(true);
380
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
381
+ case 3:
382
+ _a.sent();
383
+ // Spinner should hide only after last request completes
384
+ (0, vitest_1.expect)(element.classList.contains('loading')).toBe(false);
385
+ return [2 /*return*/];
386
+ }
387
+ });
388
+ }); });
389
+ (0, vitest_1.it)('should not flicker spinner during rapid interactions', function () { return __awaiter(void 0, void 0, void 0, function () {
390
+ var element, datatable, spinnerStates, checkInterval, transitions;
391
+ return __generator(this, function (_a) {
392
+ switch (_a.label) {
393
+ case 0:
394
+ element = container.querySelector('[data-kt-datatable="true"]');
395
+ datatable = new datatable_1.KTDataTable(element, {
396
+ apiEndpoint: '/api/data',
397
+ });
398
+ spinnerStates = [];
399
+ checkInterval = setInterval(function () {
400
+ spinnerStates.push(element.classList.contains('loading'));
401
+ }, 20);
402
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
403
+ case 1:
404
+ _a.sent();
405
+ datatable.search('a');
406
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
407
+ case 2:
408
+ _a.sent();
409
+ datatable.search('ab');
410
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
411
+ case 3:
412
+ _a.sent();
413
+ datatable.search('abc');
414
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
415
+ case 4:
416
+ _a.sent();
417
+ clearInterval(checkInterval);
418
+ transitions = spinnerStates.reduce(function (acc, curr, idx) {
419
+ if (idx > 0 && spinnerStates[idx - 1] !== curr) {
420
+ acc.push(curr);
421
+ }
422
+ return acc;
423
+ }, []);
424
+ // Should have exactly 2 transitions: off->on, on->off
425
+ // No additional transitions that would indicate flickering
426
+ (0, vitest_1.expect)(transitions.length).toBeLessThanOrEqual(2);
427
+ return [2 /*return*/];
428
+ }
429
+ });
430
+ }); });
431
+ });
432
+ (0, vitest_1.describe)('Event Handling During Race Conditions', function () {
433
+ (0, vitest_1.it)('should fire fetch event for successful requests', function () { return __awaiter(void 0, void 0, void 0, function () {
434
+ var fetchEvents, element, datatable;
435
+ return __generator(this, function (_a) {
436
+ switch (_a.label) {
437
+ case 0:
438
+ fetchEvents = [];
439
+ element = container.querySelector('[data-kt-datatable="true"]');
440
+ element.addEventListener('fetch', function (e) {
441
+ fetchEvents.push(e);
442
+ });
443
+ datatable = new datatable_1.KTDataTable(element, {
444
+ apiEndpoint: '/api/data',
445
+ });
446
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
447
+ case 1:
448
+ _a.sent(); // Complete initial
449
+ datatable.search('test');
450
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
451
+ case 2:
452
+ _a.sent(); // Complete search
453
+ // Should fire fetch for initial and search
454
+ (0, vitest_1.expect)(fetchEvents.length).toBeGreaterThanOrEqual(2);
455
+ return [2 /*return*/];
456
+ }
457
+ });
458
+ }); });
459
+ (0, vitest_1.it)('should fire fetched event after successful data load', function () { return __awaiter(void 0, void 0, void 0, function () {
460
+ var fetchedEvents, element, datatable;
461
+ return __generator(this, function (_a) {
462
+ switch (_a.label) {
463
+ case 0:
464
+ fetchedEvents = [];
465
+ element = container.querySelector('[data-kt-datatable="true"]');
466
+ element.addEventListener('fetched', function (e) {
467
+ fetchedEvents.push(e);
468
+ });
469
+ datatable = new datatable_1.KTDataTable(element, {
470
+ apiEndpoint: '/api/data',
471
+ });
472
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
473
+ case 1:
474
+ _a.sent();
475
+ // Should fire fetched for initial request
476
+ (0, vitest_1.expect)(fetchedEvents.length).toBeGreaterThanOrEqual(1);
477
+ return [2 /*return*/];
478
+ }
479
+ });
480
+ }); });
481
+ (0, vitest_1.it)('should not fire error events for AbortError', function () { return __awaiter(void 0, void 0, void 0, function () {
482
+ var errorEvents, element, datatable;
483
+ return __generator(this, function (_a) {
484
+ switch (_a.label) {
485
+ case 0:
486
+ errorEvents = [];
487
+ element = container.querySelector('[data-kt-datatable="true"]');
488
+ element.addEventListener('error.kt.datatable', function (e) {
489
+ errorEvents.push(e);
490
+ });
491
+ datatable = new datatable_1.KTDataTable(element, {
492
+ apiEndpoint: '/api/data',
493
+ });
494
+ return [4 /*yield*/, (0, setup_1.waitFor)(10)];
495
+ case 1:
496
+ _a.sent();
497
+ datatable.search('test'); // Cancels previous
498
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
499
+ case 2:
500
+ _a.sent();
501
+ // AbortError should not trigger error event
502
+ (0, vitest_1.expect)(errorEvents.length).toBe(0);
503
+ return [2 /*return*/];
504
+ }
505
+ });
506
+ }); });
507
+ });
508
+ (0, vitest_1.describe)('Backward Compatibility', function () {
509
+ (0, vitest_1.it)('should work with local data mode (no AbortController needed)', function () { return __awaiter(void 0, void 0, void 0, function () {
510
+ var datatable;
511
+ return __generator(this, function (_a) {
512
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'));
513
+ // Should not call fetch for local data
514
+ (0, vitest_1.expect)(mockFetch).not.toHaveBeenCalled();
515
+ // Should still work without errors
516
+ datatable.search('Item 1');
517
+ datatable.sort('name');
518
+ datatable.goPage(1);
519
+ return [2 /*return*/];
520
+ });
521
+ }); });
522
+ (0, vitest_1.it)('should maintain existing API compatibility', function () { return __awaiter(void 0, void 0, void 0, function () {
523
+ var datatable;
524
+ return __generator(this, function (_a) {
525
+ switch (_a.label) {
526
+ case 0:
527
+ datatable = new datatable_1.KTDataTable(container.querySelector('[data-kt-datatable="true"]'), {
528
+ apiEndpoint: '/api/data',
529
+ });
530
+ return [4 /*yield*/, (0, setup_1.waitFor)(150)];
531
+ case 1:
532
+ _a.sent();
533
+ // All existing methods should work
534
+ (0, vitest_1.expect)(function () {
535
+ datatable.reload();
536
+ datatable.search('test');
537
+ datatable.sort('name');
538
+ datatable.goPage(1);
539
+ datatable.setPageSize(20);
540
+ datatable.getState();
541
+ }).not.toThrow();
542
+ return [2 /*return*/];
543
+ }
544
+ });
545
+ }); });
546
+ });
547
+ });
548
+ //# sourceMappingURL=race-conditions.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"race-conditions.test.js","sourceRoot":"","sources":["../../../../../src/components/datatable/__tests__/race-conditions.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ /**
3
+ * Vitest setup file for datatable tests
4
+ * Provides DOM environment setup and utilities
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createMockElement = exports.waitFor = void 0;
8
+ var vitest_1 = require("vitest");
9
+ // Mock KTComponents to prevent auto-initialization errors
10
+ vitest_1.vi.mock('../../../index', function () { return ({
11
+ default: {
12
+ init: vitest_1.vi.fn(),
13
+ },
14
+ KTComponents: {
15
+ init: vitest_1.vi.fn(),
16
+ },
17
+ }); });
18
+ // Setup DOM environment before each test
19
+ (0, vitest_1.beforeEach)(function () {
20
+ // Clear localStorage
21
+ localStorage.clear();
22
+ // Reset document body
23
+ document.body.innerHTML = '';
24
+ // Clear any global state
25
+ // Add any other global setup here
26
+ });
27
+ // Cleanup after each test
28
+ (0, vitest_1.afterEach)(function () {
29
+ // Clear localStorage
30
+ localStorage.clear();
31
+ // Reset document body
32
+ document.body.innerHTML = '';
33
+ // Clear all pending timers to prevent "document is not defined" errors
34
+ vitest_1.vi.clearAllTimers();
35
+ });
36
+ // Mock window.matchMedia if needed
37
+ Object.defineProperty(window, 'matchMedia', {
38
+ writable: true,
39
+ value: function (query) { return ({
40
+ matches: false,
41
+ media: query,
42
+ onchange: null,
43
+ addListener: function () { }, // deprecated
44
+ removeListener: function () { }, // deprecated
45
+ addEventListener: function () { },
46
+ removeEventListener: function () { },
47
+ dispatchEvent: function () { return true; },
48
+ }); },
49
+ });
50
+ // Export utilities that tests can use
51
+ var waitFor = function (ms) { return new Promise(function (resolve) { return setTimeout(resolve, ms); }); };
52
+ exports.waitFor = waitFor;
53
+ var createMockElement = function (tag, attributes) {
54
+ if (attributes === void 0) { attributes = {}; }
55
+ var el = document.createElement(tag);
56
+ Object.entries(attributes).forEach(function (_a) {
57
+ var key = _a[0], value = _a[1];
58
+ el.setAttribute(key, value);
59
+ });
60
+ return el;
61
+ };
62
+ exports.createMockElement = createMockElement;
63
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../../src/components/datatable/__tests__/setup.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,iCAAmD;AAEnD,0DAA0D;AAC1D,WAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,cAAM,OAAA,CAAC;IAChC,OAAO,EAAE;QACR,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;KACb;IACD,YAAY,EAAE;QACb,IAAI,EAAE,WAAE,CAAC,EAAE,EAAE;KACb;CACD,CAAC,EAP8B,CAO9B,CAAC,CAAC;AAEJ,yCAAyC;AACzC,IAAA,mBAAU,EAAC;IACV,qBAAqB;IACrB,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IAE7B,yBAAyB;IACzB,kCAAkC;AACnC,CAAC,CAAC,CAAC;AAEH,0BAA0B;AAC1B,IAAA,kBAAS,EAAC;IACT,qBAAqB;IACrB,YAAY,CAAC,KAAK,EAAE,CAAC;IAErB,sBAAsB;IACtB,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;IAE7B,uEAAuE;IACvE,WAAE,CAAC,cAAc,EAAE,CAAC;AACrB,CAAC,CAAC,CAAC;AAEH,mCAAmC;AACnC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,YAAY,EAAE;IAC3C,QAAQ,EAAE,IAAI;IACd,KAAK,EAAE,UAAC,KAAa,IAAK,OAAA,CAAC;QAC1B,OAAO,EAAE,KAAK;QACd,KAAK,EAAE,KAAK;QACZ,QAAQ,EAAE,IAAuE;QACjF,WAAW,EAAE,cAAO,CAAC,EAAE,aAAa;QACpC,cAAc,EAAE,cAAO,CAAC,EAAE,aAAa;QACvC,gBAAgB,EAAE,cAAO,CAAC;QAC1B,mBAAmB,EAAE,cAAO,CAAC;QAC7B,aAAa,EAAE,cAAM,OAAA,IAAI,EAAJ,CAAI;KACzB,CAAC,EATwB,CASxB;CACF,CAAC,CAAC;AAEH,sCAAsC;AAC/B,IAAM,OAAO,GAAG,UAAC,EAAU,IAAK,OAAA,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAvB,CAAuB,CAAC,EAAjD,CAAiD,CAAC;AAA5E,QAAA,OAAO,WAAqE;AAElF,IAAM,iBAAiB,GAAG,UAAC,GAAW,EAAE,UAAuC;IAAvC,2BAAA,EAAA,eAAuC;IACrF,IAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,UAAC,EAAY;YAAX,GAAG,QAAA,EAAE,KAAK,QAAA;QAC9C,EAAE,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AANW,QAAA,iBAAiB,qBAM5B"}