@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.
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js +1 -1
- package/dist/components/avatars/RuiAvatar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/buttons/button/RuiButton.vue.d.ts +1 -1
- package/dist/components/buttons/button-group/RuiButtonGroup.vue.d.ts +1 -1
- package/dist/components/calendar/RuiCalendar.js.map +1 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js +3 -1
- package/dist/components/calendar/RuiCalendar.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.js.map +1 -1
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js +121 -25
- package/dist/components/calendar/RuiCalendarGrid.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js +11 -4
- package/dist/components/calendar/RuiCalendarMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue.d.ts +23 -1
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js +136 -24
- package/dist/components/date-time-picker/RuiDateTimePicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.js.map +1 -1
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue.d.ts +7 -0
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js +70 -25
- package/dist/components/date-time-picker/RuiDateTimePickerMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/RuiTimezoneSelect.js.map +1 -1
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js +7 -3
- package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/date-time-picker/segment-utils.d.ts +28 -0
- package/dist/components/date-time-picker/segment-utils.js +42 -1
- package/dist/components/date-time-picker/segment-utils.js.map +1 -1
- package/dist/components/date-time-picker/types.d.ts +2 -0
- package/dist/components/date-time-picker/types.js.map +1 -1
- package/dist/components/date-time-picker/use-date-time-selection.d.ts +6 -0
- package/dist/components/date-time-picker/use-date-time-selection.js +65 -42
- package/dist/components/date-time-picker/use-date-time-selection.js.map +1 -1
- package/dist/components/date-time-picker/use-keyboard-handler.js +4 -3
- package/dist/components/date-time-picker/use-keyboard-handler.js.map +1 -1
- package/dist/components/date-time-picker/utils.d.ts +5 -0
- package/dist/components/date-time-picker/utils.js +12 -1
- package/dist/components/date-time-picker/utils.js.map +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue.d.ts +1 -1
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js +2 -5
- package/dist/components/forms/auto-complete/RuiAutoComplete.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue.d.ts +1 -1
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js +3 -2
- package/dist/components/forms/category-picker/RuiCategoryPicker.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/checkbox/RuiCheckbox.vue.d.ts +1 -1
- package/dist/components/forms/checkbox/checkbox-group/RuiCheckboxGroup.vue.d.ts +1 -1
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/forms/file-upload/RuiFileUpload.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/radio-button/radio/RuiRadio.vue.d.ts +1 -1
- package/dist/components/forms/radio-button/radio-group/RuiRadioGroup.vue.d.ts +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue.d.ts +1 -1
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js +2 -1
- package/dist/components/forms/select/RuiMenuSelect.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/text-area/RuiTextArea.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js +2 -2
- package/dist/components/forms/text-field/RuiTextField.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/index.d.ts +2 -2
- package/dist/components/overlays/menu/RuiMenu.js.map +1 -1
- package/dist/components/overlays/menu/RuiMenu.vue.d.ts +12 -0
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js +11 -5
- package/dist/components/overlays/menu/RuiMenu.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/RuiDataTable.vue.d.ts +1 -1
- package/dist/components/tables/RuiTableHead.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableBody.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js +2 -8
- package/dist/components/tables/data-table/RuiDataTableBody.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/data-table/RuiDataTableCell.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableExpandedRow.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableGroupRow.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableMobileSort.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.vue.d.ts +1 -1
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js +1 -2
- package/dist/components/tables/data-table/RuiDataTableRow.vue_vue_type_script_setup_true_lang.js.map +1 -1
- package/dist/components/tables/use-pagination-navigation.js.map +1 -1
- package/dist/components/tabs/tab-items/RuiTabItems.vue.d.ts +1 -1
- package/dist/components/tabs/tabs/use-tab-scroll.js +2 -1
- package/dist/components/tabs/tabs/use-tab-scroll.js.map +1 -1
- package/dist/composables/forms/auto-complete/search.d.ts +1 -2
- package/dist/composables/forms/auto-complete/search.js.map +1 -1
- package/dist/composables/forms/auto-complete/value.d.ts +1 -2
- package/dist/composables/forms/auto-complete/value.js.map +1 -1
- package/dist/i18n/keys.d.ts +10 -0
- package/dist/i18n/keys.js +15 -5
- package/dist/i18n/keys.js.map +1 -1
- package/dist/icons/icons_1.d.ts +1 -1
- package/dist/icons/icons_1.js +25 -22
- package/dist/icons/icons_1.js.map +1 -1
- package/dist/icons/icons_2.d.ts +7 -7
- package/dist/icons/icons_2.js +126 -92
- package/dist/icons/icons_2.js.map +1 -1
- package/dist/icons/icons_3.d.ts +12 -12
- package/dist/icons/icons_3.js +119 -177
- package/dist/icons/icons_3.js.map +1 -1
- package/dist/icons/icons_4.d.ts +26 -26
- package/dist/icons/icons_4.js +320 -285
- package/dist/icons/icons_4.js.map +1 -1
- package/dist/icons/icons_5.d.ts +13 -1
- package/dist/icons/icons_5.js +149 -9
- package/dist/icons/icons_5.js.map +1 -1
- package/dist/icons/index.d.ts +1 -1
- package/dist/icons/index.js +34 -22
- package/dist/icons/index.js.map +1 -1
- package/dist/index.js +7 -7
- package/dist/style.css +12 -756
- package/dist/web-types.json +85 -10
- 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
|
|
9
|
-
var _hoisted_2 = { class: "flex
|
|
10
|
-
var _hoisted_3 = {
|
|
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([
|
|
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
|
-
|
|
64
|
-
|
|
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
|
-
|
|
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[
|
|
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\
|
|
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
|
|
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":""}
|
package/dist/components/date-time-picker/RuiTimezoneSelect.vue_vue_type_script_setup_true_lang.js
CHANGED
|
@@ -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 {
|
|
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: {
|
|
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:
|
|
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
|
|
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":"
|
|
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
|
|
25
|
-
|
|
26
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
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
|
|
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:
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
}
|