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 { ThemeType } from '@/core/theme.ts';
import { NumeralSystem } from '@/core/numeral.ts'; import { NumeralSystem } from '@/core/numeral.ts';
import { import {
type DateTime,
MeridiemIndicator, MeridiemIndicator,
KnownDateTimeFormat KnownDateTimeFormat
} from '@/core/datetime.ts'; } from '@/core/datetime.ts';
@@ -121,6 +122,8 @@ const theme = useTheme();
const { const {
tt, tt,
getCurrentNumeralSystemType, getCurrentNumeralSystemType,
parseDateTimeFromLongDateTime,
parseDateTimeFromShortDateTime,
formatUnixTimeToLongDateTime formatUnixTimeToLongDateTime
} = useI18n(); } = useI18n();
@@ -233,21 +236,42 @@ function onPaste(event: ClipboardEvent): void {
return; return;
} }
const text = event.clipboardData.getData('Text'); let text = event.clipboardData.getData('Text');
if (!text) { if (!text) {
event.preventDefault(); event.preventDefault();
return; return;
} }
const formats = KnownDateTimeFormat.detect(text); text = text.trim();
if (!formats || formats.length !== 1) { const formats = KnownDateTimeFormat.detect(text);
event.preventDefault(); 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; 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 { 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)); return MomentDateTime.of(moment.unix(unixTime));
} }
export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime { export function parseDateTimeFromKnownDateTimeFormat(dateTime: string, format: KnownDateTimeFormat): DateTime | undefined {
return MomentDateTime.of(moment(dateTime, format.format)); 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 { export function formatUnixTime(unixTime: number, format: string, options: DateTimeFormatOptions, utcOffset?: number, currentUtcOffset?: number): string {
+3
View File
@@ -188,6 +188,7 @@ import {
getCurrentUnixTime, getCurrentUnixTime,
getYearMonthDayDateTime, getYearMonthDayDateTime,
parseDateTimeFromUnixTime, parseDateTimeFromUnixTime,
parseDateTimeFromString,
getGregorianCalendarYearMonthDays, getGregorianCalendarYearMonthDays,
getDateTimeFormatType, getDateTimeFormatType,
getFiscalYearTimeRangeFromUnixTime, 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), 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), 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 // 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), 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), 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), formatUnixTimeToLongDate: (unixTime: number, utcOffset?: number, currentUtcOffset?: number) => formatUnixTime(unixTime, getLocalizedLongDateFormat(), getDateTimeFormatOptions(), utcOffset, currentUtcOffset),