@rotki/ui-library 2.22.2 → 2.23.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 (105) hide show
  1. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +1 -1
  2. package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  3. package/dist/components/buttons/button/RuiButton.vue.d.ts +1 -1
  4. package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +1 -1
  5. package/dist/components/calendar/RuiCalendar.js.map +1 -1
  6. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +3 -1
  7. package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
  8. package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
  9. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +121 -25
  10. package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
  11. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +11 -4
  12. package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  13. package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
  14. package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +23 -1
  15. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +136 -24
  16. package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  17. package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
  18. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +7 -0
  19. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +70 -25
  20. package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  21. package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
  22. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +7 -3
  23. package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  24. package/dist/components/date-time-picker/segment-utils.d.ts +28 -0
  25. package/dist/components/date-time-picker/segment-utils.js +42 -1
  26. package/dist/components/date-time-picker/segment-utils.js.map +1 -1
  27. package/dist/components/date-time-picker/types.d.ts +2 -0
  28. package/dist/components/date-time-picker/types.js.map +1 -1
  29. package/dist/components/date-time-picker/use-date-time-selection.d.ts +6 -0
  30. package/dist/components/date-time-picker/use-date-time-selection.js +65 -42
  31. package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
  32. package/dist/components/date-time-picker/use-keyboard-handler.js +4 -3
  33. package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
  34. package/dist/components/date-time-picker/utils.d.ts +5 -0
  35. package/dist/components/date-time-picker/utils.js +12 -1
  36. package/dist/components/date-time-picker/utils.js.map +1 -1
  37. package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -1
  38. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +2 -5
  39. package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
  40. package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +1 -1
  41. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +3 -2
  42. package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
  43. package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +1 -1
  44. package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue.d.ts +1 -1
  45. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +2 -1
  46. package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
  47. package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -1
  48. package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +1 -1
  49. package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +1 -1
  50. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +2 -1
  51. package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
  52. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +2 -2
  53. package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
  54. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +2 -2
  55. package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
  56. package/dist/components/index.d.ts +2 -2
  57. package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
  58. package/dist/components/overlays/menu/RuiMenu.vue.d.ts +12 -0
  59. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +11 -5
  60. package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
  61. package/dist/components/tables/RuiDataTable.vue.d.ts +1 -1
  62. package/dist/components/tables/RuiTableHead.vue.d.ts +1 -1
  63. package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +1 -1
  64. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js +2 -8
  65. package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -1
  66. package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +1 -1
  67. package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue.d.ts +1 -1
  68. package/dist/components/tables/data-table/RuiDataTableGroupRow.vue.d.ts +1 -1
  69. package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +1 -1
  70. package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +1 -1
  71. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +1 -2
  72. package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
  73. package/dist/components/tables/use-pagination-navigation.js.map +1 -1
  74. package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +1 -1
  75. package/dist/components/tabs/tabs/use-tab-scroll.js +2 -1
  76. package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
  77. package/dist/composables/forms/auto-complete/search.d.ts +1 -2
  78. package/dist/composables/forms/auto-complete/search.js.map +1 -1
  79. package/dist/composables/forms/auto-complete/value.d.ts +1 -2
  80. package/dist/composables/forms/auto-complete/value.js.map +1 -1
  81. package/dist/i18n/keys.d.ts +10 -0
  82. package/dist/i18n/keys.js +15 -5
  83. package/dist/i18n/keys.js.map +1 -1
  84. package/dist/icons/icons_1.d.ts +1 -1
  85. package/dist/icons/icons_1.js +25 -22
  86. package/dist/icons/icons_1.js.map +1 -1
  87. package/dist/icons/icons_2.d.ts +7 -7
  88. package/dist/icons/icons_2.js +126 -92
  89. package/dist/icons/icons_2.js.map +1 -1
  90. package/dist/icons/icons_3.d.ts +12 -12
  91. package/dist/icons/icons_3.js +119 -177
  92. package/dist/icons/icons_3.js.map +1 -1
  93. package/dist/icons/icons_4.d.ts +26 -26
  94. package/dist/icons/icons_4.js +320 -285
  95. package/dist/icons/icons_4.js.map +1 -1
  96. package/dist/icons/icons_5.d.ts +13 -1
  97. package/dist/icons/icons_5.js +149 -9
  98. package/dist/icons/icons_5.js.map +1 -1
  99. package/dist/icons/index.d.ts +1 -1
  100. package/dist/icons/index.js +34 -22
  101. package/dist/icons/index.js.map +1 -1
  102. package/dist/index.js +7 -7
  103. package/dist/style.css +12 -756
  104. package/dist/web-types.json +85 -10
  105. package/package.json +32 -32
@@ -1,9 +1,12 @@
1
+ import type { DateTimePickerAction } from '../../components/date-time-picker/types.js';
1
2
  import type { TimeAccuracy } from '../../consts/time-accuracy.js';
2
3
  import { type TimePickerSelection } from '../../components/time-picker/RuiTimePicker.vue';
3
4
  type __VLS_Props = {
4
5
  accuracy: TimeAccuracy;
6
+ actions?: DateTimePickerAction[];
5
7
  maxDate?: Date | number;
6
8
  minDate?: Date | number;
9
+ showTimezone?: boolean;
7
10
  };
8
11
  type __VLS_Slots = {
9
12
  default: () => any;
@@ -21,7 +24,9 @@ type __VLS_ModelProps = {
21
24
  };
22
25
  type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
23
26
  declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
27
+ clear: () => any;
24
28
  "set-now": () => any;
29
+ "set-today": () => any;
25
30
  "update:selectedDate": (value: Date | undefined) => any;
26
31
  "update:selectedTime": (value: Date | undefined) => any;
27
32
  "update:selectedHour": (value: number | undefined) => any;
@@ -32,7 +37,9 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_PublicProps, {}, {
32
37
  "update:selectedTimezone": (value: string | undefined) => any;
33
38
  "update:calendarMenuOpen": (value: boolean) => any;
34
39
  }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
40
+ onClear?: (() => any) | undefined;
35
41
  "onSet-now"?: (() => any) | undefined;
42
+ "onSet-today"?: (() => any) | undefined;
36
43
  "onUpdate:selectedDate"?: ((value: Date | undefined) => any) | undefined;
37
44
  "onUpdate:selectedTime"?: ((value: Date | undefined) => any) | undefined;
38
45
  "onUpdate:selectedHour"?: ((value: number | undefined) => any) | undefined;
@@ -1,20 +1,33 @@
1
+ import { useRuiI8n } from "../../composables/use-rui-i18n.js";
1
2
  import RuiIcon_default from "../icons/RuiIcon.js";
2
3
  import RuiButton_default from "../buttons/button/RuiButton.js";
3
4
  import RuiCalendar_default from "../calendar/RuiCalendar.js";
5
+ import { RUI_I18N_KEYS } from "../../i18n/keys.js";
4
6
  import RuiTimezoneSelect_default from "./RuiTimezoneSelect.js";
5
7
  import RuiTimePicker_default from "../time-picker/RuiTimePicker.js";
6
- import { createElementBlock, createElementVNode, createVNode, defineComponent, mergeModels, openBlock, renderSlot, useModel, withCtx } from "vue";
8
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, openBlock, renderList, renderSlot, toDisplayString, unref, useModel, withCtx } from "vue";
7
9
  //#region src/components/date-time-picker/RuiDateTimePickerMenu.vue?vue&type=script&setup=true&lang.ts
8
- var _hoisted_1 = { class: "flex divide-x divide-rui-grey-200 dark:divide-rui-grey-800" };
9
- var _hoisted_2 = { class: "flex gap-3 p-4 pl-3" };
10
- var _hoisted_3 = { class: "flex flex-col justify-center items-center" };
10
+ var _hoisted_1 = { class: "flex flex-col" };
11
+ var _hoisted_2 = { class: "flex divide-x divide-rui-grey-200 dark:divide-rui-grey-800" };
12
+ var _hoisted_3 = { key: 0 };
13
+ var _hoisted_4 = {
14
+ key: 0,
15
+ class: "p-4 pl-3"
16
+ };
17
+ var _hoisted_5 = {
18
+ key: 0,
19
+ "data-id": "actions",
20
+ class: "flex justify-end gap-1 px-3 py-2 border-t border-rui-grey-200 dark:border-rui-grey-800"
21
+ };
11
22
  var RuiDateTimePickerMenu_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
12
23
  name: "RuiDateTimePickerMenu",
13
24
  __name: "RuiDateTimePickerMenu",
14
25
  props: /*@__PURE__*/ mergeModels({
15
26
  accuracy: {},
27
+ actions: { default: () => [] },
16
28
  maxDate: {},
17
- minDate: {}
29
+ minDate: {},
30
+ showTimezone: { type: Boolean }
18
31
  }, {
19
32
  "selectedDate": { required: true },
20
33
  "selectedDateModifiers": {},
@@ -38,7 +51,11 @@ var RuiDateTimePickerMenu_vue_vue_type_script_setup_true_lang_default = /*@__PUR
38
51
  },
39
52
  "calendarMenuOpenModifiers": {}
40
53
  }),
41
- emits: /*@__PURE__*/ mergeModels(["set-now"], [
54
+ emits: /*@__PURE__*/ mergeModels([
55
+ "set-now",
56
+ "set-today",
57
+ "clear"
58
+ ], [
42
59
  "update:selectedDate",
43
60
  "update:selectedTime",
44
61
  "update:selectedHour",
@@ -60,11 +77,33 @@ var RuiDateTimePickerMenu_vue_vue_type_script_setup_true_lang_default = /*@__PUR
60
77
  const selectedTimezone = useModel(__props, "selectedTimezone");
61
78
  const calendarMenuOpen = useModel(__props, "calendarMenuOpen");
62
79
  const emit = __emit;
63
- function setNow() {
64
- emit("set-now");
65
- }
80
+ const { t } = useRuiI8n();
81
+ const keys = RUI_I18N_KEYS.dateTimePicker;
82
+ const actionConfig = computed(() => {
83
+ const available = {
84
+ clear: {
85
+ handler: () => emit("clear"),
86
+ icon: "lu-x",
87
+ id: "clear",
88
+ label: t(keys.clear, "Clear")
89
+ },
90
+ now: {
91
+ handler: () => emit("set-now"),
92
+ icon: "lu-clock",
93
+ id: "now",
94
+ label: t(keys.now, "Now")
95
+ },
96
+ today: {
97
+ handler: () => emit("set-today"),
98
+ icon: "lu-calendar-days",
99
+ id: "today",
100
+ label: t(keys.today, "Today")
101
+ }
102
+ };
103
+ return __props.actions.map((action) => available[action]).filter(Boolean);
104
+ });
66
105
  return (_ctx, _cache) => {
67
- return openBlock(), createElementBlock("div", _hoisted_1, [
106
+ return openBlock(), createElementBlock("div", _hoisted_1, [createElementVNode("div", _hoisted_2, [
68
107
  createVNode(RuiCalendar_default, {
69
108
  modelValue: selectedDate.value,
70
109
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => selectedDate.value = $event),
@@ -103,24 +142,30 @@ var RuiDateTimePickerMenu_vue_vue_type_script_setup_true_lang_default = /*@__PUR
103
142
  "selection",
104
143
  "accuracy"
105
144
  ]),
106
- createElementVNode("div", null, [createElementVNode("div", _hoisted_2, [createElementVNode("div", _hoisted_3, [createVNode(RuiButton_default, {
107
- variant: "text",
108
- icon: "",
109
- "data-id": "set-now",
110
- onClick: _cache[8] || (_cache[8] = ($event) => setNow())
111
- }, {
112
- default: withCtx(() => [createVNode(RuiIcon_default, {
113
- name: "lu-clock",
114
- size: "18"
115
- })]),
116
- _: 1
117
- })]), createVNode(RuiTimezoneSelect_default, {
145
+ __props.showTimezone || _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_3, [__props.showTimezone ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(RuiTimezoneSelect_default, {
118
146
  modelValue: selectedTimezone.value,
119
- "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => selectedTimezone.value = $event),
147
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => selectedTimezone.value = $event),
148
+ "data-id": "timezone-select",
120
149
  "hide-details": "",
121
150
  class: "pt-0 pr-0"
122
- }, null, 8, ["modelValue"])]), renderSlot(_ctx.$slots, "default")])
123
- ]);
151
+ }, null, 8, ["modelValue"])])) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
152
+ ]), unref(actionConfig).length > 0 ? (openBlock(), createElementBlock("div", _hoisted_5, [(openBlock(true), createElementBlock(Fragment, null, renderList(unref(actionConfig), (action) => {
153
+ return openBlock(), createBlock(RuiButton_default, {
154
+ key: action.id,
155
+ variant: "text",
156
+ size: "sm",
157
+ color: "primary",
158
+ "data-id": `action-${action.id}`,
159
+ onClick: ($event) => action.handler()
160
+ }, {
161
+ prepend: withCtx(() => [createVNode(RuiIcon_default, {
162
+ name: action.icon,
163
+ size: "16"
164
+ }, null, 8, ["name"])]),
165
+ default: withCtx(() => [createTextVNode(" " + toDisplayString(action.label), 1)]),
166
+ _: 2
167
+ }, 1032, ["data-id", "onClick"]);
168
+ }), 128))])) : createCommentVNode("", true)]);
124
169
  };
125
170
  }
126
171
  });
@@ -1 +1 @@
1
- {"version":3,"file":"RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/date-time-picker/RuiDateTimePickerMenu.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { TimeAccuracy } from '@/consts/time-accuracy';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCalendar from '@/components/calendar/RuiCalendar.vue';\nimport RuiTimezoneSelect from '@/components/date-time-picker/RuiTimezoneSelect.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTimePicker, { type TimePickerSelection } from '@/components/time-picker/RuiTimePicker.vue';\n\ndefineOptions({\n name: 'RuiDateTimePickerMenu',\n});\n\nconst selectedDate = defineModel<Date | undefined>('selectedDate', { required: true });\nconst selectedTime = defineModel<Date | undefined>('selectedTime', { required: true });\nconst selectedHour = defineModel<number | undefined>('selectedHour', { required: true });\nconst selectedMinute = defineModel<number | undefined>('selectedMinute', { required: true });\nconst selectedSecond = defineModel<number | undefined>('selectedSecond', { required: true });\nconst selectedMillisecond = defineModel<number | undefined>('selectedMillisecond', { required: true });\nconst timeSelection = defineModel<TimePickerSelection>('timeSelection', { required: true });\nconst selectedTimezone = defineModel<string | undefined>('selectedTimezone', { required: true });\nconst calendarMenuOpen = defineModel<boolean>('calendarMenuOpen', { required: true });\n\ndefineProps<{\n accuracy: TimeAccuracy;\n maxDate?: Date | number;\n minDate?: Date | number;\n}>();\n\nconst emit = defineEmits<{\n 'set-now': [];\n}>();\n\ndefineSlots<{\n default: () => any;\n}>();\n\nfunction setNow(): void {\n emit('set-now');\n}\n</script>\n\n<template>\n <div class=\"flex divide-x divide-rui-grey-200 dark:divide-rui-grey-800\">\n <RuiCalendar\n v-model=\"selectedDate\"\n v-model:menu-open=\"calendarMenuOpen\"\n borderless\n :max-date=\"maxDate\"\n :min-date=\"minDate\"\n />\n <RuiTimePicker\n v-model=\"selectedTime\"\n v-model:hour=\"selectedHour\"\n v-model:minute=\"selectedMinute\"\n v-model:second=\"selectedSecond\"\n v-model:millisecond=\"selectedMillisecond\"\n v-model:selection=\"timeSelection\"\n :accuracy=\"accuracy\"\n borderless\n />\n <div>\n <div class=\"flex gap-3 p-4 pl-3\">\n <div class=\"flex flex-col justify-center items-center\">\n <RuiButton\n variant=\"text\"\n icon\n data-id=\"set-now\"\n @click=\"setNow()\"\n >\n <RuiIcon\n name=\"lu-clock\"\n size=\"18\"\n />\n </RuiButton>\n </div>\n <RuiTimezoneSelect\n v-model=\"selectedTimezone\"\n hide-details\n class=\"pt-0 pr-0\"\n />\n </div>\n <slot />\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAYA,MAAM,eAAe,SAA6B,SAAC,cAAkC;EACrF,MAAM,eAAe,SAA6B,SAAC,cAAkC;EACrF,MAAM,eAAe,SAA+B,SAAC,cAAkC;EACvF,MAAM,iBAAiB,SAA+B,SAAC,gBAAoC;EAC3F,MAAM,iBAAiB,SAA+B,SAAC,gBAAoC;EAC3F,MAAM,sBAAsB,SAA+B,SAAC,qBAAyC;EACrG,MAAM,gBAAgB,SAAgC,SAAC,eAAmC;EAC1F,MAAM,mBAAmB,SAA+B,SAAC,kBAAsC;EAC/F,MAAM,mBAAmB,SAAoB,SAAC,kBAAsC;EAQpF,MAAM,OAAO;EAQb,SAAS,SAAe;GACtB,KAAK,SAAS;EAChB;;uBAIE,mBAyCM,OAzCN,YAyCM;IAxCJ,YAME,qBAAA;iBALS,aAAA;+EAAY,QAAA;KACb,aAAW,iBAAA;iFAAgB,QAAA;KACnC,YAAA;KACC,YAAU,QAAA;KACV,YAAU,QAAA;;;;;;;IAEb,YASE,uBAAA;iBARS,aAAA;+EAAY,QAAA;KACb,MAAM,aAAA;yEAAY,QAAA;KAClB,QAAQ,eAAA;6EAAc,QAAA;KACtB,QAAQ,eAAA;6EAAc,QAAA;KACtB,aAAa,oBAAA;uFAAmB,QAAA;KAChC,WAAW,cAAA;+EAAa,QAAA;KAC/B,UAAU,QAAA;KACX,YAAA;;;;;;;;;;IAEF,mBAsBM,OAAA,MAAA,CArBJ,mBAmBM,OAnBN,YAmBM,CAlBJ,mBAYM,OAZN,YAYM,CAXJ,YAUY,mBAAA;KATV,SAAQ;KACR,MAAA;KACA,WAAQ;KACP,SAAK,OAAA,OAAA,OAAA,MAAA,WAAE,OAAM;;4BAKZ,CAHF,YAGE,iBAAA;MAFA,MAAK;MACL,MAAK;;;UAIX,YAIE,2BAAA;iBAHS,iBAAA;mFAAgB,QAAA;KACzB,gBAAA;KACA,OAAM;mCAGV,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js","names":["$slots"],"sources":["../../../src/components/date-time-picker/RuiDateTimePickerMenu.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { DateTimePickerAction } from '@/components/date-time-picker/types';\nimport type { TimeAccuracy } from '@/consts/time-accuracy';\nimport RuiButton from '@/components/buttons/button/RuiButton.vue';\nimport RuiCalendar from '@/components/calendar/RuiCalendar.vue';\nimport RuiTimezoneSelect from '@/components/date-time-picker/RuiTimezoneSelect.vue';\nimport RuiIcon from '@/components/icons/RuiIcon.vue';\nimport RuiTimePicker, { type TimePickerSelection } from '@/components/time-picker/RuiTimePicker.vue';\nimport { useRuiI8n } from '@/composables/use-rui-i18n';\nimport { RUI_I18N_KEYS } from '@/i18n/keys';\n\ndefineOptions({\n name: 'RuiDateTimePickerMenu',\n});\n\nconst selectedDate = defineModel<Date | undefined>('selectedDate', { required: true });\nconst selectedTime = defineModel<Date | undefined>('selectedTime', { required: true });\nconst selectedHour = defineModel<number | undefined>('selectedHour', { required: true });\nconst selectedMinute = defineModel<number | undefined>('selectedMinute', { required: true });\nconst selectedSecond = defineModel<number | undefined>('selectedSecond', { required: true });\nconst selectedMillisecond = defineModel<number | undefined>('selectedMillisecond', { required: true });\nconst timeSelection = defineModel<TimePickerSelection>('timeSelection', { required: true });\nconst selectedTimezone = defineModel<string | undefined>('selectedTimezone', { required: true });\nconst calendarMenuOpen = defineModel<boolean>('calendarMenuOpen', { required: true });\n\nconst { actions = [] } = defineProps<{\n accuracy: TimeAccuracy;\n actions?: DateTimePickerAction[];\n maxDate?: Date | number;\n minDate?: Date | number;\n showTimezone?: boolean;\n}>();\n\nconst emit = defineEmits<{\n 'set-now': [];\n 'set-today': [];\n 'clear': [];\n}>();\n\ndefineSlots<{\n default: () => any;\n}>();\n\nconst { t } = useRuiI8n();\n\nconst keys = RUI_I18N_KEYS.dateTimePicker;\n\ninterface ActionConfig {\n id: DateTimePickerAction;\n icon: 'lu-clock' | 'lu-calendar-days' | 'lu-x';\n label: string;\n handler: () => void;\n}\n\nconst actionConfig = computed<ActionConfig[]>(() => {\n const available: Record<DateTimePickerAction, ActionConfig> = {\n clear: {\n handler: () => emit('clear'),\n icon: 'lu-x',\n id: 'clear',\n label: t(keys.clear, 'Clear'),\n },\n now: {\n handler: () => emit('set-now'),\n icon: 'lu-clock',\n id: 'now',\n label: t(keys.now, 'Now'),\n },\n today: {\n handler: () => emit('set-today'),\n icon: 'lu-calendar-days',\n id: 'today',\n label: t(keys.today, 'Today'),\n },\n };\n\n return actions.map(action => available[action]).filter(Boolean);\n});\n</script>\n\n<template>\n <div class=\"flex flex-col\">\n <div class=\"flex divide-x divide-rui-grey-200 dark:divide-rui-grey-800\">\n <RuiCalendar\n v-model=\"selectedDate\"\n v-model:menu-open=\"calendarMenuOpen\"\n borderless\n :max-date=\"maxDate\"\n :min-date=\"minDate\"\n />\n <RuiTimePicker\n v-model=\"selectedTime\"\n v-model:hour=\"selectedHour\"\n v-model:minute=\"selectedMinute\"\n v-model:second=\"selectedSecond\"\n v-model:millisecond=\"selectedMillisecond\"\n v-model:selection=\"timeSelection\"\n :accuracy=\"accuracy\"\n borderless\n />\n <div v-if=\"showTimezone || $slots.default\">\n <div\n v-if=\"showTimezone\"\n class=\"p-4 pl-3\"\n >\n <RuiTimezoneSelect\n v-model=\"selectedTimezone\"\n data-id=\"timezone-select\"\n hide-details\n class=\"pt-0 pr-0\"\n />\n </div>\n <slot />\n </div>\n </div>\n <div\n v-if=\"actionConfig.length > 0\"\n data-id=\"actions\"\n class=\"flex justify-end gap-1 px-3 py-2 border-t border-rui-grey-200 dark:border-rui-grey-800\"\n >\n <RuiButton\n v-for=\"action in actionConfig\"\n :key=\"action.id\"\n variant=\"text\"\n size=\"sm\"\n color=\"primary\"\n :data-id=\"`action-${action.id}`\"\n @click=\"action.handler()\"\n >\n <template #prepend>\n <RuiIcon\n :name=\"action.icon\"\n size=\"16\"\n />\n </template>\n {{ action.label }}\n </RuiButton>\n </div>\n </div>\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAeA,MAAM,eAAe,SAA6B,SAAC,cAAkC;EACrF,MAAM,eAAe,SAA6B,SAAC,cAAkC;EACrF,MAAM,eAAe,SAA+B,SAAC,cAAkC;EACvF,MAAM,iBAAiB,SAA+B,SAAC,gBAAoC;EAC3F,MAAM,iBAAiB,SAA+B,SAAC,gBAAoC;EAC3F,MAAM,sBAAsB,SAA+B,SAAC,qBAAyC;EACrG,MAAM,gBAAgB,SAAgC,SAAC,eAAmC;EAC1F,MAAM,mBAAmB,SAA+B,SAAC,kBAAsC;EAC/F,MAAM,mBAAmB,SAAoB,SAAC,kBAAsC;EAUpF,MAAM,OAAO;EAUb,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,OAAO,cAAc;EAS3B,MAAM,eAAe,eAA+B;GAClD,MAAM,YAAwD;IAC5D,OAAO;KACL,eAAe,KAAK,OAAO;KAC3B,MAAM;KACN,IAAI;KACJ,OAAO,EAAE,KAAK,OAAO,OAAO;IAC9B;IACA,KAAK;KACH,eAAe,KAAK,SAAS;KAC7B,MAAM;KACN,IAAI;KACJ,OAAO,EAAE,KAAK,KAAK,KAAK;IAC1B;IACA,OAAO;KACL,eAAe,KAAK,WAAW;KAC/B,MAAM;KACN,IAAI;KACJ,OAAO,EAAE,KAAK,OAAO,OAAO;IAC9B;GACF;GAEA,OAAO,QAAA,QAAQ,KAAI,WAAU,UAAU,OAAO,CAAC,CAAC,OAAO,OAAO;EAChE,CAAC;;uBAIC,mBAyDM,OAzDN,YAyDM,CAxDJ,mBAgCM,OAhCN,YAgCM;IA/BJ,YAME,qBAAA;iBALS,aAAA;+EAAY,QAAA;KACb,aAAW,iBAAA;iFAAgB,QAAA;KACnC,YAAA;KACC,YAAU,QAAA;KACV,YAAU,QAAA;;;;;;;IAEb,YASE,uBAAA;iBARS,aAAA;+EAAY,QAAA;KACb,MAAM,aAAA;yEAAY,QAAA;KAClB,QAAQ,eAAA;6EAAc,QAAA;KACtB,QAAQ,eAAA;6EAAc,QAAA;KACtB,aAAa,oBAAA;uFAAmB,QAAA;KAChC,WAAW,cAAA;+EAAa,QAAA;KAC/B,UAAU,QAAA;KACX,YAAA;;;;;;;;;;IAES,QAAA,gBAAgBA,KAAAA,OAAO,WAAA,UAAA,GAAlC,mBAaM,OAAA,YAAA,CAXI,QAAA,gBAAA,UAAA,GADR,mBAUM,OAVN,YAUM,CANJ,YAKE,2BAAA;iBAJS,iBAAA;mFAAgB,QAAA;KACzB,WAAQ;KACR,gBAAA;KACA,OAAM;mEAGV,WAAQ,KAAA,QAAA,SAAA,CAAA,CAAA,KAAA,mBAAA,IAAA,IAAA;OAIJ,MAAA,YAAA,CAAY,CAAC,SAAM,KAAA,UAAA,GAD3B,mBAsBM,OAtBN,YAsBM,EAAA,UAAA,IAAA,GAjBJ,mBAgBY,UAAA,MAAA,WAfO,MAAA,YAAA,IAAV,WAAM;wBADf,YAgBY,mBAAA;KAdT,KAAK,OAAO;KACb,SAAQ;KACR,MAAK;KACL,OAAM;KACL,WAAO,UAAY,OAAO;KAC1B,UAAK,WAAE,OAAO,QAAO;;KAEX,SAAO,cAId,CAHF,YAGE,iBAAA;MAFC,MAAM,OAAO;MACd,MAAK;;4BAGT,CAAA,gBADW,MACX,gBAAG,OAAO,KAAK,GAAA,CAAA,CAAA,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTimezoneSelect.js","names":[],"sources":["../../../src/components/date-time-picker/RuiTimezoneSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AutoCompleteVariant } from '@/components/forms/auto-complete/auto-complete-styles';\nimport type { MenuProps } from '@/components/overlays/menu/RuiMenu.vue';\nimport { timezones } from '@/components/date-time-picker/timezones';\nimport RuiAutoComplete, { type RuiAutoCompleteClassNames } from '@/components/forms/auto-complete/RuiAutoComplete.vue';\n\nexport interface RuiTimezoneSelectProps {\n disabled?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n label?: string;\n variant?: AutoCompleteVariant;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n placeholder?: string;\n required?: boolean;\n classNames?: RuiAutoCompleteClassNames;\n menuOptions?: MenuProps;\n}\n\ndefineOptions({\n name: 'RuiTimezoneSelect',\n});\n\nconst modelValue = defineModel<string | undefined>({ required: true });\n\nconst {\n disabled = false,\n readOnly = false,\n dense = false,\n clearable = false,\n label = 'Timezone',\n variant = 'outlined',\n hint,\n errorMessages,\n successMessages,\n hideDetails = false,\n placeholder,\n required = false,\n classNames,\n menuOptions,\n} = defineProps<RuiTimezoneSelectProps>();\n\ninterface TimezoneOption {\n value: string;\n label: string;\n}\n\nconst options: TimezoneOption[] = timezones.map(value => ({\n value,\n label: value.replace(/_/g, ' '),\n}));\n</script>\n\n<template>\n <RuiAutoComplete\n v-model=\"modelValue\"\n key-attr=\"value\"\n text-attr=\"label\"\n auto-select-first\n :options=\"options\"\n :label=\"label\"\n :variant=\"variant\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :dense=\"dense\"\n :clearable=\"clearable\"\n :hint=\"hint\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hide-details=\"hideDetails\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :class-names=\"classNames\"\n :menu-options=\"menuOptions\"\n />\n</template>\n"],"mappings":""}
1
+ {"version":3,"file":"RuiTimezoneSelect.js","names":[],"sources":["../../../src/components/date-time-picker/RuiTimezoneSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AutoCompleteVariant } from '@/components/forms/auto-complete/auto-complete-styles';\nimport type { MenuProps } from '@/components/overlays/menu/RuiMenu.vue';\nimport { timezones } from '@/components/date-time-picker/timezones';\nimport RuiAutoComplete, { type RuiAutoCompleteClassNames } from '@/components/forms/auto-complete/RuiAutoComplete.vue';\nimport { useRuiI8n } from '@/composables/use-rui-i18n';\nimport { RUI_I18N_KEYS } from '@/i18n/keys';\n\nexport interface RuiTimezoneSelectProps {\n disabled?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n label?: string;\n variant?: AutoCompleteVariant;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n placeholder?: string;\n required?: boolean;\n classNames?: RuiAutoCompleteClassNames;\n menuOptions?: MenuProps;\n}\n\ndefineOptions({\n name: 'RuiTimezoneSelect',\n});\n\nconst modelValue = defineModel<string | undefined>({ required: true });\n\nconst {\n disabled = false,\n readOnly = false,\n dense = false,\n clearable = false,\n label,\n variant = 'outlined',\n hint,\n errorMessages,\n successMessages,\n hideDetails = false,\n placeholder,\n required = false,\n classNames,\n menuOptions,\n} = defineProps<RuiTimezoneSelectProps>();\n\nconst { t } = useRuiI8n();\n\nconst fieldLabel = computed<string>(() => label ?? t(RUI_I18N_KEYS.timezoneSelect.label, 'Timezone'));\n\ninterface TimezoneOption {\n value: string;\n label: string;\n}\n\nconst options: TimezoneOption[] = timezones.map(value => ({\n value,\n label: value.replace(/_/g, ' '),\n}));\n</script>\n\n<template>\n <RuiAutoComplete\n v-model=\"modelValue\"\n key-attr=\"value\"\n text-attr=\"label\"\n auto-select-first\n :options=\"options\"\n :label=\"fieldLabel\"\n :variant=\"variant\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :dense=\"dense\"\n :clearable=\"clearable\"\n :hint=\"hint\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hide-details=\"hideDetails\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :class-names=\"classNames\"\n :menu-options=\"menuOptions\"\n />\n</template>\n"],"mappings":""}
@@ -1,6 +1,8 @@
1
+ import { useRuiI8n } from "../../composables/use-rui-i18n.js";
1
2
  import { timezones } from "./timezones.js";
2
3
  import RuiAutoComplete_default from "../forms/auto-complete/RuiAutoComplete.js";
3
- import { createBlock, defineComponent, mergeModels, openBlock, unref, useModel } from "vue";
4
+ import { RUI_I18N_KEYS } from "../../i18n/keys.js";
5
+ import { computed, createBlock, defineComponent, mergeModels, openBlock, unref, useModel } from "vue";
4
6
  //#region src/components/date-time-picker/RuiTimezoneSelect.vue?vue&type=script&setup=true&lang.ts
5
7
  var RuiTimezoneSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
6
8
  name: "RuiTimezoneSelect",
@@ -22,7 +24,7 @@ var RuiTimezoneSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
22
24
  type: Boolean,
23
25
  default: false
24
26
  },
25
- label: { default: "Timezone" },
27
+ label: {},
26
28
  variant: { default: "outlined" },
27
29
  hint: {},
28
30
  errorMessages: {},
@@ -45,6 +47,8 @@ var RuiTimezoneSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
45
47
  emits: ["update:modelValue"],
46
48
  setup(__props) {
47
49
  const modelValue = useModel(__props, "modelValue");
50
+ const { t } = useRuiI8n();
51
+ const fieldLabel = computed(() => __props.label ?? t(RUI_I18N_KEYS.timezoneSelect.label, "Timezone"));
48
52
  const options = timezones.map((value) => ({
49
53
  value,
50
54
  label: value.replace(/_/g, " ")
@@ -57,7 +61,7 @@ var RuiTimezoneSelect_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*
57
61
  "text-attr": "label",
58
62
  "auto-select-first": "",
59
63
  options: unref(options),
60
- label: __props.label,
64
+ label: unref(fieldLabel),
61
65
  variant: __props.variant,
62
66
  disabled: __props.disabled,
63
67
  "read-only": __props.readOnly,
@@ -1 +1 @@
1
- {"version":3,"file":"RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/date-time-picker/RuiTimezoneSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AutoCompleteVariant } from '@/components/forms/auto-complete/auto-complete-styles';\nimport type { MenuProps } from '@/components/overlays/menu/RuiMenu.vue';\nimport { timezones } from '@/components/date-time-picker/timezones';\nimport RuiAutoComplete, { type RuiAutoCompleteClassNames } from '@/components/forms/auto-complete/RuiAutoComplete.vue';\n\nexport interface RuiTimezoneSelectProps {\n disabled?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n label?: string;\n variant?: AutoCompleteVariant;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n placeholder?: string;\n required?: boolean;\n classNames?: RuiAutoCompleteClassNames;\n menuOptions?: MenuProps;\n}\n\ndefineOptions({\n name: 'RuiTimezoneSelect',\n});\n\nconst modelValue = defineModel<string | undefined>({ required: true });\n\nconst {\n disabled = false,\n readOnly = false,\n dense = false,\n clearable = false,\n label = 'Timezone',\n variant = 'outlined',\n hint,\n errorMessages,\n successMessages,\n hideDetails = false,\n placeholder,\n required = false,\n classNames,\n menuOptions,\n} = defineProps<RuiTimezoneSelectProps>();\n\ninterface TimezoneOption {\n value: string;\n label: string;\n}\n\nconst options: TimezoneOption[] = timezones.map(value => ({\n value,\n label: value.replace(/_/g, ' '),\n}));\n</script>\n\n<template>\n <RuiAutoComplete\n v-model=\"modelValue\"\n key-attr=\"value\"\n text-attr=\"label\"\n auto-select-first\n :options=\"options\"\n :label=\"label\"\n :variant=\"variant\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :dense=\"dense\"\n :clearable=\"clearable\"\n :hint=\"hint\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hide-details=\"hideDetails\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :class-names=\"classNames\"\n :menu-options=\"menuOptions\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BA,MAAM,aAAa,SAA+B,SAAA,YAAmB;EAwBrE,MAAM,UAA4B,UAAU,KAAI,WAAU;GACxD;GACA,OAAO,MAAM,QAAQ,MAAM,GAAG;EAChC,EAAE;;uBAIA,YAoBE,yBAAA;gBAnBS,WAAA;4EAAU,QAAA;IACnB,YAAS;IACT,aAAU;IACV,qBAAA;IACC,SAAS,MAAA,OAAA;IACT,OAAO,QAAA;IACP,SAAS,QAAA;IACT,UAAU,QAAA;IACV,aAAW,QAAA;IACX,OAAO,QAAA;IACP,WAAW,QAAA;IACX,MAAM,QAAA;IACN,kBAAgB,QAAA;IAChB,oBAAkB,QAAA;IAClB,gBAAc,QAAA;IACd,aAAa,QAAA;IACb,UAAU,QAAA;IACV,eAAa,QAAA;IACb,gBAAc,QAAA"}
1
+ {"version":3,"file":"RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js","names":[],"sources":["../../../src/components/date-time-picker/RuiTimezoneSelect.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport type { AutoCompleteVariant } from '@/components/forms/auto-complete/auto-complete-styles';\nimport type { MenuProps } from '@/components/overlays/menu/RuiMenu.vue';\nimport { timezones } from '@/components/date-time-picker/timezones';\nimport RuiAutoComplete, { type RuiAutoCompleteClassNames } from '@/components/forms/auto-complete/RuiAutoComplete.vue';\nimport { useRuiI8n } from '@/composables/use-rui-i18n';\nimport { RUI_I18N_KEYS } from '@/i18n/keys';\n\nexport interface RuiTimezoneSelectProps {\n disabled?: boolean;\n readOnly?: boolean;\n dense?: boolean;\n clearable?: boolean;\n label?: string;\n variant?: AutoCompleteVariant;\n hint?: string;\n errorMessages?: string | string[];\n successMessages?: string | string[];\n hideDetails?: boolean;\n placeholder?: string;\n required?: boolean;\n classNames?: RuiAutoCompleteClassNames;\n menuOptions?: MenuProps;\n}\n\ndefineOptions({\n name: 'RuiTimezoneSelect',\n});\n\nconst modelValue = defineModel<string | undefined>({ required: true });\n\nconst {\n disabled = false,\n readOnly = false,\n dense = false,\n clearable = false,\n label,\n variant = 'outlined',\n hint,\n errorMessages,\n successMessages,\n hideDetails = false,\n placeholder,\n required = false,\n classNames,\n menuOptions,\n} = defineProps<RuiTimezoneSelectProps>();\n\nconst { t } = useRuiI8n();\n\nconst fieldLabel = computed<string>(() => label ?? t(RUI_I18N_KEYS.timezoneSelect.label, 'Timezone'));\n\ninterface TimezoneOption {\n value: string;\n label: string;\n}\n\nconst options: TimezoneOption[] = timezones.map(value => ({\n value,\n label: value.replace(/_/g, ' '),\n}));\n</script>\n\n<template>\n <RuiAutoComplete\n v-model=\"modelValue\"\n key-attr=\"value\"\n text-attr=\"label\"\n auto-select-first\n :options=\"options\"\n :label=\"fieldLabel\"\n :variant=\"variant\"\n :disabled=\"disabled\"\n :read-only=\"readOnly\"\n :dense=\"dense\"\n :clearable=\"clearable\"\n :hint=\"hint\"\n :error-messages=\"errorMessages\"\n :success-messages=\"successMessages\"\n :hide-details=\"hideDetails\"\n :placeholder=\"placeholder\"\n :required=\"required\"\n :class-names=\"classNames\"\n :menu-options=\"menuOptions\"\n />\n</template>\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6BA,MAAM,aAAa,SAA+B,SAAA,YAAmB;EAmBrE,MAAM,EAAE,MAAM,UAAU;EAExB,MAAM,aAAa,eAAuB,QAAA,SAAS,EAAE,cAAc,eAAe,OAAO,UAAU,CAAC;EAOpG,MAAM,UAA4B,UAAU,KAAI,WAAU;GACxD;GACA,OAAO,MAAM,QAAQ,MAAM,GAAG;EAChC,EAAE;;uBAIA,YAoBE,yBAAA;gBAnBS,WAAA;4EAAU,QAAA;IACnB,YAAS;IACT,aAAU;IACV,qBAAA;IACC,SAAS,MAAA,OAAA;IACT,OAAO,MAAA,UAAA;IACP,SAAS,QAAA;IACT,UAAU,QAAA;IACV,aAAW,QAAA;IACX,OAAO,QAAA;IACP,WAAW,QAAA;IACX,MAAM,QAAA;IACN,kBAAgB,QAAA;IAChB,oBAAkB,QAAA;IAClB,gBAAc,QAAA;IACd,aAAa,QAAA;IACb,UAAU,QAAA;IACV,eAAa,QAAA;IACb,gBAAc,QAAA"}
@@ -1,5 +1,33 @@
1
1
  import type { DateTimeSegmentType } from '../../components/date-time-picker/types.js';
2
2
  import type { TimeAccuracy } from '../../consts/time-accuracy.js';
3
+ import { type Dayjs } from 'dayjs';
3
4
  import '../../components/date-time-picker/dayjs-setup.js';
5
+ export interface SegmentValues {
6
+ year?: number;
7
+ month?: number;
8
+ day?: number;
9
+ hour?: number;
10
+ minute?: number;
11
+ second?: number;
12
+ millisecond?: number;
13
+ }
14
+ /**
15
+ * Builds a date from the segments that have been entered so far. Segments the
16
+ * accuracy does not expose are zeroed rather than inherited from the clock the
17
+ * base date started at, so a value cannot pick up a stray second.
18
+ */
19
+ export declare function buildDateTime(segments: SegmentValues, accuracy: TimeAccuracy, base?: Dayjs): Dayjs;
20
+ /**
21
+ * Turns a `minDate` / `maxDate` prop into a Date. An `epoch` picker states its
22
+ * bounds in whole seconds, so those are widened to milliseconds first.
23
+ */
24
+ export declare function resolveBound(bound: Date | number | undefined, epochSeconds: boolean): Date | undefined;
25
+ /**
26
+ * Pulls a date inside the allowed range. Used by the `now` and `today` actions,
27
+ * which have no partial state: typed input is left to diverge and explain
28
+ * itself through the error message instead, since clamping a keystroke would
29
+ * rewrite a year the moment its first digit landed below the minimum.
30
+ */
31
+ export declare function clampToBounds(date: Dayjs, min: Date, max?: Date): Dayjs;
4
32
  export declare function getClickPosition(event: MouseEvent, input: HTMLInputElement, useCaretPosition: boolean): number;
5
33
  export declare function parseAndSetDateValues(pastedText: string, dateFormat: string, accuracy: TimeAccuracy, setValue: (segment: DateTimeSegmentType, value?: number) => void): void;
@@ -2,6 +2,47 @@ import "./dayjs-setup.js";
2
2
  import { includeMilliseconds, includeSeconds } from "./utils.js";
3
3
  import dayjs from "dayjs";
4
4
  //#region src/components/date-time-picker/segment-utils.ts
5
+ /**
6
+ * Builds a date from the segments that have been entered so far. Segments the
7
+ * accuracy does not expose are zeroed rather than inherited from the clock the
8
+ * base date started at, so a value cannot pick up a stray second.
9
+ */
10
+ function buildDateTime(segments, accuracy, base = dayjs()) {
11
+ const { day, hour, millisecond, minute, month, second, year } = segments;
12
+ let dateTime = base;
13
+ if (year !== void 0) dateTime = dateTime.year(year);
14
+ if (month !== void 0) dateTime = dateTime.month(month - 1);
15
+ if (day !== void 0) dateTime = dateTime.date(Math.min(day, dateTime.daysInMonth()));
16
+ if (hour !== void 0) dateTime = dateTime.hour(hour);
17
+ if (minute !== void 0) dateTime = dateTime.minute(minute);
18
+ if (second !== void 0) dateTime = dateTime.second(second);
19
+ else if (!includeSeconds(accuracy)) dateTime = dateTime.second(0);
20
+ if (millisecond !== void 0) dateTime = dateTime.millisecond(millisecond);
21
+ else if (!includeMilliseconds(accuracy)) dateTime = dateTime.millisecond(0);
22
+ return dateTime;
23
+ }
24
+ var MILLISECONDS = 1e3;
25
+ /**
26
+ * Turns a `minDate` / `maxDate` prop into a Date. An `epoch` picker states its
27
+ * bounds in whole seconds, so those are widened to milliseconds first.
28
+ */
29
+ function resolveBound(bound, epochSeconds) {
30
+ if (bound === void 0) return;
31
+ if (epochSeconds && typeof bound === "number") return /* @__PURE__ */ new Date(bound * MILLISECONDS);
32
+ return new Date(bound);
33
+ }
34
+ /**
35
+ * Pulls a date inside the allowed range. Used by the `now` and `today` actions,
36
+ * which have no partial state: typed input is left to diverge and explain
37
+ * itself through the error message instead, since clamping a keystroke would
38
+ * rewrite a year the moment its first digit landed below the minimum.
39
+ */
40
+ function clampToBounds(date, min, max) {
41
+ const lower = dayjs(min);
42
+ if (date.isBefore(lower)) return lower;
43
+ if (max && date.isAfter(max)) return dayjs(max);
44
+ return date;
45
+ }
5
46
  function getClickPosition(event, input, useCaretPosition) {
6
47
  const fallback = input.selectionStart ?? 0;
7
48
  if (!useCaretPosition) return fallback;
@@ -24,6 +65,6 @@ function parseAndSetDateValues(pastedText, dateFormat, accuracy, setValue) {
24
65
  } catch {}
25
66
  }
26
67
  //#endregion
27
- export { getClickPosition, parseAndSetDateValues };
68
+ export { buildDateTime, clampToBounds, getClickPosition, parseAndSetDateValues, resolveBound };
28
69
 
29
70
  //# sourceMappingURL=segment-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"segment-utils.js","names":[],"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"],"mappings":";;;;AAOA,SAAgB,iBACd,OACA,OACA,kBACQ;CACR,MAAM,WAAW,MAAM,kBAAkB;CACzC,IAAI,CAAC,kBACH,OAAO;CACT,MAAM,WAAW,SAAS,yBAAyB,MAAM,SAAS,MAAM,OAAO;CAC/E,IAAI,UACF,OAAO,SAAS;CAClB,OAAO,SAAS,sBAAsB,MAAM,SAAS,MAAM,OAAO,CAAC,EAAE,eAAe;AACtF;AAEA,SAAgB,sBACd,YACA,YACA,UACA,UACM;CACN,IAAI;EACF,MAAM,aAAa,MAAM,YAAY,UAAU;EAE/C,IAAI,CAAC,WAAW,QAAQ,GACtB;EAGF,MAAM,OAAO,WAAW,OAAO;EAC/B,SAAS,QAAQ,KAAK,YAAY,CAAC;EACnC,SAAS,MAAM,KAAK,SAAS,IAAI,CAAC;EAClC,SAAS,MAAM,KAAK,QAAQ,CAAC;EAC7B,SAAS,MAAM,KAAK,SAAS,CAAC;EAC9B,SAAS,MAAM,KAAK,WAAW,CAAC;EAChC,IAAI,eAAe,QAAQ,GACzB,SAAS,MAAM,KAAK,WAAW,CAAC;EAElC,IAAI,oBAAoB,QAAQ,GAC9B,SAAS,OAAO,KAAK,gBAAgB,CAAC;CAE1C,QACM,CAEN;AACF"}
1
+ {"version":3,"file":"segment-utils.js","names":[],"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, { type Dayjs } from 'dayjs';\nimport { includeMilliseconds, includeSeconds } from '@/components/date-time-picker/utils';\n\nimport '@/components/date-time-picker/dayjs-setup';\n\nexport interface SegmentValues {\n year?: number;\n month?: number;\n day?: number;\n hour?: number;\n minute?: number;\n second?: number;\n millisecond?: number;\n}\n\n/**\n * Builds a date from the segments that have been entered so far. Segments the\n * accuracy does not expose are zeroed rather than inherited from the clock the\n * base date started at, so a value cannot pick up a stray second.\n */\nexport function buildDateTime(segments: SegmentValues, accuracy: TimeAccuracy, base: Dayjs = dayjs()): Dayjs {\n const { day, hour, millisecond, minute, month, second, year } = segments;\n let dateTime = base;\n\n if (year !== undefined)\n dateTime = dateTime.year(year);\n\n if (month !== undefined)\n dateTime = dateTime.month(month - 1);\n\n if (day !== undefined)\n dateTime = dateTime.date(Math.min(day, dateTime.daysInMonth()));\n\n if (hour !== undefined)\n dateTime = dateTime.hour(hour);\n\n if (minute !== undefined)\n dateTime = dateTime.minute(minute);\n\n if (second !== undefined)\n dateTime = dateTime.second(second);\n else if (!includeSeconds(accuracy))\n dateTime = dateTime.second(0);\n\n if (millisecond !== undefined)\n dateTime = dateTime.millisecond(millisecond);\n else if (!includeMilliseconds(accuracy))\n dateTime = dateTime.millisecond(0);\n\n return dateTime;\n}\n\nconst MILLISECONDS = 1000;\n\n/**\n * Turns a `minDate` / `maxDate` prop into a Date. An `epoch` picker states its\n * bounds in whole seconds, so those are widened to milliseconds first.\n */\nexport function resolveBound(bound: Date | number | undefined, epochSeconds: boolean): Date | undefined {\n if (bound === undefined) {\n return undefined;\n }\n\n if (epochSeconds && typeof bound === 'number') {\n return new Date(bound * MILLISECONDS);\n }\n\n return new Date(bound);\n}\n\n/**\n * Pulls a date inside the allowed range. Used by the `now` and `today` actions,\n * which have no partial state: typed input is left to diverge and explain\n * itself through the error message instead, since clamping a keystroke would\n * rewrite a year the moment its first digit landed below the minimum.\n */\nexport function clampToBounds(date: Dayjs, min: Date, max?: Date): Dayjs {\n const lower = dayjs(min);\n if (date.isBefore(lower)) {\n return lower;\n }\n\n if (max && date.isAfter(max)) {\n return dayjs(max);\n }\n\n return date;\n}\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"],"mappings":";;;;;;;;;AAsBA,SAAgB,cAAc,UAAyB,UAAwB,OAAc,MAAM,GAAU;CAC3G,MAAM,EAAE,KAAK,MAAM,aAAa,QAAQ,OAAO,QAAQ,SAAS;CAChE,IAAI,WAAW;CAEf,IAAI,SAAS,KAAA,GACX,WAAW,SAAS,KAAK,IAAI;CAE/B,IAAI,UAAU,KAAA,GACZ,WAAW,SAAS,MAAM,QAAQ,CAAC;CAErC,IAAI,QAAQ,KAAA,GACV,WAAW,SAAS,KAAK,KAAK,IAAI,KAAK,SAAS,YAAY,CAAC,CAAC;CAEhE,IAAI,SAAS,KAAA,GACX,WAAW,SAAS,KAAK,IAAI;CAE/B,IAAI,WAAW,KAAA,GACb,WAAW,SAAS,OAAO,MAAM;CAEnC,IAAI,WAAW,KAAA,GACb,WAAW,SAAS,OAAO,MAAM;MAC9B,IAAI,CAAC,eAAe,QAAQ,GAC/B,WAAW,SAAS,OAAO,CAAC;CAE9B,IAAI,gBAAgB,KAAA,GAClB,WAAW,SAAS,YAAY,WAAW;MACxC,IAAI,CAAC,oBAAoB,QAAQ,GACpC,WAAW,SAAS,YAAY,CAAC;CAEnC,OAAO;AACT;AAEA,IAAM,eAAe;;;;;AAMrB,SAAgB,aAAa,OAAkC,cAAyC;CACtG,IAAI,UAAU,KAAA,GACZ;CAGF,IAAI,gBAAgB,OAAO,UAAU,UACnC,uBAAO,IAAI,KAAK,QAAQ,YAAY;CAGtC,OAAO,IAAI,KAAK,KAAK;AACvB;;;;;;;AAQA,SAAgB,cAAc,MAAa,KAAW,KAAmB;CACvE,MAAM,QAAQ,MAAM,GAAG;CACvB,IAAI,KAAK,SAAS,KAAK,GACrB,OAAO;CAGT,IAAI,OAAO,KAAK,QAAQ,GAAG,GACzB,OAAO,MAAM,GAAG;CAGlB,OAAO;AACT;AAEA,SAAgB,iBACd,OACA,OACA,kBACQ;CACR,MAAM,WAAW,MAAM,kBAAkB;CACzC,IAAI,CAAC,kBACH,OAAO;CACT,MAAM,WAAW,SAAS,yBAAyB,MAAM,SAAS,MAAM,OAAO;CAC/E,IAAI,UACF,OAAO,SAAS;CAClB,OAAO,SAAS,sBAAsB,MAAM,SAAS,MAAM,OAAO,CAAC,EAAE,eAAe;AACtF;AAEA,SAAgB,sBACd,YACA,YACA,UACA,UACM;CACN,IAAI;EACF,MAAM,aAAa,MAAM,YAAY,UAAU;EAE/C,IAAI,CAAC,WAAW,QAAQ,GACtB;EAGF,MAAM,OAAO,WAAW,OAAO;EAC/B,SAAS,QAAQ,KAAK,YAAY,CAAC;EACnC,SAAS,MAAM,KAAK,SAAS,IAAI,CAAC;EAClC,SAAS,MAAM,KAAK,QAAQ,CAAC;EAC7B,SAAS,MAAM,KAAK,SAAS,CAAC;EAC9B,SAAS,MAAM,KAAK,WAAW,CAAC;EAChC,IAAI,eAAe,QAAQ,GACzB,SAAS,MAAM,KAAK,WAAW,CAAC;EAElC,IAAI,oBAAoB,QAAQ,GAC9B,SAAS,OAAO,KAAK,gBAAgB,CAAC;CAE1C,QACM,CAEN;AACF"}
@@ -3,3 +3,5 @@ export declare const DATE_TIME_SEGMENT_TYPES: readonly ["DD", "MM", "YYYY", "HH"
3
3
  export type DateTimeSegmentType = typeof DATE_TIME_SEGMENT_TYPES[number];
4
4
  export declare function isDateTimeSegmentType(value: string): value is DateTimeSegmentType;
5
5
  export type SegmentData = Record<DateTimeSegmentType, Ref<number | undefined>>;
6
+ export declare const DATE_TIME_PICKER_ACTIONS: readonly ["now", "today", "clear"];
7
+ export type DateTimePickerAction = typeof DATE_TIME_PICKER_ACTIONS[number];
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../src/components/date-time-picker/types.ts"],"sourcesContent":["import type { Ref } from 'vue';\n\nexport const DATE_TIME_SEGMENT_TYPES = [\n 'DD',\n 'MM',\n 'YYYY',\n 'HH',\n 'mm',\n 'ss',\n 'SSS',\n] as const;\n\nexport type DateTimeSegmentType = typeof DATE_TIME_SEGMENT_TYPES[number];\n\nexport function isDateTimeSegmentType(value: string): value is DateTimeSegmentType {\n return (DATE_TIME_SEGMENT_TYPES as readonly string[]).includes(value);\n}\n\nexport type SegmentData = Record<DateTimeSegmentType, Ref<number | undefined>>;\n"],"mappings":";AAEA,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,SAAgB,sBAAsB,OAA6C;CACjF,OAAQ,wBAA8C,SAAS,KAAK;AACtE"}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../src/components/date-time-picker/types.ts"],"sourcesContent":["import type { Ref } from 'vue';\n\nexport const DATE_TIME_SEGMENT_TYPES = [\n 'DD',\n 'MM',\n 'YYYY',\n 'HH',\n 'mm',\n 'ss',\n 'SSS',\n] as const;\n\nexport type DateTimeSegmentType = typeof DATE_TIME_SEGMENT_TYPES[number];\n\nexport function isDateTimeSegmentType(value: string): value is DateTimeSegmentType {\n return (DATE_TIME_SEGMENT_TYPES as readonly string[]).includes(value);\n}\n\nexport type SegmentData = Record<DateTimeSegmentType, Ref<number | undefined>>;\n\nexport const DATE_TIME_PICKER_ACTIONS = ['now', 'today', 'clear'] as const;\n\nexport type DateTimePickerAction = typeof DATE_TIME_PICKER_ACTIONS[number];\n"],"mappings":";AAEA,IAAa,0BAA0B;CACrC;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAIA,SAAgB,sBAAsB,OAA6C;CACjF,OAAQ,wBAA8C,SAAS,KAAK;AACtE"}
@@ -12,6 +12,11 @@ interface DateTimeSelectionOptions<T extends DateTimeModelType> {
12
12
  minDate: Date | number | undefined;
13
13
  maxDate: Date | number | 'now' | undefined;
14
14
  allowEmpty: boolean;
15
+ /**
16
+ * The field's own format, so a bound named in an error message is written the
17
+ * same way round as the value the user is looking at.
18
+ */
19
+ dateFormat: Ref<string>;
15
20
  }
16
21
  interface DateTimeSelectionReturn {
17
22
  selectedYear: Ref<number | undefined>;
@@ -32,6 +37,7 @@ interface DateTimeSelectionReturn {
32
37
  maxAllowedDate: ComputedRef<Date | undefined>;
33
38
  getDateTime: () => Dayjs;
34
39
  setNow: () => void;
40
+ setToday: () => void;
35
41
  clear: () => void;
36
42
  isDateValid: (date: Dayjs) => boolean;
37
43
  }
@@ -1,7 +1,8 @@
1
1
  import { useRuiI8n } from "../../composables/use-rui-i18n.js";
2
- import "./dayjs-setup.js";
3
- import { guessTimezone, includeMilliseconds, includeSeconds } from "./utils.js";
4
2
  import { RUI_I18N_KEYS } from "../../i18n/keys.js";
3
+ import "./dayjs-setup.js";
4
+ import { formatWallClock, guessTimezone, includeMilliseconds, includeSeconds } from "./utils.js";
5
+ import { buildDateTime, clampToBounds, resolveBound } from "./segment-utils.js";
5
6
  import { computed, nextTick, onMounted, ref, watch } from "vue";
6
7
  import { isDefined, watchIgnorable } from "@vueuse/core";
7
8
  import { get as get$1, set as set$1 } from "@vueuse/shared";
@@ -9,7 +10,7 @@ import dayjs from "dayjs";
9
10
  //#region src/components/date-time-picker/use-date-time-selection.ts
10
11
  var MILLISECONDS = 1e3;
11
12
  function useDateTimeSelection(options) {
12
- const { accuracy, allowEmpty, maxDate, minDate, modelValue, type } = options;
13
+ const { accuracy, allowEmpty, dateFormat, maxDate, minDate, modelValue, type } = options;
13
14
  const { t } = useRuiI8n();
14
15
  const selectedYear = ref();
15
16
  const selectedMonth = ref();
@@ -21,17 +22,9 @@ function useDateTimeSelection(options) {
21
22
  const selectedTimezone = ref(guessTimezone());
22
23
  const internalErrorMessages = ref([]);
23
24
  const now = ref(dayjs.tz(void 0, guessTimezone()));
24
- const minAllowedDate = computed(() => {
25
- if (minDate === void 0) return new Date(1970, 0, 1);
26
- if (type === "epoch" && typeof minDate === "number") return /* @__PURE__ */ new Date(minDate * MILLISECONDS);
27
- return new Date(minDate);
28
- });
29
- const maxAllowedDate = computed(() => {
30
- if (maxDate === void 0) return;
31
- if (maxDate === "now") return get$1(now).toDate();
32
- if (type === "epoch" && typeof maxDate === "number") return /* @__PURE__ */ new Date(maxDate * MILLISECONDS);
33
- return new Date(maxDate);
34
- });
25
+ const epochSeconds = type === "epoch";
26
+ const minAllowedDate = computed(() => resolveBound(minDate, epochSeconds) ?? new Date(1970, 0, 1));
27
+ const maxAllowedDate = computed(() => maxDate === "now" ? get$1(now).toDate() : resolveBound(maxDate, epochSeconds));
35
28
  const segmentData = {
36
29
  DD: selectedDay,
37
30
  HH: selectedHour,
@@ -73,32 +66,39 @@ function useDateTimeSelection(options) {
73
66
  });
74
67
  const valueSet = computed(() => isDefined(selectedDate) && isDefined(selectedTime));
75
68
  function getDateTime() {
76
- let dateTime = dayjs();
77
- if (isDefined(selectedYear)) dateTime = dateTime.year(get$1(selectedYear));
78
- if (isDefined(selectedMonth)) dateTime = dateTime.month(get$1(selectedMonth) - 1);
79
- if (isDefined(selectedDay)) {
80
- const daysInMonth = dateTime.daysInMonth();
81
- const day = Math.min(get$1(selectedDay), daysInMonth);
82
- dateTime = dateTime.date(day);
83
- }
84
- if (isDefined(selectedHour)) dateTime = dateTime.hour(get$1(selectedHour));
85
- if (isDefined(selectedMinute)) dateTime = dateTime.minute(get$1(selectedMinute));
86
- if (isDefined(selectedSecond)) dateTime = dateTime.second(get$1(selectedSecond));
87
- if (isDefined(selectedMillisecond)) dateTime = dateTime.millisecond(get$1(selectedMillisecond));
88
- return dateTime;
69
+ return buildDateTime({
70
+ day: get$1(selectedDay),
71
+ hour: get$1(selectedHour),
72
+ millisecond: get$1(selectedMillisecond),
73
+ minute: get$1(selectedMinute),
74
+ month: get$1(selectedMonth),
75
+ second: get$1(selectedSecond),
76
+ year: get$1(selectedYear)
77
+ }, accuracy);
78
+ }
79
+ /**
80
+ * Writes a bound the way the field writes its value. `toLocaleDateString()`
81
+ * followed the browser locale and ignored the picker's own format, so a
82
+ * day-first field could report its limit month-first, and it dropped the time
83
+ * entirely, which left a mid-day bound unable to explain itself.
84
+ */
85
+ function formatBound(bound) {
86
+ return dayjs(bound).format(get$1(dateFormat));
89
87
  }
90
88
  function isDateValid(date) {
91
89
  const min = get$1(minAllowedDate);
92
90
  const max = get$1(maxAllowedDate);
93
91
  set$1(internalErrorMessages, []);
94
92
  if (min && date.isBefore(min)) {
95
- const errorMessage = t(RUI_I18N_KEYS.dateTimePicker.dateBeforeMin, { date: min.toLocaleDateString() }, `Date cannot be before ${min.toLocaleDateString()}`);
93
+ const formatted = formatBound(min);
94
+ const errorMessage = t(RUI_I18N_KEYS.dateTimePicker.dateBeforeMin, { date: formatted }, `Date cannot be before ${formatted}`);
96
95
  set$1(internalErrorMessages, [...get$1(internalErrorMessages), errorMessage]);
97
96
  return false;
98
97
  }
99
98
  if (max && date.isAfter(max)) {
99
+ const formatted = formatBound(max);
100
100
  const nowError = t(RUI_I18N_KEYS.dateTimePicker.dateInFuture, "The selected date cannot be in the future");
101
- const maxError = t(RUI_I18N_KEYS.dateTimePicker.dateAfterMax, { date: max.toLocaleDateString() }, `Date cannot be after ${max.toLocaleDateString()}`);
101
+ const maxError = t(RUI_I18N_KEYS.dateTimePicker.dateAfterMax, { date: formatted }, `Date cannot be after ${formatted}`);
102
102
  const errorMessage = maxDate === "now" ? nowError : maxError;
103
103
  set$1(internalErrorMessages, [...get$1(internalErrorMessages), errorMessage]);
104
104
  return false;
@@ -108,20 +108,15 @@ function useDateTimeSelection(options) {
108
108
  function emitUpdate(updatedModel) {
109
109
  set$1(modelValue, {
110
110
  "date": () => updatedModel.toDate(),
111
- "epoch": () => updatedModel.valueOf() / MILLISECONDS,
111
+ "epoch": () => Math.floor(updatedModel.valueOf() / MILLISECONDS),
112
112
  "epoch-ms": () => updatedModel.valueOf()
113
113
  }[type]());
114
114
  }
115
115
  function updateModelValue() {
116
116
  if (!isDefined(selectedDate) || !isDefined(selectedTime)) return;
117
- if (!(isDefined(selectedDate) && isDefined(selectedTime))) set$1(modelValue, void 0);
118
- else {
119
- const date = get$1(selectedDate);
120
- const time = get$1(selectedTime);
121
- const updatedModel = dayjs.tz(isDefined(modelValue) ? get$1(modelValue) : void 0, get$1(selectedTimezone)).year(date.getFullYear()).month(date.getMonth()).date(date.getDate()).hour(time.getHours()).minute(time.getMinutes()).second(includeSeconds(accuracy) ? time.getSeconds() : 0).millisecond(includeMilliseconds(accuracy) ? time.getMilliseconds() : 0);
122
- if (!isDateValid(updatedModel)) return;
123
- emitUpdate(updatedModel);
124
- }
117
+ const updatedModel = dayjs.tz(formatWallClock(get$1(selectedDate), get$1(selectedTime), accuracy), get$1(selectedTimezone));
118
+ if (!isDateValid(updatedModel)) return;
119
+ emitUpdate(updatedModel);
125
120
  }
126
121
  function clear() {
127
122
  set$1(internalErrorMessages, []);
@@ -134,10 +129,10 @@ function useDateTimeSelection(options) {
134
129
  set$1(selectedMillisecond, void 0);
135
130
  set$1(modelValue, void 0);
136
131
  }
137
- function setNow() {
138
- set$1(internalErrorMessages, []);
139
- const date = dayjs();
140
- set$1(now, date);
132
+ function clampToAllowed(date) {
133
+ return clampToBounds(date, get$1(minAllowedDate), get$1(maxAllowedDate));
134
+ }
135
+ function applySegments(date) {
141
136
  set$1(selectedYear, date.year());
142
137
  set$1(selectedMonth, date.month() + 1);
143
138
  set$1(selectedDay, date.date());
@@ -145,6 +140,33 @@ function useDateTimeSelection(options) {
145
140
  set$1(selectedMinute, date.minute());
146
141
  set$1(selectedSecond, includeSeconds(accuracy) ? date.second() : 0);
147
142
  set$1(selectedMillisecond, includeMilliseconds(accuracy) ? date.millisecond() : 0);
143
+ }
144
+ function setNow() {
145
+ set$1(internalErrorMessages, []);
146
+ const date = dayjs();
147
+ set$1(now, date);
148
+ applySegments(clampToAllowed(date));
149
+ nextTick(() => {
150
+ updateModelValue();
151
+ });
152
+ }
153
+ /**
154
+ * Moves the date part to today and leaves the time part alone, so a picked
155
+ * time survives. Falls back to midnight when no time has been entered yet.
156
+ */
157
+ function setToday() {
158
+ set$1(internalErrorMessages, []);
159
+ const date = dayjs();
160
+ set$1(now, date);
161
+ applySegments(clampToAllowed(buildDateTime({
162
+ day: date.date(),
163
+ hour: get$1(selectedHour) ?? 0,
164
+ millisecond: get$1(selectedMillisecond) ?? 0,
165
+ minute: get$1(selectedMinute) ?? 0,
166
+ month: date.month() + 1,
167
+ second: get$1(selectedSecond) ?? 0,
168
+ year: date.year()
169
+ }, accuracy, date)));
148
170
  nextTick(() => {
149
171
  updateModelValue();
150
172
  });
@@ -218,6 +240,7 @@ function useDateTimeSelection(options) {
218
240
  selectedTimezone,
219
241
  selectedYear,
220
242
  setNow,
243
+ setToday,
221
244
  valueSet
222
245
  };
223
246
  }