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