pasting date time from clipboard supports current language date time format

This commit is contained in:
MaysWind
2025-10-18 00:21:43 +08:00
parent d936b64cf9
commit 8a947ef224
3 changed files with 50 additions and 7 deletions
+29 -5
View File
@@ -88,6 +88,7 @@ import { type TimePickerValue, useDateTimeSelectionBase } from '@/components/bas
import { ThemeType } from '@/core/theme.ts';
import { NumeralSystem } from '@/core/numeral.ts';
import {
type DateTime,
MeridiemIndicator,
KnownDateTimeFormat
} from '@/core/datetime.ts';
@@ -121,6 +122,8 @@ const theme = useTheme();
const {
tt,
getCurrentNumeralSystemType,
parseDateTimeFromLongDateTime,
parseDateTimeFromShortDateTime,
formatUnixTimeToLongDateTime
} = useI18n();
@@ -233,21 +236,42 @@ function onPaste(event: ClipboardEvent): void {
return;
}
const text = event.clipboardData.getData('Text');
let text = event.clipboardData.getData('Text');
if (!text) {
event.preventDefault();
return;
}
const formats = KnownDateTimeFormat.detect(text);
text = text.trim();
if (!formats || formats.length !== 1) {
event.preventDefault();
const formats = KnownDateTimeFormat.detect(text);
let dt: DateTime | undefined = undefined;
if (formats && formats.length === 1) {
dt = parseDateTimeFromKnownDateTimeFormat(text, formats[0] as KnownDateTimeFormat);
if (dt) {
dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dt.getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()));
return;
}
}
dt = parseDateTimeFromLongDateTime(text);
if (dt) {
dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dt.getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()));
return;
}
dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(parseDateTimeFromKnownDateTimeFormat(text, formats[0] as KnownDateTimeFormat).getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()));
dt = parseDateTimeFromShortDateTime(text);
if (dt) {
dateTime.value = getLocalDatetimeFromUnixTime(getDummyUnixTimeForLocalUsage(dt.getUnixTime(), getTimezoneOffsetMinutes(), getBrowserTimezoneOffsetMinutes()));
return;
}
event.preventDefault();
}
function onFocused(input: VAutocomplete | null | undefined, focused: boolean): void {
+18 -2
View File
@@ -558,8 +558,24 @@ 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 parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime | undefined {
const m = moment(dateTime, format.format);
if (!m.isValid()) {
return undefined;
}
return MomentDateTime.of(m);
}
export function parseDateTimeFromString(dateTime: string, format: string): DateTime | undefined {
const m = moment(dateTime, format);
if (!m.isValid()) {
return undefined;
}
return MomentDateTime.of(m);
}
export function formatUnixTime(unixTime: number, format: string, options: DateTimeFormatOptions, utcOffset?: number, currentUtcOffset?: number): string {
+3
View File
@@ -188,6 +188,7 @@ import {
getCurrentUnixTime,
getYearMonthDayDateTime,
parseDateTimeFromUnixTime,
parseDateTimeFromString,
getGregorianCalendarYearMonthDays,
getDateTimeFormatType,
getFiscalYearTimeRangeFromUnixTime,
@@ -2361,6 +2362,8 @@ export function useI18n() {
getCalendarDisplayShortMonthFromUnixTime: (unixTime: number, numeralSystem?: NumeralSystem, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, 'MMM', getDateTimeFormatOptions({ calendarType: getCurrentCalendarDisplayType().primaryCalendarType, numeralSystem: numeralSystem }), utcOffset, currentUtcOffset),
getCalendarDisplayDayOfMonthFromUnixTime: (unixTime: number, numeralSystem?: NumeralSystem, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedShortDayFormat(), getDateTimeFormatOptions({ calendarType: getCurrentCalendarDisplayType().primaryCalendarType, numeralSystem: numeralSystem }), utcOffset, currentUtcOffset),
// format date time (by date display type) functions
parseDateTimeFromLongDateTime: (dateTime: string) => parseDateTimeFromString(dateTime, getLocalizedLongDateFormat() + ' ' + getLocalizedLongTimeFormat()),
parseDateTimeFromShortDateTime: (dateTime: string) => parseDateTimeFromString(dateTime, getLocalizedShortDateFormat() + ' ' + getLocalizedShortTimeFormat()),
formatUnixTimeToLongDateTime: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedLongDateFormat() + ' ' + getLocalizedLongTimeFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset),
formatUnixTimeToShortDateTime: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedShortDateFormat() + ' ' + getLocalizedShortTimeFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset),
formatUnixTimeToLongDate: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedLongDateFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset),