@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,1058 +0,0 @@
1
- /**
2
- * KTUI - Free & Open-Source Tailwind UI Components by Keenthemes
3
- * Copyright 2025 by Keenthemes Inc
4
- */
5
- import { calendarGridTemplate, dayTemplate, monthYearSelectTemplate, monthSelectionTemplate, yearSelectionTemplate, } from './templates';
6
- import { generateCalendarMonth, getLocaleConfig, isSameDay, isDateDisabled, isDateBetween, isWeekend, } from './utils';
7
- import { KTDatepickerDropdown } from './dropdown';
8
- import { KTDatepickerEventName } from './events';
9
- /**
10
- * Calendar component for the KTDatepicker
11
- * Handles rendering and interactions with the calendar
12
- */
13
- var KTDatepickerCalendar = /** @class */ (function () {
14
- /**
15
- * Constructor for the KTDatepickerCalendar class
16
- *
17
- * @param element - The datepicker element
18
- * @param stateManager - State manager for the datepicker
19
- */
20
- function KTDatepickerCalendar(element, stateManager) {
21
- this._calendarContainer = null;
22
- this._dropdownElement = null;
23
- this._dropdownManager = null;
24
- this._isVisible = false;
25
- this._element = element;
26
- this._stateManager = stateManager;
27
- this._eventManager = stateManager.getEventManager();
28
- // Get current date/time
29
- var now = new Date();
30
- this._currentViewMonth = now.getMonth();
31
- this._currentViewYear = now.getFullYear();
32
- this._initializeCalendar();
33
- this._setupEventListeners();
34
- }
35
- /**
36
- * Initialize the calendar
37
- */
38
- KTDatepickerCalendar.prototype._initializeCalendar = function () {
39
- var _this = this;
40
- var config = this._stateManager.getConfig();
41
- var locale = getLocaleConfig(config);
42
- // Create calendar container
43
- this._dropdownElement = document.createElement('div');
44
- this._dropdownElement.className = 'kt-datepicker-dropdown';
45
- this._dropdownElement.setAttribute('role', 'dialog');
46
- this._dropdownElement.setAttribute('aria-modal', 'true');
47
- this._dropdownElement.setAttribute('aria-label', 'Calendar');
48
- // Hidden by default
49
- this._dropdownElement.classList.add('hidden');
50
- this._dropdownElement.setAttribute('aria-hidden', 'true');
51
- // Create header for navigation
52
- var headerElement = document.createElement('div');
53
- headerElement.className = 'kt-datepicker-calendar-header';
54
- // Left navigation button
55
- var leftNavButton = document.createElement('button');
56
- leftNavButton.type = 'button';
57
- leftNavButton.className = 'kt-datepicker-calendar-left-nav-btn';
58
- leftNavButton.setAttribute('aria-label', 'Previous month');
59
- leftNavButton.innerHTML =
60
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M12.707 5.293a1 1 0 010 1.414L9.414 10l3.293 3.293a1 1 0 01-1.414 1.414l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 0z" clip-rule="evenodd" /></svg>';
61
- leftNavButton.addEventListener('click', function () { return _this._navigateMonth(-1); });
62
- // Month and Year selector (center)
63
- var headerCenter = document.createElement('div');
64
- headerCenter.className = 'kt-datepicker-datepicker-header-middle';
65
- // Right navigation button
66
- var rightNavButton = document.createElement('button');
67
- rightNavButton.type = 'button';
68
- rightNavButton.className = 'kt-dropdown-calendar-right-nav-btn';
69
- rightNavButton.setAttribute('aria-label', 'Next month');
70
- rightNavButton.innerHTML =
71
- '<svg xmlns="http://www.w3.org/2000/svg" class="h-5 w-5" viewBox="0 0 20 20" fill="currentColor"><path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd" /></svg>';
72
- rightNavButton.addEventListener('click', function () { return _this._navigateMonth(1); });
73
- // Assemble header
74
- headerElement.appendChild(leftNavButton);
75
- headerElement.appendChild(headerCenter);
76
- headerElement.appendChild(rightNavButton);
77
- this._dropdownElement.appendChild(headerElement);
78
- // Create calendar content container
79
- this._calendarContainer = document.createElement('div');
80
- this._calendarContainer.className = 'kt-datepicker-calendar-container';
81
- this._dropdownElement.appendChild(this._calendarContainer);
82
- // Add calendar footer with action buttons
83
- var footerElement = document.createElement('div');
84
- footerElement.className = 'kt-datepicker-calendar-footer';
85
- // Today button
86
- var todayButton = document.createElement('button');
87
- todayButton.type = 'button';
88
- todayButton.className = 'kt-datepicker-calendar-today-btn';
89
- todayButton.textContent = 'Today';
90
- todayButton.addEventListener('click', function () { return _this._goToToday(); });
91
- // Clear button
92
- var clearButton = document.createElement('button');
93
- clearButton.type = 'button';
94
- clearButton.className = 'kt-datepicker-calendar-clear-btn';
95
- clearButton.textContent = 'Clear';
96
- clearButton.addEventListener('click', function () { return _this._clearSelection(); });
97
- // Apply button
98
- var applyButton = document.createElement('button');
99
- applyButton.type = 'button';
100
- applyButton.className = 'kt-datepicker-calendar-clear-btn';
101
- applyButton.textContent = 'Apply';
102
- applyButton.addEventListener('click', function () { return _this._applySelection(); });
103
- // Assemble footer
104
- footerElement.appendChild(todayButton);
105
- var rightFooter = document.createElement('div');
106
- rightFooter.className = 'kt-datepicker-calendar-footer-right';
107
- rightFooter.appendChild(clearButton);
108
- rightFooter.appendChild(applyButton);
109
- footerElement.appendChild(rightFooter);
110
- this._dropdownElement.appendChild(footerElement);
111
- // Add to document
112
- this._element.appendChild(this._dropdownElement);
113
- // Initialize dropdown manager
114
- this._initDropdownManager();
115
- // Initialize calendar view
116
- this._renderCalendarView();
117
- };
118
- /**
119
- * Initialize the dropdown manager
120
- */
121
- KTDatepickerCalendar.prototype._initDropdownManager = function () {
122
- var _this = this;
123
- var config = this._stateManager.getConfig();
124
- // Use the display element rather than the input element
125
- var displayElement = this._element.querySelector('[data-kt-datepicker-display]');
126
- var inputElement = this._element.querySelector('[data-kt-datepicker-input]');
127
- var triggerElement = displayElement || inputElement;
128
- if (triggerElement && this._dropdownElement) {
129
- this._dropdownManager = new KTDatepickerDropdown(this._element, triggerElement, this._dropdownElement, config);
130
- // Add keyboard event listener to the trigger element
131
- triggerElement.addEventListener('keydown', function (e) {
132
- if (e.key === 'Enter' || e.key === ' ' || e.key === 'ArrowDown') {
133
- e.preventDefault();
134
- if (!_this._isVisible) {
135
- // Open the dropdown
136
- _this._stateManager.setOpen(true);
137
- }
138
- }
139
- });
140
- }
141
- };
142
- /**
143
- * Set up event listeners for calendar interactions
144
- */
145
- KTDatepickerCalendar.prototype._setupEventListeners = function () {
146
- var _this = this;
147
- if (!this._dropdownElement)
148
- return;
149
- // Get elements
150
- var prevMonthBtn = this._dropdownElement.querySelector('button[aria-label="Previous Month"]');
151
- var nextMonthBtn = this._dropdownElement.querySelector('button[aria-label="Next Month"]');
152
- // Find buttons by text content instead of using jQuery-style selectors
153
- var buttons = this._dropdownElement.querySelectorAll('button');
154
- var todayBtn = null;
155
- var clearBtn = null;
156
- var applyBtn = null;
157
- buttons.forEach(function (btn) {
158
- var _a;
159
- var btnText = (_a = btn.textContent) === null || _a === void 0 ? void 0 : _a.trim();
160
- if (btnText === 'Today')
161
- todayBtn = btn;
162
- else if (btnText === 'Clear')
163
- clearBtn = btn;
164
- else if (btnText === 'Apply')
165
- applyBtn = btn;
166
- });
167
- var monthYearText = this._dropdownElement.querySelector('.kt-datepicker-calendar-monthyear-text');
168
- // Month navigation
169
- if (prevMonthBtn) {
170
- prevMonthBtn.addEventListener('click', function () { return _this._navigateMonth(-1); });
171
- }
172
- if (nextMonthBtn) {
173
- nextMonthBtn.addEventListener('click', function () { return _this._navigateMonth(1); });
174
- }
175
- // Month/year view toggle
176
- if (monthYearText) {
177
- monthYearText.addEventListener('click', function () {
178
- return _this._toggleMonthYearView();
179
- });
180
- }
181
- // Today, Clear, Apply buttons
182
- if (todayBtn) {
183
- todayBtn.addEventListener('click', function () { return _this._goToToday(); });
184
- }
185
- if (clearBtn) {
186
- clearBtn.addEventListener('click', function () { return _this._clearSelection(); });
187
- }
188
- if (applyBtn) {
189
- applyBtn.addEventListener('click', function () { return _this._applySelection(); });
190
- }
191
- // Handle day selection through event delegation
192
- if (this._calendarContainer) {
193
- this._calendarContainer.addEventListener('click', function (e) {
194
- var target = e.target;
195
- var dayButton = target.closest('button[data-date]');
196
- if (dayButton && !dayButton.hasAttribute('disabled')) {
197
- // Get the date ID directly from the clicked button (YYYY-MM-DD format)
198
- var dateIdAttr = dayButton.getAttribute('data-date-id');
199
- if (dateIdAttr) {
200
- // Parse the ISO date string to get exact year, month, day
201
- var _a = dateIdAttr
202
- .split('-')
203
- .map(function (part) { return parseInt(part, 10); }), year = _a[0], month = _a[1], day = _a[2];
204
- // Create the date object from the parsed components
205
- var clickedDate = new Date(year, month - 1, day); // Month is 0-indexed in JS
206
- clickedDate.setHours(0, 0, 0, 0); // Set to midnight
207
- // Handle this date directly instead of using day number
208
- _this._handleDateSelection(clickedDate, dayButton);
209
- }
210
- else {
211
- // Fallback to old method using day number if date-id is not present
212
- var dateAttr = dayButton.getAttribute('data-date');
213
- if (dateAttr) {
214
- var day = parseInt(dateAttr, 10);
215
- _this._handleDaySelection(day);
216
- }
217
- }
218
- }
219
- });
220
- // Add hover effect for range selection
221
- this._calendarContainer.addEventListener('mouseover', function (e) {
222
- var state = _this._stateManager.getState();
223
- var config = _this._stateManager.getConfig();
224
- // Only apply hover effect in range mode when start date is selected but end date is not
225
- if (!config.range ||
226
- !state.selectedDateRange ||
227
- !state.selectedDateRange.startDate ||
228
- state.selectedDateRange.endDate) {
229
- return;
230
- }
231
- var target = e.target;
232
- var dayButton = target.closest('button[data-date]');
233
- if (dayButton && !dayButton.hasAttribute('disabled')) {
234
- // Clear any existing hover classes
235
- _this._clearRangeHoverClasses();
236
- // Get the proper date from the data-date-id attribute
237
- var dateIdAttr = dayButton.getAttribute('data-date-id');
238
- if (dateIdAttr) {
239
- // Parse the ISO date string (YYYY-MM-DD)
240
- var _a = dateIdAttr
241
- .split('-')
242
- .map(function (part) { return parseInt(part, 10); }), year = _a[0], month = _a[1], day = _a[2];
243
- var hoverDate = new Date(year, month - 1, day); // Month is 0-indexed in JS Date
244
- // Apply hover effect between start date and current hover date
245
- _this._applyRangeHoverEffect(state.selectedDateRange.startDate, hoverDate);
246
- }
247
- else {
248
- // Fallback to old method if data-date-id is not present
249
- var dateAttr = dayButton.getAttribute('data-date');
250
- if (dateAttr) {
251
- var day = parseInt(dateAttr, 10);
252
- var hoverDate = new Date(state.currentDate);
253
- hoverDate.setDate(day);
254
- // Apply hover effect between start date and current hover date
255
- _this._applyRangeHoverEffect(state.selectedDateRange.startDate, hoverDate);
256
- }
257
- }
258
- }
259
- });
260
- // Clear hover effect when mouse leaves the calendar
261
- this._calendarContainer.addEventListener('mouseleave', function () {
262
- _this._clearRangeHoverClasses();
263
- });
264
- }
265
- // Listen for state changes
266
- this._eventManager.addEventListener(KTDatepickerEventName.STATE_CHANGE, function (e) {
267
- var _a;
268
- var detail = (_a = e.detail) === null || _a === void 0 ? void 0 : _a.payload;
269
- var config = _this._stateManager.getConfig();
270
- // For range selection, check if we need to keep the dropdown open
271
- if (config.range && detail && detail.selectedDateRange) {
272
- var _b = detail.selectedDateRange, startDate = _b.startDate, endDate = _b.endDate;
273
- // If start date is set but no end date, keep dropdown open
274
- if (startDate && !endDate) {
275
- _this._stateManager.getState().isRangeSelectionInProgress = true;
276
- }
277
- else if (startDate && endDate) {
278
- _this._stateManager.getState().isRangeSelectionInProgress = false;
279
- }
280
- }
281
- // Update calendar view
282
- _this._updateCalendarView();
283
- });
284
- // Listen for other state changes
285
- this._eventManager.addEventListener(KTDatepickerEventName.VIEW_CHANGE, function () {
286
- return _this._updateViewMode();
287
- });
288
- this._eventManager.addEventListener(KTDatepickerEventName.OPEN, function () {
289
- return _this.show();
290
- });
291
- this._eventManager.addEventListener(KTDatepickerEventName.CLOSE, function () {
292
- return _this.hide();
293
- });
294
- this._eventManager.addEventListener(KTDatepickerEventName.UPDATE, function () {
295
- return _this._updateCalendarView();
296
- });
297
- // Time inputs
298
- var timeContainer = this._dropdownElement.querySelector('.kt-datepicker-calendar-time-container');
299
- if (timeContainer) {
300
- var hourInput = timeContainer.querySelector('input[aria-label="Hour"]');
301
- var minuteInput = timeContainer.querySelector('input[aria-label="Minute"]');
302
- var secondInput = timeContainer.querySelector('input[aria-label="Second"]');
303
- var amButton = timeContainer.querySelector('button[aria-label="AM"]');
304
- var pmButton = timeContainer.querySelector('button[aria-label="PM"]');
305
- // Update AM/PM button texts
306
- var config = this._stateManager.getConfig();
307
- if (amButton)
308
- amButton.textContent = config.am;
309
- if (pmButton)
310
- pmButton.textContent = config.pm;
311
- // Time input listeners
312
- if (hourInput) {
313
- hourInput.addEventListener('change', function () { return _this._handleTimeChange(); });
314
- }
315
- if (minuteInput) {
316
- minuteInput.addEventListener('change', function () { return _this._handleTimeChange(); });
317
- }
318
- if (secondInput) {
319
- secondInput.addEventListener('change', function () { return _this._handleTimeChange(); });
320
- }
321
- // AM/PM selection
322
- if (amButton) {
323
- amButton.addEventListener('click', function () { return _this._setAmPm('AM'); });
324
- }
325
- if (pmButton) {
326
- pmButton.addEventListener('click', function () { return _this._setAmPm('PM'); });
327
- }
328
- }
329
- };
330
- /**
331
- * Render the calendar view based on current state
332
- */
333
- KTDatepickerCalendar.prototype._renderCalendarView = function () {
334
- var _this = this;
335
- if (!this._calendarContainer)
336
- return;
337
- var state = this._stateManager.getState();
338
- var config = this._stateManager.getConfig();
339
- var locale = getLocaleConfig(config);
340
- // Clear existing content
341
- this._calendarContainer.innerHTML = '';
342
- // Set up proper container classes for multiple months view
343
- if (config.visibleMonths > 1) {
344
- // For multiple months, use a flex container with no wrapping
345
- this._calendarContainer.className = 'kt-datepicker-calendar-container-mt';
346
- }
347
- else {
348
- this._calendarContainer.className = 'kt-datepicker-calendar-container';
349
- }
350
- // Render based on view mode
351
- switch (state.viewMode) {
352
- case 'days':
353
- // For each visible month, create a calendar
354
- for (var i = 0; i < config.visibleMonths; i++) {
355
- // Calculate the month to display
356
- var tempDate = new Date(state.currentDate);
357
- tempDate.setMonth(state.currentDate.getMonth() + i);
358
- var month = tempDate.getMonth();
359
- var year = tempDate.getFullYear();
360
- // Create month container
361
- var monthContainer = document.createElement('div');
362
- // Set appropriate class based on number of months
363
- if (config.visibleMonths > 1) {
364
- // For multiple months, use fixed width and properly spaced
365
- monthContainer.className = 'kt-datepicker-calendar-month-mt';
366
- monthContainer.setAttribute('data-month-id', "".concat(month, "-").concat(year));
367
- }
368
- else {
369
- monthContainer.className = 'kt-datepicker-calendar-month';
370
- }
371
- // Add month header
372
- var monthHeader = document.createElement('div');
373
- monthHeader.className = 'kt-datepicker-calendar-month-header';
374
- monthHeader.textContent = "".concat(locale.monthNames[month], " ").concat(year);
375
- monthContainer.appendChild(monthHeader);
376
- // Generate calendar grid
377
- monthContainer.innerHTML += calendarGridTemplate(locale, config.weekDays);
378
- // Get days for the month
379
- var calendarMatrix = generateCalendarMonth(year, month, config);
380
- // Render days
381
- var daysBody = monthContainer.querySelector('tbody');
382
- if (daysBody) {
383
- daysBody.innerHTML = this._renderDays(calendarMatrix, month, year);
384
- }
385
- // Add to container
386
- this._calendarContainer.appendChild(monthContainer);
387
- }
388
- // Update the month/year display in header
389
- this._updateMonthYearDisplay();
390
- break;
391
- case 'months':
392
- // Render month selection view with current month
393
- var currentMonth = state.currentDate.getMonth();
394
- this._calendarContainer.innerHTML = monthSelectionTemplate(locale, currentMonth);
395
- // Add click events to month buttons
396
- var monthButtons = this._calendarContainer.querySelectorAll('button[data-month]');
397
- monthButtons.forEach(function (btn) {
398
- btn.addEventListener('click', function (e) {
399
- var target = e.target;
400
- var monthIdx = target.getAttribute('data-month');
401
- if (monthIdx) {
402
- _this._selectMonth(parseInt(monthIdx, 10));
403
- }
404
- });
405
- });
406
- break;
407
- case 'years':
408
- // Get current year and calculate year range
409
- var currentYear = state.currentDate.getFullYear();
410
- var startYear_1 = currentYear - Math.floor(config.visibleYears / 2);
411
- var endYear_1 = startYear_1 + config.visibleYears - 1;
412
- // Render year selection view
413
- this._calendarContainer.innerHTML = yearSelectionTemplate(startYear_1, endYear_1, currentYear);
414
- // Add click events to year buttons
415
- var yearButtons = this._calendarContainer.querySelectorAll('button[data-year]');
416
- yearButtons.forEach(function (btn) {
417
- btn.addEventListener('click', function (e) {
418
- var target = e.target;
419
- var year = target.getAttribute('data-year');
420
- if (year) {
421
- _this._selectYear(parseInt(year, 10));
422
- }
423
- });
424
- });
425
- // Add navigation for year ranges
426
- var prevYearsBtn = this._calendarContainer.querySelector('button[data-year-nav="prev"]');
427
- if (prevYearsBtn) {
428
- prevYearsBtn.addEventListener('click', function () {
429
- var newYear = startYear_1 - config.visibleYears;
430
- var newDate = new Date(state.currentDate);
431
- newDate.setFullYear(newYear);
432
- _this._stateManager.setCurrentDate(newDate);
433
- _this._renderCalendarView();
434
- });
435
- }
436
- var nextYearsBtn = this._calendarContainer.querySelector('button[data-year-nav="next"]');
437
- if (nextYearsBtn) {
438
- nextYearsBtn.addEventListener('click', function () {
439
- var newYear = endYear_1 + 1;
440
- var newDate = new Date(state.currentDate);
441
- newDate.setFullYear(newYear);
442
- _this._stateManager.setCurrentDate(newDate);
443
- _this._renderCalendarView();
444
- });
445
- }
446
- break;
447
- }
448
- };
449
- /**
450
- * Render days for a calendar month
451
- *
452
- * @param calendarMatrix - Matrix of dates for the month
453
- * @param currentMonth - Current month
454
- * @param currentYear - Current year
455
- * @returns HTML string for the days
456
- */
457
- KTDatepickerCalendar.prototype._renderDays = function (calendarMatrix, currentMonth, currentYear) {
458
- var state = this._stateManager.getState();
459
- var config = this._stateManager.getConfig();
460
- var today = new Date();
461
- today.setHours(0, 0, 0, 0);
462
- var html = '';
463
- // Loop through each week
464
- for (var _i = 0, calendarMatrix_1 = calendarMatrix; _i < calendarMatrix_1.length; _i++) {
465
- var week = calendarMatrix_1[_i];
466
- html += '<tr>';
467
- var _loop_1 = function (date) {
468
- // Determine cell properties
469
- var isCurrentMonth = date.getMonth() === currentMonth;
470
- var isToday = isSameDay(date, today);
471
- var isSelected = false;
472
- var isRangeStart = false;
473
- var isRangeEnd = false;
474
- var isInRange = false;
475
- // Check if date is selected
476
- if (state.selectedDate && isSameDay(date, state.selectedDate)) {
477
- isSelected = true;
478
- }
479
- // Check if date is in range for range selection
480
- if (config.range && state.selectedDateRange) {
481
- var _b = state.selectedDateRange, startDate = _b.startDate, endDate = _b.endDate;
482
- if (startDate && isSameDay(date, startDate)) {
483
- isRangeStart = true;
484
- isSelected = true;
485
- }
486
- if (endDate && isSameDay(date, endDate)) {
487
- isRangeEnd = true;
488
- isSelected = true;
489
- }
490
- if (startDate && endDate && isDateBetween(date, startDate, endDate)) {
491
- isInRange = true;
492
- }
493
- }
494
- // Check if date is in multi-date selection
495
- if (config.multiDateSelection && state.selectedDates.length > 0) {
496
- isSelected = state.selectedDates.some(function (d) { return isSameDay(date, d); });
497
- }
498
- // Check if date is disabled
499
- var isDisabled = isDateDisabled(date, config);
500
- // Check if weekend
501
- var isWeekendDay = isWeekend(date);
502
- // Get the actual month and year of this date (may differ from currentMonth/currentYear for adjacent months)
503
- var actualMonth = date.getMonth();
504
- var actualYear = date.getFullYear();
505
- // Generate day cell
506
- html += dayTemplate(date.getDate(), actualMonth, actualYear, isCurrentMonth, isToday, isSelected, isDisabled, isRangeStart, isRangeEnd, isInRange, isWeekendDay);
507
- };
508
- // Loop through each day in the week
509
- for (var _a = 0, week_1 = week; _a < week_1.length; _a++) {
510
- var date = week_1[_a];
511
- _loop_1(date);
512
- }
513
- html += '</tr>';
514
- }
515
- return html;
516
- };
517
- /**
518
- * Update the month and year display in the header
519
- */
520
- KTDatepickerCalendar.prototype._updateMonthYearDisplay = function () {
521
- var _this = this;
522
- if (!this._dropdownElement)
523
- return;
524
- var state = this._stateManager.getState();
525
- var config = this._stateManager.getConfig();
526
- var locale = getLocaleConfig(config);
527
- // Find the calendar header
528
- var calendarHeader = this._dropdownElement.querySelector('.kt-datepicker-calendar-header');
529
- if (!calendarHeader)
530
- return;
531
- var currentMonth = state.currentDate.getMonth();
532
- var currentYear = state.currentDate.getFullYear();
533
- // Update the header with month/year selectors
534
- calendarHeader.innerHTML = monthYearSelectTemplate(locale, currentMonth, currentYear);
535
- // Add event listeners to the month and year selectors
536
- var monthSelector = calendarHeader.querySelector('.kt-datepicker-calendar-month-selector');
537
- var yearSelector = calendarHeader.querySelector('.kt-datepicker-calendar-year-selector');
538
- if (monthSelector) {
539
- monthSelector.addEventListener('click', function () {
540
- // Switch to months view
541
- _this._stateManager.setViewMode('months');
542
- _this._renderCalendarView();
543
- });
544
- }
545
- if (yearSelector) {
546
- yearSelector.addEventListener('click', function () {
547
- // Switch to years view
548
- _this._stateManager.setViewMode('years');
549
- _this._renderCalendarView();
550
- });
551
- }
552
- };
553
- /**
554
- * Navigate to a different month
555
- *
556
- * @param offset - Number of months to offset by
557
- */
558
- KTDatepickerCalendar.prototype._navigateMonth = function (offset) {
559
- var state = this._stateManager.getState();
560
- var newDate = new Date(state.currentDate);
561
- newDate.setMonth(newDate.getMonth() + offset);
562
- this._stateManager.setCurrentDate(newDate);
563
- this._renderCalendarView();
564
- };
565
- /**
566
- * Handle direct date selection (new method that takes the actual date object)
567
- *
568
- * @param selectedDate - The exact date that was selected
569
- * @param clickedButton - The button element that was clicked
570
- */
571
- KTDatepickerCalendar.prototype._handleDateSelection = function (selectedDate, clickedButton) {
572
- var state = this._stateManager.getState();
573
- var config = this._stateManager.getConfig();
574
- // Check if the date is disabled (outside min/max range or explicitly disabled)
575
- if (isDateDisabled(selectedDate, config)) {
576
- console.log('Date is disabled, ignoring selection:', selectedDate.toISOString());
577
- return;
578
- }
579
- // Create a new date object set to noon of the selected date in local timezone
580
- // This prevents timezone shifts causing the wrong date to be selected
581
- var localSelectedDate = new Date(selectedDate);
582
- localSelectedDate.setHours(12, 0, 0, 0);
583
- // Set time if enabled
584
- if (config.enableTime && state.selectedTime) {
585
- localSelectedDate.setHours(state.selectedTime.hours, state.selectedTime.minutes, state.selectedTime.seconds, 0);
586
- }
587
- // Get the current range state before updating
588
- var currentRange = state.selectedDateRange;
589
- var isStartingNewRange = !currentRange ||
590
- !currentRange.startDate ||
591
- (currentRange.startDate && currentRange.endDate);
592
- // Determine if we're in a month different from the currently displayed one
593
- var selectedMonth = localSelectedDate.getMonth();
594
- var currentViewMonth = state.currentDate.getMonth();
595
- var isInDifferentMonth = selectedMonth !== currentViewMonth;
596
- console.log('Selected date:', localSelectedDate.toISOString(), 'Month:', selectedMonth, 'Current view month:', currentViewMonth, 'Day of month:', localSelectedDate.getDate());
597
- // Call the state manager's setSelectedDate method
598
- this._stateManager.setSelectedDate(localSelectedDate);
599
- // After setting the date, get the updated range state
600
- var updatedRange = state.selectedDateRange;
601
- // If we're in range mode, handle specific range selection behavior
602
- if (config.range) {
603
- if (isStartingNewRange) {
604
- console.log('Starting new range selection with date:', localSelectedDate.toISOString());
605
- // If starting a range with a date in a different month, update the view
606
- if (isInDifferentMonth) {
607
- this._stateManager.setCurrentDate(localSelectedDate);
608
- }
609
- // Explicitly clear any hover effects when starting a new range
610
- this._clearRangeHoverClasses();
611
- }
612
- else {
613
- // This is the second click to complete a range
614
- console.log('Completing range selection with date:', localSelectedDate.toISOString());
615
- // If the selected range spans different months and we have multiple visible months
616
- if (updatedRange &&
617
- updatedRange.startDate &&
618
- updatedRange.endDate &&
619
- config.visibleMonths > 1) {
620
- // Determine range start and end months
621
- var startMonth = updatedRange.startDate.getMonth();
622
- var endMonth = updatedRange.endDate.getMonth();
623
- // If range spans multiple months, update view to show the earlier month
624
- if (startMonth !== endMonth) {
625
- // Show the earlier month as the first visible month
626
- var earlierDate = updatedRange.startDate < updatedRange.endDate
627
- ? updatedRange.startDate
628
- : updatedRange.endDate;
629
- this._stateManager.setCurrentDate(earlierDate);
630
- }
631
- }
632
- }
633
- // Close dropdown only if range selection is complete
634
- if (updatedRange && updatedRange.startDate && updatedRange.endDate) {
635
- this._stateManager.setOpen(false);
636
- }
637
- }
638
- else {
639
- // For single date selection, close the dropdown
640
- this._stateManager.setOpen(false);
641
- }
642
- // Update calendar view to reflect changes
643
- this._updateCalendarView();
644
- };
645
- /**
646
- * Handle day selection (legacy method, kept for backward compatibility)
647
- *
648
- * @param day - Day number
649
- */
650
- KTDatepickerCalendar.prototype._handleDaySelection = function (day) {
651
- var _a;
652
- var state = this._stateManager.getState();
653
- var config = this._stateManager.getConfig();
654
- // Find the clicked button element using data-date attribute
655
- var dayButtons = (_a = this._calendarContainer) === null || _a === void 0 ? void 0 : _a.querySelectorAll("button[data-date=\"".concat(day, "\"]"));
656
- if (!dayButtons || dayButtons.length === 0)
657
- return;
658
- // First look for the button that matches the clicked target in the current month
659
- var clickedButton = null;
660
- // Find the actual button that was likely clicked (prefer current month days)
661
- for (var i = 0; i < dayButtons.length; i++) {
662
- var button = dayButtons[i];
663
- var parentCell = button.closest('td');
664
- // Check if the day is in the current month (not faded)
665
- var isCurrentMonth = !button.classList.contains('current') &&
666
- (!parentCell || !parentCell.classList.contains('current'));
667
- if (isCurrentMonth) {
668
- clickedButton = button;
669
- break;
670
- }
671
- }
672
- // If no current month button found, use the first one
673
- if (!clickedButton && dayButtons.length > 0) {
674
- clickedButton = dayButtons[0];
675
- }
676
- if (!clickedButton)
677
- return;
678
- // Get the proper date from the data-date-id attribute which contains YYYY-MM-DD
679
- var dateIdAttr = clickedButton.getAttribute('data-date-id');
680
- if (!dateIdAttr)
681
- return;
682
- // Parse the ISO date string
683
- var _b = dateIdAttr
684
- .split('-')
685
- .map(function (part) { return parseInt(part, 10); }), year = _b[0], month = _b[1], dayOfMonth = _b[2];
686
- // Create the date object with the proper timezone handling
687
- // We'll set it to noon in local time to avoid timezone issues
688
- var selectedDate = new Date(year, month - 1, dayOfMonth, 12, 0, 0, 0); // Month is 0-indexed in JS Date, and setting time to noon
689
- // First check if this date is disabled (outside min/max range)
690
- if (isDateDisabled(selectedDate, config)) {
691
- console.log('Date is disabled, ignoring selection:', selectedDate.toISOString());
692
- return;
693
- }
694
- // Use the new direct date selection method
695
- this._handleDateSelection(selectedDate, clickedButton);
696
- };
697
- /**
698
- * Toggle between days, months, and years view
699
- */
700
- KTDatepickerCalendar.prototype._toggleMonthYearView = function () {
701
- var state = this._stateManager.getState();
702
- var newMode;
703
- switch (state.viewMode) {
704
- case 'days':
705
- newMode = 'months';
706
- break;
707
- case 'months':
708
- newMode = 'years';
709
- break;
710
- case 'years':
711
- newMode = 'days';
712
- break;
713
- default:
714
- newMode = 'days';
715
- }
716
- this._stateManager.setViewMode(newMode);
717
- this._renderCalendarView();
718
- };
719
- /**
720
- * Update view mode based on state change
721
- */
722
- KTDatepickerCalendar.prototype._updateViewMode = function () {
723
- this._renderCalendarView();
724
- };
725
- /**
726
- * Go to today's date
727
- */
728
- KTDatepickerCalendar.prototype._goToToday = function () {
729
- var today = new Date();
730
- this._stateManager.setCurrentDate(today);
731
- this._renderCalendarView();
732
- };
733
- /**
734
- * Clear date selection
735
- */
736
- KTDatepickerCalendar.prototype._clearSelection = function () {
737
- this._stateManager.setSelectedDate(null);
738
- this._updateCalendarView();
739
- };
740
- /**
741
- * Apply current selection and close dropdown
742
- */
743
- KTDatepickerCalendar.prototype._applySelection = function () {
744
- var state = this._stateManager.getState();
745
- var config = this._stateManager.getConfig();
746
- // For range selection, check if range selection is in progress
747
- if (config.range && state.isRangeSelectionInProgress) {
748
- console.log('Apply button clicked, but range selection in progress - keeping dropdown open');
749
- // Don't close when range selection is in progress
750
- return;
751
- }
752
- // Close dropdown for other cases
753
- this._stateManager.setOpen(false);
754
- };
755
- /**
756
- * Handle time input changes
757
- */
758
- KTDatepickerCalendar.prototype._handleTimeChange = function () {
759
- if (!this._dropdownElement)
760
- return;
761
- var timeContainer = this._dropdownElement.querySelector('.kt-datepicker-calendar-time-container');
762
- if (!timeContainer)
763
- return;
764
- var hourInput = timeContainer.querySelector('input[aria-label="Hour"]');
765
- var minuteInput = timeContainer.querySelector('input[aria-label="Minute"]');
766
- var secondInput = timeContainer.querySelector('input[aria-label="Second"]');
767
- var amButton = timeContainer.querySelector('button[aria-label="AM"]');
768
- var pmButton = timeContainer.querySelector('button[aria-label="PM"]');
769
- if (!hourInput || !minuteInput || !secondInput)
770
- return;
771
- // Get input values
772
- var hours = parseInt(hourInput.value, 10);
773
- var minutes = parseInt(minuteInput.value, 10);
774
- var seconds = parseInt(secondInput.value, 10);
775
- // Validate values
776
- var isValidHours = !isNaN(hours) && hours >= 0 && hours <= 23;
777
- var isValidMinutes = !isNaN(minutes) && minutes >= 0 && minutes <= 59;
778
- var isValidSeconds = !isNaN(seconds) && seconds >= 0 && seconds <= 59;
779
- if (!isValidHours || !isValidMinutes || !isValidSeconds)
780
- return;
781
- // Check if using 12-hour format and adjust for AM/PM
782
- var isPM = amButton && amButton.classList.contains('bg-blue-500');
783
- if (isPM && hours < 12) {
784
- hours += 12;
785
- }
786
- else if (!isPM && hours === 12) {
787
- hours = 0;
788
- }
789
- // Update time in state
790
- this._stateManager.setSelectedTime({
791
- hours: hours,
792
- minutes: minutes,
793
- seconds: seconds,
794
- ampm: isPM ? 'PM' : 'AM',
795
- });
796
- // Update selected date with new time if a date is selected
797
- var state = this._stateManager.getState();
798
- if (state.selectedDate) {
799
- var updatedDate = new Date(state.selectedDate);
800
- updatedDate.setHours(hours, minutes, seconds, 0);
801
- this._stateManager.setSelectedDate(updatedDate);
802
- }
803
- };
804
- /**
805
- * Set AM/PM selection
806
- *
807
- * @param period - 'AM' or 'PM'
808
- */
809
- KTDatepickerCalendar.prototype._setAmPm = function (period) {
810
- if (!this._dropdownElement)
811
- return;
812
- var timeContainer = this._dropdownElement.querySelector('.py-3.border-t');
813
- if (!timeContainer)
814
- return;
815
- var amButton = timeContainer.querySelector('button[aria-label="AM"]');
816
- var pmButton = timeContainer.querySelector('button[aria-label="PM"]');
817
- if (!amButton || !pmButton)
818
- return;
819
- // Update button states
820
- if (period === 'AM') {
821
- amButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');
822
- amButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');
823
- pmButton.classList.remove('bg-blue-500', 'text-white', 'border-blue-500');
824
- pmButton.classList.add('bg-gray-50', 'hover:bg-gray-100');
825
- }
826
- else {
827
- amButton.classList.remove('bg-blue-500', 'text-white', 'border-blue-500');
828
- amButton.classList.add('bg-gray-50', 'hover:bg-gray-100');
829
- pmButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');
830
- pmButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');
831
- }
832
- // Update time
833
- this._handleTimeChange();
834
- };
835
- /**
836
- * Select a month
837
- *
838
- * @param month - Month index (0-11)
839
- */
840
- KTDatepickerCalendar.prototype._selectMonth = function (month) {
841
- var state = this._stateManager.getState();
842
- var config = this._stateManager.getConfig();
843
- var newDate = new Date(state.currentDate);
844
- newDate.setMonth(month);
845
- this._stateManager.setCurrentDate(newDate);
846
- // Only change view mode if keepViewModeOnSelection is false
847
- if (!config.keepViewModeOnSelection) {
848
- this._stateManager.setViewMode('days');
849
- }
850
- this._renderCalendarView();
851
- };
852
- /**
853
- * Select a year
854
- *
855
- * @param year - Year value
856
- */
857
- KTDatepickerCalendar.prototype._selectYear = function (year) {
858
- var state = this._stateManager.getState();
859
- var config = this._stateManager.getConfig();
860
- var newDate = new Date(state.currentDate);
861
- newDate.setFullYear(year);
862
- this._stateManager.setCurrentDate(newDate);
863
- // Only change view mode if keepViewModeOnSelection is false
864
- if (!config.keepViewModeOnSelection) {
865
- this._stateManager.setViewMode('months');
866
- }
867
- this._renderCalendarView();
868
- };
869
- /**
870
- * Update calendar view to reflect state changes
871
- */
872
- KTDatepickerCalendar.prototype._updateCalendarView = function () {
873
- this._renderCalendarView();
874
- this._updateTimeDisplay();
875
- };
876
- /**
877
- * Update time inputs to reflect current time selection
878
- */
879
- KTDatepickerCalendar.prototype._updateTimeDisplay = function () {
880
- if (!this._dropdownElement)
881
- return;
882
- var state = this._stateManager.getState();
883
- var config = this._stateManager.getConfig();
884
- // Skip if time is not enabled
885
- if (!config.enableTime)
886
- return;
887
- var timeContainer = this._dropdownElement.querySelector('.py-3.border-t');
888
- if (!timeContainer)
889
- return;
890
- var hourInput = timeContainer.querySelector('input[aria-label="Hour"]');
891
- var minuteInput = timeContainer.querySelector('input[aria-label="Minute"]');
892
- var secondInput = timeContainer.querySelector('input[aria-label="Second"]');
893
- var amButton = timeContainer.querySelector('button[aria-label="AM"]');
894
- var pmButton = timeContainer.querySelector('button[aria-label="PM"]');
895
- // Get time from selected date or default to current time
896
- var hours = 0;
897
- var minutes = 0;
898
- var seconds = 0;
899
- var isAM = true;
900
- if (state.selectedTime) {
901
- hours = state.selectedTime.hours;
902
- minutes = state.selectedTime.minutes;
903
- seconds = state.selectedTime.seconds;
904
- isAM = state.selectedTime.ampm === 'AM';
905
- }
906
- else if (state.selectedDate) {
907
- hours = state.selectedDate.getHours();
908
- minutes = state.selectedDate.getMinutes();
909
- seconds = state.selectedDate.getSeconds();
910
- isAM = hours < 12;
911
- }
912
- else {
913
- var now = new Date();
914
- hours = now.getHours();
915
- minutes = now.getMinutes();
916
- seconds = now.getSeconds();
917
- isAM = hours < 12;
918
- }
919
- // Adjust for 12-hour display if needed
920
- var displayHours = hours;
921
- if (hourInput && config.timeFormat.includes('h')) {
922
- displayHours = hours % 12;
923
- if (displayHours === 0)
924
- displayHours = 12;
925
- }
926
- // Update input values
927
- if (hourInput)
928
- hourInput.value =
929
- config.forceLeadingZero && displayHours < 10
930
- ? "0".concat(displayHours)
931
- : "".concat(displayHours);
932
- if (minuteInput)
933
- minuteInput.value =
934
- config.forceLeadingZero && minutes < 10 ? "0".concat(minutes) : "".concat(minutes);
935
- if (secondInput)
936
- secondInput.value =
937
- config.forceLeadingZero && seconds < 10 ? "0".concat(seconds) : "".concat(seconds);
938
- // Update AM/PM buttons
939
- if (amButton && pmButton) {
940
- if (isAM) {
941
- amButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');
942
- amButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');
943
- pmButton.classList.remove('bg-blue-500', 'text-white', 'border-blue-500');
944
- pmButton.classList.add('bg-gray-50', 'hover:bg-gray-100');
945
- }
946
- else {
947
- amButton.classList.remove('bg-blue-500', 'text-white', 'border-blue-500');
948
- amButton.classList.add('bg-gray-50', 'hover:bg-gray-100');
949
- pmButton.classList.add('bg-blue-500', 'text-white', 'border-blue-500');
950
- pmButton.classList.remove('bg-gray-50', 'hover:bg-gray-100');
951
- }
952
- }
953
- };
954
- /**
955
- * Show the calendar dropdown
956
- */
957
- KTDatepickerCalendar.prototype.show = function () {
958
- if (!this._dropdownElement || this._isVisible)
959
- return;
960
- // Ensure we're in days view
961
- var state = this._stateManager.getState();
962
- if (state.viewMode !== 'days') {
963
- this._stateManager.setViewMode('days');
964
- }
965
- // Render calendar before showing
966
- this._renderCalendarView();
967
- this._updateTimeDisplay();
968
- // Show dropdown using dropdown manager
969
- if (this._dropdownManager) {
970
- this._dropdownManager.open();
971
- this._isVisible = true;
972
- }
973
- };
974
- /**
975
- * Hide the calendar dropdown
976
- */
977
- KTDatepickerCalendar.prototype.hide = function () {
978
- if (!this._dropdownElement || !this._isVisible)
979
- return;
980
- // Hide dropdown using dropdown manager
981
- if (this._dropdownManager) {
982
- this._dropdownManager.close();
983
- this._isVisible = false;
984
- }
985
- };
986
- /**
987
- * Update dropdown position
988
- */
989
- KTDatepickerCalendar.prototype.updatePosition = function () {
990
- if (this._dropdownManager) {
991
- this._dropdownManager.updatePosition();
992
- }
993
- };
994
- /**
995
- * Clear range hover classes from all day cells
996
- */
997
- KTDatepickerCalendar.prototype._clearRangeHoverClasses = function () {
998
- if (!this._calendarContainer)
999
- return;
1000
- // Find all day cells with hover classes across all month containers
1001
- var hoverCells = this._calendarContainer.querySelectorAll('.bg-blue-50, .text-blue-600, button[data-hover-date="true"]');
1002
- hoverCells.forEach(function (cell) {
1003
- cell.classList.remove('bg-blue-50', 'text-blue-600');
1004
- });
1005
- };
1006
- /**
1007
- * Apply hover effect to show potential range selection
1008
- *
1009
- * @param startDate - Start date of the range
1010
- * @param hoverDate - Current date being hovered
1011
- */
1012
- KTDatepickerCalendar.prototype._applyRangeHoverEffect = function (startDate, hoverDate) {
1013
- var _this = this;
1014
- if (!this._calendarContainer)
1015
- return;
1016
- // Clear any existing hover effects first
1017
- this._clearRangeHoverClasses();
1018
- // Normalize dates to midnight for comparison
1019
- var startDateMidnight = new Date(startDate);
1020
- startDateMidnight.setHours(0, 0, 0, 0);
1021
- var hoverDateMidnight = new Date(hoverDate);
1022
- hoverDateMidnight.setHours(0, 0, 0, 0);
1023
- // Ensure proper order for comparison (start date <= end date)
1024
- var rangeStart = startDateMidnight <= hoverDateMidnight
1025
- ? startDateMidnight
1026
- : hoverDateMidnight;
1027
- var rangeEnd = startDateMidnight <= hoverDateMidnight
1028
- ? hoverDateMidnight
1029
- : startDateMidnight;
1030
- // Generate all dates in the range as ISO strings (YYYY-MM-DD)
1031
- var dateRangeISOStrings = [];
1032
- var currentDate = new Date(rangeStart);
1033
- while (currentDate <= rangeEnd) {
1034
- // Format as YYYY-MM-DD
1035
- var year = currentDate.getFullYear();
1036
- var month = String(currentDate.getMonth() + 1).padStart(2, '0');
1037
- var day = String(currentDate.getDate()).padStart(2, '0');
1038
- dateRangeISOStrings.push("".concat(year, "-").concat(month, "-").concat(day));
1039
- // Move to the next day
1040
- currentDate.setDate(currentDate.getDate() + 1);
1041
- }
1042
- // Apply hover effect to all day cells in the range using the date-id attribute
1043
- dateRangeISOStrings.forEach(function (dateStr) {
1044
- // Find the day cell with matching date-id
1045
- var dayCells = _this._calendarContainer.querySelectorAll("button[data-date-id=\"".concat(dateStr, "\"]"));
1046
- dayCells.forEach(function (cell) {
1047
- // Skip if this is already a selected date (has blue background)
1048
- if (cell.classList.contains('bg-blue-600'))
1049
- return;
1050
- // Apply hover effect
1051
- cell.classList.add('bg-blue-50', 'text-blue-600');
1052
- });
1053
- });
1054
- };
1055
- return KTDatepickerCalendar;
1056
- }());
1057
- export { KTDatepickerCalendar };
1058
- //# sourceMappingURL=calendar.js.map