@keenthemes/ktui 1.0.7 → 1.0.9

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 (499) hide show
  1. package/dist/ktui.js +16038 -17101
  2. package/dist/ktui.min.js +1 -1
  3. package/dist/ktui.min.js.map +1 -1
  4. package/lib/cjs/components/accordion/accordion.js +20 -11
  5. package/lib/cjs/components/accordion/accordion.js.map +1 -1
  6. package/lib/cjs/components/accordion/index.js +4 -0
  7. package/lib/cjs/components/accordion/index.js.map +1 -1
  8. package/lib/cjs/components/accordion/types.js +4 -0
  9. package/lib/cjs/components/accordion/types.js.map +1 -1
  10. package/lib/cjs/components/collapse/collapse.js +13 -7
  11. package/lib/cjs/components/collapse/collapse.js.map +1 -1
  12. package/lib/cjs/components/collapse/index.js +4 -0
  13. package/lib/cjs/components/collapse/index.js.map +1 -1
  14. package/lib/cjs/components/collapse/types.js +4 -0
  15. package/lib/cjs/components/collapse/types.js.map +1 -1
  16. package/lib/cjs/components/component.js +12 -41
  17. package/lib/cjs/components/component.js.map +1 -1
  18. package/lib/cjs/components/constants.js +4 -0
  19. package/lib/cjs/components/constants.js.map +1 -1
  20. package/lib/cjs/components/datatable/datatable-checkbox.js +217 -0
  21. package/lib/cjs/components/datatable/datatable-checkbox.js.map +1 -0
  22. package/lib/cjs/components/datatable/datatable-sort.js +91 -0
  23. package/lib/cjs/components/datatable/datatable-sort.js.map +1 -0
  24. package/lib/cjs/components/datatable/datatable.js +294 -349
  25. package/lib/cjs/components/datatable/datatable.js.map +1 -1
  26. package/lib/cjs/components/datatable/index.js +4 -0
  27. package/lib/cjs/components/datatable/index.js.map +1 -1
  28. package/lib/cjs/components/datatable/types.js +4 -0
  29. package/lib/cjs/components/datatable/types.js.map +1 -1
  30. package/lib/cjs/components/datepicker/calendar.js +1061 -0
  31. package/lib/cjs/components/datepicker/calendar.js.map +1 -0
  32. package/lib/cjs/components/datepicker/config.js +332 -0
  33. package/lib/cjs/components/datepicker/config.js.map +1 -0
  34. package/lib/cjs/components/datepicker/datepicker.js +949 -0
  35. package/lib/cjs/components/datepicker/datepicker.js.map +1 -0
  36. package/lib/cjs/components/datepicker/dropdown.js +635 -0
  37. package/lib/cjs/components/datepicker/dropdown.js.map +1 -0
  38. package/lib/cjs/components/datepicker/events.js +129 -0
  39. package/lib/cjs/components/datepicker/events.js.map +1 -0
  40. package/lib/cjs/components/datepicker/index.js +13 -0
  41. package/lib/cjs/components/datepicker/index.js.map +1 -0
  42. package/lib/cjs/components/datepicker/keyboard.js +536 -0
  43. package/lib/cjs/components/datepicker/keyboard.js.map +1 -0
  44. package/lib/cjs/components/datepicker/locales.js +78 -0
  45. package/lib/cjs/components/datepicker/locales.js.map +1 -0
  46. package/lib/cjs/components/datepicker/templates.js +403 -0
  47. package/lib/cjs/components/datepicker/templates.js.map +1 -0
  48. package/lib/cjs/components/datepicker/types.js +23 -0
  49. package/lib/cjs/components/datepicker/types.js.map +1 -0
  50. package/lib/cjs/components/datepicker/utils.js +524 -0
  51. package/lib/cjs/components/datepicker/utils.js.map +1 -0
  52. package/lib/cjs/components/dismiss/dismiss.js +10 -6
  53. package/lib/cjs/components/dismiss/dismiss.js.map +1 -1
  54. package/lib/cjs/components/dismiss/index.js +4 -0
  55. package/lib/cjs/components/dismiss/index.js.map +1 -1
  56. package/lib/cjs/components/dismiss/types.js +4 -0
  57. package/lib/cjs/components/dismiss/types.js.map +1 -1
  58. package/lib/cjs/components/drawer/drawer.js +54 -28
  59. package/lib/cjs/components/drawer/drawer.js.map +1 -1
  60. package/lib/cjs/components/drawer/index.js +4 -0
  61. package/lib/cjs/components/drawer/index.js.map +1 -1
  62. package/lib/cjs/components/drawer/types.js +4 -0
  63. package/lib/cjs/components/drawer/types.js.map +1 -1
  64. package/lib/cjs/components/dropdown/dropdown.js +145 -115
  65. package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
  66. package/lib/cjs/components/dropdown/index.js +4 -0
  67. package/lib/cjs/components/dropdown/index.js.map +1 -1
  68. package/lib/cjs/components/dropdown/types.js +4 -0
  69. package/lib/cjs/components/dropdown/types.js.map +1 -1
  70. package/lib/cjs/components/image-input/image-input.js +21 -16
  71. package/lib/cjs/components/image-input/image-input.js.map +1 -1
  72. package/lib/cjs/components/image-input/index.js +4 -0
  73. package/lib/cjs/components/image-input/index.js.map +1 -1
  74. package/lib/cjs/components/image-input/types.js +4 -0
  75. package/lib/cjs/components/image-input/types.js.map +1 -1
  76. package/lib/cjs/components/modal/index.js +4 -0
  77. package/lib/cjs/components/modal/index.js.map +1 -1
  78. package/lib/cjs/components/modal/modal.js +26 -19
  79. package/lib/cjs/components/modal/modal.js.map +1 -1
  80. package/lib/cjs/components/modal/types.js +4 -0
  81. package/lib/cjs/components/modal/types.js.map +1 -1
  82. package/lib/cjs/components/reparent/index.js +4 -0
  83. package/lib/cjs/components/reparent/index.js.map +1 -1
  84. package/lib/cjs/components/reparent/reparent.js +13 -5
  85. package/lib/cjs/components/reparent/reparent.js.map +1 -1
  86. package/lib/cjs/components/reparent/types.js +4 -0
  87. package/lib/cjs/components/reparent/types.js.map +1 -1
  88. package/lib/cjs/components/scrollable/index.js +4 -0
  89. package/lib/cjs/components/scrollable/index.js.map +1 -1
  90. package/lib/cjs/components/scrollable/scrollable.js +17 -10
  91. package/lib/cjs/components/scrollable/scrollable.js.map +1 -1
  92. package/lib/cjs/components/scrollable/types.js +4 -0
  93. package/lib/cjs/components/scrollable/types.js.map +1 -1
  94. package/lib/cjs/components/scrollspy/index.js +4 -0
  95. package/lib/cjs/components/scrollspy/index.js.map +1 -1
  96. package/lib/cjs/components/scrollspy/scrollspy.js +28 -17
  97. package/lib/cjs/components/scrollspy/scrollspy.js.map +1 -1
  98. package/lib/cjs/components/scrollspy/types.js +4 -0
  99. package/lib/cjs/components/scrollspy/types.js.map +1 -1
  100. package/lib/cjs/components/scrollto/index.js +4 -0
  101. package/lib/cjs/components/scrollto/index.js.map +1 -1
  102. package/lib/cjs/components/scrollto/scrollto.js +14 -8
  103. package/lib/cjs/components/scrollto/scrollto.js.map +1 -1
  104. package/lib/cjs/components/scrollto/types.js +4 -0
  105. package/lib/cjs/components/scrollto/types.js.map +1 -1
  106. package/lib/cjs/components/select/combobox.js +237 -0
  107. package/lib/cjs/components/select/combobox.js.map +1 -0
  108. package/lib/cjs/components/select/config.js +226 -0
  109. package/lib/cjs/components/select/config.js.map +1 -0
  110. package/lib/cjs/components/select/dropdown.js +429 -0
  111. package/lib/cjs/components/select/dropdown.js.map +1 -0
  112. package/lib/cjs/components/select/index.js +24 -0
  113. package/lib/cjs/components/select/index.js.map +1 -0
  114. package/lib/cjs/components/select/option.js +53 -0
  115. package/lib/cjs/components/select/option.js.map +1 -0
  116. package/lib/cjs/components/select/remote.js +414 -0
  117. package/lib/cjs/components/select/remote.js.map +1 -0
  118. package/lib/cjs/components/select/search.js +339 -0
  119. package/lib/cjs/components/select/search.js.map +1 -0
  120. package/lib/cjs/components/select/select.js +1538 -0
  121. package/lib/cjs/components/select/select.js.map +1 -0
  122. package/lib/cjs/components/select/tags.js +110 -0
  123. package/lib/cjs/components/select/tags.js.map +1 -0
  124. package/lib/cjs/components/select/templates.js +337 -0
  125. package/lib/cjs/components/select/templates.js.map +1 -0
  126. package/lib/cjs/components/select/types.js +19 -0
  127. package/lib/cjs/components/select/types.js.map +1 -0
  128. package/lib/cjs/components/select/utils.js +606 -0
  129. package/lib/cjs/components/select/utils.js.map +1 -0
  130. package/lib/cjs/components/stepper/index.js +4 -0
  131. package/lib/cjs/components/stepper/index.js.map +1 -1
  132. package/lib/cjs/components/stepper/stepper.js +20 -13
  133. package/lib/cjs/components/stepper/stepper.js.map +1 -1
  134. package/lib/cjs/components/stepper/types.js +4 -0
  135. package/lib/cjs/components/stepper/types.js.map +1 -1
  136. package/lib/cjs/components/sticky/index.js +4 -0
  137. package/lib/cjs/components/sticky/index.js.map +1 -1
  138. package/lib/cjs/components/sticky/sticky.js +60 -38
  139. package/lib/cjs/components/sticky/sticky.js.map +1 -1
  140. package/lib/cjs/components/sticky/types.js +4 -0
  141. package/lib/cjs/components/sticky/types.js.map +1 -1
  142. package/lib/cjs/components/tabs/index.js +4 -0
  143. package/lib/cjs/components/tabs/index.js.map +1 -1
  144. package/lib/cjs/components/tabs/tabs.js +34 -24
  145. package/lib/cjs/components/tabs/tabs.js.map +1 -1
  146. package/lib/cjs/components/tabs/types.js +4 -0
  147. package/lib/cjs/components/tabs/types.js.map +1 -1
  148. package/lib/cjs/components/theme-switch/index.js +10 -0
  149. package/lib/cjs/components/theme-switch/index.js.map +1 -0
  150. package/lib/cjs/components/theme-switch/theme-switch.js +143 -0
  151. package/lib/cjs/components/theme-switch/theme-switch.js.map +1 -0
  152. package/lib/cjs/components/theme-switch/types.js +7 -0
  153. package/lib/cjs/components/theme-switch/types.js.map +1 -0
  154. package/lib/cjs/components/toggle/index.js +4 -0
  155. package/lib/cjs/components/toggle/index.js.map +1 -1
  156. package/lib/cjs/components/toggle/toggle.js +11 -7
  157. package/lib/cjs/components/toggle/toggle.js.map +1 -1
  158. package/lib/cjs/components/toggle/types.js +4 -0
  159. package/lib/cjs/components/toggle/types.js.map +1 -1
  160. package/lib/cjs/components/toggle-password/index.js +4 -0
  161. package/lib/cjs/components/toggle-password/index.js.map +1 -1
  162. package/lib/cjs/components/toggle-password/toggle-password.js +12 -7
  163. package/lib/cjs/components/toggle-password/toggle-password.js.map +1 -1
  164. package/lib/cjs/components/toggle-password/types.js +4 -0
  165. package/lib/cjs/components/toggle-password/types.js.map +1 -1
  166. package/lib/cjs/components/tooltip/index.js +4 -0
  167. package/lib/cjs/components/tooltip/index.js.map +1 -1
  168. package/lib/cjs/components/tooltip/tooltip.js +51 -21
  169. package/lib/cjs/components/tooltip/tooltip.js.map +1 -1
  170. package/lib/cjs/components/tooltip/types.js +4 -0
  171. package/lib/cjs/components/tooltip/types.js.map +1 -1
  172. package/lib/cjs/helpers/data.js +5 -1
  173. package/lib/cjs/helpers/data.js.map +1 -1
  174. package/lib/cjs/helpers/dom.js +34 -29
  175. package/lib/cjs/helpers/dom.js.map +1 -1
  176. package/lib/cjs/helpers/event-handler.js +5 -1
  177. package/lib/cjs/helpers/event-handler.js.map +1 -1
  178. package/lib/cjs/helpers/utils.js +65 -11
  179. package/lib/cjs/helpers/utils.js.map +1 -1
  180. package/lib/cjs/index.js +18 -22
  181. package/lib/cjs/index.js.map +1 -1
  182. package/lib/cjs/types.js +4 -0
  183. package/lib/cjs/types.js.map +1 -1
  184. package/lib/esm/components/accordion/accordion.js +20 -11
  185. package/lib/esm/components/accordion/accordion.js.map +1 -1
  186. package/lib/esm/components/accordion/index.js +4 -0
  187. package/lib/esm/components/accordion/index.js.map +1 -1
  188. package/lib/esm/components/accordion/types.js +4 -0
  189. package/lib/esm/components/accordion/types.js.map +1 -1
  190. package/lib/esm/components/collapse/collapse.js +13 -7
  191. package/lib/esm/components/collapse/collapse.js.map +1 -1
  192. package/lib/esm/components/collapse/index.js +4 -0
  193. package/lib/esm/components/collapse/index.js.map +1 -1
  194. package/lib/esm/components/collapse/types.js +4 -0
  195. package/lib/esm/components/collapse/types.js.map +1 -1
  196. package/lib/esm/components/component.js +12 -41
  197. package/lib/esm/components/component.js.map +1 -1
  198. package/lib/esm/components/constants.js +4 -0
  199. package/lib/esm/components/constants.js.map +1 -1
  200. package/lib/esm/components/datatable/datatable-checkbox.js +214 -0
  201. package/lib/esm/components/datatable/datatable-checkbox.js.map +1 -0
  202. package/lib/esm/components/datatable/datatable-sort.js +88 -0
  203. package/lib/esm/components/datatable/datatable-sort.js.map +1 -0
  204. package/lib/esm/components/datatable/datatable.js +294 -349
  205. package/lib/esm/components/datatable/datatable.js.map +1 -1
  206. package/lib/esm/components/datatable/index.js +4 -0
  207. package/lib/esm/components/datatable/index.js.map +1 -1
  208. package/lib/esm/components/datatable/types.js +4 -0
  209. package/lib/esm/components/datatable/types.js.map +1 -1
  210. package/lib/esm/components/datepicker/calendar.js +1058 -0
  211. package/lib/esm/components/datepicker/calendar.js.map +1 -0
  212. package/lib/esm/components/datepicker/config.js +329 -0
  213. package/lib/esm/components/datepicker/config.js.map +1 -0
  214. package/lib/esm/components/datepicker/datepicker.js +946 -0
  215. package/lib/esm/components/datepicker/datepicker.js.map +1 -0
  216. package/lib/esm/components/datepicker/dropdown.js +632 -0
  217. package/lib/esm/components/datepicker/dropdown.js.map +1 -0
  218. package/lib/esm/components/datepicker/events.js +126 -0
  219. package/lib/esm/components/datepicker/events.js.map +1 -0
  220. package/lib/esm/components/datepicker/index.js +9 -0
  221. package/lib/esm/components/datepicker/index.js.map +1 -0
  222. package/lib/esm/components/datepicker/keyboard.js +533 -0
  223. package/lib/esm/components/datepicker/keyboard.js.map +1 -0
  224. package/lib/esm/components/datepicker/locales.js +74 -0
  225. package/lib/esm/components/datepicker/locales.js.map +1 -0
  226. package/lib/esm/components/datepicker/templates.js +390 -0
  227. package/lib/esm/components/datepicker/templates.js.map +1 -0
  228. package/lib/esm/components/datepicker/types.js +20 -0
  229. package/lib/esm/components/datepicker/types.js.map +1 -0
  230. package/lib/esm/components/datepicker/utils.js +508 -0
  231. package/lib/esm/components/datepicker/utils.js.map +1 -0
  232. package/lib/esm/components/dismiss/dismiss.js +10 -6
  233. package/lib/esm/components/dismiss/dismiss.js.map +1 -1
  234. package/lib/esm/components/dismiss/index.js +4 -0
  235. package/lib/esm/components/dismiss/index.js.map +1 -1
  236. package/lib/esm/components/dismiss/types.js +4 -0
  237. package/lib/esm/components/dismiss/types.js.map +1 -1
  238. package/lib/esm/components/drawer/drawer.js +54 -28
  239. package/lib/esm/components/drawer/drawer.js.map +1 -1
  240. package/lib/esm/components/drawer/index.js +4 -0
  241. package/lib/esm/components/drawer/index.js.map +1 -1
  242. package/lib/esm/components/drawer/types.js +4 -0
  243. package/lib/esm/components/drawer/types.js.map +1 -1
  244. package/lib/esm/components/dropdown/dropdown.js +146 -116
  245. package/lib/esm/components/dropdown/dropdown.js.map +1 -1
  246. package/lib/esm/components/dropdown/index.js +4 -0
  247. package/lib/esm/components/dropdown/index.js.map +1 -1
  248. package/lib/esm/components/dropdown/types.js +4 -0
  249. package/lib/esm/components/dropdown/types.js.map +1 -1
  250. package/lib/esm/components/image-input/image-input.js +21 -16
  251. package/lib/esm/components/image-input/image-input.js.map +1 -1
  252. package/lib/esm/components/image-input/index.js +4 -0
  253. package/lib/esm/components/image-input/index.js.map +1 -1
  254. package/lib/esm/components/image-input/types.js +4 -0
  255. package/lib/esm/components/image-input/types.js.map +1 -1
  256. package/lib/esm/components/modal/index.js +4 -0
  257. package/lib/esm/components/modal/index.js.map +1 -1
  258. package/lib/esm/components/modal/modal.js +26 -19
  259. package/lib/esm/components/modal/modal.js.map +1 -1
  260. package/lib/esm/components/modal/types.js +4 -0
  261. package/lib/esm/components/modal/types.js.map +1 -1
  262. package/lib/esm/components/reparent/index.js +4 -0
  263. package/lib/esm/components/reparent/index.js.map +1 -1
  264. package/lib/esm/components/reparent/reparent.js +13 -5
  265. package/lib/esm/components/reparent/reparent.js.map +1 -1
  266. package/lib/esm/components/reparent/types.js +4 -0
  267. package/lib/esm/components/reparent/types.js.map +1 -1
  268. package/lib/esm/components/scrollable/index.js +4 -0
  269. package/lib/esm/components/scrollable/index.js.map +1 -1
  270. package/lib/esm/components/scrollable/scrollable.js +17 -10
  271. package/lib/esm/components/scrollable/scrollable.js.map +1 -1
  272. package/lib/esm/components/scrollable/types.js +4 -0
  273. package/lib/esm/components/scrollable/types.js.map +1 -1
  274. package/lib/esm/components/scrollspy/index.js +4 -0
  275. package/lib/esm/components/scrollspy/index.js.map +1 -1
  276. package/lib/esm/components/scrollspy/scrollspy.js +28 -17
  277. package/lib/esm/components/scrollspy/scrollspy.js.map +1 -1
  278. package/lib/esm/components/scrollspy/types.js +4 -0
  279. package/lib/esm/components/scrollspy/types.js.map +1 -1
  280. package/lib/esm/components/scrollto/index.js +4 -0
  281. package/lib/esm/components/scrollto/index.js.map +1 -1
  282. package/lib/esm/components/scrollto/scrollto.js +14 -8
  283. package/lib/esm/components/scrollto/scrollto.js.map +1 -1
  284. package/lib/esm/components/scrollto/types.js +4 -0
  285. package/lib/esm/components/scrollto/types.js.map +1 -1
  286. package/lib/esm/components/select/combobox.js +234 -0
  287. package/lib/esm/components/select/combobox.js.map +1 -0
  288. package/lib/esm/components/select/config.js +223 -0
  289. package/lib/esm/components/select/config.js.map +1 -0
  290. package/lib/esm/components/select/dropdown.js +426 -0
  291. package/lib/esm/components/select/dropdown.js.map +1 -0
  292. package/lib/esm/components/select/index.js +12 -0
  293. package/lib/esm/components/select/index.js.map +1 -0
  294. package/lib/esm/components/select/option.js +50 -0
  295. package/lib/esm/components/select/option.js.map +1 -0
  296. package/lib/esm/components/select/remote.js +411 -0
  297. package/lib/esm/components/select/remote.js.map +1 -0
  298. package/lib/esm/components/select/search.js +336 -0
  299. package/lib/esm/components/select/search.js.map +1 -0
  300. package/lib/esm/components/select/select.js +1535 -0
  301. package/lib/esm/components/select/select.js.map +1 -0
  302. package/lib/esm/components/select/tags.js +107 -0
  303. package/lib/esm/components/select/tags.js.map +1 -0
  304. package/lib/esm/components/select/templates.js +332 -0
  305. package/lib/esm/components/select/templates.js.map +1 -0
  306. package/lib/esm/components/select/types.js +16 -0
  307. package/lib/esm/components/select/types.js.map +1 -0
  308. package/lib/esm/components/select/utils.js +598 -0
  309. package/lib/esm/components/select/utils.js.map +1 -0
  310. package/lib/esm/components/stepper/index.js +4 -0
  311. package/lib/esm/components/stepper/index.js.map +1 -1
  312. package/lib/esm/components/stepper/stepper.js +20 -13
  313. package/lib/esm/components/stepper/stepper.js.map +1 -1
  314. package/lib/esm/components/stepper/types.js +4 -0
  315. package/lib/esm/components/stepper/types.js.map +1 -1
  316. package/lib/esm/components/sticky/index.js +4 -0
  317. package/lib/esm/components/sticky/index.js.map +1 -1
  318. package/lib/esm/components/sticky/sticky.js +60 -38
  319. package/lib/esm/components/sticky/sticky.js.map +1 -1
  320. package/lib/esm/components/sticky/types.js +4 -0
  321. package/lib/esm/components/sticky/types.js.map +1 -1
  322. package/lib/esm/components/tabs/index.js +4 -0
  323. package/lib/esm/components/tabs/index.js.map +1 -1
  324. package/lib/esm/components/tabs/tabs.js +34 -24
  325. package/lib/esm/components/tabs/tabs.js.map +1 -1
  326. package/lib/esm/components/tabs/types.js +4 -0
  327. package/lib/esm/components/tabs/types.js.map +1 -1
  328. package/lib/esm/components/theme-switch/index.js +6 -0
  329. package/lib/esm/components/theme-switch/index.js.map +1 -0
  330. package/lib/esm/components/theme-switch/theme-switch.js +140 -0
  331. package/lib/esm/components/theme-switch/theme-switch.js.map +1 -0
  332. package/lib/esm/components/theme-switch/types.js +6 -0
  333. package/lib/esm/components/theme-switch/types.js.map +1 -0
  334. package/lib/esm/components/toggle/index.js +4 -0
  335. package/lib/esm/components/toggle/index.js.map +1 -1
  336. package/lib/esm/components/toggle/toggle.js +11 -7
  337. package/lib/esm/components/toggle/toggle.js.map +1 -1
  338. package/lib/esm/components/toggle/types.js +4 -0
  339. package/lib/esm/components/toggle/types.js.map +1 -1
  340. package/lib/esm/components/toggle-password/index.js +4 -0
  341. package/lib/esm/components/toggle-password/index.js.map +1 -1
  342. package/lib/esm/components/toggle-password/toggle-password.js +12 -7
  343. package/lib/esm/components/toggle-password/toggle-password.js.map +1 -1
  344. package/lib/esm/components/toggle-password/types.js +4 -0
  345. package/lib/esm/components/toggle-password/types.js.map +1 -1
  346. package/lib/esm/components/tooltip/index.js +4 -0
  347. package/lib/esm/components/tooltip/index.js.map +1 -1
  348. package/lib/esm/components/tooltip/tooltip.js +52 -22
  349. package/lib/esm/components/tooltip/tooltip.js.map +1 -1
  350. package/lib/esm/components/tooltip/types.js +4 -0
  351. package/lib/esm/components/tooltip/types.js.map +1 -1
  352. package/lib/esm/helpers/data.js +5 -1
  353. package/lib/esm/helpers/data.js.map +1 -1
  354. package/lib/esm/helpers/dom.js +34 -29
  355. package/lib/esm/helpers/dom.js.map +1 -1
  356. package/lib/esm/helpers/event-handler.js +5 -1
  357. package/lib/esm/helpers/event-handler.js.map +1 -1
  358. package/lib/esm/helpers/utils.js +65 -11
  359. package/lib/esm/helpers/utils.js.map +1 -1
  360. package/lib/esm/index.js +14 -16
  361. package/lib/esm/index.js.map +1 -1
  362. package/lib/esm/types.js +4 -0
  363. package/lib/esm/types.js.map +1 -1
  364. package/package.json +16 -8
  365. package/src/components/accordion/accordion-menu.css +1 -2
  366. package/src/components/accordion/accordion.css +1 -1
  367. package/src/components/accordion/accordion.ts +1 -1
  368. package/src/components/accordion/index.ts +1 -1
  369. package/src/components/accordion/types.ts +1 -1
  370. package/src/components/alert/alert.css +1 -1
  371. package/src/components/avatar/avatar.css +1 -1
  372. package/src/components/badge/badge.css +1 -1
  373. package/src/components/breadcrumb/breadcrumb.css +1 -1
  374. package/src/components/btn/btn.css +1 -1
  375. package/src/components/card/card.css +1 -1
  376. package/src/components/checkbox/checkbox.css +1 -1
  377. package/src/components/collapse/collapse.css +1 -1
  378. package/src/components/collapse/collapse.ts +1 -1
  379. package/src/components/collapse/index.ts +1 -1
  380. package/src/components/collapse/types.ts +1 -1
  381. package/src/components/component.ts +1 -1
  382. package/src/components/constants.ts +1 -1
  383. package/src/components/datatable/datatable-checkbox.ts +1 -1
  384. package/src/components/datatable/datatable-sort.ts +1 -1
  385. package/src/components/datatable/datatable.css +1 -1
  386. package/src/components/datatable/datatable.ts +38 -2
  387. package/src/components/datatable/index.ts +1 -1
  388. package/src/components/datatable/types.ts +1 -1
  389. package/src/components/datepicker/calendar.ts +1 -1
  390. package/src/components/datepicker/config.ts +1 -1
  391. package/src/components/datepicker/datepicker.css +1 -1
  392. package/src/components/datepicker/datepicker.ts +1 -1
  393. package/src/components/datepicker/dropdown.ts +1 -1
  394. package/src/components/datepicker/events.ts +1 -1
  395. package/src/components/datepicker/index.ts +1 -1
  396. package/src/components/datepicker/keyboard.ts +1 -1
  397. package/src/components/datepicker/locales.ts +1 -1
  398. package/src/components/datepicker/templates.ts +1 -1
  399. package/src/components/datepicker/types.ts +1 -1
  400. package/src/components/datepicker/utils.ts +1 -1
  401. package/src/components/dismiss/dismiss.css +1 -1
  402. package/src/components/dismiss/dismiss.ts +1 -1
  403. package/src/components/dismiss/index.ts +1 -1
  404. package/src/components/dismiss/types.ts +1 -1
  405. package/src/components/drawer/drawer.css +1 -1
  406. package/src/components/drawer/drawer.ts +1 -1
  407. package/src/components/drawer/index.ts +1 -1
  408. package/src/components/drawer/types.ts +1 -1
  409. package/src/components/dropdown/dropdown-menu.css +1 -1
  410. package/src/components/dropdown/dropdown.css +1 -1
  411. package/src/components/dropdown/dropdown.ts +1 -1
  412. package/src/components/dropdown/index.ts +1 -1
  413. package/src/components/dropdown/types.ts +1 -1
  414. package/src/components/form/form.css +1 -1
  415. package/src/components/image-input/image-input.css +1 -1
  416. package/src/components/image-input/image-input.ts +1 -1
  417. package/src/components/image-input/index.ts +1 -1
  418. package/src/components/image-input/types.ts +1 -1
  419. package/src/components/input/input-group.css +8 -5
  420. package/src/components/input/input.css +1 -1
  421. package/src/components/kbd/kbd.css +1 -1
  422. package/src/components/label/label.css +1 -1
  423. package/src/components/link/link.css +1 -1
  424. package/src/components/modal/index.ts +1 -1
  425. package/src/components/modal/modal.css +1 -1
  426. package/src/components/modal/modal.ts +1 -1
  427. package/src/components/modal/types.ts +1 -1
  428. package/src/components/pagination/pagination.css +1 -1
  429. package/src/components/popover/popover.css +1 -1
  430. package/src/components/progress/progress.css +2 -2
  431. package/src/components/radio/radio.css +1 -1
  432. package/src/components/reparent/index.ts +1 -1
  433. package/src/components/reparent/reparent.ts +1 -1
  434. package/src/components/reparent/types.ts +1 -1
  435. package/src/components/scrollable/index.ts +1 -1
  436. package/src/components/scrollable/scrollable.css +1 -1
  437. package/src/components/scrollable/scrollable.ts +1 -1
  438. package/src/components/scrollable/types.ts +1 -1
  439. package/src/components/scrollspy/index.ts +1 -1
  440. package/src/components/scrollspy/scrollspy.css +1 -1
  441. package/src/components/scrollspy/scrollspy.ts +1 -1
  442. package/src/components/scrollspy/types.ts +1 -1
  443. package/src/components/scrollto/index.ts +1 -1
  444. package/src/components/scrollto/scrollto.ts +1 -1
  445. package/src/components/scrollto/types.ts +1 -1
  446. package/src/components/select/combobox.ts +1 -1
  447. package/src/components/select/config.ts +1 -1
  448. package/src/components/select/dropdown.ts +1 -1
  449. package/src/components/select/index.ts +1 -1
  450. package/src/components/select/option.ts +1 -1
  451. package/src/components/select/remote.ts +1 -1
  452. package/src/components/select/search.ts +1 -1
  453. package/src/components/select/select.css +1 -1
  454. package/src/components/select/select.ts +1 -1
  455. package/src/components/select/tags.ts +1 -1
  456. package/src/components/select/templates.ts +1 -1
  457. package/src/components/select/types.ts +1 -1
  458. package/src/components/select/utils.ts +1 -1
  459. package/src/components/select/variants.css +1 -1
  460. package/src/components/separator/separator.css +1 -1
  461. package/src/components/skeleton/skeleton.css +1 -1
  462. package/src/components/stepper/index.ts +1 -1
  463. package/src/components/stepper/stepper.css +1 -1
  464. package/src/components/stepper/stepper.ts +1 -1
  465. package/src/components/stepper/types.ts +1 -1
  466. package/src/components/sticky/index.ts +1 -1
  467. package/src/components/sticky/sticky.css +1 -1
  468. package/src/components/sticky/sticky.ts +1 -1
  469. package/src/components/sticky/types.ts +1 -1
  470. package/src/components/switch/switch.css +1 -1
  471. package/src/components/table/table.css +2 -2
  472. package/src/components/tabs/index.ts +1 -1
  473. package/src/components/tabs/tabs.css +1 -1
  474. package/src/components/tabs/tabs.ts +1 -1
  475. package/src/components/tabs/types.ts +1 -1
  476. package/src/components/textarea/textarea.css +1 -1
  477. package/src/components/theme-switch/index.ts +1 -1
  478. package/src/components/theme-switch/theme-switch.css +1 -1
  479. package/src/components/theme-switch/theme-switch.ts +1 -1
  480. package/src/components/theme-switch/types.ts +1 -1
  481. package/src/components/toggle/index.ts +1 -1
  482. package/src/components/toggle/toggle.css +1 -1
  483. package/src/components/toggle/toggle.ts +1 -1
  484. package/src/components/toggle/types.ts +1 -1
  485. package/src/components/toggle-group/toggle-group.css +1 -1
  486. package/src/components/toggle-password/index.ts +1 -1
  487. package/src/components/toggle-password/toggle-password.css +1 -1
  488. package/src/components/toggle-password/toggle-password.ts +1 -1
  489. package/src/components/toggle-password/types.ts +1 -1
  490. package/src/components/tooltip/index.ts +1 -1
  491. package/src/components/tooltip/tooltip.css +1 -1
  492. package/src/components/tooltip/tooltip.ts +1 -1
  493. package/src/components/tooltip/types.ts +1 -1
  494. package/src/helpers/data.ts +1 -1
  495. package/src/helpers/dom.ts +1 -1
  496. package/src/helpers/event-handler.ts +1 -1
  497. package/src/helpers/utils.ts +1 -1
  498. package/src/index.ts +1 -1
  499. package/src/types.ts +1 -1
@@ -0,0 +1,1538 @@
1
+ "use strict";
2
+ /**
3
+ * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
4
+ * Copyright 2025 by Keenthemes Inc
5
+ */
6
+ var __extends = (this && this.__extends) || (function () {
7
+ var extendStatics = function (d, b) {
8
+ extendStatics = Object.setPrototypeOf ||
9
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
10
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
11
+ return extendStatics(d, b);
12
+ };
13
+ return function (d, b) {
14
+ if (typeof b !== "function" && b !== null)
15
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
16
+ extendStatics(d, b);
17
+ function __() { this.constructor = d; }
18
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
19
+ };
20
+ })();
21
+ var __assign = (this && this.__assign) || function () {
22
+ __assign = Object.assign || function(t) {
23
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
24
+ s = arguments[i];
25
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
26
+ t[p] = s[p];
27
+ }
28
+ return t;
29
+ };
30
+ return __assign.apply(this, arguments);
31
+ };
32
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
33
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
34
+ if (ar || !(i in from)) {
35
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
36
+ ar[i] = from[i];
37
+ }
38
+ }
39
+ return to.concat(ar || Array.prototype.slice.call(from));
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.KTSelect = void 0;
43
+ var data_1 = require("../../helpers/data");
44
+ var dom_1 = require("../../helpers/dom");
45
+ var component_1 = require("../component");
46
+ var config_1 = require("./config");
47
+ var option_1 = require("./option");
48
+ var remote_1 = require("./remote");
49
+ var search_1 = require("./search");
50
+ var templates_1 = require("./templates");
51
+ var combobox_1 = require("./combobox");
52
+ var dropdown_1 = require("./dropdown");
53
+ var utils_1 = require("./utils");
54
+ var tags_1 = require("./tags");
55
+ var types_1 = require("./types");
56
+ var KTSelect = /** @class */ (function (_super) {
57
+ __extends(KTSelect, _super);
58
+ /**
59
+ * Constructor: Initializes the select component
60
+ */
61
+ function KTSelect(element, config) {
62
+ var _this = _super.call(this) || this;
63
+ // Core properties
64
+ _this._name = 'select';
65
+ _this._dataOptionPrefix = 'kt-'; // Use 'kt-' prefix to support data-kt-select-option attributes
66
+ // State
67
+ _this._dropdownIsOpen = false;
68
+ _this._comboboxModule = null;
69
+ _this._tagsModule = null;
70
+ _this._dropdownModule = null;
71
+ _this._loadMoreIndicator = null;
72
+ // Search debounce timeout
73
+ _this._searchDebounceTimeout = null;
74
+ // Store original options HTML for restoring after search
75
+ _this._originalOptionsHtml = null;
76
+ if (data_1.default.has(element, _this._name)) {
77
+ return _this;
78
+ }
79
+ _this._init(element);
80
+ _this._buildConfig(config);
81
+ _this._state = new config_1.KTSelectState(_this._config);
82
+ _this._config = _this._state.getConfig();
83
+ element.instance = _this;
84
+ // Initialize event manager
85
+ _this._eventManager = new utils_1.EventManager();
86
+ // Initialize remote module if remote data is enabled
87
+ if (_this._config.remote) {
88
+ _this._remoteModule = new remote_1.KTSelectRemote(_this._config, _this._element);
89
+ _this._initializeRemoteData();
90
+ }
91
+ else {
92
+ _this._state
93
+ .setItems()
94
+ .then(function () {
95
+ if (_this._config.debug)
96
+ console.log('Setting up component after remote data is loaded');
97
+ _this._setupComponent();
98
+ })
99
+ .catch(function (error) {
100
+ console.error('Error setting items:', error);
101
+ // Handle the error, e.g., display an error message to the user
102
+ });
103
+ }
104
+ return _this;
105
+ }
106
+ /**
107
+ * Initialize remote data fetching
108
+ */
109
+ KTSelect.prototype._initializeRemoteData = function () {
110
+ var _this = this;
111
+ if (!this._remoteModule || !this._config.remote)
112
+ return;
113
+ if (this._config.debug)
114
+ console.log('Initializing remote data with URL:', this._config.dataUrl);
115
+ // Show loading state
116
+ this._renderLoadingState();
117
+ // Fetch remote data
118
+ this._remoteModule
119
+ .fetchData()
120
+ .then(function (items) {
121
+ if (_this._config.debug)
122
+ console.log('Remote data fetched:', items);
123
+ // Remove placeholder/loading options before setting new items
124
+ _this._clearExistingOptions();
125
+ // Update state with fetched items
126
+ _this._state
127
+ .setItems(items)
128
+ .then(function () {
129
+ // Generate options from the fetched data
130
+ _this._generateOptionsHtml(_this._element);
131
+ if (_this._config.debug)
132
+ console.log('Generating options HTML from remote data');
133
+ _this._setupComponent();
134
+ // Add pagination "Load More" button if needed
135
+ if (_this._config.pagination && _this._remoteModule.hasMorePages()) {
136
+ _this._addLoadMoreButton();
137
+ }
138
+ })
139
+ .catch(function (error) {
140
+ console.error('Error setting items:', error);
141
+ _this._renderErrorState(error.message || 'Failed to load data');
142
+ });
143
+ })
144
+ .catch(function (error) {
145
+ console.error('Error fetching remote data:', error);
146
+ _this._renderErrorState(_this._remoteModule.getErrorMessage() || 'Failed to load data');
147
+ });
148
+ };
149
+ /**
150
+ * Clear existing options from the select element
151
+ */
152
+ KTSelect.prototype._clearExistingOptions = function () {
153
+ // Keep only the empty/placeholder option and remove the rest
154
+ var options = Array.from(this._element.querySelectorAll('option:not([value=""])'));
155
+ options.forEach(function (option) { return option.remove(); });
156
+ // Ensure we have at least an empty option
157
+ if (this._element.querySelectorAll('option').length === 0) {
158
+ var emptyOption = templates_1.defaultTemplates.emptyOption(__assign(__assign({}, this._config), { placeholder: this._config.placeholder }));
159
+ this._element.appendChild(emptyOption);
160
+ }
161
+ };
162
+ /**
163
+ * Helper to show a dropdown message (error, loading, noResults)
164
+ */
165
+ KTSelect.prototype._showDropdownMessage = function (type, message) {
166
+ if (!this._dropdownContentElement)
167
+ return;
168
+ var optionsContainer = this._dropdownContentElement.querySelector('[data-kt-select-options-container]');
169
+ if (!optionsContainer)
170
+ return;
171
+ switch (type) {
172
+ case 'error':
173
+ optionsContainer.innerHTML = templates_1.defaultTemplates.error(__assign(__assign({}, this._config), { errorMessage: message }));
174
+ break;
175
+ case 'loading':
176
+ optionsContainer.innerHTML = templates_1.defaultTemplates.loading(this._config, message || 'Loading...').outerHTML;
177
+ break;
178
+ case 'noResults':
179
+ optionsContainer.innerHTML = '';
180
+ optionsContainer.appendChild(templates_1.defaultTemplates.noResults(this._config));
181
+ break;
182
+ }
183
+ };
184
+ /**
185
+ * Render loading state in dropdown
186
+ */
187
+ KTSelect.prototype._renderLoadingState = function () {
188
+ if (this._element.querySelectorAll('option').length <= 1) {
189
+ var existingLoadingOptions = this._element.querySelectorAll('option[disabled][selected][value=""]');
190
+ existingLoadingOptions.forEach(function (option) { return option.remove(); });
191
+ this._showDropdownMessage('loading', 'Loading options...');
192
+ }
193
+ };
194
+ /**
195
+ * Render error state
196
+ * @param message Error message
197
+ */
198
+ KTSelect.prototype._renderErrorState = function (message) {
199
+ // Create error option if the select is empty
200
+ if (this._element.querySelectorAll('option').length <= 1) {
201
+ var loadingOptions = this._element.querySelectorAll('option[disabled]:not([value])');
202
+ loadingOptions.forEach(function (option) { return option.remove(); });
203
+ // Use template function for error option instead of hardcoded element
204
+ var errorOption = templates_1.defaultTemplates.errorOption(__assign(__assign({}, this._config), { errorMessage: message }));
205
+ this._element.appendChild(errorOption);
206
+ }
207
+ // If dropdown is already created, show error message there
208
+ this._showDropdownMessage('error', message);
209
+ if (!this._wrapperElement) {
210
+ if (this._config.debug)
211
+ console.log('Setting up component after error');
212
+ this._setupComponent();
213
+ }
214
+ };
215
+ /**
216
+ * Add "Load More" button for pagination
217
+ */
218
+ KTSelect.prototype._addLoadMoreButton = function () {
219
+ if (!this._dropdownContentElement || !this._config.pagination)
220
+ return;
221
+ // Remove existing button if any
222
+ if (this._loadMoreIndicator) {
223
+ this._loadMoreIndicator.remove();
224
+ this._loadMoreIndicator = null;
225
+ }
226
+ // Create load more button using template
227
+ this._loadMoreIndicator = templates_1.defaultTemplates.loadMore(this._config);
228
+ // Add to dropdown
229
+ var optionsContainer = this._dropdownContentElement.querySelector('[data-kt-select-options-container]');
230
+ if (optionsContainer) {
231
+ optionsContainer.appendChild(this._loadMoreIndicator);
232
+ }
233
+ else {
234
+ this._dropdownContentElement.appendChild(this._loadMoreIndicator);
235
+ }
236
+ // Add event listener
237
+ this._loadMoreIndicator.addEventListener('click', this._handleLoadMore.bind(this));
238
+ };
239
+ /**
240
+ * Handle load more button click
241
+ */
242
+ KTSelect.prototype._handleLoadMore = function () {
243
+ var _this = this;
244
+ if (!this._remoteModule || !this._config.pagination)
245
+ return;
246
+ // Show loading state
247
+ if (this._loadMoreIndicator) {
248
+ this._loadMoreIndicator.textContent = 'Loading...';
249
+ }
250
+ // Fetch next page
251
+ this._remoteModule
252
+ .loadNextPage()
253
+ .then(function (newItems) {
254
+ // Get existing items
255
+ var existingItems = _this._state.getItems();
256
+ // Combine new items with existing items
257
+ _this._state
258
+ .setItems(__spreadArray(__spreadArray([], existingItems, true), newItems, true))
259
+ .then(function () {
260
+ // Update options in the dropdown
261
+ _this._updateOptionsInDropdown(newItems);
262
+ // Check if there are more pages
263
+ if (_this._remoteModule.hasMorePages()) {
264
+ // Reset load more button
265
+ if (_this._loadMoreIndicator) {
266
+ _this._loadMoreIndicator.textContent =
267
+ _this._config.loadMoreText || 'Load more...';
268
+ }
269
+ }
270
+ else {
271
+ // Remove load more button if no more pages
272
+ if (_this._loadMoreIndicator) {
273
+ _this._loadMoreIndicator.remove();
274
+ _this._loadMoreIndicator = null;
275
+ }
276
+ }
277
+ })
278
+ .catch(function (error) {
279
+ console.error('Error updating items:', error);
280
+ // Reset load more button
281
+ if (_this._loadMoreIndicator) {
282
+ _this._loadMoreIndicator.textContent = 'Error loading more items';
283
+ }
284
+ });
285
+ })
286
+ .catch(function (error) {
287
+ console.error('Error loading more items:', error);
288
+ // Reset load more button
289
+ if (_this._loadMoreIndicator) {
290
+ _this._loadMoreIndicator.textContent = 'Error loading more items';
291
+ }
292
+ });
293
+ };
294
+ /**
295
+ * Update options in the dropdown
296
+ * @param newItems New items to add to the dropdown
297
+ */
298
+ KTSelect.prototype._updateOptionsInDropdown = function (newItems) {
299
+ var _this = this;
300
+ if (!this._dropdownContentElement || !newItems.length)
301
+ return;
302
+ var optionsContainer = this._dropdownContentElement.querySelector('[data-kt-select-options-container]');
303
+ if (!optionsContainer)
304
+ return;
305
+ // Get the load more button
306
+ var loadMoreButton = optionsContainer.querySelector('[data-kt-select-load-more]');
307
+ // Process each new item
308
+ newItems.forEach(function (item) {
309
+ // Create option for the original select
310
+ var selectOption = templates_1.defaultTemplates.emptyOption(__assign(__assign({}, _this._config), { placeholder: item.title || 'Unnamed option' }));
311
+ selectOption.value = item.id || '';
312
+ // Add description and icon attributes if available and valid
313
+ if (item.description &&
314
+ item.description !== 'null' &&
315
+ item.description !== 'undefined') {
316
+ selectOption.setAttribute('data-kt-select-option-description', item.description);
317
+ }
318
+ if (item.icon && item.icon !== 'null' && item.icon !== 'undefined') {
319
+ selectOption.setAttribute('data-kt-select-option-icon', item.icon);
320
+ }
321
+ // Add the option to the original select element
322
+ _this._element.appendChild(selectOption);
323
+ // Create option element for the dropdown using the KTSelectOption class
324
+ // This ensures consistent option rendering
325
+ var ktOption = new option_1.KTSelectOption(selectOption, _this._config);
326
+ var renderedOption = ktOption.render();
327
+ // Add to dropdown container
328
+ if (loadMoreButton) {
329
+ // Insert before the load more button
330
+ optionsContainer.insertBefore(renderedOption, loadMoreButton);
331
+ }
332
+ else {
333
+ // Append to the end
334
+ optionsContainer.appendChild(renderedOption);
335
+ }
336
+ });
337
+ // Update options NodeList to include the new options
338
+ this._options = this._wrapperElement.querySelectorAll("[data-kt-select-option]");
339
+ if (this._config.debug)
340
+ console.log("Added ".concat(newItems.length, " more options to dropdown"));
341
+ };
342
+ /**
343
+ * ========================================================================
344
+ * INITIALIZATION METHODS
345
+ * ========================================================================
346
+ */
347
+ /**
348
+ * Set up the component after everything is initialized
349
+ */
350
+ KTSelect.prototype._setupComponent = function () {
351
+ // Setup HTML structure
352
+ this._createHtmlStructure();
353
+ this._setupElementReferences();
354
+ this._initZIndex();
355
+ // Initialize options
356
+ this._initializeOptionsHtml();
357
+ this._preSelectOptions(this._element);
358
+ // Apply disabled state if needed
359
+ this._applyInitialDisabledState();
360
+ // Initialize search if enabled
361
+ if (this._config.enableSearch) {
362
+ this._initializeSearchModule();
363
+ }
364
+ // Initialize combobox if enabled
365
+ if (this._config.mode === types_1.SelectMode.COMBOBOX) {
366
+ this._comboboxModule = new combobox_1.KTSelectCombobox(this);
367
+ }
368
+ // Initialize tags if enabled
369
+ if (this._config.mode === types_1.SelectMode.TAGS) {
370
+ this._tagsModule = new tags_1.KTSelectTags(this);
371
+ }
372
+ // Initialize focus manager after dropdown element is created
373
+ this._focusManager = new utils_1.FocusManager(this._dropdownContentElement, '[data-kt-select-option]', this._config);
374
+ // Initialize dropdown module after all elements are created
375
+ this._dropdownModule = new dropdown_1.KTSelectDropdown(this._wrapperElement, this._displayElement, this._dropdownContentElement, this._config);
376
+ // Update display and set ARIA attributes
377
+ this._updateDisplayAndAriaAttributes();
378
+ this.updateSelectedOptionDisplay();
379
+ this._setAriaAttributes();
380
+ // Attach event listeners after all modules are initialized
381
+ this._attachEventListeners();
382
+ };
383
+ /**
384
+ * Initialize options HTML from data
385
+ */
386
+ KTSelect.prototype._initializeOptionsHtml = function () {
387
+ this._generateOptionsHtml(this._element);
388
+ };
389
+ /**
390
+ * Creates the HTML structure for the select component
391
+ */
392
+ KTSelect.prototype._createHtmlStructure = function () {
393
+ var _this = this;
394
+ var options = Array.from(this._element.querySelectorAll('option'));
395
+ // Create wrapper and display elements
396
+ var wrapperElement = templates_1.defaultTemplates.main(this._config);
397
+ var displayElement = templates_1.defaultTemplates.display(this._config);
398
+ // Add the display element to the wrapper
399
+ wrapperElement.appendChild(displayElement);
400
+ // Create an empty dropdown first (without options) using template
401
+ var dropdownElement = templates_1.defaultTemplates.dropdownContent(__assign(__assign({}, this._config), { zindex: this._config.dropdownZindex }));
402
+ // Add search input if needed
403
+ var isCombobox = this._config.mode === types_1.SelectMode.COMBOBOX;
404
+ var hasSearch = this._config.enableSearch && !isCombobox;
405
+ if (hasSearch) {
406
+ var searchElement = templates_1.defaultTemplates.search(this._config);
407
+ dropdownElement.appendChild(searchElement);
408
+ }
409
+ // Create options container using template
410
+ var optionsContainer = templates_1.defaultTemplates.optionsContainer(this._config);
411
+ // Add each option directly to the container
412
+ options.forEach(function (optionElement) {
413
+ // Skip empty placeholder options (only if BOTH value AND text are empty)
414
+ // This allows options with empty value but visible text to display in dropdown
415
+ if (optionElement.value === '' &&
416
+ optionElement.textContent.trim() === '') {
417
+ return;
418
+ }
419
+ // Create new KTSelectOption instance for each option
420
+ var selectOption = new option_1.KTSelectOption(optionElement, _this._config);
421
+ var renderedOption = selectOption.render();
422
+ // Append directly to options container
423
+ optionsContainer.appendChild(renderedOption);
424
+ });
425
+ // Add options container to dropdown
426
+ dropdownElement.appendChild(optionsContainer);
427
+ // Add dropdown to wrapper
428
+ wrapperElement.appendChild(dropdownElement);
429
+ // Insert after the original element
430
+ this._element.after(wrapperElement);
431
+ this._element.style.display = 'none';
432
+ };
433
+ /**
434
+ * Setup all element references after DOM is created
435
+ */
436
+ KTSelect.prototype._setupElementReferences = function () {
437
+ this._wrapperElement = this._element.nextElementSibling;
438
+ // Get display element
439
+ this._displayElement = this._wrapperElement.querySelector("[data-kt-select-display]");
440
+ // Get dropdown content element - this is critical for dropdown functionality
441
+ this._dropdownContentElement = this._wrapperElement.querySelector("[data-kt-select-dropdown-content]");
442
+ if (!this._dropdownContentElement) {
443
+ console.error('Dropdown content element not found', this._wrapperElement);
444
+ }
445
+ // Get search input element - this is used for the search functionality
446
+ // First check if it's in dropdown, then check if it's in display (for combobox)
447
+ this._searchInputElement = this._dropdownContentElement.querySelector("[data-kt-select-search]");
448
+ // If not found in dropdown, check if it's the display element itself (for combobox)
449
+ if (!this._searchInputElement &&
450
+ this._config.mode === types_1.SelectMode.COMBOBOX) {
451
+ this._searchInputElement = this._displayElement;
452
+ }
453
+ if (this._config.debug)
454
+ console.log('Search input found:', this._searchInputElement ? 'Yes' : 'No', 'Mode:', this._config.mode, 'EnableSearch:', this._config.enableSearch);
455
+ this._valueDisplayElement = this._wrapperElement.querySelector("[data-kt-select-value]");
456
+ this._options = this._wrapperElement.querySelectorAll("[data-kt-select-option]");
457
+ };
458
+ /**
459
+ * Attach all event listeners to elements
460
+ */
461
+ KTSelect.prototype._attachEventListeners = function () {
462
+ // Document level event listeners
463
+ document.addEventListener('click', this._handleDocumentClick.bind(this));
464
+ document.addEventListener('keydown', this._handleEscKey.bind(this));
465
+ // Dropdown option click events
466
+ this._eventManager.addListener(this._dropdownContentElement, 'click', this._handleDropdownOptionClick.bind(this));
467
+ // Only attach click handler to display element
468
+ this._eventManager.addListener(this._displayElement, 'click', this._handleDropdownClick.bind(this));
469
+ // Only attach keyboard navigation to display element if NOT in combobox mode
470
+ // This prevents conflicts with the combobox module's keyboard handler
471
+ if (this._config.mode !== types_1.SelectMode.COMBOBOX) {
472
+ if (this._config.debug)
473
+ console.log('Attaching keyboard navigation to display element (non-combobox mode)');
474
+ this._eventManager.addListener(this._displayElement, 'keydown', this._handleDropdownKeyDown.bind(this));
475
+ }
476
+ };
477
+ /**
478
+ * Initialize search module if search is enabled
479
+ */
480
+ KTSelect.prototype._initializeSearchModule = function () {
481
+ if (this._config.enableSearch) {
482
+ this._searchModule = new search_1.KTSelectSearch(this);
483
+ this._searchModule.init();
484
+ // If remote search is enabled, add event listener for search input
485
+ if (this._config.remote &&
486
+ this._config.searchParam &&
487
+ this._searchInputElement) {
488
+ this._searchInputElement.addEventListener('input', this._handleRemoteSearch.bind(this));
489
+ }
490
+ }
491
+ };
492
+ /**
493
+ * Apply ARIA attributes and update display
494
+ */
495
+ KTSelect.prototype._updateDisplayAndAriaAttributes = function () {
496
+ this.updateSelectedOptionDisplay();
497
+ this._setAriaAttributes();
498
+ };
499
+ /**
500
+ * Apply initial disabled state if configured
501
+ */
502
+ KTSelect.prototype._applyInitialDisabledState = function () {
503
+ if (this._config.disabled) {
504
+ this.getElement().classList.add('disabled');
505
+ this.getElement().setAttribute('disabled', 'disabled');
506
+ this._wrapperElement.classList.add('disabled');
507
+ }
508
+ };
509
+ /**
510
+ * Generate options HTML from data items
511
+ */
512
+ KTSelect.prototype._generateOptionsHtml = function (element) {
513
+ var _this = this;
514
+ var items = this._state.getItems() || [];
515
+ if (this._config.debug)
516
+ console.log("Generating options HTML from ".concat(items.length, " items"));
517
+ // Only modify options if we have items to replace them with
518
+ if (items && items.length > 0) {
519
+ // Clear existing options except the first empty one
520
+ var options = element.querySelectorAll('option:not(:first-child)');
521
+ options.forEach(function (option) { return option.remove(); });
522
+ // Generate options from data
523
+ items.forEach(function (item) {
524
+ var optionElement = document.createElement('option');
525
+ // Get value - use item.id directly if available, otherwise try dataValueField
526
+ var value = '';
527
+ if (item.id !== undefined) {
528
+ value = String(item.id);
529
+ }
530
+ else if (_this._config.dataValueField) {
531
+ var extractedValue = _this._getValueByKey(item, _this._config.dataValueField);
532
+ value = extractedValue !== null ? String(extractedValue) : '';
533
+ }
534
+ // Get label - use item.title directly if available, otherwise try dataFieldText
535
+ var label = '';
536
+ if (item.title !== undefined) {
537
+ label = String(item.title);
538
+ }
539
+ else if (_this._config.dataFieldText) {
540
+ var extractedLabel = _this._getValueByKey(item, _this._config.dataFieldText);
541
+ label =
542
+ extractedLabel !== null ? String(extractedLabel) : 'Unnamed option';
543
+ }
544
+ // Get description - skip if null, undefined, or "null" string
545
+ var description = null;
546
+ if (item.description !== undefined &&
547
+ item.description !== null &&
548
+ String(item.description) !== 'null' &&
549
+ String(item.description) !== 'undefined') {
550
+ description = String(item.description);
551
+ }
552
+ else if (_this._config.dataFieldDescription) {
553
+ var extractedDesc = _this._getValueByKey(item, _this._config.dataFieldDescription);
554
+ if (extractedDesc !== null &&
555
+ extractedDesc !== undefined &&
556
+ String(extractedDesc) !== 'null' &&
557
+ String(extractedDesc) !== 'undefined') {
558
+ description = String(extractedDesc);
559
+ }
560
+ }
561
+ // Get icon - skip if null, undefined, or "null" string
562
+ var icon = null;
563
+ if (item.icon !== undefined &&
564
+ item.icon !== null &&
565
+ String(item.icon) !== 'null' &&
566
+ String(item.icon) !== 'undefined') {
567
+ icon = String(item.icon);
568
+ }
569
+ else if (_this._config.dataFieldIcon) {
570
+ var extractedIcon = _this._getValueByKey(item, _this._config.dataFieldIcon);
571
+ if (extractedIcon !== null &&
572
+ extractedIcon !== undefined &&
573
+ String(extractedIcon) !== 'null' &&
574
+ String(extractedIcon) !== 'undefined') {
575
+ icon = String(extractedIcon);
576
+ }
577
+ }
578
+ // Log the extracted values for debugging
579
+ if (_this._config.debug)
580
+ console.log("Option: value=".concat(value, ", label=").concat(label, ", desc=").concat(description ? description : 'none', ", icon=").concat(icon ? icon : 'none'));
581
+ // Set option attributes
582
+ optionElement.value = value;
583
+ optionElement.textContent = label || 'Unnamed option';
584
+ if (description) {
585
+ optionElement.setAttribute('data-kt-select-option-description', description);
586
+ }
587
+ if (icon) {
588
+ optionElement.setAttribute('data-kt-select-option-icon', icon);
589
+ }
590
+ if (item.selected) {
591
+ optionElement.setAttribute('selected', 'selected');
592
+ }
593
+ element.appendChild(optionElement);
594
+ });
595
+ if (this._config.debug)
596
+ console.log("Added ".concat(items.length, " options to select element"));
597
+ }
598
+ else {
599
+ if (this._config.debug)
600
+ console.log('No items to generate options from');
601
+ }
602
+ };
603
+ /**
604
+ * Extract nested property value from object using dot notation
605
+ */
606
+ KTSelect.prototype._getValueByKey = function (obj, key) {
607
+ if (!key || !obj)
608
+ return null;
609
+ // Use reduce to walk through the object by splitting the key on dots
610
+ var result = key
611
+ .split('.')
612
+ .reduce(function (o, k) { return (o && o[k] !== undefined ? o[k] : null); }, obj);
613
+ if (this._config.debug)
614
+ console.log("Extracting [".concat(key, "] from object => ").concat(result !== null ? JSON.stringify(result) : 'null'));
615
+ return result;
616
+ };
617
+ /**
618
+ * Pre-select options that have the selected attribute
619
+ */
620
+ KTSelect.prototype._preSelectOptions = function (element) {
621
+ var _this = this;
622
+ // Handle options with selected attribute
623
+ Array.from(element.querySelectorAll('option[selected]')).forEach(function (option) {
624
+ var value = option.value;
625
+ _this._selectOption(value);
626
+ });
627
+ // Handle data-kt-select-pre-selected attribute for React compatibility
628
+ var preSelectedValues = element.getAttribute('data-kt-select-pre-selected');
629
+ if (preSelectedValues) {
630
+ var values = preSelectedValues.split(',').map(function (v) { return v.trim(); });
631
+ values.forEach(function (value) {
632
+ if (value) {
633
+ _this._selectOption(value);
634
+ }
635
+ });
636
+ }
637
+ };
638
+ /**
639
+ * Set appropriate z-index for dropdown
640
+ */
641
+ KTSelect.prototype._initZIndex = function () {
642
+ var zindex = this._config.dropdownZindex;
643
+ if (parseInt(dom_1.default.getCssProp(this._dropdownContentElement, 'z-index')) >
644
+ zindex) {
645
+ zindex = parseInt(dom_1.default.getCssProp(this._dropdownContentElement, 'z-index'));
646
+ }
647
+ if (dom_1.default.getHighestZindex(this._wrapperElement) > zindex) {
648
+ zindex = dom_1.default.getHighestZindex(this._wrapperElement) + 1;
649
+ }
650
+ this._dropdownContentElement.style.zIndex = String(zindex);
651
+ };
652
+ /**
653
+ * ========================================================================
654
+ * DROPDOWN MANAGEMENT
655
+ * ========================================================================
656
+ */
657
+ /**
658
+ * Toggle dropdown visibility
659
+ */
660
+ KTSelect.prototype.toggleDropdown = function () {
661
+ if (this._config.debug)
662
+ console.log('toggleDropdown called');
663
+ if (this._dropdownModule) {
664
+ // Always use the dropdown module's state to determine whether to open or close
665
+ if (this._dropdownModule.isOpen()) {
666
+ if (this._config.debug)
667
+ console.log('Dropdown is open, closing...');
668
+ this.closeDropdown();
669
+ }
670
+ else {
671
+ if (this._config.debug)
672
+ console.log('Dropdown is closed, opening...');
673
+ this.openDropdown();
674
+ }
675
+ }
676
+ };
677
+ /**
678
+ * Open the dropdown
679
+ */
680
+ KTSelect.prototype.openDropdown = function () {
681
+ var _this = this;
682
+ if (this._config.debug)
683
+ console.log('openDropdown called, dropdownModule exists:', !!this._dropdownModule);
684
+ if (!this._dropdownModule) {
685
+ if (this._config.debug)
686
+ console.log('Early return from openDropdown - module missing');
687
+ return;
688
+ }
689
+ // Don't open dropdown if the select is disabled
690
+ if (this._config.disabled) {
691
+ if (this._config.debug)
692
+ console.log('Early return from openDropdown - select is disabled');
693
+ return;
694
+ }
695
+ if (this._config.debug)
696
+ console.log('Opening dropdown via dropdownModule...');
697
+ // Set our internal flag to match what we're doing
698
+ this._dropdownIsOpen = true;
699
+ // Open the dropdown via the module
700
+ this._dropdownModule.open();
701
+ // Dispatch custom event
702
+ this._dispatchEvent('show');
703
+ this._fireEvent('show');
704
+ // Focus search input if configured and exists
705
+ if (this._config.enableSearch &&
706
+ this._config.searchAutofocus &&
707
+ this._searchInputElement) {
708
+ setTimeout(function () {
709
+ _this._searchInputElement.focus();
710
+ }, 50);
711
+ }
712
+ // Update ARIA states
713
+ this._setAriaAttributes();
714
+ // Focus the first selected option or first option if nothing selected
715
+ this._focusSelectedOption();
716
+ };
717
+ /**
718
+ * Close the dropdown
719
+ */
720
+ KTSelect.prototype.closeDropdown = function () {
721
+ if (this._config.debug)
722
+ console.log('closeDropdown called, dropdownModule exists:', !!this._dropdownModule);
723
+ // Only check if dropdown module exists, not dropdownIsOpen flag
724
+ if (!this._dropdownModule) {
725
+ if (this._config.debug)
726
+ console.log('Early return from closeDropdown - module missing');
727
+ return;
728
+ }
729
+ // Always close by delegating to the dropdown module, which is the source of truth
730
+ if (this._config.debug)
731
+ console.log('Closing dropdown via dropdownModule...');
732
+ // Clear search input and highlights if the dropdown is closing
733
+ if (this._searchModule && this._searchInputElement) {
734
+ // Clear search input if configured to do so
735
+ if (this._config.clearSearchOnClose) {
736
+ this._searchInputElement.value = '';
737
+ }
738
+ // Always clear the highlights when dropdown closes
739
+ this._searchModule.clearSearchHighlights();
740
+ }
741
+ // Set our internal flag to match what we're doing
742
+ this._dropdownIsOpen = false;
743
+ // Call the dropdown module's close method
744
+ this._dropdownModule.close();
745
+ // Reset all focus states
746
+ if (this._focusManager) {
747
+ this._focusManager.resetFocus();
748
+ }
749
+ // Dispatch custom events
750
+ this._dispatchEvent('close');
751
+ this._fireEvent('close');
752
+ // Update ARIA states
753
+ this._setAriaAttributes();
754
+ if (this._config.debug)
755
+ console.log('closeDropdown complete');
756
+ };
757
+ /**
758
+ * Update dropdown position
759
+ */
760
+ KTSelect.prototype.updateDropdownPosition = function () {
761
+ if (this._dropdownModule) {
762
+ this._dropdownModule.updatePosition();
763
+ }
764
+ };
765
+ /**
766
+ * Focus on the first selected option if any exists in the dropdown
767
+ */
768
+ KTSelect.prototype._focusSelectedOption = function () {
769
+ // Get selected options
770
+ var selectedOptions = this.getSelectedOptions();
771
+ if (selectedOptions.length === 0)
772
+ return;
773
+ // Get the first selected option element
774
+ var firstSelectedValue = selectedOptions[0];
775
+ // Use the FocusManager to focus on the option
776
+ this._focusManager.focusOptionByValue(firstSelectedValue);
777
+ };
778
+ /**
779
+ * ========================================================================
780
+ * SELECTION MANAGEMENT
781
+ * ========================================================================
782
+ */
783
+ /**
784
+ * Select an option by value
785
+ */
786
+ KTSelect.prototype._selectOption = function (value) {
787
+ // Get current selection state
788
+ var isSelected = this._state.isSelected(value);
789
+ // Toggle selection in state
790
+ if (this._config.multiple) {
791
+ // Toggle in multiple mode
792
+ this._state.toggleSelectedOptions(value);
793
+ }
794
+ else {
795
+ // Set as only selection in single mode
796
+ this._state.setSelectedOptions(value);
797
+ }
798
+ // Update the original select element's option selected state
799
+ var optionEl = Array.from(this._element.querySelectorAll('option')).find(function (opt) { return opt.value === value; });
800
+ if (optionEl) {
801
+ if (this._config.multiple) {
802
+ // Toggle the selection for multiple select
803
+ optionEl.selected = !isSelected;
804
+ }
805
+ else {
806
+ // Set as only selection for single select
807
+ Array.from(this._element.querySelectorAll('option')).forEach(function (opt) {
808
+ opt.selected = opt.value === value;
809
+ });
810
+ }
811
+ }
812
+ // Update the visual display of selected options
813
+ this.updateSelectedOptionDisplay();
814
+ // Update option classes without re-rendering the dropdown content
815
+ this._updateSelectedOptionClass();
816
+ // Dispatch standard and custom change events
817
+ this._dispatchEvent('change', {
818
+ value: value,
819
+ selected: !isSelected,
820
+ selectedOptions: this.getSelectedOptions(),
821
+ });
822
+ this._fireEvent('change', {
823
+ value: value,
824
+ selected: !isSelected,
825
+ selectedOptions: this.getSelectedOptions(),
826
+ });
827
+ };
828
+ /**
829
+ * Update selected option display value
830
+ */
831
+ KTSelect.prototype.updateSelectedOptionDisplay = function () {
832
+ var _this = this;
833
+ var selectedOptions = this.getSelectedOptions();
834
+ if (this._config.renderSelected) {
835
+ // Use the custom renderSelected function if provided
836
+ this._updateValueDisplay(this._config.renderSelected(selectedOptions));
837
+ }
838
+ else {
839
+ if (selectedOptions.length === 0) {
840
+ if (this._config.mode !== types_1.SelectMode.COMBOBOX) {
841
+ this._updateValueDisplay(this._config.placeholder); // Use innerHTML for placeholder
842
+ }
843
+ }
844
+ else if (this._config.multiple) {
845
+ if (this._config.mode === types_1.SelectMode.TAGS) {
846
+ // Use the tags module to render selected options as tags
847
+ if (this._tagsModule) {
848
+ this._tagsModule.updateTagsDisplay(selectedOptions);
849
+ }
850
+ else {
851
+ // Fallback if tags module not initialized for some reason
852
+ this._updateValueDisplay(selectedOptions.join(', '));
853
+ }
854
+ }
855
+ else {
856
+ // Render as comma-separated values
857
+ var displayText = selectedOptions
858
+ .map(function (option) { return _this._getOptionInnerHtml(option) || ''; })
859
+ .join(', ');
860
+ this._updateValueDisplay(displayText);
861
+ }
862
+ }
863
+ else {
864
+ var selectedOption = selectedOptions[0];
865
+ if (selectedOption) {
866
+ var selectedText = this._getOptionInnerHtml(selectedOption);
867
+ this._updateValueDisplay(selectedText);
868
+ // Update combobox input value if in combobox mode
869
+ if (this._config.mode === types_1.SelectMode.COMBOBOX &&
870
+ this._comboboxModule) {
871
+ this._comboboxModule.updateSelectedValue(selectedText);
872
+ }
873
+ }
874
+ else {
875
+ this._updateValueDisplay(this._config.placeholder);
876
+ }
877
+ }
878
+ }
879
+ // Update any debug display boxes if they exist
880
+ this._updateDebugDisplays();
881
+ };
882
+ /**
883
+ * Update the value display element
884
+ */
885
+ KTSelect.prototype._updateValueDisplay = function (value) {
886
+ if (this._config.mode === types_1.SelectMode.COMBOBOX) {
887
+ // For combobox, we only update the hidden value element, not the input
888
+ // The combobox module will handle updating the input value
889
+ if (!this._comboboxModule) {
890
+ this._valueDisplayElement.value = value;
891
+ }
892
+ }
893
+ else {
894
+ this._valueDisplayElement.innerHTML = value;
895
+ }
896
+ };
897
+ /**
898
+ * Update debug displays if present
899
+ */
900
+ KTSelect.prototype._updateDebugDisplays = function () {
901
+ // Check if we're in a test environment with debug boxes
902
+ var selectId = this.getElement().id;
903
+ if (selectId) {
904
+ var debugElement = document.getElementById("".concat(selectId, "-value"));
905
+ if (debugElement) {
906
+ var selectedOptions = this.getSelectedOptions();
907
+ // Format display based on selection mode
908
+ if (this._config.multiple) {
909
+ // For multiple selection, show comma-separated list
910
+ debugElement.textContent =
911
+ selectedOptions.length > 0 ? selectedOptions.join(', ') : 'None';
912
+ }
913
+ else {
914
+ // For single selection, show just the one value
915
+ debugElement.textContent =
916
+ selectedOptions.length > 0 ? selectedOptions[0] : 'None';
917
+ }
918
+ }
919
+ }
920
+ };
921
+ /**
922
+ * Get option inner HTML content by option value
923
+ */
924
+ KTSelect.prototype._getOptionInnerHtml = function (optionValue) {
925
+ var option = Array.from(this._options).find(function (opt) { return opt.dataset.value === optionValue; });
926
+ if (this._config.mode == types_1.SelectMode.COMBOBOX) {
927
+ return option.textContent;
928
+ }
929
+ return option.innerHTML; // Get the entire HTML content of the option
930
+ };
931
+ /**
932
+ * Update CSS classes for selected options
933
+ */
934
+ KTSelect.prototype._updateSelectedOptionClass = function () {
935
+ var allOptions = this._wrapperElement.querySelectorAll("[data-kt-select-option]");
936
+ var selectedValues = this._state.getSelectedOptions();
937
+ var maxReached = typeof this._config.maxSelections === 'number' &&
938
+ selectedValues.length >= this._config.maxSelections;
939
+ if (this._config.debug)
940
+ console.log('Updating selected classes for options, selected values:', selectedValues);
941
+ allOptions.forEach(function (option) {
942
+ var optionValue = option.getAttribute('data-value');
943
+ if (!optionValue)
944
+ return;
945
+ var isSelected = selectedValues.includes(optionValue);
946
+ if (isSelected) {
947
+ option.classList.add('selected');
948
+ option.setAttribute('aria-selected', 'true');
949
+ option.classList.remove('hidden');
950
+ option.classList.remove('disabled');
951
+ option.removeAttribute('aria-disabled');
952
+ }
953
+ else {
954
+ option.classList.remove('selected');
955
+ option.setAttribute('aria-selected', 'false');
956
+ if (maxReached) {
957
+ option.classList.add('disabled');
958
+ option.setAttribute('aria-disabled', 'true');
959
+ }
960
+ else {
961
+ option.classList.remove('disabled');
962
+ option.removeAttribute('aria-disabled');
963
+ }
964
+ }
965
+ });
966
+ };
967
+ /**
968
+ * Clear all selected options
969
+ */
970
+ KTSelect.prototype.clearSelection = function () {
971
+ // Clear the current selection
972
+ this._state.setSelectedOptions([]);
973
+ this.updateSelectedOptionDisplay();
974
+ this._updateSelectedOptionClass();
975
+ // For combobox, also clear the input value
976
+ if (this._config.mode === types_1.SelectMode.COMBOBOX) {
977
+ if (this._searchInputElement) {
978
+ this._searchInputElement.value = '';
979
+ }
980
+ // If combobox has a clear button, hide it
981
+ if (this._comboboxModule) {
982
+ // The combobox module will handle hiding the clear button
983
+ this._comboboxModule.resetInputValueToSelection();
984
+ }
985
+ }
986
+ // Dispatch change event
987
+ this._dispatchEvent('change');
988
+ this._fireEvent('change');
989
+ };
990
+ /**
991
+ * Set selected options programmatically
992
+ */
993
+ KTSelect.prototype.setSelectedOptions = function (options) {
994
+ var values = Array.from(options).map(function (option) { return option.value; });
995
+ this._state.setSelectedOptions(values);
996
+ };
997
+ /**
998
+ * ========================================================================
999
+ * KEYBOARD NAVIGATION
1000
+ * ========================================================================
1001
+ */
1002
+ /**
1003
+ * Handle dropdown key down events for keyboard navigation
1004
+ * Only used for standard (non-combobox) dropdowns
1005
+ */
1006
+ KTSelect.prototype._handleDropdownKeyDown = function (event) {
1007
+ // Log event for debugging
1008
+ if (this._config.debug)
1009
+ console.log('Standard dropdown keydown:', event.key);
1010
+ // Use the shared handler
1011
+ (0, utils_1.handleDropdownKeyNavigation)(event, this, {
1012
+ multiple: this._config.multiple,
1013
+ closeOnSelect: this._config.closeOnSelect,
1014
+ });
1015
+ };
1016
+ /**
1017
+ * Focus next option in dropdown
1018
+ */
1019
+ KTSelect.prototype._focusNextOption = function () {
1020
+ return this._focusManager.focusNext();
1021
+ };
1022
+ /**
1023
+ * Focus previous option in dropdown
1024
+ */
1025
+ KTSelect.prototype._focusPreviousOption = function () {
1026
+ return this._focusManager.focusPrevious();
1027
+ };
1028
+ /**
1029
+ * Apply hover/focus state to focused option
1030
+ */
1031
+ KTSelect.prototype._hoverFocusedOption = function (option) {
1032
+ this._focusManager.applyFocus(option);
1033
+ };
1034
+ /**
1035
+ * Scroll option into view when navigating
1036
+ */
1037
+ KTSelect.prototype._scrollOptionIntoView = function (option) {
1038
+ this._focusManager.scrollIntoView(option);
1039
+ };
1040
+ /**
1041
+ * Select the currently focused option
1042
+ */
1043
+ KTSelect.prototype.selectFocusedOption = function () {
1044
+ var _a, _b;
1045
+ var focusedOption = this._focusManager.getFocusedOption();
1046
+ if (focusedOption) {
1047
+ var selectedValue = focusedOption.dataset.value;
1048
+ // Extract just the title text, not including description
1049
+ var selectedText = '';
1050
+ var titleElement = focusedOption.querySelector('[data-kt-option-title]');
1051
+ if (titleElement) {
1052
+ // If it has a structured content with title element
1053
+ selectedText = ((_a = titleElement.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || '';
1054
+ }
1055
+ else {
1056
+ // Fallback to the whole text content
1057
+ selectedText = ((_b = focusedOption.textContent) === null || _b === void 0 ? void 0 : _b.trim()) || '';
1058
+ }
1059
+ // First trigger the selection to ensure state is updated properly
1060
+ if (selectedValue) {
1061
+ this._selectOption(selectedValue);
1062
+ }
1063
+ // For combobox mode, update input value AFTER selection to ensure consistency
1064
+ if (this._config.mode === types_1.SelectMode.COMBOBOX && this._comboboxModule) {
1065
+ this._comboboxModule.updateSelectedValue(selectedText);
1066
+ // Also directly update the input value for immediate visual feedback
1067
+ if (this._searchInputElement) {
1068
+ this._searchInputElement.value = selectedText;
1069
+ }
1070
+ }
1071
+ }
1072
+ };
1073
+ /**
1074
+ * ========================================================================
1075
+ * COMBOBOX SPECIFIC METHODS
1076
+ * ========================================================================
1077
+ */
1078
+ /**
1079
+ * Handle combobox input events
1080
+ */
1081
+ KTSelect.prototype._handleComboboxInput = function (event) {
1082
+ if (this._comboboxModule) {
1083
+ return;
1084
+ }
1085
+ var inputElement = event.target;
1086
+ var query = inputElement.value.toLowerCase();
1087
+ // If dropdown isn't open, open it when user starts typing
1088
+ if (!this._dropdownIsOpen) {
1089
+ this.openDropdown();
1090
+ }
1091
+ // Filter options based on input
1092
+ this._filterOptionsForCombobox(query);
1093
+ };
1094
+ /**
1095
+ * Filter options for combobox based on input query
1096
+ * Uses the shared filterOptions function
1097
+ */
1098
+ KTSelect.prototype._filterOptionsForCombobox = function (query) {
1099
+ var options = Array.from(this._dropdownContentElement.querySelectorAll('[data-kt-select-option]'));
1100
+ (0, utils_1.filterOptions)(options, query, this._config, this._dropdownContentElement);
1101
+ };
1102
+ /**
1103
+ * ========================================================================
1104
+ * EVENT HANDLERS
1105
+ * ========================================================================
1106
+ */
1107
+ /**
1108
+ * Handle display element click
1109
+ */
1110
+ KTSelect.prototype._handleDropdownClick = function (event) {
1111
+ if (this._config.debug)
1112
+ console.log('Display element clicked', event.target);
1113
+ event.preventDefault();
1114
+ event.stopPropagation(); // Prevent event bubbling
1115
+ this.toggleDropdown();
1116
+ };
1117
+ /**
1118
+ * Handle click within the dropdown
1119
+ */
1120
+ KTSelect.prototype._handleDropdownOptionClick = function (event) {
1121
+ var optionElement = event.target.closest("[data-kt-select-option]");
1122
+ // If an option is clicked, handle the option click
1123
+ if (optionElement) {
1124
+ this._handleOptionClick(event);
1125
+ }
1126
+ };
1127
+ /**
1128
+ * Handle clicking on an option in the dropdown
1129
+ */
1130
+ KTSelect.prototype._handleOptionClick = function (event) {
1131
+ if (this._config.debug)
1132
+ console.log('_handleOptionClick called', event.target);
1133
+ event.preventDefault();
1134
+ event.stopPropagation();
1135
+ // Find the clicked option element
1136
+ var clickedOption = event.target.closest("[data-kt-select-option]");
1137
+ if (!clickedOption) {
1138
+ if (this._config.debug)
1139
+ console.log('No clicked option found');
1140
+ return;
1141
+ }
1142
+ // Check if the option is disabled
1143
+ if (clickedOption.getAttribute('aria-disabled') === 'true') {
1144
+ if (this._config.debug)
1145
+ console.log('Option is disabled, ignoring click');
1146
+ return;
1147
+ }
1148
+ // Use dataset.value to get the option value
1149
+ var optionValue = clickedOption.dataset.value;
1150
+ if (optionValue === undefined) {
1151
+ if (this._config.debug)
1152
+ console.log('Option value is undefined');
1153
+ return;
1154
+ }
1155
+ if (this._config.debug)
1156
+ console.log('Option clicked:', optionValue);
1157
+ // Use toggleSelection instead of _selectOption to prevent re-rendering
1158
+ this.toggleSelection(optionValue);
1159
+ };
1160
+ /**
1161
+ * Handle document click for closing dropdown
1162
+ */
1163
+ KTSelect.prototype._handleDocumentClick = function (event) {
1164
+ var targetElement = event.target;
1165
+ // Check if the click is outside the dropdown and the display element
1166
+ if (!this._wrapperElement.contains(targetElement)) {
1167
+ this.closeDropdown();
1168
+ }
1169
+ };
1170
+ /**
1171
+ * Handle escape key press
1172
+ */
1173
+ KTSelect.prototype._handleEscKey = function (event) {
1174
+ if (event.key === 'Escape' && this._dropdownIsOpen) {
1175
+ this.closeDropdown();
1176
+ }
1177
+ };
1178
+ /**
1179
+ * ========================================================================
1180
+ * ACCESSIBILITY METHODS
1181
+ * ========================================================================
1182
+ */
1183
+ /**
1184
+ * Set ARIA attributes for accessibility
1185
+ */
1186
+ KTSelect.prototype._setAriaAttributes = function () {
1187
+ this._displayElement.setAttribute('aria-expanded', this._dropdownIsOpen.toString());
1188
+ };
1189
+ /**
1190
+ * Handle focus events
1191
+ */
1192
+ KTSelect.prototype._handleFocus = function () {
1193
+ // Implementation pending
1194
+ };
1195
+ /**
1196
+ * Handle blur events
1197
+ */
1198
+ KTSelect.prototype._handleBlur = function () {
1199
+ // Implementation pending
1200
+ };
1201
+ /**
1202
+ * ========================================================================
1203
+ * PUBLIC API
1204
+ * ========================================================================
1205
+ */
1206
+ /**
1207
+ * Get the search input element
1208
+ */
1209
+ KTSelect.prototype.getSearchInput = function () {
1210
+ return this._searchInputElement;
1211
+ };
1212
+ /**
1213
+ * Get selected options
1214
+ */
1215
+ KTSelect.prototype.getSelectedOptions = function () {
1216
+ return this._state.getSelectedOptions();
1217
+ };
1218
+ /**
1219
+ * Get configuration
1220
+ */
1221
+ KTSelect.prototype.getConfig = function () {
1222
+ return this._config;
1223
+ };
1224
+ /**
1225
+ * Get option elements
1226
+ */
1227
+ KTSelect.prototype.getOptionsElement = function () {
1228
+ return this._options;
1229
+ };
1230
+ /**
1231
+ * Get dropdown element
1232
+ */
1233
+ KTSelect.prototype.getDropdownElement = function () {
1234
+ return this._dropdownContentElement;
1235
+ };
1236
+ /**
1237
+ * Get value display element
1238
+ */
1239
+ KTSelect.prototype.getValueDisplayElement = function () {
1240
+ return this._valueDisplayElement;
1241
+ };
1242
+ /**
1243
+ * Show all options in the dropdown
1244
+ */
1245
+ KTSelect.prototype.showAllOptions = function () {
1246
+ // Get all options in the dropdown
1247
+ var options = Array.from(this._wrapperElement.querySelectorAll("[data-kt-select-option]"));
1248
+ // Show all options by removing the hidden class and any inline styles
1249
+ options.forEach(function (option) {
1250
+ // Remove hidden class
1251
+ option.classList.remove('hidden');
1252
+ // Clean up any existing inline styles for backward compatibility
1253
+ if (option.hasAttribute('style')) {
1254
+ var styleAttr = option.getAttribute('style');
1255
+ if (styleAttr.includes('display:')) {
1256
+ // If style only contains display property, remove the entire attribute
1257
+ if (styleAttr.trim() === 'display: none;' ||
1258
+ styleAttr.trim() === 'display: block;') {
1259
+ option.removeAttribute('style');
1260
+ }
1261
+ else {
1262
+ // Otherwise, remove just the display property
1263
+ option.setAttribute('style', styleAttr.replace(/display:\s*[^;]+;?/gi, '').trim());
1264
+ }
1265
+ }
1266
+ }
1267
+ });
1268
+ // If search input exists, clear it
1269
+ if (this._searchInputElement && this._config.mode !== types_1.SelectMode.COMBOBOX) {
1270
+ this._searchInputElement.value = '';
1271
+ // If we have a search module, clear any search filtering
1272
+ if (this._searchModule) {
1273
+ this._searchModule.clearSearchHighlights();
1274
+ }
1275
+ }
1276
+ };
1277
+ /**
1278
+ * Toggle multi-select functionality
1279
+ */
1280
+ KTSelect.prototype.enableMultiSelect = function () {
1281
+ this._state.modifyConfig({ multiple: true });
1282
+ };
1283
+ /**
1284
+ * Disable multi-select functionality
1285
+ */
1286
+ KTSelect.prototype.disableMultiSelect = function () {
1287
+ this._state.modifyConfig({ multiple: false });
1288
+ };
1289
+ /**
1290
+ * Toggle the selection of an option
1291
+ */
1292
+ KTSelect.prototype.toggleSelection = function (value) {
1293
+ // Get current selection state
1294
+ var isSelected = this._state.isSelected(value);
1295
+ if (this._config.debug)
1296
+ console.log("toggleSelection called for value: ".concat(value, ", isSelected: ").concat(isSelected, ", multiple: ").concat(this._config.multiple, ", closeOnSelect: ").concat(this._config.closeOnSelect));
1297
+ // If already selected in single select mode, do nothing (can't deselect in single select)
1298
+ if (isSelected && !this._config.multiple) {
1299
+ if (this._config.debug)
1300
+ console.log('Early return from toggleSelection - already selected in single select mode');
1301
+ return;
1302
+ }
1303
+ if (this._config.debug)
1304
+ console.log("Toggling selection for option: ".concat(value, ", currently selected: ").concat(isSelected));
1305
+ // Ensure any search highlights are cleared when selection changes
1306
+ if (this._searchModule) {
1307
+ this._searchModule.clearSearchHighlights();
1308
+ }
1309
+ // Toggle the selection in the state
1310
+ this._state.toggleSelectedOptions(value);
1311
+ // Update the original select element's option selected state
1312
+ var optionEl = Array.from(this._element.querySelectorAll('option')).find(function (opt) { return opt.value === value; });
1313
+ if (optionEl) {
1314
+ // For multiple select, toggle the 'selected' attribute
1315
+ if (this._config.multiple) {
1316
+ optionEl.selected = !isSelected;
1317
+ }
1318
+ else {
1319
+ // For single select, deselect all other options and select this one
1320
+ Array.from(this._element.querySelectorAll('option')).forEach(function (opt) {
1321
+ opt.selected = opt.value === value;
1322
+ });
1323
+ }
1324
+ }
1325
+ // Update the display element value
1326
+ this.updateSelectedOptionDisplay();
1327
+ // Update option classes without re-rendering the dropdown content
1328
+ this._updateSelectedOptionClass();
1329
+ // For single select mode, always close the dropdown after selection
1330
+ // For multiple select mode, only close if closeOnSelect is true
1331
+ if (!this._config.multiple) {
1332
+ if (this._config.debug)
1333
+ console.log('About to call closeDropdown() for single select mode - always close after selection');
1334
+ this.closeDropdown();
1335
+ }
1336
+ else if (this._config.closeOnSelect) {
1337
+ if (this._config.debug)
1338
+ console.log('About to call closeDropdown() for multiple select with closeOnSelect:true');
1339
+ this.closeDropdown();
1340
+ }
1341
+ // Dispatch custom change event with additional data
1342
+ this._dispatchEvent('change', {
1343
+ value: value,
1344
+ selected: !isSelected,
1345
+ selectedOptions: this.getSelectedOptions(),
1346
+ });
1347
+ this._fireEvent('change', {
1348
+ value: value,
1349
+ selected: !isSelected,
1350
+ selectedOptions: this.getSelectedOptions(),
1351
+ });
1352
+ };
1353
+ /**
1354
+ * Clean up all resources when the component is destroyed
1355
+ * This overrides the parent dispose method
1356
+ */
1357
+ KTSelect.prototype.dispose = function () {
1358
+ // Clean up event listeners
1359
+ this._eventManager.removeAllListeners(null);
1360
+ // Dispose modules
1361
+ if (this._dropdownModule) {
1362
+ this._dropdownModule.dispose();
1363
+ }
1364
+ if (this._comboboxModule) {
1365
+ if (typeof this._comboboxModule.destroy === 'function') {
1366
+ this._comboboxModule.destroy();
1367
+ }
1368
+ }
1369
+ if (this._tagsModule) {
1370
+ if (typeof this._tagsModule.destroy === 'function') {
1371
+ this._tagsModule.destroy();
1372
+ }
1373
+ }
1374
+ if (this._searchModule) {
1375
+ if (typeof this._searchModule.destroy === 'function') {
1376
+ this._searchModule.destroy();
1377
+ }
1378
+ }
1379
+ // Remove DOM elements
1380
+ if (this._wrapperElement && this._wrapperElement.parentNode) {
1381
+ this._wrapperElement.parentNode.removeChild(this._wrapperElement);
1382
+ }
1383
+ // Call parent dispose to clean up data
1384
+ _super.prototype.dispose.call(this);
1385
+ };
1386
+ /**
1387
+ * Create instances of KTSelect for all matching elements
1388
+ */
1389
+ KTSelect.createInstances = function () {
1390
+ var _this = this;
1391
+ var elements = document.querySelectorAll('[data-kt-select]');
1392
+ elements.forEach(function (element) {
1393
+ if (element.hasAttribute('data-kt-select') &&
1394
+ !element.classList.contains('data-kt-select-initialized')) {
1395
+ var instance = new KTSelect(element);
1396
+ _this._instances.set(element, instance);
1397
+ }
1398
+ });
1399
+ };
1400
+ /**
1401
+ * Initialize all KTSelect instances
1402
+ */
1403
+ KTSelect.init = function () {
1404
+ KTSelect.createInstances();
1405
+ };
1406
+ /**
1407
+ * Handle remote search
1408
+ * @param event Input event
1409
+ */
1410
+ KTSelect.prototype._handleRemoteSearch = function (event) {
1411
+ var _this = this;
1412
+ if (!this._remoteModule ||
1413
+ !this._config.remote ||
1414
+ !this._config.searchParam)
1415
+ return;
1416
+ var query = event.target.value;
1417
+ // Check if the query is long enough
1418
+ if (query.length < (this._config.searchMinLength || 0)) {
1419
+ return;
1420
+ }
1421
+ // Debounce the search
1422
+ if (this._searchDebounceTimeout) {
1423
+ clearTimeout(this._searchDebounceTimeout);
1424
+ }
1425
+ this._searchDebounceTimeout = window.setTimeout(function () {
1426
+ // Show loading state
1427
+ _this._renderSearchLoadingState();
1428
+ // Fetch remote data with search query
1429
+ _this._remoteModule
1430
+ .fetchData(query)
1431
+ .then(function (items) {
1432
+ // Update state with fetched items
1433
+ _this._state
1434
+ .setItems(items)
1435
+ .then(function () {
1436
+ // Update options in the dropdown
1437
+ _this._updateSearchResults(items);
1438
+ // Refresh the search module's option cache if search is enabled
1439
+ if (_this._searchModule && _this._config.enableSearch) {
1440
+ _this._searchModule.refreshOptionCache();
1441
+ }
1442
+ })
1443
+ .catch(function (error) {
1444
+ console.error('Error updating search results:', error);
1445
+ _this._renderSearchErrorState(error.message || 'Failed to load search results');
1446
+ });
1447
+ })
1448
+ .catch(function (error) {
1449
+ console.error('Error fetching search results:', error);
1450
+ _this._renderSearchErrorState(_this._remoteModule.getErrorMessage() ||
1451
+ 'Failed to load search results');
1452
+ });
1453
+ }, this._config.searchDebounce || 300);
1454
+ };
1455
+ /**
1456
+ * Render loading state for search
1457
+ */
1458
+ KTSelect.prototype._renderSearchLoadingState = function () {
1459
+ if (!this._originalOptionsHtml && this._dropdownContentElement) {
1460
+ var optionsContainer = this._dropdownContentElement.querySelector('[data-kt-select-options-container]');
1461
+ if (optionsContainer) {
1462
+ this._originalOptionsHtml = optionsContainer.innerHTML;
1463
+ }
1464
+ }
1465
+ this._showDropdownMessage('loading', 'Searching...');
1466
+ };
1467
+ /**
1468
+ * Render error state for search
1469
+ * @param message Error message
1470
+ */
1471
+ KTSelect.prototype._renderSearchErrorState = function (message) {
1472
+ this._showDropdownMessage('error', message);
1473
+ };
1474
+ /**
1475
+ * Update search results in the dropdown
1476
+ * @param items Search result items
1477
+ */
1478
+ KTSelect.prototype._updateSearchResults = function (items) {
1479
+ var _this = this;
1480
+ if (!this._dropdownContentElement)
1481
+ return;
1482
+ var optionsContainer = this._dropdownContentElement.querySelector('[data-kt-select-options-container]');
1483
+ if (!optionsContainer)
1484
+ return;
1485
+ // Clear current options
1486
+ optionsContainer.innerHTML = '';
1487
+ if (items.length === 0) {
1488
+ // Show no results message using template for consistency and customization
1489
+ var noResultsElement = templates_1.defaultTemplates.noResults(this._config);
1490
+ optionsContainer.appendChild(noResultsElement);
1491
+ return;
1492
+ }
1493
+ // Process each item individually to create options
1494
+ items.forEach(function (item) {
1495
+ // Create option for the original select
1496
+ var selectOption = templates_1.defaultTemplates.emptyOption(__assign(__assign({}, _this._config), { placeholder: item.title }));
1497
+ selectOption.value = item.id;
1498
+ if (item.description) {
1499
+ selectOption.setAttribute('data-kt-select-option-description', item.description);
1500
+ }
1501
+ if (item.icon) {
1502
+ selectOption.setAttribute('data-kt-select-option-icon', item.icon);
1503
+ }
1504
+ // Create option element for the dropdown
1505
+ var ktOption = new option_1.KTSelectOption(selectOption, _this._config);
1506
+ var renderedOption = ktOption.render();
1507
+ // Add to dropdown container
1508
+ optionsContainer.appendChild(renderedOption);
1509
+ });
1510
+ // Add pagination "Load More" button if needed
1511
+ if (this._config.pagination && this._remoteModule.hasMorePages()) {
1512
+ this._addLoadMoreButton();
1513
+ }
1514
+ // Update options NodeList
1515
+ this._options = this._wrapperElement.querySelectorAll("[data-kt-select-option]");
1516
+ };
1517
+ /**
1518
+ * Filter options by query
1519
+ */
1520
+ KTSelect.prototype.filterOptions = function (query) {
1521
+ this._filterOptionsForCombobox(query);
1522
+ };
1523
+ /**
1524
+ * Check if dropdown is open
1525
+ */
1526
+ KTSelect.prototype.isDropdownOpen = function () {
1527
+ return this._dropdownIsOpen;
1528
+ };
1529
+ /**
1530
+ * ========================================================================
1531
+ * STATIC METHODS
1532
+ * ========================================================================
1533
+ */
1534
+ KTSelect._instances = new Map();
1535
+ return KTSelect;
1536
+ }(component_1.default));
1537
+ exports.KTSelect = KTSelect;
1538
+ //# sourceMappingURL=select.js.map