@keenthemes/ktui 1.0.28 → 1.1.0

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 (288) hide show
  1. package/README.md +27 -0
  2. package/dist/ktui.js +8780 -6199
  3. package/dist/ktui.min.js +1 -1
  4. package/dist/ktui.min.js.map +1 -1
  5. package/dist/styles.css +2744 -1367
  6. package/lib/cjs/components/alert/alert.js +1025 -0
  7. package/lib/cjs/components/alert/alert.js.map +1 -0
  8. package/lib/cjs/components/alert/index.js +20 -0
  9. package/lib/cjs/components/alert/index.js.map +1 -0
  10. package/lib/cjs/components/alert/templates.js +120 -0
  11. package/lib/cjs/components/alert/templates.js.map +1 -0
  12. package/lib/cjs/components/alert/types.js +7 -0
  13. package/lib/cjs/components/alert/types.js.map +1 -0
  14. package/lib/cjs/components/datepicker/config/config.js +42 -0
  15. package/lib/cjs/components/datepicker/config/config.js.map +1 -0
  16. package/lib/cjs/components/datepicker/config/index.js +24 -0
  17. package/lib/cjs/components/datepicker/config/index.js.map +1 -0
  18. package/lib/cjs/components/datepicker/config/interfaces.js +7 -0
  19. package/lib/cjs/components/datepicker/config/interfaces.js.map +1 -0
  20. package/lib/cjs/components/datepicker/config/types.js +7 -0
  21. package/lib/cjs/components/datepicker/config/types.js.map +1 -0
  22. package/lib/cjs/components/datepicker/core/event-manager.js +135 -0
  23. package/lib/cjs/components/datepicker/core/event-manager.js.map +1 -0
  24. package/lib/cjs/components/datepicker/core/focus-manager.js +167 -0
  25. package/lib/cjs/components/datepicker/core/focus-manager.js.map +1 -0
  26. package/lib/cjs/components/datepicker/core/helpers.js +219 -0
  27. package/lib/cjs/components/datepicker/core/helpers.js.map +1 -0
  28. package/lib/cjs/components/datepicker/core/index.js +25 -0
  29. package/lib/cjs/components/datepicker/core/index.js.map +1 -0
  30. package/lib/cjs/components/datepicker/core/unified-state-manager.js +394 -0
  31. package/lib/cjs/components/datepicker/core/unified-state-manager.js.map +1 -0
  32. package/lib/cjs/components/datepicker/datepicker.js +2066 -763
  33. package/lib/cjs/components/datepicker/datepicker.js.map +1 -1
  34. package/lib/cjs/components/datepicker/index.js +19 -8
  35. package/lib/cjs/components/datepicker/index.js.map +1 -1
  36. package/lib/cjs/components/datepicker/ui/index.js +23 -0
  37. package/lib/cjs/components/datepicker/ui/index.js.map +1 -0
  38. package/lib/cjs/components/datepicker/ui/input/dropdown.js +489 -0
  39. package/lib/cjs/components/datepicker/ui/input/dropdown.js.map +1 -0
  40. package/lib/cjs/components/datepicker/ui/input/index.js +23 -0
  41. package/lib/cjs/components/datepicker/ui/input/index.js.map +1 -0
  42. package/lib/cjs/components/datepicker/ui/input/segmented-input.js +640 -0
  43. package/lib/cjs/components/datepicker/ui/input/segmented-input.js.map +1 -0
  44. package/lib/cjs/components/datepicker/ui/renderers/calendar.js +446 -0
  45. package/lib/cjs/components/datepicker/ui/renderers/calendar.js.map +1 -0
  46. package/lib/cjs/components/datepicker/ui/renderers/footer.js +42 -0
  47. package/lib/cjs/components/datepicker/ui/renderers/footer.js.map +1 -0
  48. package/lib/cjs/components/datepicker/ui/renderers/header.js +32 -0
  49. package/lib/cjs/components/datepicker/ui/renderers/header.js.map +1 -0
  50. package/lib/cjs/components/datepicker/ui/renderers/index.js +25 -0
  51. package/lib/cjs/components/datepicker/ui/renderers/index.js.map +1 -0
  52. package/lib/cjs/components/datepicker/ui/renderers/time-picker.js +384 -0
  53. package/lib/cjs/components/datepicker/ui/renderers/time-picker.js.map +1 -0
  54. package/lib/cjs/components/datepicker/ui/templates/index.js +22 -0
  55. package/lib/cjs/components/datepicker/ui/templates/index.js.map +1 -0
  56. package/lib/cjs/components/datepicker/ui/templates/templates.js +253 -0
  57. package/lib/cjs/components/datepicker/ui/templates/templates.js.map +1 -0
  58. package/lib/cjs/components/datepicker/utils/date-formatters.js +88 -0
  59. package/lib/cjs/components/datepicker/utils/date-formatters.js.map +1 -0
  60. package/lib/cjs/components/datepicker/utils/date-utils.js +194 -0
  61. package/lib/cjs/components/datepicker/utils/date-utils.js.map +1 -0
  62. package/lib/cjs/components/datepicker/utils/index.js +24 -0
  63. package/lib/cjs/components/datepicker/utils/index.js.map +1 -0
  64. package/lib/cjs/components/datepicker/utils/time-utils.js +213 -0
  65. package/lib/cjs/components/datepicker/utils/time-utils.js.map +1 -0
  66. package/lib/cjs/index.js +6 -1
  67. package/lib/cjs/index.js.map +1 -1
  68. package/lib/esm/components/alert/alert.js +1022 -0
  69. package/lib/esm/components/alert/alert.js.map +1 -0
  70. package/lib/esm/components/alert/index.js +4 -0
  71. package/lib/esm/components/alert/index.js.map +1 -0
  72. package/lib/esm/components/alert/templates.js +112 -0
  73. package/lib/esm/components/alert/templates.js.map +1 -0
  74. package/lib/esm/components/alert/types.js +6 -0
  75. package/lib/esm/components/alert/types.js.map +1 -0
  76. package/lib/esm/components/datepicker/config/config.js +39 -0
  77. package/lib/esm/components/datepicker/config/config.js.map +1 -0
  78. package/lib/esm/components/datepicker/config/index.js +8 -0
  79. package/lib/esm/components/datepicker/config/index.js.map +1 -0
  80. package/lib/esm/components/datepicker/config/interfaces.js +6 -0
  81. package/lib/esm/components/datepicker/config/interfaces.js.map +1 -0
  82. package/lib/esm/components/datepicker/config/types.js +6 -0
  83. package/lib/esm/components/datepicker/config/types.js.map +1 -0
  84. package/lib/esm/components/datepicker/core/event-manager.js +133 -0
  85. package/lib/esm/components/datepicker/core/event-manager.js.map +1 -0
  86. package/lib/esm/components/datepicker/core/focus-manager.js +164 -0
  87. package/lib/esm/components/datepicker/core/focus-manager.js.map +1 -0
  88. package/lib/esm/components/datepicker/core/helpers.js +211 -0
  89. package/lib/esm/components/datepicker/core/helpers.js.map +1 -0
  90. package/lib/esm/components/datepicker/core/index.js +9 -0
  91. package/lib/esm/components/datepicker/core/index.js.map +1 -0
  92. package/lib/esm/components/datepicker/core/unified-state-manager.js +391 -0
  93. package/lib/esm/components/datepicker/core/unified-state-manager.js.map +1 -0
  94. package/lib/esm/components/datepicker/datepicker.js +2065 -763
  95. package/lib/esm/components/datepicker/datepicker.js.map +1 -1
  96. package/lib/esm/components/datepicker/index.js +6 -8
  97. package/lib/esm/components/datepicker/index.js.map +1 -1
  98. package/lib/esm/components/datepicker/ui/index.js +7 -0
  99. package/lib/esm/components/datepicker/ui/index.js.map +1 -0
  100. package/lib/esm/components/datepicker/ui/input/dropdown.js +486 -0
  101. package/lib/esm/components/datepicker/ui/input/dropdown.js.map +1 -0
  102. package/lib/esm/components/datepicker/ui/input/index.js +7 -0
  103. package/lib/esm/components/datepicker/ui/input/index.js.map +1 -0
  104. package/lib/esm/components/datepicker/ui/input/segmented-input.js +637 -0
  105. package/lib/esm/components/datepicker/ui/input/segmented-input.js.map +1 -0
  106. package/lib/esm/components/datepicker/ui/renderers/calendar.js +443 -0
  107. package/lib/esm/components/datepicker/ui/renderers/calendar.js.map +1 -0
  108. package/lib/esm/components/datepicker/ui/renderers/footer.js +39 -0
  109. package/lib/esm/components/datepicker/ui/renderers/footer.js.map +1 -0
  110. package/lib/esm/components/datepicker/ui/renderers/header.js +29 -0
  111. package/lib/esm/components/datepicker/ui/renderers/header.js.map +1 -0
  112. package/lib/esm/components/datepicker/ui/renderers/index.js +9 -0
  113. package/lib/esm/components/datepicker/ui/renderers/index.js.map +1 -0
  114. package/lib/esm/components/datepicker/ui/renderers/time-picker.js +381 -0
  115. package/lib/esm/components/datepicker/ui/renderers/time-picker.js.map +1 -0
  116. package/lib/esm/components/datepicker/ui/templates/index.js +6 -0
  117. package/lib/esm/components/datepicker/ui/templates/index.js.map +1 -0
  118. package/lib/esm/components/datepicker/ui/templates/templates.js +242 -0
  119. package/lib/esm/components/datepicker/ui/templates/templates.js.map +1 -0
  120. package/lib/esm/components/datepicker/utils/date-formatters.js +83 -0
  121. package/lib/esm/components/datepicker/utils/date-formatters.js.map +1 -0
  122. package/lib/esm/components/datepicker/utils/date-utils.js +184 -0
  123. package/lib/esm/components/datepicker/utils/date-utils.js.map +1 -0
  124. package/lib/esm/components/datepicker/utils/index.js +8 -0
  125. package/lib/esm/components/datepicker/utils/index.js.map +1 -0
  126. package/lib/esm/components/datepicker/utils/time-utils.js +201 -0
  127. package/lib/esm/components/datepicker/utils/time-utils.js.map +1 -0
  128. package/lib/esm/index.js +4 -0
  129. package/lib/esm/index.js.map +1 -1
  130. package/package.json +22 -3
  131. package/src/components/alert/alert.css +429 -188
  132. package/src/components/alert/alert.ts +990 -0
  133. package/src/components/alert/index.ts +4 -0
  134. package/src/components/alert/templates.ts +110 -0
  135. package/src/components/alert/tests/accessibility/aria-roles.test.ts +19 -0
  136. package/src/components/alert/tests/accessibility/focus-management.test.ts +19 -0
  137. package/src/components/alert/tests/accessibility/keyboard-nav.test.ts +22 -0
  138. package/src/components/alert/tests/actions/confirm-cancel.test.ts +122 -0
  139. package/src/components/alert/tests/actions/input-field.test.ts +180 -0
  140. package/src/components/alert/tests/alert.basic.test.ts +126 -0
  141. package/src/components/alert/tests/alert.config.test.ts +75 -0
  142. package/src/components/alert/tests/alert.templates.test.ts +17 -0
  143. package/src/components/alert/tests/config/attribute-config.test.ts +94 -0
  144. package/src/components/alert/tests/config/json-config.test.ts +119 -0
  145. package/src/components/alert/tests/config/merging.test.ts +89 -0
  146. package/src/components/alert/tests/dismissal/auto-dismiss.test.ts +96 -0
  147. package/src/components/alert/tests/dismissal/escape-key-dismiss.test.ts +105 -0
  148. package/src/components/alert/tests/dismissal/manual-dismiss.test.ts +90 -0
  149. package/src/components/alert/tests/dismissal/outside-click-dismiss.test.ts +91 -0
  150. package/src/components/alert/tests/edge-cases/invalid-config.test.ts +19 -0
  151. package/src/components/alert/tests/edge-cases/multiple-alerts.test.ts +19 -0
  152. package/src/components/alert/tests/rendering/custom-content.test.ts +81 -0
  153. package/src/components/alert/tests/rendering/info-alert.test.ts +84 -0
  154. package/src/components/alert/tests/rendering/success-alert.test.ts +100 -0
  155. package/src/components/alert/tests/templates/default-templates.test.ts +16 -0
  156. package/src/components/alert/tests/templates/user-templates.test.ts +16 -0
  157. package/src/components/alert/types.ts +145 -0
  158. package/src/components/datepicker/__tests__/datepicker-events.test.ts +356 -0
  159. package/src/components/datepicker/__tests__/datepicker-init.test.ts +343 -0
  160. package/src/components/datepicker/__tests__/datepicker-integration.test.ts +435 -0
  161. package/src/components/datepicker/__tests__/datepicker-timezone.test.ts +220 -0
  162. package/src/components/datepicker/__tests__/segmented-input-focus.test.ts +380 -0
  163. package/src/components/datepicker/__tests__/selective-state-updates.test.ts +400 -0
  164. package/src/components/datepicker/__tests__/state-manager.test.ts +421 -0
  165. package/src/components/datepicker/__tests__/time-preservation.test.ts +387 -0
  166. package/src/components/datepicker/config/config.ts +40 -0
  167. package/src/components/datepicker/config/index.ts +8 -0
  168. package/src/components/datepicker/config/interfaces.ts +82 -0
  169. package/src/components/datepicker/config/types.ts +188 -0
  170. package/src/components/datepicker/core/event-manager.ts +159 -0
  171. package/src/components/datepicker/core/focus-manager.ts +201 -0
  172. package/src/components/datepicker/core/helpers.ts +231 -0
  173. package/src/components/datepicker/core/index.ts +9 -0
  174. package/src/components/datepicker/core/unified-state-manager.ts +459 -0
  175. package/src/components/datepicker/datepicker.css +429 -1
  176. package/src/components/datepicker/datepicker.ts +2538 -1277
  177. package/src/components/datepicker/index.ts +6 -8
  178. package/src/components/datepicker/ui/index.ts +7 -0
  179. package/src/components/datepicker/ui/input/dropdown.ts +552 -0
  180. package/src/components/datepicker/ui/input/index.ts +7 -0
  181. package/src/components/datepicker/ui/input/segmented-input.ts +638 -0
  182. package/src/components/datepicker/ui/renderers/__tests__/calendar-optimizations.test.ts +611 -0
  183. package/src/components/datepicker/ui/renderers/calendar.ts +530 -0
  184. package/src/components/datepicker/ui/renderers/footer.ts +43 -0
  185. package/src/components/datepicker/ui/renderers/header.ts +33 -0
  186. package/src/components/datepicker/ui/renderers/index.ts +9 -0
  187. package/src/components/datepicker/ui/renderers/time-picker.ts +438 -0
  188. package/src/components/datepicker/ui/templates/index.ts +6 -0
  189. package/src/components/datepicker/ui/templates/templates.ts +306 -0
  190. package/src/components/datepicker/utils/__tests__/date-formatters.test.ts +160 -0
  191. package/src/components/datepicker/utils/__tests__/date-utils-keys.test.ts +86 -0
  192. package/src/components/datepicker/utils/__tests__/date-utils-timezone.test.ts +215 -0
  193. package/src/components/datepicker/utils/date-formatters.ts +85 -0
  194. package/src/components/datepicker/utils/date-utils.ts +172 -0
  195. package/src/components/datepicker/utils/index.ts +8 -0
  196. package/src/components/datepicker/utils/time-utils.ts +221 -0
  197. package/src/index.ts +7 -1
  198. package/CONTRIBUTING.md +0 -101
  199. package/examples/datatable/checkbox-events-test.html +0 -400
  200. package/examples/datatable/credentials-test.html +0 -423
  201. package/examples/datatable/remote-checkbox-test.html +0 -365
  202. package/examples/datatable/sorting-test.html +0 -258
  203. package/examples/image-input/file-upload-example.html +0 -189
  204. package/examples/modal/persistent.html +0 -205
  205. package/examples/modal/remote-select-dropdown.html +0 -166
  206. package/examples/modal/select-dropdown-container.html +0 -129
  207. package/examples/select/avatar.html +0 -47
  208. package/examples/select/basic-usage.html +0 -39
  209. package/examples/select/country.html +0 -43
  210. package/examples/select/dark-mode.html +0 -93
  211. package/examples/select/description.html +0 -53
  212. package/examples/select/disable-option.html +0 -37
  213. package/examples/select/disable-select.html +0 -35
  214. package/examples/select/dropdowncontainer.html +0 -111
  215. package/examples/select/dynamic-methods.html +0 -273
  216. package/examples/select/formdata-remote.html +0 -161
  217. package/examples/select/global-config.html +0 -81
  218. package/examples/select/icon-multiple.html +0 -50
  219. package/examples/select/icon.html +0 -48
  220. package/examples/select/max-selection.html +0 -38
  221. package/examples/select/modal-container.html +0 -128
  222. package/examples/select/modal-positioning-test.html +0 -338
  223. package/examples/select/modal.html +0 -80
  224. package/examples/select/multiple.html +0 -40
  225. package/examples/select/native-selected.html +0 -64
  226. package/examples/select/placeholder.html +0 -40
  227. package/examples/select/remote-data-preselected.html +0 -283
  228. package/examples/select/remote-data.html +0 -38
  229. package/examples/select/search.html +0 -57
  230. package/examples/select/sizes.html +0 -94
  231. package/examples/select/tags-enhanced.html +0 -86
  232. package/examples/select/tags-icons.html +0 -57
  233. package/examples/select/template-customization.html +0 -61
  234. package/examples/sticky/README.md +0 -158
  235. package/examples/sticky/debug-sticky.html +0 -144
  236. package/examples/sticky/test-runner.html +0 -175
  237. package/examples/sticky/test-sticky-logic.js +0 -369
  238. package/examples/sticky/test-sticky-positioning.html +0 -386
  239. package/examples/toast/example.html +0 -479
  240. package/lib/cjs/components/datepicker/calendar.js +0 -1061
  241. package/lib/cjs/components/datepicker/calendar.js.map +0 -1
  242. package/lib/cjs/components/datepicker/config.js +0 -332
  243. package/lib/cjs/components/datepicker/config.js.map +0 -1
  244. package/lib/cjs/components/datepicker/dropdown.js +0 -635
  245. package/lib/cjs/components/datepicker/dropdown.js.map +0 -1
  246. package/lib/cjs/components/datepicker/events.js +0 -129
  247. package/lib/cjs/components/datepicker/events.js.map +0 -1
  248. package/lib/cjs/components/datepicker/keyboard.js +0 -536
  249. package/lib/cjs/components/datepicker/keyboard.js.map +0 -1
  250. package/lib/cjs/components/datepicker/locales.js +0 -78
  251. package/lib/cjs/components/datepicker/locales.js.map +0 -1
  252. package/lib/cjs/components/datepicker/templates.js +0 -403
  253. package/lib/cjs/components/datepicker/templates.js.map +0 -1
  254. package/lib/cjs/components/datepicker/types.js +0 -23
  255. package/lib/cjs/components/datepicker/types.js.map +0 -1
  256. package/lib/cjs/components/datepicker/utils.js +0 -524
  257. package/lib/cjs/components/datepicker/utils.js.map +0 -1
  258. package/lib/esm/components/datepicker/calendar.js +0 -1058
  259. package/lib/esm/components/datepicker/calendar.js.map +0 -1
  260. package/lib/esm/components/datepicker/config.js +0 -329
  261. package/lib/esm/components/datepicker/config.js.map +0 -1
  262. package/lib/esm/components/datepicker/dropdown.js +0 -632
  263. package/lib/esm/components/datepicker/dropdown.js.map +0 -1
  264. package/lib/esm/components/datepicker/events.js +0 -126
  265. package/lib/esm/components/datepicker/events.js.map +0 -1
  266. package/lib/esm/components/datepicker/keyboard.js +0 -533
  267. package/lib/esm/components/datepicker/keyboard.js.map +0 -1
  268. package/lib/esm/components/datepicker/locales.js +0 -74
  269. package/lib/esm/components/datepicker/locales.js.map +0 -1
  270. package/lib/esm/components/datepicker/templates.js +0 -390
  271. package/lib/esm/components/datepicker/templates.js.map +0 -1
  272. package/lib/esm/components/datepicker/types.js +0 -20
  273. package/lib/esm/components/datepicker/types.js.map +0 -1
  274. package/lib/esm/components/datepicker/utils.js +0 -508
  275. package/lib/esm/components/datepicker/utils.js.map +0 -1
  276. package/prettier.config.js +0 -9
  277. package/src/components/datepicker/calendar.ts +0 -1397
  278. package/src/components/datepicker/config.ts +0 -368
  279. package/src/components/datepicker/dropdown.ts +0 -757
  280. package/src/components/datepicker/events.ts +0 -149
  281. package/src/components/datepicker/keyboard.ts +0 -646
  282. package/src/components/datepicker/locales.ts +0 -80
  283. package/src/components/datepicker/templates.ts +0 -792
  284. package/src/components/datepicker/types.ts +0 -154
  285. package/src/components/datepicker/utils.ts +0 -631
  286. package/src/components/select/variants.css +0 -4
  287. package/tsconfig.json +0 -17
  288. package/webpack.config.js +0 -118
@@ -1,365 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
-
4
- <head>
5
- <meta charset="UTF-8">
6
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
- <title>DataTable Remote Data with Checkboxes Test</title>
8
- <link rel="stylesheet" href="../../dist/styles.css">
9
- </head>
10
-
11
- <body class="bg-gray-50 min-h-screen p-4">
12
- <div class="container mx-auto max-w-5xl">
13
- <div class="bg-white rounded-lg shadow-lg p-8 mt-6 border border-gray-200">
14
- <div class="mb-6">
15
- <h1 class="text-xl font-bold text-gray-900">DataTable Remote Data with Checkboxes Test</h1>
16
- <p class="text-sm text-gray-600 mt-2">Tests checkbox events with server-side data from JSONPlaceholder API</p>
17
- </div>
18
-
19
- <!-- Current Selection Display -->
20
- <div class="mb-6">
21
- <h2 class="text-lg font-semibold text-gray-800 mb-3">Current Selection</h2>
22
- <div id="selectionDisplay" class="bg-blue-50 border border-blue-200 rounded-md p-4">
23
- <div class="text-gray-700">
24
- <strong>Checked IDs:</strong> <span id="checkedIds" class="font-mono">[]</span>
25
- </div>
26
- <div class="text-gray-700 mt-2">
27
- <strong>Count:</strong> <span id="checkedCount" class="font-semibold">0</span>
28
- </div>
29
- </div>
30
- </div>
31
-
32
- <!-- Test Controls -->
33
- <div class="mb-6 flex gap-3 flex-wrap">
34
- <button
35
- onclick="testCheckAll()"
36
- class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700 transition-colors font-medium">
37
- Check All
38
- </button>
39
- <button
40
- onclick="testUncheckAll()"
41
- class="px-4 py-2 bg-red-600 text-white rounded-md hover:bg-red-700 transition-colors font-medium">
42
- Uncheck All
43
- </button>
44
- <button
45
- onclick="testToggle()"
46
- class="px-4 py-2 bg-purple-600 text-white rounded-md hover:bg-purple-700 transition-colors font-medium">
47
- Toggle All
48
- </button>
49
- <button
50
- onclick="testGetChecked()"
51
- class="px-4 py-2 bg-blue-600 text-white rounded-md hover:bg-blue-700 transition-colors font-medium">
52
- Get Checked
53
- </button>
54
- </div>
55
-
56
- <!-- DataTable Container -->
57
- <div class="kt-card">
58
- <div class="kt-card-table" id="remote-datatable-container">
59
- <div class="kt-table-wrapper kt-scrollable">
60
- <table id="remote-checkbox-table" class="kt-table" data-kt-datatable-table="true">
61
- <thead>
62
- <tr>
63
- <th scope="col" class="w-12" data-kt-datatable-column="checkbox">
64
- <input
65
- type="checkbox"
66
- data-kt-datatable-check="true"
67
- class="w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2">
68
- </th>
69
- <th scope="col" class="w-20" data-kt-datatable-column="id">
70
- <span class="kt-table-col">
71
- <span class="kt-table-col-label">ID</span>
72
- <span class="kt-table-col-sort"></span>
73
- </span>
74
- </th>
75
- <th scope="col" class="w-48" data-kt-datatable-column="name">
76
- <span class="kt-table-col">
77
- <span class="kt-table-col-label">Name</span>
78
- <span class="kt-table-col-sort"></span>
79
- </span>
80
- </th>
81
- <th scope="col" class="w-64" data-kt-datatable-column="email">
82
- <span class="kt-table-col">
83
- <span class="kt-table-col-label">Email</span>
84
- <span class="kt-table-col-sort"></span>
85
- </span>
86
- </th>
87
- <th scope="col" class="w-40" data-kt-datatable-column="company">
88
- <span class="kt-table-col">
89
- <span class="kt-table-col-label">Company</span>
90
- <span class="kt-table-col-sort"></span>
91
- </span>
92
- </th>
93
- </tr>
94
- </thead>
95
- <tbody>
96
- <!-- Data will be loaded from API -->
97
- </tbody>
98
- </table>
99
- </div>
100
-
101
- <!-- Pagination Info -->
102
- <div class="flex items-center justify-between mt-4">
103
- <div class="flex items-center space-x-2">
104
- <span class="text-sm text-gray-700">Show</span>
105
- <select data-kt-datatable-size="true" class="border border-gray-300 rounded px-2 py-1 bg-white text-gray-900">
106
- <option value="5" selected>5</option>
107
- <option value="10">10</option>
108
- </select>
109
- <span class="text-sm text-gray-700">entries</span>
110
- </div>
111
- <div data-kt-datatable-info="true" class="text-sm text-gray-700"></div>
112
- </div>
113
-
114
- <!-- Pagination Controls -->
115
- <div class="flex justify-center mt-4">
116
- <div data-kt-datatable-pagination="true" class="flex space-x-1"></div>
117
- </div>
118
- </div>
119
- </div>
120
- </div>
121
-
122
- <!-- Event Log Section -->
123
- <div class="bg-white rounded-lg shadow-lg p-8 mt-6 border border-gray-200">
124
- <div class="flex items-center justify-between mb-3">
125
- <h2 class="text-lg font-semibold text-gray-800">Event Log</h2>
126
- <button
127
- id="clearLog"
128
- onclick="clearEventLog()"
129
- class="px-3 py-1 text-sm bg-gray-200 text-gray-700 rounded-md hover:bg-gray-300 transition-colors">
130
- Clear Log
131
- </button>
132
- </div>
133
- <div id="eventLog" class="bg-gray-50 border border-gray-200 rounded-md p-4 h-64 overflow-y-auto font-mono text-sm">
134
- <div class="text-gray-500">No events yet. Interact with checkboxes to see events...</div>
135
- </div>
136
- </div>
137
- </div>
138
-
139
- <script src="../../dist/ktui.js"></script>
140
- <script>
141
- let datatableInstance = null;
142
-
143
- // Event log helper functions
144
- function addEventLog(eventName, details = '') {
145
- const logElement = document.getElementById('eventLog');
146
- const timestamp = new Date().toLocaleTimeString();
147
- const logEntry = document.createElement('div');
148
- logEntry.className = 'mb-2 pb-2 border-b border-gray-200';
149
-
150
- let eventColor = 'text-gray-700';
151
- if (eventName === 'checked') {
152
- eventColor = 'text-green-600';
153
- } else if (eventName === 'unchecked') {
154
- eventColor = 'text-red-600';
155
- } else if (eventName === 'changed') {
156
- eventColor = 'text-blue-600';
157
- } else if (eventName === 'fetch' || eventName === 'fetched') {
158
- eventColor = 'text-purple-600';
159
- }
160
-
161
- logEntry.innerHTML = `
162
- <div class="flex items-start gap-2">
163
- <span class="text-gray-500 text-xs">[${timestamp}]</span>
164
- <span class="font-semibold ${eventColor}">${eventName.toUpperCase()}</span>
165
- ${details ? `<span class="text-gray-600">${details}</span>` : ''}
166
- </div>
167
- `;
168
-
169
- // Remove "No events yet" message if it exists
170
- const firstChild = logElement.firstChild;
171
- if (firstChild && firstChild.textContent.includes('No events yet')) {
172
- logElement.removeChild(firstChild);
173
- }
174
-
175
- logElement.insertBefore(logEntry, logElement.firstChild);
176
-
177
- // Keep only last 50 entries
178
- while (logElement.children.length > 50) {
179
- logElement.removeChild(logElement.lastChild);
180
- }
181
- }
182
-
183
- function clearEventLog() {
184
- const logElement = document.getElementById('eventLog');
185
- logElement.innerHTML = '<div class="text-gray-500">No events yet. Interact with checkboxes to see events...</div>';
186
- }
187
-
188
- function updateSelectionDisplay() {
189
- if (!datatableInstance || typeof datatableInstance.getChecked !== 'function') {
190
- return;
191
- }
192
- try {
193
- const checkedIds = datatableInstance.getChecked();
194
- document.getElementById('checkedIds').textContent = JSON.stringify(checkedIds);
195
- document.getElementById('checkedCount').textContent = checkedIds.length;
196
- } catch (e) {
197
- console.error('Error updating selection display:', e);
198
- }
199
- }
200
-
201
- // Test functions
202
- function testCheckAll() {
203
- if (datatableInstance) {
204
- datatableInstance.check();
205
- }
206
- }
207
-
208
- function testUncheckAll() {
209
- if (datatableInstance) {
210
- datatableInstance.uncheck();
211
- }
212
- }
213
-
214
- function testToggle() {
215
- if (datatableInstance) {
216
- datatableInstance.toggle();
217
- }
218
- }
219
-
220
- function testGetChecked() {
221
- if (datatableInstance) {
222
- const checkedIds = datatableInstance.getChecked();
223
- addEventLog('info', `Manual getChecked() call returned: [${checkedIds.join(', ')}]`);
224
- }
225
- }
226
-
227
- // Initialize the datatable when page loads
228
- document.addEventListener('DOMContentLoaded', function() {
229
- setTimeout(() => {
230
- try {
231
- // Initialize KTUI components
232
- if (typeof KTDataTable !== 'undefined') {
233
- const container = document.getElementById('remote-datatable-container');
234
- if (container) {
235
- // Set data attributes for datatable initialization
236
- container.setAttribute('data-kt-datatable', 'true');
237
- container.setAttribute('data-kt-datatable-page-size', '5');
238
- container.setAttribute('data-kt-datatable-api-endpoint', 'https://jsonplaceholder.typicode.com/users');
239
-
240
- datatableInstance = new KTDataTable(container, {
241
- apiEndpoint: 'https://jsonplaceholder.typicode.com/users',
242
- requestMethod: 'GET',
243
- requestHeaders: {
244
- 'Content-Type': 'application/json'
245
- },
246
- columns: {
247
- 'checkbox': {
248
- render: function(cellData, rowData, context) {
249
- const checkbox = document.createElement('input');
250
- checkbox.type = 'checkbox';
251
- checkbox.value = rowData.id;
252
- checkbox.setAttribute('data-kt-datatable-row-check', 'true');
253
- checkbox.className = 'w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 focus:ring-2';
254
- return checkbox;
255
- }
256
- },
257
- 'id': {
258
- render: function(cellData, rowData, context) {
259
- return String(cellData);
260
- }
261
- },
262
- 'name': {
263
- render: function(cellData, rowData, context) {
264
- return String(cellData);
265
- }
266
- },
267
- 'email': {
268
- render: function(cellData, rowData, context) {
269
- return String(cellData);
270
- }
271
- },
272
- 'company': {
273
- render: function(cellData, rowData, context) {
274
- return String(cellData);
275
- }
276
- }
277
- },
278
- mapResponse: function(response) {
279
- // JSONPlaceholder returns an array directly
280
- // Transform nested objects to flat structure and format for datatable
281
- if (Array.isArray(response)) {
282
- const transformedData = response.map(user => ({
283
- checkbox: '', // Empty value for checkbox column
284
- id: user.id,
285
- name: user.name,
286
- email: user.email,
287
- company: user.company ? user.company.name : ''
288
- }));
289
-
290
- // Get current pagination state for client-side pagination
291
- // Since JSONPlaceholder doesn't support server-side pagination
292
- // Use 'this' context which refers to the datatable instance
293
- const state = this.getState();
294
- const page = state.page || 1;
295
- const pageSize = state.pageSize || 10;
296
-
297
- // Slice data for current page (client-side pagination)
298
- const startIndex = (page - 1) * pageSize;
299
- const endIndex = startIndex + pageSize;
300
- const paginatedData = transformedData.slice(startIndex, endIndex);
301
-
302
- return {
303
- data: paginatedData,
304
- totalCount: transformedData.length
305
- };
306
- }
307
- // If already in correct format, return as is
308
- return response;
309
- },
310
- checkbox: {
311
- preserveSelection: true
312
- }
313
- });
314
-
315
- console.log('✅ Remote DataTable with Checkboxes initialized successfully!');
316
-
317
- // Attach event listeners using DOM events (without kt-datatable- prefix)
318
- container.addEventListener('checked', function(event) {
319
- const checkedIds = datatableInstance.getChecked();
320
- addEventLog('checked', `Selected ${checkedIds.length} rows: [${checkedIds.join(', ')}]`);
321
- updateSelectionDisplay();
322
- });
323
-
324
- container.addEventListener('unchecked', function(event) {
325
- const checkedIds = datatableInstance.getChecked();
326
- addEventLog('unchecked', `Deselected. Remaining: ${checkedIds.length} rows: [${checkedIds.join(', ')}]`);
327
- updateSelectionDisplay();
328
- });
329
-
330
- container.addEventListener('changed', function(event) {
331
- const checkedIds = datatableInstance.getChecked();
332
- addEventLog('changed', `Selection changed. Total: ${checkedIds.length} rows: [${checkedIds.join(', ')}]`);
333
- updateSelectionDisplay();
334
- });
335
-
336
- container.addEventListener('fetch', function() {
337
- addEventLog('fetch', 'Fetching data from server...');
338
- });
339
-
340
- container.addEventListener('fetched', function() {
341
- try {
342
- const state = datatableInstance.getState();
343
- addEventLog('fetched', `Loaded ${state.totalItems || 0} total records`);
344
- // Update selection display after data is loaded
345
- updateSelectionDisplay();
346
- } catch (e) {
347
- console.error('Error in fetched handler:', e);
348
- }
349
- });
350
- } else {
351
- console.error('❌ DataTable container not found');
352
- }
353
- } else {
354
- console.error('❌ KTDataTable is not defined');
355
- }
356
- } catch (error) {
357
- console.error('❌ Error initializing Remote DataTable: ' + error.message);
358
- }
359
- }, 100);
360
- });
361
- </script>
362
- </body>
363
-
364
- </html>
365
-
@@ -1,258 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>KT DataTable Sorting Test</title>
7
- <script src="https://cdn.tailwindcss.com"></script>
8
- <link rel="stylesheet" href="../../dist/styles.css">
9
- <style>
10
- /* Custom styles for the test */
11
- .test-container {
12
- max-width: 1200px;
13
- margin: 0 auto;
14
- padding: 20px;
15
- }
16
- .test-header {
17
- background: #f8f9fa;
18
- padding: 20px;
19
- border-radius: 8px;
20
- margin-bottom: 20px;
21
- }
22
- .test-controls {
23
- display: flex;
24
- gap: 10px;
25
- margin-bottom: 20px;
26
- flex-wrap: wrap;
27
- }
28
- .test-button {
29
- background: #007bff;
30
- color: white;
31
- border: none;
32
- padding: 8px 16px;
33
- border-radius: 4px;
34
- cursor: pointer;
35
- }
36
- .test-button:hover {
37
- background: #0056b3;
38
- }
39
- .test-status {
40
- padding: 10px;
41
- border-radius: 4px;
42
- margin-top: 10px;
43
- font-weight: bold;
44
- }
45
- .test-pass {
46
- background: #d4edda;
47
- color: #155724;
48
- border: 1px solid #c3e6cb;
49
- }
50
- .test-fail {
51
- background: #f8d7da;
52
- color: #721c24;
53
- border: 1px solid #f5c6cb;
54
- }
55
- </style>
56
- </head>
57
- <body>
58
- <div class="test-container">
59
- <!-- Search Input -->
60
- <div class="mb-4">
61
- <input
62
- type="text"
63
- id="search-input"
64
- placeholder="Search data..."
65
- class="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
66
- data-kt-datatable-search="#sorting-test-table"
67
- >
68
- </div>
69
-
70
- <!-- DataTable Container using official structure -->
71
- <div class="kt-card">
72
- <div class="kt-card-table" data-kt-datatable="true" data-kt-datatable-page-size="5" data-kt-datatable-state-save="true">
73
- <div class="kt-table-wrapper kt-scrollable">
74
- <table id="sorting-test-table" class="kt-table" data-kt-datatable-table="true">
75
- <thead>
76
- <tr>
77
- <th scope="col" class="w-20" data-kt-datatable-column="id">
78
- <span class="kt-table-col">
79
- <span class="kt-table-col-label">ID</span>
80
- <span class="kt-table-col-sort"></span>
81
- </span>
82
- </th>
83
- <th scope="col" class="w-32" data-kt-datatable-column="name">
84
- <span class="kt-table-col">
85
- <span class="kt-table-col-label">Name</span>
86
- <span class="kt-table-col-sort"></span>
87
- </span>
88
- </th>
89
- <th scope="col" class="w-40" data-kt-datatable-column="email">
90
- <span class="kt-table-col">
91
- <span class="kt-table-col-label">Email</span>
92
- <span class="kt-table-col-sort"></span>
93
- </span>
94
- </th>
95
- <th scope="col" class="w-32" data-kt-datatable-column="department">
96
- <span class="kt-table-col">
97
- <span class="kt-table-col-label">Department</span>
98
- <span class="kt-table-col-sort"></span>
99
- </span>
100
- </th>
101
- <th scope="col" class="w-24" data-kt-datatable-column="salary">
102
- <span class="kt-table-col">
103
- <span class="kt-table-col-label">Salary</span>
104
- <span class="kt-table-col-sort"></span>
105
- </span>
106
- </th>
107
- <th scope="col" class="w-24" data-kt-datatable-column="status">
108
- <span class="kt-table-col">
109
- <span class="kt-table-col-label">Status</span>
110
- <span class="kt-table-col-sort"></span>
111
- </span>
112
- </th>
113
- </tr>
114
- </thead>
115
- <tbody>
116
- <tr>
117
- <td>1</td>
118
- <td>John Doe</td>
119
- <td>john.doe@example.com</td>
120
- <td>Engineering</td>
121
- <td>$75,000</td>
122
- <td><span class="kt-badge kt-badge-success">Active</span></td>
123
- </tr>
124
- <tr>
125
- <td>2</td>
126
- <td>Jane Smith</td>
127
- <td>jane.smith@example.com</td>
128
- <td>Marketing</td>
129
- <td>$65,000</td>
130
- <td><span class="kt-badge kt-badge-success">Active</span></td>
131
- </tr>
132
- <tr>
133
- <td>3</td>
134
- <td>Mike Johnson</td>
135
- <td>mike.johnson@example.com</td>
136
- <td>Engineering</td>
137
- <td>$80,000</td>
138
- <td><span class="kt-badge kt-badge-destructive">Inactive</span></td>
139
- </tr>
140
- <tr>
141
- <td>4</td>
142
- <td>Sarah Wilson</td>
143
- <td>sarah.wilson@example.com</td>
144
- <td>Sales</td>
145
- <td>$70,000</td>
146
- <td><span class="kt-badge kt-badge-success">Active</span></td>
147
- </tr>
148
- <tr>
149
- <td>5</td>
150
- <td>David Brown</td>
151
- <td>david.brown@example.com</td>
152
- <td>HR</td>
153
- <td>$60,000</td>
154
- <td><span class="kt-badge kt-badge-success">Active</span></td>
155
- </tr>
156
- <tr>
157
- <td>6</td>
158
- <td>Lisa Davis</td>
159
- <td>lisa.davis@example.com</td>
160
- <td>Engineering</td>
161
- <td>$85,000</td>
162
- <td><span class="kt-badge kt-badge-primary">Verified</span></td>
163
- </tr>
164
- <tr>
165
- <td>7</td>
166
- <td>Tom Anderson</td>
167
- <td>tom.anderson@example.com</td>
168
- <td>Marketing</td>
169
- <td>$68,000</td>
170
- <td><span class="kt-badge kt-badge-destructive">Inactive</span></td>
171
- </tr>
172
- <tr>
173
- <td>8</td>
174
- <td>Emma Taylor</td>
175
- <td>emma.taylor@example.com</td>
176
- <td>Sales</td>
177
- <td>$72,000</td>
178
- <td><span class="kt-badge kt-badge-success">Active</span></td>
179
- </tr>
180
- <tr>
181
- <td>9</td>
182
- <td>Chris Miller</td>
183
- <td>chris.miller@example.com</td>
184
- <td>Engineering</td>
185
- <td>$78,000</td>
186
- <td><span class="kt-badge kt-badge-success">Active</span></td>
187
- </tr>
188
- <tr>
189
- <td>10</td>
190
- <td>Amy Garcia</td>
191
- <td>amy.garcia@example.com</td>
192
- <td>HR</td>
193
- <td>$62,000</td>
194
- <td><span class="kt-badge kt-badge-success">Active</span></td>
195
- </tr>
196
- </tbody>
197
- </table>
198
- </div>
199
-
200
- <!-- Pagination Info -->
201
- <div class="flex items-center justify-between mt-4">
202
- <div class="flex items-center space-x-2">
203
- <span class="text-sm text-gray-700">Show</span>
204
- <select data-kt-datatable-size="true" class="border border-gray-300 rounded px-2 py-1">
205
- <option value="5">5</option>
206
- <option value="10" selected>10</option>
207
- <option value="20">20</option>
208
- <option value="50">50</option>
209
- </select>
210
- <span class="text-sm text-gray-700">entries</span>
211
- </div>
212
- <div data-kt-datatable-info="true" class="text-sm text-gray-700"></div>
213
- </div>
214
-
215
- <!-- Pagination Controls -->
216
- <div class="flex justify-center mt-4">
217
- <div data-kt-datatable-pagination="true" class="flex space-x-1"></div>
218
- </div>
219
- </div>
220
- </div>
221
- </div>
222
-
223
- <!-- Load KTUI -->
224
- <script src="../../dist/ktui.js"></script>
225
-
226
- <script>
227
- let datatableInstance = null;
228
-
229
- // Initialize the datatable when page loads
230
- document.addEventListener('DOMContentLoaded', function() {
231
- // Wait a bit for the DOM to be fully ready
232
- setTimeout(() => {
233
- try {
234
- // Initialize KTUI components using official method
235
- if (typeof KTDataTable !== 'undefined') {
236
- KTDataTable.init();
237
- }
238
-
239
- // Get the datatable instance using official API
240
- const container = document.querySelector('[data-kt-datatable="true"]');
241
- if (container) {
242
- datatableInstance = KTDataTable.getInstance(container);
243
- if (datatableInstance) {
244
- console.log('✅ DataTable initialized successfully using official API!');
245
- } else {
246
- console.error('❌ Failed to get DataTable instance');
247
- }
248
- } else {
249
- console.error('❌ DataTable container not found');
250
- }
251
- } catch (error) {
252
- console.error('❌ Error initializing DataTable: ' + error.message);
253
- }
254
- }, 100);
255
- });
256
- </script>
257
- </body>
258
- </html>