support pasting date time into the date-time picker on the desktop version

This commit is contained in:
MaysWind
2025-10-09 21:38:35 +08:00
parent e88491268b
commit 5692bec216
2 changed files with 36 additions and 2 deletions
+31 -2
View File
@@ -6,6 +6,7 @@
:label="label"
:menu-props="{ contentClass: 'date-time-select-menu' }"
v-model="dateTime"
@paste="onPaste"
>
<template #selection>
<span class="text-truncate cursor-pointer">{{ displayTime }}</span>
@@ -86,14 +87,19 @@ import { type TimePickerValue, useDateTimeSelectionBase } from '@/components/bas
import { ThemeType } from '@/core/theme.ts';
import { NumeralSystem } from '@/core/numeral.ts';
import { MeridiemIndicator } from '@/core/datetime.ts';
import {
MeridiemIndicator,
KnownDateTimeFormat
} from '@/core/datetime.ts';
import {
getHourIn12HourFormat,
getTimezoneOffsetMinutes,
getBrowserTimezoneOffsetMinutes,
getLocalDatetimeFromUnixTime,
getActualUnixTimeForStore,
getUnixTimeFromLocalDatetime,
getActualUnixTimeForStore,
getDummyUnixTimeForLocalUsage,
parseDateTimeFromKnownDateTimeFormat,
getAMOrPM,
getCombinedDateAndTimeValues
} from '@/lib/datetime.ts';
@@ -221,6 +227,29 @@ function toggleMeridiemIndicator(): void {
}
}
function onPaste(event: ClipboardEvent): void {
if (!event.clipboardData || props.readonly || props.disabled) {
event.preventDefault();
return;
}
const text = event.clipboardData.getData('Text');
if (!text) {
event.preventDefault();
return;
}
const formats = KnownDateTimeFormat.detect(text);
if (!formats || formats.length !== 1) {
event.preventDefault();
return;
}
dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(parseDateTimeFromKnownDateTimeFormat(text, formats[0] as KnownDateTimeFormat).getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()));
}
function onFocused(input: VAutocomplete | null | undefined, focused: boolean): void {
if (input && focused) {
nextTick(() => {
+5
View File
@@ -35,6 +35,7 @@ import {
YearMonthDayUnixTime,
WeekDay,
MeridiemIndicator,
KnownDateTimeFormat,
DateRangeScene,
DateRange,
LANGUAGE_DEFAULT_DATE_TIME_FORMAT_VALUE
@@ -557,6 +558,10 @@ export function parseDateTimeFromUnixTime(unixTime: number, utcOffset?: number,
return MomentDateTime.of(moment.unix(unixTime));
}
export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime {
return MomentDateTime.of(moment(dateTime, format.format));
}
export function formatUnixTime(unixTime: number, format: string, options: DateTimeFormatOptions, utcOffset?: number, currentUtcOffset?: number): string {
return parseDateTimeFromUnixTime(unixTime, utcOffset, currentUtcOffset).format(format, options);
}