@rotki/ui-library 2.12.2 → 2.13.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (277) hide show
  1. package/dist/components/accordions/accordion/RuiAccordion.vue.d.ts +6 -14
  2. package/dist/components/accordions/accordion/RuiAccordion.vue.js +3 -4
  3. package/dist/components/accordions/accordion/RuiAccordion.vue.js.map +1 -1
  4. package/dist/components/accordions/accordions/RuiAccordions.vue.d.ts +10 -9
  5. package/dist/components/accordions/accordions/RuiAccordions.vue.js +27 -26
  6. package/dist/components/accordions/accordions/RuiAccordions.vue.js.map +1 -1
  7. package/dist/components/alerts/RuiAlert.vue.d.ts +5 -15
  8. package/dist/components/alerts/RuiAlert.vue2.js +8 -16
  9. package/dist/components/alerts/RuiAlert.vue2.js.map +1 -1
  10. package/dist/components/buttons/button/RuiButton.vue.d.ts +5 -7
  11. package/dist/components/buttons/button/RuiButton.vue2.js +19 -20
  12. package/dist/components/buttons/button/RuiButton.vue2.js.map +1 -1
  13. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +6 -5
  14. package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js +42 -41
  15. package/dist/components/buttons/button-group/RuiButtonGroup.vue2.js.map +1 -1
  16. package/dist/components/calendar/RuiCalendar.vue.d.ts +1 -6
  17. package/dist/components/calendar/RuiCalendar.vue.js +6 -7
  18. package/dist/components/calendar/RuiCalendar.vue.js.map +1 -1
  19. package/dist/components/calendar/RuiCalendarGrid.vue.js +1 -1
  20. package/dist/components/calendar/RuiCalendarGrid.vue2.js +19 -17
  21. package/dist/components/calendar/RuiCalendarGrid.vue2.js.map +1 -1
  22. package/dist/components/calendar/RuiCalendarHeader.vue.js +1 -1
  23. package/dist/components/calendar/RuiCalendarHeader.vue2.js +2 -3
  24. package/dist/components/calendar/RuiCalendarHeader.vue2.js.map +1 -1
  25. package/dist/components/calendar/RuiCalendarMenu.vue.js +1 -1
  26. package/dist/components/calendar/RuiCalendarMenu.vue2.js +47 -39
  27. package/dist/components/calendar/RuiCalendarMenu.vue2.js.map +1 -1
  28. package/dist/components/cards/RuiCard.vue.d.ts +9 -24
  29. package/dist/components/cards/RuiCard.vue2.js +7 -7
  30. package/dist/components/cards/RuiCard.vue2.js.map +1 -1
  31. package/dist/components/cards/RuiCardHeader.vue.d.ts +5 -10
  32. package/dist/components/cards/RuiCardHeader.vue2.js.map +1 -1
  33. package/dist/components/chips/RuiChip.vue.d.ts +7 -21
  34. package/dist/components/chips/RuiChip.vue2.js +16 -21
  35. package/dist/components/chips/RuiChip.vue2.js.map +1 -1
  36. package/dist/components/color-picker/RuiColorBoard.vue.d.ts +1 -1
  37. package/dist/components/color-picker/RuiColorBoard.vue2.js +14 -18
  38. package/dist/components/color-picker/RuiColorBoard.vue2.js.map +1 -1
  39. package/dist/components/color-picker/RuiColorDisplay.vue.js +3 -5
  40. package/dist/components/color-picker/RuiColorDisplay.vue.js.map +1 -1
  41. package/dist/components/color-picker/RuiColorHue.vue2.js +10 -13
  42. package/dist/components/color-picker/RuiColorHue.vue2.js.map +1 -1
  43. package/dist/components/color-picker/RuiColorInput.vue.js +8 -6
  44. package/dist/components/color-picker/RuiColorInput.vue.js.map +1 -1
  45. package/dist/components/color-picker/RuiColorPicker.vue.d.ts +7 -9
  46. package/dist/components/color-picker/RuiColorPicker.vue.js +18 -13
  47. package/dist/components/color-picker/RuiColorPicker.vue.js.map +1 -1
  48. package/dist/components/color-picker/utils.js +22 -5
  49. package/dist/components/color-picker/utils.js.map +1 -1
  50. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +2 -44
  51. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js +73 -77
  52. package/dist/components/date-time-picker/RuiDateTimePicker.vue2.js.map +1 -1
  53. package/dist/components/date-time-picker/dayjs-setup.d.ts +1 -0
  54. package/dist/components/date-time-picker/dayjs-setup.js +8 -0
  55. package/dist/components/date-time-picker/dayjs-setup.js.map +1 -0
  56. package/dist/components/date-time-picker/segment-config.d.ts +14 -0
  57. package/dist/components/date-time-picker/segment-config.js +23 -0
  58. package/dist/components/date-time-picker/segment-config.js.map +1 -0
  59. package/dist/components/date-time-picker/segment-utils.d.ts +5 -0
  60. package/dist/components/date-time-picker/segment-utils.js +36 -0
  61. package/dist/components/date-time-picker/segment-utils.js.map +1 -0
  62. package/dist/components/date-time-picker/use-date-time-selection.d.ts +1 -0
  63. package/dist/components/date-time-picker/use-date-time-selection.js +1 -0
  64. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  65. package/dist/components/date-time-picker/use-keyboard-handler.d.ts +4 -8
  66. package/dist/components/date-time-picker/use-keyboard-handler.js +9 -54
  67. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  68. package/dist/components/date-time-picker/utils.d.ts +1 -0
  69. package/dist/components/date-time-picker/utils.js +1 -0
  70. package/dist/components/date-time-picker/utils.js.map +1 -1
  71. package/dist/components/divider/RuiDivider.vue.d.ts +1 -3
  72. package/dist/components/divider/RuiDivider.vue.js.map +1 -1
  73. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +9 -1120
  74. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js +144 -160
  75. package/dist/components/forms/auto-complete/RuiAutoComplete.vue2.js.map +1 -1
  76. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +15 -24
  77. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js +31 -31
  78. package/dist/components/forms/checkbox/RuiCheckbox.vue2.js.map +1 -1
  79. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -1
  80. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js +18 -21
  81. package/dist/components/forms/radio-button/radio/RuiRadio.vue2.js.map +1 -1
  82. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +3 -1
  83. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js +12 -15
  84. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue2.js.map +1 -1
  85. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.d.ts +5 -11
  86. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js +6 -7
  87. package/dist/components/forms/revealable-text-field/RuiRevealableTextField.vue.js.map +1 -1
  88. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +9 -784
  89. package/dist/components/forms/select/RuiMenuSelect.vue2.js +48 -51
  90. package/dist/components/forms/select/RuiMenuSelect.vue2.js.map +1 -1
  91. package/dist/components/forms/select/RuiSimpleSelect.vue.d.ts +10 -11
  92. package/dist/components/forms/select/RuiSimpleSelect.vue2.js +15 -24
  93. package/dist/components/forms/select/RuiSimpleSelect.vue2.js.map +1 -1
  94. package/dist/components/forms/slider/RuiSlider.vue.d.ts +10 -26
  95. package/dist/components/forms/slider/RuiSlider.vue2.js +41 -46
  96. package/dist/components/forms/slider/RuiSlider.vue2.js.map +1 -1
  97. package/dist/components/forms/switch/RuiSwitch.vue.d.ts +12 -20
  98. package/dist/components/forms/switch/RuiSwitch.vue2.js +21 -20
  99. package/dist/components/forms/switch/RuiSwitch.vue2.js.map +1 -1
  100. package/dist/components/forms/text-area/RuiTextArea.vue.d.ts +5 -30
  101. package/dist/components/forms/text-area/RuiTextArea.vue2.js +43 -79
  102. package/dist/components/forms/text-area/RuiTextArea.vue2.js.map +1 -1
  103. package/dist/components/forms/text-field/RuiTextField.vue.d.ts +7 -27
  104. package/dist/components/forms/text-field/RuiTextField.vue2.js +35 -66
  105. package/dist/components/forms/text-field/RuiTextField.vue2.js.map +1 -1
  106. package/dist/components/helpers/RuiFormTextDetail.vue.d.ts +1 -5
  107. package/dist/components/helpers/RuiFormTextDetail.vue.js +5 -9
  108. package/dist/components/helpers/RuiFormTextDetail.vue.js.map +1 -1
  109. package/dist/components/icons/LazyIcon.vue.d.ts +1 -3
  110. package/dist/components/icons/RuiIcon.vue.d.ts +1 -4
  111. package/dist/components/icons/RuiIcon.vue2.js +8 -8
  112. package/dist/components/icons/RuiIcon.vue2.js.map +1 -1
  113. package/dist/components/index.d.ts +3 -3
  114. package/dist/components/loaders/RuiSkeletonBase.vue.d.ts +1 -3
  115. package/dist/components/loaders/RuiSkeletonBase.vue2.js +1 -1
  116. package/dist/components/loaders/RuiSkeletonBase.vue2.js.map +1 -1
  117. package/dist/components/loaders/RuiSkeletonLoader.vue.d.ts +1 -4
  118. package/dist/components/loaders/RuiSkeletonLoader.vue2.js +1 -1
  119. package/dist/components/loaders/RuiSkeletonLoader.vue2.js.map +1 -1
  120. package/dist/components/logos/RuiLogo.vue.d.ts +1 -7
  121. package/dist/components/logos/RuiLogo.vue.js +11 -13
  122. package/dist/components/logos/RuiLogo.vue.js.map +1 -1
  123. package/dist/components/overlays/badge/RuiBadge.vue.d.ts +5 -20
  124. package/dist/components/overlays/badge/RuiBadge.vue2.js +11 -13
  125. package/dist/components/overlays/badge/RuiBadge.vue2.js.map +1 -1
  126. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.d.ts +10 -5
  127. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js +18 -7
  128. package/dist/components/overlays/bottom-sheet/RuiBottomSheet.vue.js.map +1 -1
  129. package/dist/components/overlays/dialog/RuiDialog.vue.d.ts +21 -27
  130. package/dist/components/overlays/dialog/RuiDialog.vue2.js +80 -63
  131. package/dist/components/overlays/dialog/RuiDialog.vue2.js.map +1 -1
  132. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +24 -35
  133. package/dist/components/overlays/menu/RuiMenu.vue2.js +67 -76
  134. package/dist/components/overlays/menu/RuiMenu.vue2.js.map +1 -1
  135. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue.d.ts +22 -30
  136. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js +71 -47
  137. package/dist/components/overlays/navigation-drawer/RuiNavigationDrawer.vue2.js.map +1 -1
  138. package/dist/components/overlays/notification/RuiNotification.vue.d.ts +12 -12
  139. package/dist/components/overlays/notification/RuiNotification.vue.js +25 -22
  140. package/dist/components/overlays/notification/RuiNotification.vue.js.map +1 -1
  141. package/dist/components/overlays/tooltip/RuiTooltip.vue.d.ts +7 -18
  142. package/dist/components/overlays/tooltip/RuiTooltip.vue2.js +11 -8
  143. package/dist/components/overlays/tooltip/RuiTooltip.vue2.js.map +1 -1
  144. package/dist/components/progress/RuiProgress.vue.d.ts +8 -10
  145. package/dist/components/progress/RuiProgress.vue2.js +18 -24
  146. package/dist/components/progress/RuiProgress.vue2.js.map +1 -1
  147. package/dist/components/steppers/RuiFooterStepper.vue.d.ts +10 -11
  148. package/dist/components/steppers/RuiFooterStepper.vue2.js +21 -21
  149. package/dist/components/steppers/RuiFooterStepper.vue2.js.map +1 -1
  150. package/dist/components/steppers/RuiStepper.vue.d.ts +6 -15
  151. package/dist/components/steppers/RuiStepper.vue2.js +31 -33
  152. package/dist/components/steppers/RuiStepper.vue2.js.map +1 -1
  153. package/dist/components/steppers/RuiStepperCustomIcon.vue.d.ts +1 -3
  154. package/dist/components/steppers/RuiStepperCustomIcon.vue2.js +1 -1
  155. package/dist/components/steppers/RuiStepperCustomIcon.vue2.js.map +1 -1
  156. package/dist/components/steppers/RuiStepperIcon.vue.d.ts +1 -3
  157. package/dist/components/steppers/RuiStepperIcon.vue2.js +1 -1
  158. package/dist/components/steppers/RuiStepperIcon.vue2.js.map +1 -1
  159. package/dist/components/tables/RuiDataTable.vue.d.ts +29 -81
  160. package/dist/components/tables/RuiDataTable.vue2.js +173 -582
  161. package/dist/components/tables/RuiDataTable.vue2.js.map +1 -1
  162. package/dist/components/tables/RuiDataTable.vue3.js +24 -27
  163. package/dist/components/tables/RuiDataTable.vue3.js.map +1 -1
  164. package/dist/components/tables/RuiExpandButton.vue.d.ts +3 -6
  165. package/dist/components/tables/RuiExpandButton.vue2.js +1 -0
  166. package/dist/components/tables/RuiExpandButton.vue2.js.map +1 -1
  167. package/dist/components/tables/RuiTableHead.vue.d.ts +4 -7
  168. package/dist/components/tables/RuiTableHead.vue2.js +19 -19
  169. package/dist/components/tables/RuiTableHead.vue2.js.map +1 -1
  170. package/dist/components/tables/RuiTablePagination.vue.d.ts +10 -10
  171. package/dist/components/tables/RuiTablePagination.vue2.js +17 -16
  172. package/dist/components/tables/RuiTablePagination.vue2.js.map +1 -1
  173. package/dist/components/tabs/tab/RuiTab.vue.d.ts +3 -18
  174. package/dist/components/tabs/tab/RuiTab.vue2.js +80 -51
  175. package/dist/components/tabs/tab/RuiTab.vue2.js.map +1 -1
  176. package/dist/components/tabs/tab-item/RuiTabItem.vue.d.ts +3 -11
  177. package/dist/components/tabs/tab-item/RuiTabItem.vue2.js +1 -1
  178. package/dist/components/tabs/tab-item/RuiTabItem.vue2.js.map +1 -1
  179. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +1 -4
  180. package/dist/components/tabs/tab-items/RuiTabItems.vue2.js +18 -18
  181. package/dist/components/tabs/tab-items/RuiTabItems.vue2.js.map +1 -1
  182. package/dist/components/tabs/tabs/RuiTabs.vue.d.ts +10 -14
  183. package/dist/components/tabs/tabs/RuiTabs.vue2.js +101 -94
  184. package/dist/components/tabs/tabs/RuiTabs.vue2.js.map +1 -1
  185. package/dist/components/time-picker/RuiTimePicker.vue.d.ts +1 -4
  186. package/dist/components/time-picker/RuiTimePicker.vue2.js +68 -35
  187. package/dist/components/time-picker/RuiTimePicker.vue2.js.map +1 -1
  188. package/dist/composables/breakpoint.js +8 -13
  189. package/dist/composables/breakpoint.js.map +1 -1
  190. package/dist/composables/dropdown-menu.d.ts +7 -4
  191. package/dist/composables/dropdown-menu.js +73 -50
  192. package/dist/composables/dropdown-menu.js.map +1 -1
  193. package/dist/composables/forms/auto-complete/focus.d.ts +7 -5
  194. package/dist/composables/forms/auto-complete/focus.js +28 -17
  195. package/dist/composables/forms/auto-complete/focus.js.map +1 -1
  196. package/dist/composables/forms/auto-complete/index.d.ts +0 -9
  197. package/dist/composables/forms/auto-complete/keyboard-navigation.d.ts +8 -3
  198. package/dist/composables/forms/auto-complete/keyboard-navigation.js +11 -5
  199. package/dist/composables/forms/auto-complete/keyboard-navigation.js.map +1 -1
  200. package/dist/composables/forms/auto-complete/search.d.ts +7 -0
  201. package/dist/composables/forms/auto-complete/search.js +10 -8
  202. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  203. package/dist/composables/forms/auto-complete/value.d.ts +4 -0
  204. package/dist/composables/forms/auto-complete/value.js +24 -42
  205. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  206. package/dist/composables/forms/use-label-with-quote.d.ts +2 -0
  207. package/dist/composables/forms/use-label-with-quote.js +14 -0
  208. package/dist/composables/forms/use-label-with-quote.js.map +1 -0
  209. package/dist/composables/forms/use-prepend-append-width.d.ts +6 -0
  210. package/dist/composables/forms/use-prepend-append-width.js +25 -0
  211. package/dist/composables/forms/use-prepend-append-width.js.map +1 -0
  212. package/dist/composables/popper.js +60 -46
  213. package/dist/composables/popper.js.map +1 -1
  214. package/dist/composables/sticky-header.d.ts +7 -5
  215. package/dist/composables/sticky-header.js +51 -41
  216. package/dist/composables/sticky-header.js.map +1 -1
  217. package/dist/composables/tables/data-table/columns.d.ts +25 -0
  218. package/dist/composables/tables/data-table/columns.js +54 -0
  219. package/dist/composables/tables/data-table/columns.js.map +1 -0
  220. package/dist/composables/tables/data-table/expansion.d.ts +17 -0
  221. package/dist/composables/tables/data-table/expansion.js +38 -0
  222. package/dist/composables/tables/data-table/expansion.js.map +1 -0
  223. package/dist/composables/tables/data-table/grouping.d.ts +29 -0
  224. package/dist/composables/tables/data-table/grouping.js +136 -0
  225. package/dist/composables/tables/data-table/grouping.js.map +1 -0
  226. package/dist/composables/tables/data-table/pagination.d.ts +33 -0
  227. package/dist/composables/tables/data-table/pagination.js +119 -0
  228. package/dist/composables/tables/data-table/pagination.js.map +1 -0
  229. package/dist/composables/tables/data-table/selection.d.ts +29 -0
  230. package/dist/composables/tables/data-table/selection.js +164 -0
  231. package/dist/composables/tables/data-table/selection.js.map +1 -0
  232. package/dist/composables/tables/data-table/sort.d.ts +32 -0
  233. package/dist/composables/tables/data-table/sort.js +136 -0
  234. package/dist/composables/tables/data-table/sort.js.map +1 -0
  235. package/dist/composables/tables/data-table/types.d.ts +14 -0
  236. package/dist/composables/tables/data-table/types.js +11 -0
  237. package/dist/composables/tables/data-table/types.js.map +1 -0
  238. package/dist/composables/theme.js +1 -20
  239. package/dist/composables/theme.js.map +1 -1
  240. package/dist/composables/timeout-manager.d.ts +4 -2
  241. package/dist/composables/timeout-manager.js +2 -1
  242. package/dist/composables/timeout-manager.js.map +1 -1
  243. package/dist/icons/icons_1.js +28 -28
  244. package/dist/icons/icons_1.js.map +1 -1
  245. package/dist/icons/icons_2.d.ts +8 -8
  246. package/dist/icons/icons_2.js +52 -52
  247. package/dist/icons/icons_2.js.map +1 -1
  248. package/dist/icons/icons_3.d.ts +18 -18
  249. package/dist/icons/icons_3.js +108 -108
  250. package/dist/icons/icons_3.js.map +1 -1
  251. package/dist/icons/icons_4.d.ts +35 -0
  252. package/dist/icons/icons_4.js +176 -1
  253. package/dist/icons/icons_4.js.map +1 -1
  254. package/dist/icons/index.d.ts +1 -1
  255. package/dist/icons/index.js +1 -1
  256. package/dist/icons/index.js.map +1 -1
  257. package/dist/index.js +43 -15
  258. package/dist/index.js.map +1 -1
  259. package/dist/style.css +189 -162
  260. package/dist/theme/index.js +15 -1
  261. package/dist/theme/index.js.map +1 -1
  262. package/dist/utils/assert.d.ts +1 -1
  263. package/dist/utils/assert.js.map +1 -1
  264. package/dist/utils/form-text-detail.d.ts +9 -8
  265. package/dist/utils/form-text-detail.js +1 -2
  266. package/dist/utils/form-text-detail.js.map +1 -1
  267. package/dist/utils/helpers.d.ts +4 -32
  268. package/dist/utils/helpers.js +8 -9
  269. package/dist/utils/helpers.js.map +1 -1
  270. package/dist/utils/is-equal.d.ts +1 -1
  271. package/dist/utils/is-equal.js +5 -3
  272. package/dist/utils/is-equal.js.map +1 -1
  273. package/dist/web-types.json +359 -359
  274. package/package.json +44 -35
  275. package/dist/utils/generate-id.d.ts +0 -5
  276. package/dist/utils/generate-id.js +0 -21
  277. package/dist/utils/generate-id.js.map +0 -1
@@ -1,5 +1,4 @@
1
- import { defineComponent, useCssVars, unref, useModel, ref, computed, openBlock, createBlock, mergeProps, isRef, withCtx, createVNode, renderSlot, createElementVNode, createElementBlock, normalizeClass, createTextVNode, toDisplayString, createCommentVNode, withModifiers, mergeModels, nextTick } from "vue";
2
- import { logicOr, logicAnd } from "@vueuse/math";
1
+ import { defineComponent, useCssVars, unref, useModel, ref, useTemplateRef, computed, openBlock, createBlock, mergeProps, isRef, withCtx, createVNode, renderSlot, createElementVNode, createElementBlock, normalizeClass, createTextVNode, toDisplayString, createCommentVNode, withModifiers, mergeModels, nextTick } from "vue";
3
2
  import RuiButton from "../buttons/button/RuiButton.vue.js";
4
3
  import _sfc_main$1 from "./RuiDateTimePickerMenu.vue.js";
5
4
  import { useDateTimeSelection } from "./use-date-time-selection.js";
@@ -7,6 +6,7 @@ import { useInputHandler } from "./use-input-handler.js";
7
6
  import { useKeyboardHandler } from "./use-keyboard-handler.js";
8
7
  import RuiIcon from "../icons/RuiIcon.vue.js";
9
8
  import RuiMenu from "../overlays/menu/RuiMenu.vue.js";
9
+ import { useLabelWithQuote } from "../../composables/forms/use-label-with-quote.js";
10
10
  import { getRootAttrs, getNonRootAttrs } from "../../utils/helpers.js";
11
11
  import { useFocusWithin, useFocus, isDefined } from "@vueuse/core";
12
12
  import { get, set } from "@vueuse/shared";
@@ -24,8 +24,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
24
24
  },
25
25
  __name: "RuiDateTimePicker",
26
26
  props: /* @__PURE__ */ mergeModels({
27
- minDate: { default: void 0 },
28
- maxDate: { default: void 0 },
27
+ minDate: {},
28
+ maxDate: {},
29
29
  format: { default: "day-first" },
30
30
  type: { default: "epoch-ms" },
31
31
  accuracy: { default: "minute" },
@@ -35,7 +35,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
35
35
  dense: { type: Boolean, default: false },
36
36
  label: { default: "Pick a date" },
37
37
  variant: { default: "default" },
38
- hint: { default: void 0 },
38
+ hint: {},
39
39
  errorMessages: { default: () => [] },
40
40
  successMessages: { default: () => [] },
41
41
  hideDetails: { type: Boolean, default: false },
@@ -47,10 +47,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
47
47
  emits: ["update:modelValue"],
48
48
  setup(__props) {
49
49
  useCssVars((_ctx) => ({
50
- "v5fc8ba2e": unref(labelWithQuote)
50
+ "v335a9d31": unref(labelWithQuote)
51
51
  }));
52
52
  const modelValue = useModel(__props, "modelValue");
53
- const props = __props;
54
53
  const baseFormats = {
55
54
  "day-first": "DD/MM/YYYY HH:mm",
56
55
  "month-first": "MM/DD/YYYY HH:mm",
@@ -59,13 +58,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
59
58
  const isOpen = ref(false);
60
59
  const cursorPosition = ref(0);
61
60
  const currentValue = ref();
62
- const textInput = ref();
63
- const activator = ref();
64
- const menuWrapperRef = ref();
61
+ const textInput = useTemplateRef("textInput");
62
+ const activator = useTemplateRef("activator");
63
+ const menuWrapperRef = useTemplateRef("menuWrapperRef");
65
64
  const calendarMenuOpen = ref(false);
66
65
  const { focused: activatorFocusedWithin } = useFocusWithin(activator);
67
66
  const { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);
68
67
  const { focused: searchInputFocused } = useFocus(textInput);
68
+ const anyFocused = computed(() => get(activatorFocusedWithin) || get(menuWrapperFocusedWithin));
69
69
  const {
70
70
  clear: clearSelection,
71
71
  getDateTime,
@@ -86,23 +86,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
86
86
  setNow,
87
87
  valueSet
88
88
  } = useDateTimeSelection({
89
- accuracy: props.accuracy,
90
- allowEmpty: props.allowEmpty,
91
- maxDate: props.maxDate,
92
- minDate: props.minDate,
89
+ accuracy: __props.accuracy,
90
+ allowEmpty: __props.allowEmpty,
91
+ maxDate: __props.maxDate,
92
+ minDate: __props.minDate,
93
93
  modelValue,
94
- type: props.type
94
+ type: __props.type
95
95
  });
96
96
  const { setValue, getCurrent } = useInputHandler(segmentData, currentValue);
97
97
  const dateFormat = computed(() => {
98
- const dateFormat2 = props.format;
99
- const format = baseFormats[dateFormat2];
100
- if (props.accuracy === "second") {
101
- return format.replace("HH:mm", "HH:mm:ss");
102
- } else if (props.accuracy === "millisecond") {
103
- return format.replace("HH:mm", "HH:mm:ss.SSS");
98
+ const fmt = baseFormats[__props.format];
99
+ if (__props.accuracy === "second") {
100
+ return fmt.replace("HH:mm", "HH:mm:ss");
101
+ } else if (__props.accuracy === "millisecond") {
102
+ return fmt.replace("HH:mm", "HH:mm:ss.SSS");
104
103
  }
105
- return format;
104
+ return fmt;
106
105
  });
107
106
  const {
108
107
  getCurrentSegment,
@@ -116,31 +115,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
116
115
  handlePaste,
117
116
  setSegment
118
117
  } = useKeyboardHandler({
119
- accuracy: props.accuracy,
118
+ accuracy: __props.accuracy,
120
119
  currentValue,
121
120
  cursorPosition,
122
121
  dateFormat,
123
- disabled: props.disabled,
122
+ disabled: __props.disabled,
124
123
  getCurrent,
125
124
  getDateTime,
126
- readonly: props.readonly,
125
+ readonly: __props.readonly,
127
126
  setValue,
128
127
  textInput
129
128
  });
130
- function handleInputClick(event) {
131
- handleClick(event);
132
- if (!get(isOpen)) {
133
- set(isOpen, true);
134
- }
135
- }
136
- const anyFocused = logicOr(activatorFocusedWithin, menuWrapperFocusedWithin);
137
- const labelWithQuote = computed(() => {
138
- if (!props.label)
139
- return '"\\200B"';
140
- const asterisk = props.required ? "﹡" : "";
141
- return `' ${props.label}${asterisk} '`;
142
- });
143
- const isOutlined = computed(() => props.variant === "outlined");
129
+ const labelWithQuote = useLabelWithQuote(
130
+ () => __props.label,
131
+ () => __props.required
132
+ );
133
+ const isOutlined = computed(() => __props.variant === "outlined");
144
134
  const formattedDisplay = computed(() => {
145
135
  let result = get(dateFormat);
146
136
  const replacements = [
@@ -183,13 +173,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
183
173
  setSegment(segmentType);
184
174
  }
185
175
  });
186
- const float = logicAnd(logicOr(isOpen, valueSet, searchInputFocused), isOutlined);
176
+ const float = computed(() => (get(isOpen) || get(valueSet) || get(searchInputFocused)) && get(isOutlined));
187
177
  const combinedErrorMessages = computed(() => {
188
178
  let propErrors;
189
- if (props.errorMessages) {
190
- propErrors = Array.isArray(props.errorMessages) ? props.errorMessages : [props.errorMessages];
179
+ if (__props.errorMessages) {
180
+ propErrors = Array.isArray(__props.errorMessages) ? __props.errorMessages : [__props.errorMessages];
191
181
  } else {
192
- propErrors = Array.isArray(props.errorMessages) ? props.errorMessages : [];
182
+ propErrors = Array.isArray(__props.errorMessages) ? __props.errorMessages : [];
193
183
  }
194
184
  return [...propErrors, ...get(internalErrorMessages)];
195
185
  });
@@ -208,6 +198,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
208
198
  return;
209
199
  }
210
200
  }
201
+ function handleInputClick(event) {
202
+ handleClick(event);
203
+ if (!get(isOpen)) {
204
+ set(isOpen, true);
205
+ }
206
+ }
211
207
  function arrowClicked(event) {
212
208
  if (get(isOpen)) {
213
209
  set(isOpen, false);
@@ -236,36 +232,32 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
236
232
  ...unref(getRootAttrs)(_ctx.$attrs)
237
233
  }), {
238
234
  activator: withCtx(({ attrs, open, hasError, hasSuccess }) => [
239
- createElementVNode("div", mergeProps(
240
- {
241
- ref_key: "activator",
242
- ref: activator,
243
- class: ["group", [
244
- _ctx.$style.activator,
245
- {
246
- [_ctx.$style.disabled]: __props.disabled,
247
- [_ctx.$style.readonly]: __props.readonly,
248
- [_ctx.$style.outlined]: unref(isOutlined),
249
- [_ctx.$style.dense]: __props.dense,
250
- [_ctx.$style.float]: unref(float),
251
- [_ctx.$style.opened]: open,
252
- [_ctx.$style["with-value"]]: unref(valueSet),
253
- [_ctx.$style["with-error"]]: hasError,
254
- [_ctx.$style["with-success"]]: hasSuccess && !hasError
255
- }
256
- ]]
257
- },
258
- {
259
- ...unref(getNonRootAttrs)(_ctx.$attrs, ["onClick", "class"]),
260
- ...props.readonly ? {} : attrs
261
- },
262
- {
263
- "data-id": "activator",
264
- "data-error": hasError ? "" : void 0,
265
- tabindex: __props.disabled || props.readonly ? -1 : 0,
266
- onClick: _cache[10] || (_cache[10] = ($event) => setInputFocus())
267
- }
268
- ), [
235
+ createElementVNode("div", mergeProps({
236
+ ref_key: "activator",
237
+ ref: activator,
238
+ class: ["group", [
239
+ _ctx.$style.activator,
240
+ {
241
+ [_ctx.$style.disabled]: __props.disabled,
242
+ [_ctx.$style.readonly]: __props.readonly,
243
+ [_ctx.$style.outlined]: unref(isOutlined),
244
+ [_ctx.$style.dense]: __props.dense,
245
+ [_ctx.$style.float]: unref(float),
246
+ [_ctx.$style.opened]: open,
247
+ [_ctx.$style["with-value"]]: unref(valueSet),
248
+ [_ctx.$style["with-error"]]: hasError,
249
+ [_ctx.$style["with-success"]]: hasSuccess && !hasError
250
+ }
251
+ ]]
252
+ }, {
253
+ ...unref(getNonRootAttrs)(_ctx.$attrs, ["onClick", "class"]),
254
+ ...__props.readonly ? {} : attrs
255
+ }, {
256
+ "data-id": "activator",
257
+ "data-error": hasError ? "" : void 0,
258
+ tabindex: __props.disabled || __props.readonly ? -1 : 0,
259
+ onClick: _cache[10] || (_cache[10] = ($event) => setInputFocus())
260
+ }), [
269
261
  unref(isOutlined) && (unref(searchInputFocused) || open || unref(valueSet)) ? (openBlock(), createElementBlock("span", {
270
262
  key: 0,
271
263
  "data-id": "label",
@@ -278,7 +270,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
278
270
  ])
279
271
  }, [
280
272
  createTextVNode(toDisplayString(__props.label) + " ", 1),
281
- props.required ? (openBlock(), createElementBlock("span", _hoisted_2, " ﹡ ")) : createCommentVNode("", true)
273
+ __props.required ? (openBlock(), createElementBlock("span", _hoisted_2, " ﹡ ")) : createCommentVNode("", true)
282
274
  ], 2)) : createCommentVNode("", true),
283
275
  createElementVNode("span", {
284
276
  class: normalizeClass([_ctx.$style.icon__wrapper, _ctx.$style.icon__prepend])
@@ -320,9 +312,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
320
312
  size: "sm",
321
313
  tabindex: "-1",
322
314
  color: "error",
323
- class: normalizeClass(["group-hover:!visible", [_ctx.$style.clear, unref(anyFocused) && "!visible", {
324
- "mr-2": !__props.dense
325
- }]]),
315
+ class: normalizeClass(["group-hover:!visible", [
316
+ _ctx.$style.clear,
317
+ unref(anyFocused) && "!visible",
318
+ {
319
+ "mr-2": !__props.dense
320
+ }
321
+ ]]),
326
322
  onClick: _cache[8] || (_cache[8] = withModifiers(($event) => clear(), ["stop", "prevent"]))
327
323
  }, {
328
324
  default: withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"RuiDateTimePicker.vue2.js","sources":["../../../src/components/date-time-picker/RuiDateTimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DateTimeSegmentType } from '@/components/date-time-picker/types';\nimport type { TimePickerSelection } from '@/components/time-picker/RuiTimePicker.vue';\nimport { logicAnd, logicOr } from '@vueuse/math';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiDateTimePickerMenu from '@/components/date-time-picker/RuiDateTimePickerMenu.vue';\nimport { useDateTimeSelection } from '@/components/date-time-picker/use-date-time-selection';\nimport { useInputHandler } from '@/components/date-time-picker/use-input-handler';\nimport { useKeyboardHandler } from '@/components/date-time-picker/use-keyboard-handler';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\ntype DateFormat = 'year-first' | 'month-first' | 'day-first';\n\ntype DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';\n\ntype ModelValueType<T extends DateTimeModelType> =\n T extends 'date' ? Date | undefined :\n T extends 'epoch-ms' ? number | undefined :\n T extends 'epoch' ? number | undefined :\n Date | number | undefined;\n\nexport interface RuiDateTimePickerProps {\n minDate?: Date | number;\n maxDate?: Date | number | 'now';\n format?: DateFormat;\n type?: DateTimeModelType;\n accuracy?: 'minute' | 'second' | 'millisecond';\n disabled?: boolean;\n allowEmpty?: boolean;\n readonly?: boolean;\n dense?: boolean;\n label?: string;\n variant?: 'default' | 'filled' | 'outlined';\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiDateTimePicker',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<ModelValueType<typeof props.type>>({ required: true });\n\nconst props = withDefaults(defineProps<RuiDateTimePickerProps>(), {\n disabled: false,\n readonly: false,\n allowEmpty: false,\n dense: false,\n type: 'epoch-ms',\n hideDetails: false,\n label: 'Pick a date',\n variant: 'default',\n hint: undefined,\n maxDate: undefined,\n minDate: undefined,\n format: 'day-first',\n accuracy: 'minute',\n errorMessages: () => [],\n successMessages: () => [],\n required: false,\n});\n\ndefineSlots<{\n 'menu-content': () => any;\n}>();\n\nconst baseFormats: Record<DateFormat, string> = {\n 'day-first': 'DD/MM/YYYY HH:mm',\n 'month-first': 'MM/DD/YYYY HH:mm',\n 'year-first': 'YYYY/MM/DD HH:mm',\n};\n\nconst isOpen = ref<boolean>(false);\nconst cursorPosition = ref<number>(0);\nconst currentValue = ref<number>();\n\nconst textInput = ref<HTMLInputElement>();\nconst activator = ref();\nconst menuWrapperRef = ref();\nconst calendarMenuOpen = ref<boolean>(false);\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\n\nconst {\n clear: clearSelection,\n getDateTime,\n internalErrorMessages,\n maxAllowedDate,\n minAllowedDate,\n segmentData,\n selectedDate,\n selectedDay,\n selectedHour,\n selectedMillisecond,\n selectedMinute,\n selectedMonth,\n selectedSecond,\n selectedTime,\n selectedTimezone,\n selectedYear,\n setNow,\n valueSet,\n} = useDateTimeSelection({\n accuracy: props.accuracy,\n allowEmpty: props.allowEmpty,\n maxDate: props.maxDate,\n minDate: props.minDate,\n modelValue,\n type: props.type,\n});\n\nconst { setValue, getCurrent } = useInputHandler(segmentData, currentValue);\n\nconst dateFormat = computed<string>(() => {\n const dateFormat = props.format;\n const format = baseFormats[dateFormat];\n if (props.accuracy === 'second') {\n return format.replace('HH:mm', 'HH:mm:ss');\n }\n else if (props.accuracy === 'millisecond') {\n return format.replace('HH:mm', 'HH:mm:ss.SSS');\n }\n return format;\n});\n\nconst {\n clear: clearSegment,\n getCurrentSegment,\n handleBlur,\n handleClick,\n handleFocus,\n handleInput,\n handleInputSelection,\n handleKeyDown,\n handleMouseDown,\n handlePaste,\n setSegment,\n} = useKeyboardHandler({\n accuracy: props.accuracy,\n currentValue,\n cursorPosition,\n dateFormat,\n disabled: props.disabled,\n getCurrent,\n getDateTime,\n readonly: props.readonly,\n setValue,\n textInput,\n});\n\nfunction handleInputClick(event: MouseEvent): void {\n // Handle segment selection first, before any DOM changes from menu opening\n handleClick(event);\n // Open menu if not already open\n if (!get(isOpen)) {\n set(isOpen, true);\n }\n}\n\nconst anyFocused = logicOr(activatorFocusedWithin, menuWrapperFocusedWithin);\n\nconst labelWithQuote = computed<string>(() => {\n if (!props.label)\n return '\"\\\\200B\"';\n\n const asterisk = props.required ? '﹡' : '';\n return `' ${props.label}${asterisk} '`;\n});\n\nconst isOutlined = computed<boolean>(() => props.variant === 'outlined');\n\nconst formattedDisplay = computed<string>(() => {\n let result = get(dateFormat);\n\n const replacements = [\n { pattern: 'YYYY', value: getDisplayValue(selectedYear, 4) },\n { pattern: 'MM', value: getDisplayValue(selectedMonth, 2) },\n { pattern: 'DD', value: getDisplayValue(selectedDay, 2) },\n { pattern: 'HH', value: getDisplayValue(selectedHour, 2) },\n { pattern: 'mm', value: getDisplayValue(selectedMinute, 2) },\n { pattern: 'ss', value: getDisplayValue(selectedSecond, 2) },\n { pattern: 'SSS', value: getDisplayValue(selectedMillisecond, 3) },\n ];\n\n for (const { pattern, value } of replacements) {\n if (value !== undefined) {\n result = result.replace(pattern, value);\n }\n }\n\n return result;\n});\n\nconst timeSelection = computed<TimePickerSelection>({\n get() {\n const type = getCurrentSegment()?.type;\n\n if (type === 'mm') {\n return 'minute';\n }\n else if (type === 'ss') {\n return 'second';\n }\n else if (type === 'SSS') {\n return 'millisecond';\n }\n return 'hour';\n },\n set(value: TimePickerSelection) {\n let segmentType: DateTimeSegmentType = 'HH';\n if (value === 'minute') {\n segmentType = 'mm';\n }\n else if (value === 'second') {\n segmentType = 'ss';\n }\n else if (value === 'millisecond') {\n segmentType = 'SSS';\n }\n\n setSegment(segmentType);\n },\n});\n\nconst float = logicAnd(logicOr(isOpen, valueSet, searchInputFocused), isOutlined);\n\nconst combinedErrorMessages = computed<string[]>(() => {\n let propErrors: string[];\n if (props.errorMessages) {\n propErrors = Array.isArray(props.errorMessages)\n ? props.errorMessages\n : [props.errorMessages];\n }\n else {\n propErrors = Array.isArray(props.errorMessages)\n ? props.errorMessages\n : [];\n }\n return [...propErrors, ...get(internalErrorMessages)];\n});\n\nfunction getDisplayValue(digit: Ref<number | undefined>, padding: number): string | undefined {\n return isDefined(digit)\n ? get(digit).toString().padStart(padding, '0')\n : undefined;\n}\n\nasync function setInputFocus(): Promise<void> {\n await nextTick(() => {\n set(searchInputFocused, true);\n });\n}\n\nfunction clear(segmentType?: string): void {\n if (!segmentType) {\n clearSelection();\n set(currentValue, undefined);\n return;\n }\n\n clearSegment(segmentType);\n}\n\nfunction arrowClicked(event: any): void {\n if (get(isOpen)) {\n set(isOpen, false);\n event.stopPropagation();\n }\n}\n</script>\n\n<template>\n <RuiMenu\n v-model=\"isOpen\"\n :class=\"$style.wrapper\"\n :dense=\"dense\"\n :hint=\"hint\"\n :disabled=\"disabled\"\n :success-messages=\"successMessages\"\n :error-messages=\"combinedErrorMessages\"\n :close-on-content-click=\"false\"\n :show-details=\"!hideDetails\"\n :persistent=\"calendarMenuOpen\"\n :popper=\"{\n placement: 'bottom-start',\n }\"\n full-width\n disable-auto-focus\n v-bind=\"{\n ...getRootAttrs($attrs),\n }\"\n >\n <template #activator=\"{ attrs, open, hasError, hasSuccess }\">\n <div\n ref=\"activator\"\n class=\"group\"\n :class=\"[\n $style.activator,\n {\n [$style.disabled]: disabled,\n [$style.readonly]: readonly,\n [$style.outlined]: isOutlined,\n [$style.dense]: dense,\n [$style.float]: float,\n [$style.opened]: open,\n [$style['with-value']]: valueSet,\n [$style['with-error']]: hasError,\n [$style['with-success']]: hasSuccess && !hasError,\n },\n ]\"\n v-bind=\"{\n ...getNonRootAttrs($attrs, ['onClick', 'class']),\n ...(props.readonly ? {} : attrs) }\n \"\n data-id=\"activator\"\n :data-error=\"hasError ? '' : undefined\"\n :tabindex=\"disabled || props.readonly ? -1 : 0\"\n @click=\"setInputFocus()\"\n >\n <span\n v-if=\"isOutlined && (searchInputFocused || open || valueSet)\"\n data-id=\"label\"\n :class=\"[\n $style.label,\n {\n 'absolute': isOutlined,\n 'pr-2': !valueSet && !open && isOutlined,\n },\n ]\"\n >\n {{ label }}\n <span\n v-if=\"props.required\"\n data-id=\"required-indicator\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </span>\n\n <span :class=\"[$style.icon__wrapper, $style.icon__prepend]\">\n <RuiIcon\n :class=\"[$style.icon]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-calendar-days\"\n />\n </span>\n\n <div :class=\"$style.value\">\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :value=\"formattedDisplay\"\n class=\"bg-transparent outline-none flex-1 min-w-0\"\n type=\"text\"\n :placeholder=\"dateFormat\"\n :readonly=\"readonly\"\n :aria-invalid=\"hasError\"\n @mousedown=\"handleMouseDown($event)\"\n @focus=\"handleFocus()\"\n @blur=\"handleBlur()\"\n @select=\"handleInputSelection($event)\"\n @click.stop=\"handleInputClick($event)\"\n @keydown=\"handleKeyDown($event)\"\n @paste=\"handlePaste($event)\"\n @input=\"handleInput($event)\"\n />\n </div>\n\n <RuiButton\n v-if=\"allowEmpty && valueSet && !disabled\"\n variant=\"text\"\n icon\n data-id=\"clear-button\"\n size=\"sm\"\n tabindex=\"-1\"\n color=\"error\"\n class=\"group-hover:!visible\"\n :class=\"[$style.clear, anyFocused && '!visible', {\n 'mr-2': !dense,\n }]\"\n @click.stop.prevent=\"clear()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"18\"\n />\n </RuiButton>\n\n <span\n :class=\"[$style.icon__wrapper, $style.icon__append]\"\n data-id=\"append\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"[$style.icon, { 'rotate-180': open }]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-chevron-down\"\n />\n </span>\n </div>\n <fieldset\n v-if=\"isOutlined\"\n :class=\"$style.fieldset\"\n >\n <legend :class=\"{ 'px-2': float }\" />\n </fieldset>\n </template>\n <template #default>\n <RuiDateTimePickerMenu\n ref=\"menuWrapperRef\"\n v-model:selected-date=\"selectedDate\"\n v-model:selected-time=\"selectedTime\"\n v-model:selected-hour=\"selectedHour\"\n v-model:selected-minute=\"selectedMinute\"\n v-model:selected-second=\"selectedSecond\"\n v-model:selected-millisecond=\"selectedMillisecond\"\n v-model:time-selection=\"timeSelection\"\n v-model:selected-timezone=\"selectedTimezone\"\n v-model:calendar-menu-open=\"calendarMenuOpen\"\n :accuracy=\"accuracy\"\n :max-date=\"maxAllowedDate\"\n :min-date=\"minAllowedDate\"\n @set-now=\"setNow()\"\n >\n <slot name=\"menu-content\" />\n </RuiDateTimePickerMenu>\n </template>\n </RuiMenu>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n @apply w-full inline-flex flex-col;\n\n .activator {\n @apply relative inline-flex items-center w-full;\n @apply outline-none focus-within:outline-none cursor-pointer min-h-14 pl-3 py-2 pr-8 rounded;\n @apply m-0 bg-white transition-all text-body-1 text-left hover:border-black;\n\n &:not(.outlined) {\n @apply hover:bg-gray-100 focus-within:bg-gray-100;\n }\n\n &.dense {\n @apply py-1.5 min-h-10;\n\n ~ .fieldset {\n @apply px-2;\n }\n }\n\n &.disabled {\n @apply opacity-65 text-rui-text-disabled active:text-rui-text-disabled cursor-default pointer-events-none;\n }\n\n &.readonly {\n @apply opacity-80 pointer-events-none cursor-default bg-gray-50;\n }\n\n &.outlined {\n @apply border-none hover:border-none;\n\n &.opened,\n &:focus,\n &:focus-within {\n @apply border-rui-primary;\n\n ~ .fieldset {\n @apply border-rui-primary #{!important};\n @apply border-2 #{!important};\n }\n }\n\n ~ .fieldset {\n @apply border border-black/[0.23];\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-black;\n }\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-dotted;\n @apply border border-black/[0.23] #{!important};\n }\n }\n\n &.with-success {\n .label {\n @apply text-rui-success #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-success #{!important};\n }\n }\n\n &.with-error {\n .label {\n @apply text-rui-error #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-error #{!important};\n }\n }\n }\n\n .label {\n @apply text-rui-text-secondary;\n max-width: calc(100% - 2.5rem);\n }\n\n .label,\n .value {\n @apply block truncate transition-all duration-75;\n }\n\n .value {\n @apply flex gap-1 flex-wrap flex-1 ps-8;\n }\n\n .clear {\n @apply ml-auto shrink-0 invisible;\n }\n\n .icon {\n @apply text-rui-text-secondary transition;\n\n &__wrapper {\n @apply flex items-center justify-end;\n @apply absolute top-px bottom-0;\n }\n\n &__append {\n @apply right-3;\n }\n\n &__prepend {\n @apply left-3;\n }\n }\n\n &.float {\n .label {\n @apply -translate-y-2 top-0 text-xs px-1;\n }\n\n ~ .fieldset {\n legend {\n &:after {\n content: v-bind(labelWithQuote);\n }\n }\n }\n\n &.opened,\n &.opened.with-value,\n &:focus,\n &:focus.with-value,\n &:focus-within,\n &:focus-within.with-value {\n .label {\n @apply text-rui-primary;\n }\n\n ~ .fieldset {\n @apply border-rui-primary;\n @apply border-2 #{!important};\n }\n }\n }\n }\n\n .fieldset {\n @apply absolute w-full min-w-0 h-[calc(100%+0.5rem)] top-0 left-0 rounded pointer-events-none px-2 transition-all -mt-2;\n\n legend {\n @apply opacity-0 text-xs truncate;\n max-width: calc(100% - 1rem);\n\n &:before {\n content: ' ';\n }\n\n &:after {\n @apply truncate max-w-full leading-[0];\n content: '\\200B';\n }\n }\n }\n}\n\n.menu {\n @apply overflow-y-auto max-h-60 min-w-[2.5rem];\n}\n\n.highlighted {\n @apply bg-rui-grey-200 #{!important};\n\n &.active {\n @apply bg-rui-grey-300 #{!important};\n }\n}\n\n:global(.dark) {\n .wrapper {\n .activator {\n @apply bg-transparent text-rui-text;\n\n &:not(.outlined) {\n @apply hover:bg-white/10 focus-within:bg-white/10;\n\n &.disabled {\n @apply bg-white/10;\n }\n }\n\n &.readonly {\n @apply bg-white/10;\n }\n\n &.outlined {\n ~ .fieldset {\n @apply border-white/[0.23];\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-white/[0.23] #{!important};\n }\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-white;\n }\n }\n }\n }\n }\n\n .highlighted {\n @apply bg-rui-grey-800 #{!important};\n\n &.active {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n}\n</style>\n"],"names":["_useModel","dateFormat","_openBlock","_createBlock","_mergeProps","_unref","$style","$attrs","_withCtx","_createElementVNode","_createElementBlock","_normalizeClass","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","RuiDateTimePickerMenu","_renderSlot"],"mappings":"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"}
1
+ {"version":3,"file":"RuiDateTimePicker.vue2.js","sources":["../../../src/components/date-time-picker/RuiDateTimePicker.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DateTimeSegmentType } from '@/components/date-time-picker/types';\nimport type { TimePickerSelection } from '@/components/time-picker/RuiTimePicker.vue';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiDateTimePickerMenu from '@/components/date-time-picker/RuiDateTimePickerMenu.vue';\nimport { useDateTimeSelection } from '@/components/date-time-picker/use-date-time-selection';\nimport { useInputHandler } from '@/components/date-time-picker/use-input-handler';\nimport { useKeyboardHandler } from '@/components/date-time-picker/use-keyboard-handler';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiMenu from '@/components/overlays/menu/RuiMenu.vue';\nimport { useLabelWithQuote } from '@/composables/forms/use-label-with-quote';\nimport { getNonRootAttrs, getRootAttrs } from '@/utils/helpers';\n\ntype DateFormat = 'year-first' | 'month-first' | 'day-first';\n\ntype DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';\n\ntype ModelValueType<T extends DateTimeModelType> = T extends 'date'\n ? Date | undefined\n : T extends 'epoch-ms'\n ? number | undefined\n : T extends 'epoch'\n ? number | undefined\n : Date | number | undefined;\n\nexport interface RuiDateTimePickerProps {\n minDate?: Date | number;\n maxDate?: Date | number | 'now';\n format?: DateFormat;\n type?: DateTimeModelType;\n accuracy?: 'minute' | 'second' | 'millisecond';\n disabled?: boolean;\n allowEmpty?: boolean;\n readonly?: boolean;\n dense?: boolean;\n label?: string;\n variant?: 'default' | 'filled' | 'outlined';\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n required?: boolean;\n}\n\ndefineOptions({\n name: 'RuiDateTimePicker',\n inheritAttrs: false,\n});\n\nconst modelValue = defineModel<ModelValueType<DateTimeModelType>>({ required: true });\n\nconst {\n disabled = false,\n readonly = false,\n allowEmpty = false,\n dense = false,\n type = 'epoch-ms',\n hideDetails = false,\n label = 'Pick a date',\n variant = 'default',\n hint,\n maxDate,\n minDate,\n format = 'day-first',\n accuracy = 'minute',\n errorMessages = [],\n successMessages = [],\n required = false,\n} = defineProps<RuiDateTimePickerProps>();\n\ndefineSlots<{\n 'menu-content': () => any;\n}>();\n\nconst baseFormats: Record<DateFormat, string> = {\n 'day-first': 'DD/MM/YYYY HH:mm',\n 'month-first': 'MM/DD/YYYY HH:mm',\n 'year-first': 'YYYY/MM/DD HH:mm',\n};\n\nconst isOpen = ref<boolean>(false);\nconst cursorPosition = ref<number>(0);\nconst currentValue = ref<number>();\n\nconst textInput = useTemplateRef<HTMLInputElement>('textInput');\nconst activator = useTemplateRef<HTMLDivElement>('activator');\nconst menuWrapperRef = useTemplateRef<HTMLDivElement>('menuWrapperRef');\nconst calendarMenuOpen = ref<boolean>(false);\n\nconst { focused: activatorFocusedWithin } = useFocusWithin(activator);\nconst { focused: menuWrapperFocusedWithin } = useFocusWithin(menuWrapperRef);\nconst { focused: searchInputFocused } = useFocus(textInput);\n\nconst anyFocused = computed<boolean>(() => get(activatorFocusedWithin) || get(menuWrapperFocusedWithin));\n\nconst {\n clear: clearSelection,\n getDateTime,\n internalErrorMessages,\n maxAllowedDate,\n minAllowedDate,\n segmentData,\n selectedDate,\n selectedDay,\n selectedHour,\n selectedMillisecond,\n selectedMinute,\n selectedMonth,\n selectedSecond,\n selectedTime,\n selectedTimezone,\n selectedYear,\n setNow,\n valueSet,\n} = useDateTimeSelection({\n accuracy,\n allowEmpty,\n maxDate,\n minDate,\n modelValue,\n type,\n});\n\nconst { setValue, getCurrent } = useInputHandler(segmentData, currentValue);\n\nconst dateFormat = computed<string>(() => {\n const fmt = baseFormats[format];\n if (accuracy === 'second') {\n return fmt.replace('HH:mm', 'HH:mm:ss');\n }\n else if (accuracy === 'millisecond') {\n return fmt.replace('HH:mm', 'HH:mm:ss.SSS');\n }\n return fmt;\n});\n\nconst {\n clear: clearSegment,\n getCurrentSegment,\n handleBlur,\n handleClick,\n handleFocus,\n handleInput,\n handleInputSelection,\n handleKeyDown,\n handleMouseDown,\n handlePaste,\n setSegment,\n} = useKeyboardHandler({\n accuracy,\n currentValue,\n cursorPosition,\n dateFormat,\n disabled,\n getCurrent,\n getDateTime,\n readonly,\n setValue,\n textInput,\n});\n\nconst labelWithQuote = useLabelWithQuote(\n () => label,\n () => required,\n);\n\nconst isOutlined = computed<boolean>(() => variant === 'outlined');\n\nconst formattedDisplay = computed<string>(() => {\n let result = get(dateFormat);\n\n const replacements = [\n { pattern: 'YYYY', value: getDisplayValue(selectedYear, 4) },\n { pattern: 'MM', value: getDisplayValue(selectedMonth, 2) },\n { pattern: 'DD', value: getDisplayValue(selectedDay, 2) },\n { pattern: 'HH', value: getDisplayValue(selectedHour, 2) },\n { pattern: 'mm', value: getDisplayValue(selectedMinute, 2) },\n { pattern: 'ss', value: getDisplayValue(selectedSecond, 2) },\n { pattern: 'SSS', value: getDisplayValue(selectedMillisecond, 3) },\n ];\n\n for (const { pattern, value } of replacements) {\n if (value !== undefined) {\n result = result.replace(pattern, value);\n }\n }\n\n return result;\n});\n\nconst timeSelection = computed<TimePickerSelection>({\n get() {\n const type = getCurrentSegment()?.type;\n\n if (type === 'mm') {\n return 'minute';\n }\n else if (type === 'ss') {\n return 'second';\n }\n else if (type === 'SSS') {\n return 'millisecond';\n }\n return 'hour';\n },\n set(value: TimePickerSelection) {\n let segmentType: DateTimeSegmentType = 'HH';\n if (value === 'minute') {\n segmentType = 'mm';\n }\n else if (value === 'second') {\n segmentType = 'ss';\n }\n else if (value === 'millisecond') {\n segmentType = 'SSS';\n }\n\n setSegment(segmentType);\n },\n});\n\nconst float = computed<boolean>(() => (get(isOpen) || get(valueSet) || get(searchInputFocused)) && get(isOutlined));\n\nconst combinedErrorMessages = computed<string[]>(() => {\n let propErrors: string[];\n if (errorMessages) {\n propErrors = Array.isArray(errorMessages) ? errorMessages : [errorMessages];\n }\n else {\n propErrors = Array.isArray(errorMessages) ? errorMessages : [];\n }\n return [...propErrors, ...get(internalErrorMessages)];\n});\n\nfunction getDisplayValue(digit: Ref<number | undefined>, padding: number): string | undefined {\n return isDefined(digit) ? get(digit).toString().padStart(padding, '0') : undefined;\n}\n\nasync function setInputFocus(): Promise<void> {\n await nextTick(() => {\n set(searchInputFocused, true);\n });\n}\n\nfunction clear(segmentType?: string): void {\n if (!segmentType) {\n clearSelection();\n set(currentValue, undefined);\n return;\n }\n\n clearSegment(segmentType);\n}\n\nfunction handleInputClick(event: MouseEvent): void {\n // Handle segment selection first, before any DOM changes from menu opening\n handleClick(event);\n // Open menu if not already open\n if (!get(isOpen)) {\n set(isOpen, true);\n }\n}\n\nfunction arrowClicked(event: MouseEvent): void {\n if (get(isOpen)) {\n set(isOpen, false);\n event.stopPropagation();\n }\n}\n</script>\n\n<template>\n <RuiMenu\n v-model=\"isOpen\"\n :class=\"$style.wrapper\"\n :dense=\"dense\"\n :hint=\"hint\"\n :disabled=\"disabled\"\n :success-messages=\"successMessages\"\n :error-messages=\"combinedErrorMessages\"\n :close-on-content-click=\"false\"\n :show-details=\"!hideDetails\"\n :persistent=\"calendarMenuOpen\"\n :popper=\"{\n placement: 'bottom-start',\n }\"\n full-width\n disable-auto-focus\n v-bind=\"{\n ...getRootAttrs($attrs),\n }\"\n >\n <template #activator=\"{ attrs, open, hasError, hasSuccess }\">\n <div\n ref=\"activator\"\n class=\"group\"\n :class=\"[\n $style.activator,\n {\n [$style.disabled]: disabled,\n [$style.readonly]: readonly,\n [$style.outlined]: isOutlined,\n [$style.dense]: dense,\n [$style.float]: float,\n [$style.opened]: open,\n [$style['with-value']]: valueSet,\n [$style['with-error']]: hasError,\n [$style['with-success']]: hasSuccess && !hasError,\n },\n ]\"\n v-bind=\"{\n ...getNonRootAttrs($attrs, ['onClick', 'class']),\n ...(readonly ? {} : attrs),\n }\"\n data-id=\"activator\"\n :data-error=\"hasError ? '' : undefined\"\n :tabindex=\"disabled || readonly ? -1 : 0\"\n @click=\"setInputFocus()\"\n >\n <span\n v-if=\"isOutlined && (searchInputFocused || open || valueSet)\"\n data-id=\"label\"\n :class=\"[\n $style.label,\n {\n 'absolute': isOutlined,\n 'pr-2': !valueSet && !open && isOutlined,\n },\n ]\"\n >\n {{ label }}\n <span\n v-if=\"required\"\n data-id=\"required-indicator\"\n class=\"text-rui-error\"\n >\n ﹡\n </span>\n </span>\n\n <span :class=\"[$style.icon__wrapper, $style.icon__prepend]\">\n <RuiIcon\n :class=\"[$style.icon]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-calendar-days\"\n />\n </span>\n\n <div :class=\"$style.value\">\n <input\n ref=\"textInput\"\n :disabled=\"disabled\"\n :value=\"formattedDisplay\"\n class=\"bg-transparent outline-none flex-1 min-w-0\"\n type=\"text\"\n :placeholder=\"dateFormat\"\n :readonly=\"readonly\"\n :aria-invalid=\"hasError\"\n @mousedown=\"handleMouseDown($event)\"\n @focus=\"handleFocus()\"\n @blur=\"handleBlur()\"\n @select=\"handleInputSelection($event)\"\n @click.stop=\"handleInputClick($event)\"\n @keydown=\"handleKeyDown($event)\"\n @paste=\"handlePaste($event)\"\n @input=\"handleInput($event)\"\n />\n </div>\n\n <RuiButton\n v-if=\"allowEmpty && valueSet && !disabled\"\n variant=\"text\"\n icon\n data-id=\"clear-button\"\n size=\"sm\"\n tabindex=\"-1\"\n color=\"error\"\n class=\"group-hover:!visible\"\n :class=\"[\n $style.clear,\n anyFocused && '!visible',\n {\n 'mr-2': !dense,\n },\n ]\"\n @click.stop.prevent=\"clear()\"\n >\n <RuiIcon\n name=\"lu-x\"\n size=\"18\"\n />\n </RuiButton>\n\n <span\n :class=\"[$style.icon__wrapper, $style.icon__append]\"\n data-id=\"append\"\n @click=\"arrowClicked($event)\"\n >\n <RuiIcon\n :class=\"[$style.icon, { 'rotate-180': open }]\"\n :size=\"dense ? 16 : 24\"\n name=\"lu-chevron-down\"\n />\n </span>\n </div>\n <fieldset\n v-if=\"isOutlined\"\n :class=\"$style.fieldset\"\n >\n <legend :class=\"{ 'px-2': float }\" />\n </fieldset>\n </template>\n <template #default>\n <RuiDateTimePickerMenu\n ref=\"menuWrapperRef\"\n v-model:selected-date=\"selectedDate\"\n v-model:selected-time=\"selectedTime\"\n v-model:selected-hour=\"selectedHour\"\n v-model:selected-minute=\"selectedMinute\"\n v-model:selected-second=\"selectedSecond\"\n v-model:selected-millisecond=\"selectedMillisecond\"\n v-model:time-selection=\"timeSelection\"\n v-model:selected-timezone=\"selectedTimezone\"\n v-model:calendar-menu-open=\"calendarMenuOpen\"\n :accuracy=\"accuracy\"\n :max-date=\"maxAllowedDate\"\n :min-date=\"minAllowedDate\"\n @set-now=\"setNow()\"\n >\n <slot name=\"menu-content\" />\n </RuiDateTimePickerMenu>\n </template>\n </RuiMenu>\n</template>\n\n<style lang=\"scss\" module>\n.wrapper {\n @apply w-full inline-flex flex-col;\n\n .activator {\n @apply relative inline-flex items-center w-full;\n @apply outline-none focus-within:outline-none cursor-pointer min-h-14 pl-3 py-2 pr-8 rounded;\n @apply m-0 bg-white transition-all text-body-1 text-left hover:border-black;\n\n &:not(.outlined) {\n @apply hover:bg-gray-100 focus-within:bg-gray-100;\n }\n\n &.dense {\n @apply py-1.5 min-h-10;\n\n ~ .fieldset {\n @apply px-2;\n }\n }\n\n &.disabled {\n @apply opacity-65 text-rui-text-disabled active:text-rui-text-disabled cursor-default pointer-events-none;\n }\n\n &.readonly {\n @apply opacity-80 pointer-events-none cursor-default bg-gray-50;\n }\n\n &.outlined {\n @apply border-none hover:border-none;\n\n &.opened,\n &:focus,\n &:focus-within {\n @apply border-rui-primary;\n\n ~ .fieldset {\n @apply border-rui-primary #{!important};\n @apply border-2 #{!important};\n }\n }\n\n ~ .fieldset {\n @apply border border-black/[0.23];\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-black;\n }\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-dotted;\n @apply border border-black/[0.23] #{!important};\n }\n }\n\n &.with-success {\n .label {\n @apply text-rui-success #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-success #{!important};\n }\n }\n\n &.with-error {\n .label {\n @apply text-rui-error #{!important};\n }\n\n ~ .fieldset {\n @apply border-rui-error #{!important};\n }\n }\n }\n\n .label {\n @apply text-rui-text-secondary;\n max-width: calc(100% - 2.5rem);\n }\n\n .label,\n .value {\n @apply block truncate transition-all duration-75;\n }\n\n .value {\n @apply flex gap-1 flex-wrap flex-1 ps-8;\n }\n\n .clear {\n @apply ml-auto shrink-0 invisible;\n }\n\n .icon {\n @apply text-rui-text-secondary transition;\n\n &__wrapper {\n @apply flex items-center justify-end;\n @apply absolute top-px bottom-0;\n }\n\n &__append {\n @apply right-3;\n }\n\n &__prepend {\n @apply left-3;\n }\n }\n\n &.float {\n .label {\n @apply -translate-y-2 top-0 text-xs px-1;\n }\n\n ~ .fieldset {\n legend {\n &:after {\n content: v-bind(labelWithQuote);\n }\n }\n }\n\n &.opened,\n &.opened.with-value,\n &:focus,\n &:focus.with-value,\n &:focus-within,\n &:focus-within.with-value {\n .label {\n @apply text-rui-primary;\n }\n\n ~ .fieldset {\n @apply border-rui-primary;\n @apply border-2 #{!important};\n }\n }\n }\n }\n\n .fieldset {\n @apply absolute w-full min-w-0 h-[calc(100%+0.5rem)] top-0 left-0 rounded pointer-events-none px-2 transition-all -mt-2;\n\n legend {\n @apply opacity-0 text-xs truncate;\n max-width: calc(100% - 1rem);\n\n &:before {\n content: ' ';\n }\n\n &:after {\n @apply truncate max-w-full leading-[0];\n content: '\\200B';\n }\n }\n }\n}\n\n.menu {\n @apply overflow-y-auto max-h-60 min-w-[2.5rem];\n}\n\n.highlighted {\n @apply bg-rui-grey-200 #{!important};\n\n &.active {\n @apply bg-rui-grey-300 #{!important};\n }\n}\n\n:global(.dark) {\n .wrapper {\n .activator {\n @apply bg-transparent text-rui-text;\n\n &:not(.outlined) {\n @apply hover:bg-white/10 focus-within:bg-white/10;\n\n &.disabled {\n @apply bg-white/10;\n }\n }\n\n &.readonly {\n @apply bg-white/10;\n }\n\n &.outlined {\n ~ .fieldset {\n @apply border-white/[0.23];\n }\n\n &.disabled {\n ~ .fieldset {\n @apply border-white/[0.23] #{!important};\n }\n }\n\n &:hover {\n ~ .fieldset {\n @apply border-white;\n }\n }\n }\n }\n }\n\n .highlighted {\n @apply bg-rui-grey-800 #{!important};\n\n &.active {\n @apply bg-rui-grey-700 #{!important};\n }\n }\n}\n</style>\n"],"names":["_useModel","_openBlock","_createBlock","_mergeProps","_unref","$style","$attrs","_withCtx","_createElementVNode","_createElementBlock","_normalizeClass","_createTextVNode","_toDisplayString","_createVNode","_withModifiers","RuiDateTimePickerMenu","_renderSlot"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,8 @@
1
+ import dayjs from "dayjs";
2
+ import customParseFormat from "dayjs/plugin/customParseFormat.js";
3
+ import timezone from "dayjs/plugin/timezone.js";
4
+ import utc from "dayjs/plugin/utc.js";
5
+ dayjs.extend(utc);
6
+ dayjs.extend(timezone);
7
+ dayjs.extend(customParseFormat);
8
+ //# sourceMappingURL=dayjs-setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dayjs-setup.js","sources":["../../../src/components/date-time-picker/dayjs-setup.ts"],"sourcesContent":["import dayjs from 'dayjs';\nimport customParseFormat from 'dayjs/plugin/customParseFormat.js';\nimport timezone from 'dayjs/plugin/timezone.js';\nimport utc from 'dayjs/plugin/utc.js';\n\ndayjs.extend(utc);\ndayjs.extend(timezone);\ndayjs.extend(customParseFormat);\n"],"names":[],"mappings":";;;;AAKA,MAAM,OAAO,GAAG;AAChB,MAAM,OAAO,QAAQ;AACrB,MAAM,OAAO,iBAAiB;"}
@@ -0,0 +1,14 @@
1
+ import type { DateTimeSegmentType } from '../../components/date-time-picker/types.js';
2
+ export interface Segment {
3
+ start: number;
4
+ end: number;
5
+ type: DateTimeSegmentType;
6
+ }
7
+ type SegmentMethod = 'date' | 'hour' | 'month' | 'minute' | 'second' | 'millisecond' | 'year';
8
+ export declare const SEGMENT_METHODS: Record<DateTimeSegmentType, SegmentMethod>;
9
+ export interface SegmentBounds {
10
+ maxValue: number;
11
+ minValue?: number;
12
+ }
13
+ export declare const SEGMENT_CONFIG: Record<DateTimeSegmentType, SegmentBounds>;
14
+ export {};
@@ -0,0 +1,23 @@
1
+ const SEGMENT_METHODS = {
2
+ DD: "date",
3
+ HH: "hour",
4
+ MM: "month",
5
+ SSS: "millisecond",
6
+ YYYY: "year",
7
+ mm: "minute",
8
+ ss: "second"
9
+ };
10
+ const SEGMENT_CONFIG = {
11
+ DD: { maxValue: 31, minValue: 1 },
12
+ HH: { maxValue: 23, minValue: 0 },
13
+ MM: { maxValue: 12, minValue: 1 },
14
+ SSS: { maxValue: 999, minValue: 0 },
15
+ YYYY: { maxValue: 9999, minValue: 1 },
16
+ mm: { maxValue: 59, minValue: 0 },
17
+ ss: { maxValue: 59, minValue: 0 }
18
+ };
19
+ export {
20
+ SEGMENT_CONFIG,
21
+ SEGMENT_METHODS
22
+ };
23
+ //# sourceMappingURL=segment-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-config.js","sources":["../../../src/components/date-time-picker/segment-config.ts"],"sourcesContent":["import type { DateTimeSegmentType } from '@/components/date-time-picker/types';\n\nexport interface Segment {\n start: number;\n end: number;\n type: DateTimeSegmentType;\n}\n\ntype SegmentMethod = 'date' | 'hour' | 'month' | 'minute' | 'second' | 'millisecond' | 'year';\n\nexport const SEGMENT_METHODS: Record<DateTimeSegmentType, SegmentMethod> = {\n DD: 'date',\n HH: 'hour',\n MM: 'month',\n SSS: 'millisecond',\n YYYY: 'year',\n mm: 'minute',\n ss: 'second',\n};\n\nexport interface SegmentBounds {\n maxValue: number;\n minValue?: number;\n}\n\nexport const SEGMENT_CONFIG: Record<DateTimeSegmentType, SegmentBounds> = {\n DD: { maxValue: 31, minValue: 1 },\n HH: { maxValue: 23, minValue: 0 },\n MM: { maxValue: 12, minValue: 1 },\n SSS: { maxValue: 999, minValue: 0 },\n YYYY: { maxValue: 9999, minValue: 1 },\n mm: { maxValue: 59, minValue: 0 },\n ss: { maxValue: 59, minValue: 0 },\n};\n"],"names":[],"mappings":"AAUO,MAAM,kBAA8D;AAAA,EACzE,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,IAAI;AACN;AAOO,MAAM,iBAA6D;AAAA,EACxE,IAAI,EAAE,UAAU,IAAI,UAAU,EAAA;AAAA,EAC9B,IAAI,EAAE,UAAU,IAAI,UAAU,EAAA;AAAA,EAC9B,IAAI,EAAE,UAAU,IAAI,UAAU,EAAA;AAAA,EAC9B,KAAK,EAAE,UAAU,KAAK,UAAU,EAAA;AAAA,EAChC,MAAM,EAAE,UAAU,MAAM,UAAU,EAAA;AAAA,EAClC,IAAI,EAAE,UAAU,IAAI,UAAU,EAAA;AAAA,EAC9B,IAAI,EAAE,UAAU,IAAI,UAAU,EAAA;AAChC;"}
@@ -0,0 +1,5 @@
1
+ import type { DateTimeSegmentType } from '../../components/date-time-picker/types.js';
2
+ import type { TimeAccuracy } from '../../consts/time-accuracy.js';
3
+ import '../../components/date-time-picker/dayjs-setup.js';
4
+ export declare function getClickPosition(event: MouseEvent, input: HTMLInputElement, useCaretPosition: boolean): number;
5
+ export declare function parseAndSetDateValues(pastedText: string, dateFormat: string, accuracy: TimeAccuracy, setValue: (segment: DateTimeSegmentType, value?: number) => void): void;
@@ -0,0 +1,36 @@
1
+ import dayjs from "dayjs";
2
+ import { includeSeconds, includeMilliseconds } from "./utils.js";
3
+ import "./dayjs-setup.js";
4
+ function getClickPosition(event, input, useCaretPosition) {
5
+ const fallback = input.selectionStart ?? 0;
6
+ const caretPos = document.caretPositionFromPoint?.(event.clientX, event.clientY);
7
+ if (caretPos)
8
+ return caretPos.offset;
9
+ return document.caretRangeFromPoint?.(event.clientX, event.clientY)?.startOffset ?? fallback;
10
+ }
11
+ function parseAndSetDateValues(pastedText, dateFormat, accuracy, setValue) {
12
+ try {
13
+ const parsedDate = dayjs(pastedText, dateFormat);
14
+ if (!parsedDate.isValid()) {
15
+ return;
16
+ }
17
+ const date = parsedDate.toDate();
18
+ setValue("YYYY", date.getFullYear());
19
+ setValue("MM", date.getMonth() + 1);
20
+ setValue("DD", date.getDate());
21
+ setValue("HH", date.getHours());
22
+ setValue("mm", date.getMinutes());
23
+ if (includeSeconds(accuracy)) {
24
+ setValue("ss", date.getSeconds());
25
+ }
26
+ if (includeMilliseconds(accuracy)) {
27
+ setValue("SSS", date.getMilliseconds());
28
+ }
29
+ } catch {
30
+ }
31
+ }
32
+ export {
33
+ getClickPosition,
34
+ parseAndSetDateValues
35
+ };
36
+ //# sourceMappingURL=segment-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"segment-utils.js","sources":["../../../src/components/date-time-picker/segment-utils.ts"],"sourcesContent":["import type { DateTimeSegmentType } from '@/components/date-time-picker/types';\nimport type { TimeAccuracy } from '@/consts/time-accuracy';\nimport dayjs from 'dayjs';\nimport { includeMilliseconds, includeSeconds } from '@/components/date-time-picker/utils';\n\nimport '@/components/date-time-picker/dayjs-setup';\n\nexport function getClickPosition(\n event: MouseEvent,\n input: HTMLInputElement,\n useCaretPosition: boolean,\n): number {\n const fallback = input.selectionStart ?? 0;\n if (!useCaretPosition)\n return fallback;\n const caretPos = document.caretPositionFromPoint?.(event.clientX, event.clientY);\n if (caretPos)\n return caretPos.offset;\n return document.caretRangeFromPoint?.(event.clientX, event.clientY)?.startOffset ?? fallback;\n}\n\nexport function parseAndSetDateValues(\n pastedText: string,\n dateFormat: string,\n accuracy: TimeAccuracy,\n setValue: (segment: DateTimeSegmentType, value?: number) => void,\n): void {\n try {\n const parsedDate = dayjs(pastedText, dateFormat);\n\n if (!parsedDate.isValid()) {\n return;\n }\n\n const date = parsedDate.toDate();\n setValue('YYYY', date.getFullYear());\n setValue('MM', date.getMonth() + 1);\n setValue('DD', date.getDate());\n setValue('HH', date.getHours());\n setValue('mm', date.getMinutes());\n if (includeSeconds(accuracy)) {\n setValue('ss', date.getSeconds());\n }\n if (includeMilliseconds(accuracy)) {\n setValue('SSS', date.getMilliseconds());\n }\n }\n catch {\n // Invalid format, ignore paste\n }\n}\n"],"names":[],"mappings":";;;AAOO,SAAS,iBACd,OACA,OACA,kBACQ;AACR,QAAM,WAAW,MAAM,kBAAkB;AAGzC,QAAM,WAAW,SAAS,yBAAyB,MAAM,SAAS,MAAM,OAAO;AAC/E,MAAI;AACF,WAAO,SAAS;AAClB,SAAO,SAAS,sBAAsB,MAAM,SAAS,MAAM,OAAO,GAAG,eAAe;AACtF;AAEO,SAAS,sBACd,YACA,YACA,UACA,UACM;AACN,MAAI;AACF,UAAM,aAAa,MAAM,YAAY,UAAU;AAE/C,QAAI,CAAC,WAAW,WAAW;AACzB;AAAA,IACF;AAEA,UAAM,OAAO,WAAW,OAAA;AACxB,aAAS,QAAQ,KAAK,aAAa;AACnC,aAAS,MAAM,KAAK,SAAA,IAAa,CAAC;AAClC,aAAS,MAAM,KAAK,SAAS;AAC7B,aAAS,MAAM,KAAK,UAAU;AAC9B,aAAS,MAAM,KAAK,YAAY;AAChC,QAAI,eAAe,QAAQ,GAAG;AAC5B,eAAS,MAAM,KAAK,YAAY;AAAA,IAClC;AACA,QAAI,oBAAoB,QAAQ,GAAG;AACjC,eAAS,OAAO,KAAK,iBAAiB;AAAA,IACxC;AAAA,EACF,QACM;AAAA,EAEN;AACF;"}
@@ -2,6 +2,7 @@ import type { ComputedRef, Ref, WritableComputedRef } from 'vue';
2
2
  import type { SegmentData } from '../../components/date-time-picker/types.js';
3
3
  import type { TimeAccuracy } from '../../consts/time-accuracy.js';
4
4
  import { type Dayjs } from 'dayjs';
5
+ import '../../components/date-time-picker/dayjs-setup.js';
5
6
  type DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';
6
7
  type ModelValueType<T extends DateTimeModelType> = T extends 'date' ? Date | undefined : T extends 'epoch-ms' ? number | undefined : T extends 'epoch' ? number | undefined : Date | number | undefined;
7
8
  interface DateTimeSelectionOptions<T extends DateTimeModelType> {
@@ -2,6 +2,7 @@ import dayjs from "dayjs";
2
2
  import { guessTimezone, includeSeconds, includeMilliseconds } from "./utils.js";
3
3
  import { useRuiI8n } from "../../composables/use-rui-i18n.js";
4
4
  import { RUI_I18N_KEYS } from "../../i18n/keys.js";
5
+ import "./dayjs-setup.js";
5
6
  import { ref, computed, watch, onMounted, nextTick } from "vue";
6
7
  import { get, set } from "@vueuse/shared";
7
8
  import { isDefined, watchIgnorable } from "@vueuse/core";
@@ -1 +1 @@
1
- {"version":3,"file":"use-date-time-selection.js","sources":["../../../src/components/date-time-picker/use-date-time-selection.ts"],"sourcesContent":["import type { ComputedRef, Ref, WritableComputedRef } from 'vue';\nimport type { SegmentData } from '@/components/date-time-picker/types';\nimport type { TimeAccuracy } from '@/consts/time-accuracy';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport { guessTimezone, includeMilliseconds, includeSeconds } from '@/components/date-time-picker/utils';\nimport { useRuiI8n } from '@/composables/use-rui-i18n';\nimport { RUI_I18N_KEYS } from '@/i18n/keys';\n\ntype DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';\n\ntype ModelValueType<T extends DateTimeModelType> =\n T extends 'date' ? Date | undefined :\n T extends 'epoch-ms' ? number | undefined :\n T extends 'epoch' ? number | undefined :\n Date | number | undefined;\n\ninterface DateTimeSelectionOptions<T extends DateTimeModelType> {\n modelValue: Ref<ModelValueType<T>>;\n type: T;\n accuracy: TimeAccuracy;\n minDate: Date | number | undefined;\n maxDate: Date | number | 'now' | undefined;\n allowEmpty: boolean;\n}\n\ninterface DateTimeSelectionReturn {\n selectedYear: Ref<number | undefined>;\n selectedMonth: Ref<number | undefined>;\n selectedDay: Ref<number | undefined>;\n selectedHour: Ref<number | undefined>;\n selectedMinute: Ref<number | undefined>;\n selectedSecond: Ref<number | undefined>;\n selectedMillisecond: Ref<number | undefined>;\n selectedTimezone: Ref<string | undefined>;\n selectedDate: WritableComputedRef<Date | undefined>;\n selectedTime: WritableComputedRef<Date | undefined>;\n valueSet: ComputedRef<boolean>;\n internalErrorMessages: Ref<string[]>;\n now: Ref<Dayjs>;\n segmentData: SegmentData;\n minAllowedDate: ComputedRef<Date>;\n maxAllowedDate: ComputedRef<Date | undefined>;\n getDateTime: () => Dayjs;\n setNow: () => void;\n clear: () => void;\n isDateValid: (date: Dayjs) => boolean;\n}\n\nconst MILLISECONDS = 1000;\n\nexport function useDateTimeSelection<T extends DateTimeModelType>(\n options: DateTimeSelectionOptions<T>,\n): DateTimeSelectionReturn {\n const {\n accuracy,\n allowEmpty,\n maxDate,\n minDate,\n modelValue,\n type,\n } = options;\n\n const { t } = useRuiI8n();\n\n const selectedYear = ref<number | undefined>();\n const selectedMonth = ref<number | undefined>();\n const selectedDay = ref<number | undefined>();\n\n const selectedHour = ref<number | undefined>();\n const selectedMinute = ref<number | undefined>();\n const selectedSecond = ref<number | undefined>();\n const selectedMillisecond = ref<number | undefined>();\n const selectedTimezone = ref<string | undefined>(guessTimezone());\n\n const internalErrorMessages = ref<string[]>([]);\n const now = ref<Dayjs>(dayjs.tz(undefined, guessTimezone()));\n\n const minAllowedDate = computed<Date>(() => {\n if (minDate === undefined) {\n return new Date(1970, 0, 1);\n }\n\n if (type === 'epoch' && typeof minDate === 'number') {\n return new Date(minDate * MILLISECONDS);\n }\n\n return new Date(minDate);\n });\n\n const maxAllowedDate = computed<Date | undefined>(() => {\n if (maxDate === undefined) {\n return undefined;\n }\n if (maxDate === 'now') {\n return get(now).toDate();\n }\n if (type === 'epoch' && typeof maxDate === 'number') {\n return new Date(maxDate * MILLISECONDS);\n }\n return new Date(maxDate);\n });\n\n const segmentData: SegmentData = {\n DD: selectedDay,\n HH: selectedHour,\n MM: selectedMonth,\n SSS: selectedMillisecond,\n YYYY: selectedYear,\n mm: selectedMinute,\n ss: selectedSecond,\n };\n\n const selectedDate = computed<Date | undefined>({\n get() {\n if (!(isDefined(selectedYear) && isDefined(selectedMonth) && isDefined(selectedDay))) {\n return undefined;\n }\n const date = new Date();\n date.setFullYear(get(selectedYear));\n // Set day to 1 first to prevent month overflow when today's day > days in target month\n // e.g., if today is Dec 30 and we set month to Feb, day 30 would overflow to March\n date.setDate(1);\n date.setMonth(get(selectedMonth) - 1);\n date.setDate(get(selectedDay));\n return date;\n },\n set(value?: Date) {\n set(selectedYear, value?.getFullYear());\n set(selectedMonth, value ? value.getMonth() + 1 : undefined);\n set(selectedDay, value?.getDate());\n },\n });\n\n const selectedTime = computed<Date | undefined>({\n get() {\n if (!(isDefined(selectedHour) && isDefined(selectedMinute))) {\n return undefined;\n }\n const date = new Date();\n date.setHours(\n get(selectedHour),\n get(selectedMinute),\n get(selectedSecond) ?? 0,\n get(selectedMillisecond) ?? 0,\n );\n return date;\n },\n set(value?: Date) {\n set(selectedHour, value?.getHours());\n set(selectedMinute, value?.getMinutes());\n set(selectedSecond, value?.getSeconds());\n set(selectedMillisecond, value?.getMilliseconds());\n },\n });\n\n const valueSet = computed<boolean>(() => isDefined(selectedDate) && isDefined(selectedTime));\n\n function getDateTime(): Dayjs {\n let dateTime = dayjs();\n\n if (isDefined(selectedYear)) {\n dateTime = dateTime.year(get(selectedYear));\n }\n\n if (isDefined(selectedMonth)) {\n dateTime = dateTime.month(get(selectedMonth) - 1);\n }\n\n if (isDefined(selectedDay)) {\n const daysInMonth = dateTime.daysInMonth();\n const day = Math.min(get(selectedDay), daysInMonth);\n dateTime = dateTime.date(day);\n }\n\n if (isDefined(selectedHour)) {\n dateTime = dateTime.hour(get(selectedHour));\n }\n\n if (isDefined(selectedMinute)) {\n dateTime = dateTime.minute(get(selectedMinute));\n }\n\n if (isDefined(selectedSecond)) {\n dateTime = dateTime.second(get(selectedSecond));\n }\n\n if (isDefined(selectedMillisecond)) {\n dateTime = dateTime.millisecond(get(selectedMillisecond));\n }\n\n return dateTime;\n }\n\n function isDateValid(date: Dayjs): boolean {\n const min = get(minAllowedDate);\n const max = get(maxAllowedDate);\n\n set(internalErrorMessages, []);\n\n if (min && date.isBefore(min)) {\n const errorMessage = t(RUI_I18N_KEYS.dateTimePicker.dateBeforeMin, {\n date: min.toLocaleDateString(),\n }, `Date cannot be before ${min.toLocaleDateString()}`);\n set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);\n return false;\n }\n\n if (max && date.isAfter(max)) {\n const nowError = t(RUI_I18N_KEYS.dateTimePicker.dateInFuture, 'The selected date cannot be in the future');\n const maxError = t(RUI_I18N_KEYS.dateTimePicker.dateAfterMax, { date: max.toLocaleDateString() }, `Date cannot be after ${max.toLocaleDateString()}`);\n const errorMessage = maxDate === 'now' ? nowError : maxError;\n set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);\n return false;\n }\n\n return true;\n }\n\n function emitUpdate(updatedModel: Dayjs): void {\n const typeMap = {\n 'date': () => updatedModel.toDate(),\n 'epoch': () => updatedModel.valueOf() / MILLISECONDS,\n 'epoch-ms': () => updatedModel.valueOf(),\n } as const;\n\n set(modelValue, typeMap[type]() as ModelValueType<T>);\n }\n\n function updateModelValue(): void {\n if (!isDefined(selectedDate) || !isDefined(selectedTime)) {\n return;\n }\n\n if (!(isDefined(selectedDate) && isDefined(selectedTime))) {\n set(modelValue, undefined as ModelValueType<T>);\n }\n else {\n const date = get(selectedDate);\n const time = get(selectedTime);\n\n const updatedModel = dayjs.tz(isDefined(modelValue) ? get(modelValue) : undefined, get(selectedTimezone))\n .year(date.getFullYear())\n .month(date.getMonth())\n .date(date.getDate())\n .hour(time.getHours())\n .minute(time.getMinutes())\n .second(includeSeconds(accuracy) ? time.getSeconds() : 0)\n .millisecond(includeMilliseconds(accuracy) ? time.getMilliseconds() : 0);\n\n if (!isDateValid(updatedModel)) {\n return;\n }\n\n emitUpdate(updatedModel);\n }\n }\n\n function clear(): void {\n set(internalErrorMessages, []);\n set(selectedYear, undefined);\n set(selectedMonth, undefined);\n set(selectedDay, undefined);\n set(selectedHour, undefined);\n set(selectedMinute, undefined);\n set(selectedSecond, undefined);\n set(selectedMillisecond, undefined);\n set(modelValue, undefined as ModelValueType<T>);\n }\n\n function setNow(): void {\n set(internalErrorMessages, []);\n\n const date = dayjs();\n set(now, date);\n set(selectedYear, date.year());\n set(selectedMonth, date.month() + 1);\n set(selectedDay, date.date());\n set(selectedHour, date.hour());\n set(selectedMinute, date.minute());\n set(selectedSecond, includeSeconds(accuracy) ? date.second() : 0);\n set(selectedMillisecond, includeMilliseconds(accuracy) ? date.millisecond() : 0);\n\n nextTick(() => {\n updateModelValue();\n });\n }\n\n function updateSegments(date: Dayjs): void {\n const year = date.year();\n const month = date.month() + 1;\n const day = date.date();\n const hour = date.hour();\n const minute = date.minute();\n const second = includeSeconds(accuracy) ? date.second() : undefined;\n const millisecond = includeMilliseconds(accuracy) ? date.millisecond() : undefined;\n\n if (get(selectedYear) !== year)\n set(selectedYear, year);\n if (get(selectedMonth) !== month)\n set(selectedMonth, month);\n if (get(selectedDay) !== day)\n set(selectedDay, day);\n if (get(selectedHour) !== hour)\n set(selectedHour, hour);\n if (get(selectedMinute) !== minute)\n set(selectedMinute, minute);\n if (get(selectedSecond) !== second)\n set(selectedSecond, second);\n if (get(selectedMillisecond) !== millisecond)\n set(selectedMillisecond, millisecond);\n }\n\n const { ignoreUpdates } = watchIgnorable([selectedDate, selectedTime], ([newSelectedDate, newSelectedTime], [prevSelectedDate, prevSelectedTime]) => {\n const currentTimezone = get(selectedTimezone);\n const newDate = dayjs.tz(newSelectedDate, currentTimezone);\n const oldDate = dayjs.tz(prevSelectedDate, currentTimezone);\n const newTime = dayjs.tz(newSelectedTime, currentTimezone);\n const oldTime = dayjs.tz(prevSelectedTime, currentTimezone);\n\n if (newDate.isSame(oldDate) && newTime.isSame(oldTime)) {\n return;\n }\n\n set(now, dayjs());\n updateModelValue();\n });\n\n function updateInternalModel(value: ModelValueType<T>): void {\n ignoreUpdates(() => {\n const updatedValue = type === 'epoch' && typeof value === 'number'\n ? value * MILLISECONDS\n : value;\n const date = dayjs.tz(updatedValue, get(selectedTimezone));\n isDateValid(date);\n updateSegments(date);\n });\n }\n\n watch(selectedTimezone, (newTimezone: string | undefined) => {\n if (newTimezone && isDefined(selectedDate) && isDefined(selectedTime)) {\n set(now, dayjs());\n updateModelValue();\n }\n });\n\n watch(modelValue, (value) => {\n set(now, dayjs());\n if (value === undefined) {\n clear();\n }\n else {\n updateInternalModel(value);\n }\n });\n\n onMounted(() => {\n if (isDefined(modelValue)) {\n updateInternalModel(get(modelValue));\n }\n else if (!allowEmpty) {\n setNow();\n }\n });\n\n return {\n clear,\n getDateTime,\n internalErrorMessages,\n isDateValid,\n maxAllowedDate,\n minAllowedDate,\n now,\n segmentData,\n selectedDate,\n selectedDay,\n selectedHour,\n selectedMillisecond,\n selectedMinute,\n selectedMonth,\n selectedSecond,\n selectedTime,\n selectedTimezone,\n selectedYear,\n setNow,\n valueSet,\n };\n}\n"],"names":[],"mappings":";;;;;;;AAgDA,MAAM,eAAe;AAEd,SAAS,qBACd,SACyB;AACzB,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,IACE;AAEJ,QAAM,EAAE,EAAA,IAAM,UAAA;AAEd,QAAM,eAAe,IAAA;AACrB,QAAM,gBAAgB,IAAA;AACtB,QAAM,cAAc,IAAA;AAEpB,QAAM,eAAe,IAAA;AACrB,QAAM,iBAAiB,IAAA;AACvB,QAAM,iBAAiB,IAAA;AACvB,QAAM,sBAAsB,IAAA;AAC5B,QAAM,mBAAmB,IAAwB,eAAe;AAEhE,QAAM,wBAAwB,IAAc,EAAE;AAC9C,QAAM,MAAM,IAAW,MAAM,GAAG,QAAW,cAAA,CAAe,CAAC;AAE3D,QAAM,iBAAiB,SAAe,MAAM;AAC1C,QAAI,YAAY,QAAW;AACzB,aAAO,IAAI,KAAK,MAAM,GAAG,CAAC;AAAA,IAC5B;AAEA,QAAI,SAAS,WAAW,OAAO,YAAY,UAAU;AACnD,aAAO,IAAI,KAAK,UAAU,YAAY;AAAA,IACxC;AAEA,WAAO,IAAI,KAAK,OAAO;AAAA,EACzB,CAAC;AAED,QAAM,iBAAiB,SAA2B,MAAM;AACtD,QAAI,YAAY,QAAW;AACzB,aAAO;AAAA,IACT;AACA,QAAI,YAAY,OAAO;AACrB,aAAO,IAAI,GAAG,EAAE,OAAA;AAAA,IAClB;AACA,QAAI,SAAS,WAAW,OAAO,YAAY,UAAU;AACnD,aAAO,IAAI,KAAK,UAAU,YAAY;AAAA,IACxC;AACA,WAAO,IAAI,KAAK,OAAO;AAAA,EACzB,CAAC;AAED,QAAM,cAA2B;AAAA,IAC/B,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,KAAK;AAAA,IACL,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAGN,QAAM,eAAe,SAA2B;AAAA,IAC9C,MAAM;AACJ,UAAI,EAAE,UAAU,YAAY,KAAK,UAAU,aAAa,KAAK,UAAU,WAAW,IAAI;AACpF,eAAO;AAAA,MACT;AACA,YAAM,2BAAW,KAAA;AACjB,WAAK,YAAY,IAAI,YAAY,CAAC;AAGlC,WAAK,QAAQ,CAAC;AACd,WAAK,SAAS,IAAI,aAAa,IAAI,CAAC;AACpC,WAAK,QAAQ,IAAI,WAAW,CAAC;AAC7B,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAc;AAChB,UAAI,cAAc,OAAO,aAAa;AACtC,UAAI,eAAe,QAAQ,MAAM,SAAA,IAAa,IAAI,MAAS;AAC3D,UAAI,aAAa,OAAO,SAAS;AAAA,IACnC;AAAA,EAAA,CACD;AAED,QAAM,eAAe,SAA2B;AAAA,IAC9C,MAAM;AACJ,UAAI,EAAE,UAAU,YAAY,KAAK,UAAU,cAAc,IAAI;AAC3D,eAAO;AAAA,MACT;AACA,YAAM,2BAAW,KAAA;AACjB,WAAK;AAAA,QACH,IAAI,YAAY;AAAA,QAChB,IAAI,cAAc;AAAA,QAClB,IAAI,cAAc,KAAK;AAAA,QACvB,IAAI,mBAAmB,KAAK;AAAA,MAAA;AAE9B,aAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAc;AAChB,UAAI,cAAc,OAAO,UAAU;AACnC,UAAI,gBAAgB,OAAO,YAAY;AACvC,UAAI,gBAAgB,OAAO,YAAY;AACvC,UAAI,qBAAqB,OAAO,iBAAiB;AAAA,IACnD;AAAA,EAAA,CACD;AAED,QAAM,WAAW,SAAkB,MAAM,UAAU,YAAY,KAAK,UAAU,YAAY,CAAC;AAE3F,WAAS,cAAqB;AAC5B,QAAI,WAAW,MAAA;AAEf,QAAI,UAAU,YAAY,GAAG;AAC3B,iBAAW,SAAS,KAAK,IAAI,YAAY,CAAC;AAAA,IAC5C;AAEA,QAAI,UAAU,aAAa,GAAG;AAC5B,iBAAW,SAAS,MAAM,IAAI,aAAa,IAAI,CAAC;AAAA,IAClD;AAEA,QAAI,UAAU,WAAW,GAAG;AAC1B,YAAM,cAAc,SAAS,YAAA;AAC7B,YAAM,MAAM,KAAK,IAAI,IAAI,WAAW,GAAG,WAAW;AAClD,iBAAW,SAAS,KAAK,GAAG;AAAA,IAC9B;AAEA,QAAI,UAAU,YAAY,GAAG;AAC3B,iBAAW,SAAS,KAAK,IAAI,YAAY,CAAC;AAAA,IAC5C;AAEA,QAAI,UAAU,cAAc,GAAG;AAC7B,iBAAW,SAAS,OAAO,IAAI,cAAc,CAAC;AAAA,IAChD;AAEA,QAAI,UAAU,cAAc,GAAG;AAC7B,iBAAW,SAAS,OAAO,IAAI,cAAc,CAAC;AAAA,IAChD;AAEA,QAAI,UAAU,mBAAmB,GAAG;AAClC,iBAAW,SAAS,YAAY,IAAI,mBAAmB,CAAC;AAAA,IAC1D;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,YAAY,MAAsB;AACzC,UAAM,MAAM,IAAI,cAAc;AAC9B,UAAM,MAAM,IAAI,cAAc;AAE9B,QAAI,uBAAuB,EAAE;AAE7B,QAAI,OAAO,KAAK,SAAS,GAAG,GAAG;AAC7B,YAAM,eAAe,EAAE,cAAc,eAAe,eAAe;AAAA,QACjE,MAAM,IAAI,mBAAA;AAAA,MAAmB,GAC5B,yBAAyB,IAAI,mBAAA,CAAoB,EAAE;AACtD,UAAI,uBAAuB,CAAC,GAAG,IAAI,qBAAqB,GAAG,YAAY,CAAC;AACxE,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,KAAK,QAAQ,GAAG,GAAG;AAC5B,YAAM,WAAW,EAAE,cAAc,eAAe,cAAc,2CAA2C;AACzG,YAAM,WAAW,EAAE,cAAc,eAAe,cAAc,EAAE,MAAM,IAAI,mBAAA,KAAwB,wBAAwB,IAAI,mBAAA,CAAoB,EAAE;AACpJ,YAAM,eAAe,YAAY,QAAQ,WAAW;AACpD,UAAI,uBAAuB,CAAC,GAAG,IAAI,qBAAqB,GAAG,YAAY,CAAC;AACxE,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAEA,WAAS,WAAW,cAA2B;AAC7C,UAAM,UAAU;AAAA,MACd,QAAQ,MAAM,aAAa,OAAA;AAAA,MAC3B,SAAS,MAAM,aAAa,QAAA,IAAY;AAAA,MACxC,YAAY,MAAM,aAAa,QAAA;AAAA,IAAQ;AAGzC,QAAI,YAAY,QAAQ,IAAI,EAAA,CAAwB;AAAA,EACtD;AAEA,WAAS,mBAAyB;AAChC,QAAI,CAAC,UAAU,YAAY,KAAK,CAAC,UAAU,YAAY,GAAG;AACxD;AAAA,IACF;AAEA,QAAI,EAAE,UAAU,YAAY,KAAK,UAAU,YAAY,IAAI;AACzD,UAAI,YAAY,MAA8B;AAAA,IAChD,OACK;AACH,YAAM,OAAO,IAAI,YAAY;AAC7B,YAAM,OAAO,IAAI,YAAY;AAE7B,YAAM,eAAe,MAAM,GAAG,UAAU,UAAU,IAAI,IAAI,UAAU,IAAI,QAAW,IAAI,gBAAgB,CAAC,EACrG,KAAK,KAAK,YAAA,CAAa,EACvB,MAAM,KAAK,SAAA,CAAU,EACrB,KAAK,KAAK,SAAS,EACnB,KAAK,KAAK,SAAA,CAAU,EACpB,OAAO,KAAK,WAAA,CAAY,EACxB,OAAO,eAAe,QAAQ,IAAI,KAAK,WAAA,IAAe,CAAC,EACvD,YAAY,oBAAoB,QAAQ,IAAI,KAAK,gBAAA,IAAoB,CAAC;AAEzE,UAAI,CAAC,YAAY,YAAY,GAAG;AAC9B;AAAA,MACF;AAEA,iBAAW,YAAY;AAAA,IACzB;AAAA,EACF;AAEA,WAAS,QAAc;AACrB,QAAI,uBAAuB,EAAE;AAC7B,QAAI,cAAc,MAAS;AAC3B,QAAI,eAAe,MAAS;AAC5B,QAAI,aAAa,MAAS;AAC1B,QAAI,cAAc,MAAS;AAC3B,QAAI,gBAAgB,MAAS;AAC7B,QAAI,gBAAgB,MAAS;AAC7B,QAAI,qBAAqB,MAAS;AAClC,QAAI,YAAY,MAA8B;AAAA,EAChD;AAEA,WAAS,SAAe;AACtB,QAAI,uBAAuB,EAAE;AAE7B,UAAM,OAAO,MAAA;AACb,QAAI,KAAK,IAAI;AACb,QAAI,cAAc,KAAK,MAAM;AAC7B,QAAI,eAAe,KAAK,MAAA,IAAU,CAAC;AACnC,QAAI,aAAa,KAAK,MAAM;AAC5B,QAAI,cAAc,KAAK,MAAM;AAC7B,QAAI,gBAAgB,KAAK,QAAQ;AACjC,QAAI,gBAAgB,eAAe,QAAQ,IAAI,KAAK,OAAA,IAAW,CAAC;AAChE,QAAI,qBAAqB,oBAAoB,QAAQ,IAAI,KAAK,YAAA,IAAgB,CAAC;AAE/E,aAAS,MAAM;AACb,uBAAA;AAAA,IACF,CAAC;AAAA,EACH;AAEA,WAAS,eAAe,MAAmB;AACzC,UAAM,OAAO,KAAK,KAAA;AAClB,UAAM,QAAQ,KAAK,MAAA,IAAU;AAC7B,UAAM,MAAM,KAAK,KAAA;AACjB,UAAM,OAAO,KAAK,KAAA;AAClB,UAAM,SAAS,KAAK,OAAA;AACpB,UAAM,SAAS,eAAe,QAAQ,IAAI,KAAK,WAAW;AAC1D,UAAM,cAAc,oBAAoB,QAAQ,IAAI,KAAK,gBAAgB;AAEzE,QAAI,IAAI,YAAY,MAAM;AACxB,UAAI,cAAc,IAAI;AACxB,QAAI,IAAI,aAAa,MAAM;AACzB,UAAI,eAAe,KAAK;AAC1B,QAAI,IAAI,WAAW,MAAM;AACvB,UAAI,aAAa,GAAG;AACtB,QAAI,IAAI,YAAY,MAAM;AACxB,UAAI,cAAc,IAAI;AACxB,QAAI,IAAI,cAAc,MAAM;AAC1B,UAAI,gBAAgB,MAAM;AAC5B,QAAI,IAAI,cAAc,MAAM;AAC1B,UAAI,gBAAgB,MAAM;AAC5B,QAAI,IAAI,mBAAmB,MAAM;AAC/B,UAAI,qBAAqB,WAAW;AAAA,EACxC;AAEA,QAAM,EAAE,cAAA,IAAkB,eAAe,CAAC,cAAc,YAAY,GAAG,CAAC,CAAC,iBAAiB,eAAe,GAAG,CAAC,kBAAkB,gBAAgB,MAAM;AACnJ,UAAM,kBAAkB,IAAI,gBAAgB;AAC5C,UAAM,UAAU,MAAM,GAAG,iBAAiB,eAAe;AACzD,UAAM,UAAU,MAAM,GAAG,kBAAkB,eAAe;AAC1D,UAAM,UAAU,MAAM,GAAG,iBAAiB,eAAe;AACzD,UAAM,UAAU,MAAM,GAAG,kBAAkB,eAAe;AAE1D,QAAI,QAAQ,OAAO,OAAO,KAAK,QAAQ,OAAO,OAAO,GAAG;AACtD;AAAA,IACF;AAEA,QAAI,KAAK,OAAO;AAChB,qBAAA;AAAA,EACF,CAAC;AAED,WAAS,oBAAoB,OAAgC;AAC3D,kBAAc,MAAM;AAClB,YAAM,eAAe,SAAS,WAAW,OAAO,UAAU,WACtD,QAAQ,eACR;AACJ,YAAM,OAAO,MAAM,GAAG,cAAc,IAAI,gBAAgB,CAAC;AACzD,kBAAY,IAAI;AAChB,qBAAe,IAAI;AAAA,IACrB,CAAC;AAAA,EACH;AAEA,QAAM,kBAAkB,CAAC,gBAAoC;AAC3D,QAAI,eAAe,UAAU,YAAY,KAAK,UAAU,YAAY,GAAG;AACrE,UAAI,KAAK,OAAO;AAChB,uBAAA;AAAA,IACF;AAAA,EACF,CAAC;AAED,QAAM,YAAY,CAAC,UAAU;AAC3B,QAAI,KAAK,OAAO;AAChB,QAAI,UAAU,QAAW;AACvB,YAAA;AAAA,IACF,OACK;AACH,0BAAoB,KAAK;AAAA,IAC3B;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,QAAI,UAAU,UAAU,GAAG;AACzB,0BAAoB,IAAI,UAAU,CAAC;AAAA,IACrC,WACS,CAAC,YAAY;AACpB,aAAA;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;"}
1
+ {"version":3,"file":"use-date-time-selection.js","sources":["../../../src/components/date-time-picker/use-date-time-selection.ts"],"sourcesContent":["import type { ComputedRef, Ref, WritableComputedRef } from 'vue';\nimport type { SegmentData } from '@/components/date-time-picker/types';\nimport type { TimeAccuracy } from '@/consts/time-accuracy';\nimport dayjs, { type Dayjs } from 'dayjs';\nimport { guessTimezone, includeMilliseconds, includeSeconds } from '@/components/date-time-picker/utils';\nimport { useRuiI8n } from '@/composables/use-rui-i18n';\nimport { RUI_I18N_KEYS } from '@/i18n/keys';\nimport '@/components/date-time-picker/dayjs-setup';\n\ntype DateTimeModelType = 'date' | 'epoch-ms' | 'epoch';\n\ntype ModelValueType<T extends DateTimeModelType> =\n T extends 'date' ? Date | undefined :\n T extends 'epoch-ms' ? number | undefined :\n T extends 'epoch' ? number | undefined :\n Date | number | undefined;\n\ninterface DateTimeSelectionOptions<T extends DateTimeModelType> {\n modelValue: Ref<ModelValueType<T>>;\n type: T;\n accuracy: TimeAccuracy;\n minDate: Date | number | undefined;\n maxDate: Date | number | 'now' | undefined;\n allowEmpty: boolean;\n}\n\ninterface DateTimeSelectionReturn {\n selectedYear: Ref<number | undefined>;\n selectedMonth: Ref<number | undefined>;\n selectedDay: Ref<number | undefined>;\n selectedHour: Ref<number | undefined>;\n selectedMinute: Ref<number | undefined>;\n selectedSecond: Ref<number | undefined>;\n selectedMillisecond: Ref<number | undefined>;\n selectedTimezone: Ref<string | undefined>;\n selectedDate: WritableComputedRef<Date | undefined>;\n selectedTime: WritableComputedRef<Date | undefined>;\n valueSet: ComputedRef<boolean>;\n internalErrorMessages: Ref<string[]>;\n now: Ref<Dayjs>;\n segmentData: SegmentData;\n minAllowedDate: ComputedRef<Date>;\n maxAllowedDate: ComputedRef<Date | undefined>;\n getDateTime: () => Dayjs;\n setNow: () => void;\n clear: () => void;\n isDateValid: (date: Dayjs) => boolean;\n}\n\nconst MILLISECONDS = 1000;\n\nexport function useDateTimeSelection<T extends DateTimeModelType>(\n options: DateTimeSelectionOptions<T>,\n): DateTimeSelectionReturn {\n const {\n accuracy,\n allowEmpty,\n maxDate,\n minDate,\n modelValue,\n type,\n } = options;\n\n const { t } = useRuiI8n();\n\n const selectedYear = ref<number | undefined>();\n const selectedMonth = ref<number | undefined>();\n const selectedDay = ref<number | undefined>();\n\n const selectedHour = ref<number | undefined>();\n const selectedMinute = ref<number | undefined>();\n const selectedSecond = ref<number | undefined>();\n const selectedMillisecond = ref<number | undefined>();\n const selectedTimezone = ref<string | undefined>(guessTimezone());\n\n const internalErrorMessages = ref<string[]>([]);\n const now = ref<Dayjs>(dayjs.tz(undefined, guessTimezone()));\n\n const minAllowedDate = computed<Date>(() => {\n if (minDate === undefined) {\n return new Date(1970, 0, 1);\n }\n\n if (type === 'epoch' && typeof minDate === 'number') {\n return new Date(minDate * MILLISECONDS);\n }\n\n return new Date(minDate);\n });\n\n const maxAllowedDate = computed<Date | undefined>(() => {\n if (maxDate === undefined) {\n return undefined;\n }\n if (maxDate === 'now') {\n return get(now).toDate();\n }\n if (type === 'epoch' && typeof maxDate === 'number') {\n return new Date(maxDate * MILLISECONDS);\n }\n return new Date(maxDate);\n });\n\n const segmentData: SegmentData = {\n DD: selectedDay,\n HH: selectedHour,\n MM: selectedMonth,\n SSS: selectedMillisecond,\n YYYY: selectedYear,\n mm: selectedMinute,\n ss: selectedSecond,\n };\n\n const selectedDate = computed<Date | undefined>({\n get() {\n if (!(isDefined(selectedYear) && isDefined(selectedMonth) && isDefined(selectedDay))) {\n return undefined;\n }\n const date = new Date();\n date.setFullYear(get(selectedYear));\n // Set day to 1 first to prevent month overflow when today's day > days in target month\n // e.g., if today is Dec 30 and we set month to Feb, day 30 would overflow to March\n date.setDate(1);\n date.setMonth(get(selectedMonth) - 1);\n date.setDate(get(selectedDay));\n return date;\n },\n set(value?: Date) {\n set(selectedYear, value?.getFullYear());\n set(selectedMonth, value ? value.getMonth() + 1 : undefined);\n set(selectedDay, value?.getDate());\n },\n });\n\n const selectedTime = computed<Date | undefined>({\n get() {\n if (!(isDefined(selectedHour) && isDefined(selectedMinute))) {\n return undefined;\n }\n const date = new Date();\n date.setHours(\n get(selectedHour),\n get(selectedMinute),\n get(selectedSecond) ?? 0,\n get(selectedMillisecond) ?? 0,\n );\n return date;\n },\n set(value?: Date) {\n set(selectedHour, value?.getHours());\n set(selectedMinute, value?.getMinutes());\n set(selectedSecond, value?.getSeconds());\n set(selectedMillisecond, value?.getMilliseconds());\n },\n });\n\n const valueSet = computed<boolean>(() => isDefined(selectedDate) && isDefined(selectedTime));\n\n function getDateTime(): Dayjs {\n let dateTime = dayjs();\n\n if (isDefined(selectedYear)) {\n dateTime = dateTime.year(get(selectedYear));\n }\n\n if (isDefined(selectedMonth)) {\n dateTime = dateTime.month(get(selectedMonth) - 1);\n }\n\n if (isDefined(selectedDay)) {\n const daysInMonth = dateTime.daysInMonth();\n const day = Math.min(get(selectedDay), daysInMonth);\n dateTime = dateTime.date(day);\n }\n\n if (isDefined(selectedHour)) {\n dateTime = dateTime.hour(get(selectedHour));\n }\n\n if (isDefined(selectedMinute)) {\n dateTime = dateTime.minute(get(selectedMinute));\n }\n\n if (isDefined(selectedSecond)) {\n dateTime = dateTime.second(get(selectedSecond));\n }\n\n if (isDefined(selectedMillisecond)) {\n dateTime = dateTime.millisecond(get(selectedMillisecond));\n }\n\n return dateTime;\n }\n\n function isDateValid(date: Dayjs): boolean {\n const min = get(minAllowedDate);\n const max = get(maxAllowedDate);\n\n set(internalErrorMessages, []);\n\n if (min && date.isBefore(min)) {\n const errorMessage = t(RUI_I18N_KEYS.dateTimePicker.dateBeforeMin, {\n date: min.toLocaleDateString(),\n }, `Date cannot be before ${min.toLocaleDateString()}`);\n set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);\n return false;\n }\n\n if (max && date.isAfter(max)) {\n const nowError = t(RUI_I18N_KEYS.dateTimePicker.dateInFuture, 'The selected date cannot be in the future');\n const maxError = t(RUI_I18N_KEYS.dateTimePicker.dateAfterMax, { date: max.toLocaleDateString() }, `Date cannot be after ${max.toLocaleDateString()}`);\n const errorMessage = maxDate === 'now' ? nowError : maxError;\n set(internalErrorMessages, [...get(internalErrorMessages), errorMessage]);\n return false;\n }\n\n return true;\n }\n\n function emitUpdate(updatedModel: Dayjs): void {\n const typeMap = {\n 'date': () => updatedModel.toDate(),\n 'epoch': () => updatedModel.valueOf() / MILLISECONDS,\n 'epoch-ms': () => updatedModel.valueOf(),\n } as const;\n\n set(modelValue, typeMap[type]() as ModelValueType<T>);\n }\n\n function updateModelValue(): void {\n if (!isDefined(selectedDate) || !isDefined(selectedTime)) {\n return;\n }\n\n if (!(isDefined(selectedDate) && isDefined(selectedTime))) {\n set(modelValue, undefined as ModelValueType<T>);\n }\n else {\n const date = get(selectedDate);\n const time = get(selectedTime);\n\n const updatedModel = dayjs.tz(isDefined(modelValue) ? get(modelValue) : undefined, get(selectedTimezone))\n .year(date.getFullYear())\n .month(date.getMonth())\n .date(date.getDate())\n .hour(time.getHours())\n .minute(time.getMinutes())\n .second(includeSeconds(accuracy) ? time.getSeconds() : 0)\n .millisecond(includeMilliseconds(accuracy) ? time.getMilliseconds() : 0);\n\n if (!isDateValid(updatedModel)) {\n return;\n }\n\n emitUpdate(updatedModel);\n }\n }\n\n function clear(): void {\n set(internalErrorMessages, []);\n set(selectedYear, undefined);\n set(selectedMonth, undefined);\n set(selectedDay, undefined);\n set(selectedHour, undefined);\n set(selectedMinute, undefined);\n set(selectedSecond, undefined);\n set(selectedMillisecond, undefined);\n set(modelValue, undefined as ModelValueType<T>);\n }\n\n function setNow(): void {\n set(internalErrorMessages, []);\n\n const date = dayjs();\n set(now, date);\n set(selectedYear, date.year());\n set(selectedMonth, date.month() + 1);\n set(selectedDay, date.date());\n set(selectedHour, date.hour());\n set(selectedMinute, date.minute());\n set(selectedSecond, includeSeconds(accuracy) ? date.second() : 0);\n set(selectedMillisecond, includeMilliseconds(accuracy) ? date.millisecond() : 0);\n\n nextTick(() => {\n updateModelValue();\n });\n }\n\n function updateSegments(date: Dayjs): void {\n const year = date.year();\n const month = date.month() + 1;\n const day = date.date();\n const hour = date.hour();\n const minute = date.minute();\n const second = includeSeconds(accuracy) ? date.second() : undefined;\n const millisecond = includeMilliseconds(accuracy) ? date.millisecond() : undefined;\n\n if (get(selectedYear) !== year)\n set(selectedYear, year);\n if (get(selectedMonth) !== month)\n set(selectedMonth, month);\n if (get(selectedDay) !== day)\n set(selectedDay, day);\n if (get(selectedHour) !== hour)\n set(selectedHour, hour);\n if (get(selectedMinute) !== minute)\n set(selectedMinute, minute);\n if (get(selectedSecond) !== second)\n set(selectedSecond, second);\n if (get(selectedMillisecond) !== millisecond)\n set(selectedMillisecond, millisecond);\n }\n\n const { ignoreUpdates } = watchIgnorable([selectedDate, selectedTime], ([newSelectedDate, newSelectedTime], [prevSelectedDate, prevSelectedTime]) => {\n const currentTimezone = get(selectedTimezone);\n const newDate = dayjs.tz(newSelectedDate, currentTimezone);\n const oldDate = dayjs.tz(prevSelectedDate, currentTimezone);\n const newTime = dayjs.tz(newSelectedTime, currentTimezone);\n const oldTime = dayjs.tz(prevSelectedTime, currentTimezone);\n\n if (newDate.isSame(oldDate) && newTime.isSame(oldTime)) {\n return;\n }\n\n set(now, dayjs());\n updateModelValue();\n });\n\n function updateInternalModel(value: ModelValueType<T>): void {\n ignoreUpdates(() => {\n const updatedValue = type === 'epoch' && typeof value === 'number'\n ? value * MILLISECONDS\n : value;\n const date = dayjs.tz(updatedValue, get(selectedTimezone));\n isDateValid(date);\n updateSegments(date);\n });\n }\n\n watch(selectedTimezone, (newTimezone: string | undefined) => {\n if (newTimezone && isDefined(selectedDate) && isDefined(selectedTime)) {\n set(now, dayjs());\n updateModelValue();\n }\n });\n\n watch(modelValue, (value) => {\n set(now, dayjs());\n if (value === undefined) {\n clear();\n }\n else {\n updateInternalModel(value);\n }\n });\n\n onMounted(() => {\n if (isDefined(modelValue)) {\n updateInternalModel(get(modelValue));\n }\n else if (!allowEmpty) {\n setNow();\n }\n });\n\n return {\n clear,\n getDateTime,\n internalErrorMessages,\n isDateValid,\n maxAllowedDate,\n minAllowedDate,\n now,\n segmentData,\n selectedDate,\n selectedDay,\n selectedHour,\n selectedMillisecond,\n selectedMinute,\n selectedMonth,\n selectedSecond,\n selectedTime,\n selectedTimezone,\n selectedYear,\n setNow,\n valueSet,\n };\n}\n"],"names":[],"mappings":"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"}