ant-design-vue/components/vc-picker/generate/dayjs.ts

138 lines
4.5 KiB
TypeScript

import type { Dayjs } from 'dayjs';
import dayjs from 'dayjs';
import weekday from 'dayjs/plugin/weekday';
import localeData from 'dayjs/plugin/localeData';
import weekOfYear from 'dayjs/plugin/weekOfYear';
import weekYear from 'dayjs/plugin/weekYear';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import customParseFormat from 'dayjs/plugin/customParseFormat';
import type { GenerateConfig } from '.';
import { noteOnce } from '../../vc-util/warning';
dayjs.extend(customParseFormat);
dayjs.extend(advancedFormat);
dayjs.extend(weekday);
dayjs.extend(localeData);
dayjs.extend(weekOfYear);
dayjs.extend(weekYear);
dayjs.extend((_o, c) => {
// todo support Wo (ISO week)
const proto = c.prototype;
const oldFormat = proto.format;
proto.format = function f(formatStr: string) {
const str = (formatStr || '').replace('Wo', 'wo');
return oldFormat.bind(this)(str);
};
});
type IlocaleMapObject = Record<string, string>;
const localeMap: IlocaleMapObject = {
en_GB: 'en-gb',
en_US: 'en',
zh_CN: 'zh-cn',
zh_TW: 'zh-tw',
};
const parseLocale = (locale: string) => {
const mapLocale = localeMap[locale];
return mapLocale || locale.split('_')[0];
};
const parseNoMatchNotice = () => {
/* istanbul ignore next */
noteOnce(false, 'Not match any format. Please help to fire a issue about this.');
};
const generateConfig: GenerateConfig<Dayjs> = {
// get
getNow: () => dayjs(),
getFixedDate: string => dayjs(string, 'YYYY-MM-DD'),
getEndDate: date => date.endOf('month'),
getWeekDay: date => {
const clone = date.locale('en');
return clone.weekday() + clone.localeData().firstDayOfWeek();
},
getYear: date => date.year(),
getMonth: date => date.month(),
getDate: date => date.date(),
getHour: date => date.hour(),
getMinute: date => date.minute(),
getSecond: date => date.second(),
// set
addYear: (date, diff) => date.add(diff, 'year'),
addMonth: (date, diff) => date.add(diff, 'month'),
addDate: (date, diff) => date.add(diff, 'day'),
setYear: (date, year) => date.year(year),
setMonth: (date, month) => date.month(month),
setDate: (date, num) => date.date(num),
setHour: (date, hour) => date.hour(hour),
setMinute: (date, minute) => date.minute(minute),
setSecond: (date, second) => date.second(second),
// Compare
isAfter: (date1, date2) => date1.isAfter(date2),
isValidate: date => date.isValid(),
locale: {
getWeekFirstDay: locale => dayjs().locale(parseLocale(locale)).localeData().firstDayOfWeek(),
getWeekFirstDate: (locale, date) => date.locale(parseLocale(locale)).weekday(0),
getWeek: (locale, date) => date.locale(parseLocale(locale)).week(),
getShortWeekDays: locale => dayjs().locale(parseLocale(locale)).localeData().weekdaysMin(),
getShortMonths: locale => dayjs().locale(parseLocale(locale)).localeData().monthsShort(),
format: (locale, date, format) => date.locale(parseLocale(locale)).format(format),
parse: (locale, text, formats) => {
const localeStr = parseLocale(locale);
for (let i = 0; i < formats.length; i += 1) {
const format = formats[i];
const formatText = text;
if (format.includes('wo') || format.includes('Wo')) {
// parse Wo
const year = formatText.split('-')[0];
const weekStr = formatText.split('-')[1];
const firstWeek = dayjs(year, 'YYYY').startOf('year').locale(localeStr);
for (let j = 0; j <= 52; j += 1) {
const nextWeek = firstWeek.add(j, 'week');
if (nextWeek.format('Wo') === weekStr) {
return nextWeek;
}
}
parseNoMatchNotice();
return null;
}
const date = dayjs(formatText, format).locale(localeStr);
if (date.isValid()) {
return date;
}
}
if (text) {
parseNoMatchNotice();
}
return null;
},
},
toDate: (value, valueFormat) => {
if (Array.isArray(value)) {
return value.map((val: any) =>
typeof val === 'string' && val ? dayjs(val, valueFormat) : val || null,
) as Dayjs[];
} else {
return (
typeof value === 'string' && value ? dayjs(value, valueFormat) : value || null
) as Dayjs;
}
},
toString: (value, valueFormat) => {
if (Array.isArray(value)) {
return value.map((val: any) => (dayjs.isDayjs(val) ? val.format(valueFormat) : val));
} else {
return dayjs.isDayjs(value) ? value.format(valueFormat) : value;
}
},
};
export default generateConfig;