@lspriv/wx-calendar
Version:
245 lines (244 loc) • 8.75 kB
TypeScript
import { Nullable } from '../utils/shared';
import { PluginService } from '../basic/service';
import type { ArrItem } from '../utils/shared';
import type { PluginConstructor, PluginKeys, PluginUse, ServicePlugins } from '../basic/service';
import type { CalendarInstance, UsePluginService, EventSchedule, DEFAULT_PLUGINS } from './component';
export interface CalendarMonth {
year: number;
month: number;
}
export interface CalendarDay extends CalendarMonth {
day: number;
week?: number;
today?: boolean;
}
interface DateMark extends Partial<Pick<CalendarDay, 'year' | 'month' | 'day'>> {
date?: string | number | Date | CalendarDay;
}
export type DateStyle = Record<string, string | number>;
export interface CalendarMark extends DateMark {
type: 'schedule' | 'corner' | 'festival' | 'solar';
text: string;
style?: string | DateStyle;
}
export interface CalendarStyleMark extends DateMark {
type: 'style';
style: string | DateStyle;
}
export type CalendarMarkTypes = CalendarMark['type'] | CalendarStyleMark['type'];
export type WcMark = Pick<CalendarMark, 'text' | 'style'> & {
key?: string;
};
export type WcScheduleMark = WcMark;
export type WcStyleMark = CalendarStyleMark['style'];
export type MarkDict<T extends CalendarMarkTypes, Style, Schedule, CF> = T extends 'style' ? Style : T extends 'schedule' ? Schedule : CF;
export interface WcDate extends Required<CalendarDay> {
key: string;
kind: 'last' | 'current' | 'next';
style: Nullable<string>;
solar: Nullable<WcMark>;
mark: Nullable<WcMark>;
corner: Nullable<WcMark>;
schedules: Array<WcScheduleMark>;
}
export interface WcWeek {
key: string;
days: Array<WcDate>;
}
export interface WcMonth extends Required<CalendarMonth> {
key: string;
count: number;
weeks: Array<WcWeek>;
}
export interface WcAnnualMonth {
key: string;
year: number;
month: number;
weeks: number;
days: number;
start: number;
}
export interface WcDateStyle {
light: string | number;
dark: string | number;
}
export type WcAnnualDateStyle = Record<string, WcDateStyle>;
export interface WcAnnualMark {
rwtype?: 'rest' | 'work';
sub?: string;
style?: WcAnnualDateStyle;
}
export type WcAnnualMarks = Map<string, WcAnnualMark>;
export interface WcAnnualSub {
key?: string;
color: string;
text: string;
}
export interface WcYear {
key: string;
year: number;
subinfo?: Array<WcAnnualSub>;
}
export interface WcSubYear {
year: number;
months: Array<WcAnnualMonth>;
marks: WcAnnualMarks;
}
export type WcFullYear = WcYear & WcSubYear;
export type WcMarkDict = {
[P in CalendarMarkTypes]?: MarkDict<P, Nullable<CalendarStyleMark>, Nullable<Array<CalendarMark>>, Nullable<CalendarMark>>;
};
export type WcMarkMap = Map<string, WcMarkDict>;
export interface WcScheduleInfo {
dtStart?: Date;
dtEnd?: Date;
origin?: string;
originKey?: string;
summary?: string;
description?: string;
}
export declare const styleParse: (style: string | DateStyle | null) => Record<string, string | number> | null;
export declare const reorderStyle: (style: string | DateStyle, pick?: Array<string | RegExp>) => string;
export declare const styleStringify: (style: DateStyle | null, pick?: Array<string | RegExp>) => string;
export declare const themeStyle: (style?: WcDateStyle) => string | number | undefined;
export declare const getAnnualMarkKey: (day: Pick<CalendarDay, "month" | "day">) => string;
/**
* 生成 mark key
* @param id 插件内部识别id,会整体回传给插件 PLUGIN_MARK_DATA 方法
* @param pluginKey 插件 KEY
*/
export declare const getMarkKey: (id: string, pluginKey?: string) => string;
export interface WcMarkKeyParse {
plugin?: string;
id: string;
}
/**
* 解析 mark key
* @param key mark key
*/
export declare const parseMarkKey: (key?: string) => WcMarkKeyParse | undefined;
export declare const getScheduleDetail: (date: CalendarDay, schedule: WcScheduleMark, service: PluginService<DEFAULT_PLUGINS>) => EventSchedule;
export declare const mergeAnnualDateStyle: (s1?: WcAnnualDateStyle, s2?: WcAnnualDateStyle) => WcAnnualDateStyle | undefined;
/**
* 合并两个年面板标记
*/
export declare const mergeAnnualMarks: (m1?: WcAnnualMarks, m2?: WcAnnualMarks) => WcAnnualMarks | undefined;
export declare const formDateByStrKey: (key: string) => CalendarDay;
/**
* 获取某个月份的天数
* @param mon 月份
*/
export declare const getMonthDays: (mon: CalendarMonth) => number;
/**
* 是否闰年
* @param y 年
*/
export declare const isLeapYear: (y: number) => boolean;
/**
* 判断两个日期是否是同一天
*/
export declare const isSameDate: (d1: CalendarDay, d2: CalendarDay) => boolean;
/**
* 判断两个日期是否同一周
*/
export declare const isSameWeek: (d1: CalendarDay, d2: CalendarDay, weekstart?: number) => boolean;
/**
* 是否今日
* @param date
*/
export declare const isToday: (date: CalendarDay) => boolean;
export declare function normalDate(fuzzy: string | number | Date | CalendarDay): CalendarDay;
export declare function normalDate(year: number, month: number, day: number): CalendarDay;
/**
* 计算与指定日期相差几天的日期
* @param date 指定日期
* @param offset 差值,单位天
*/
export declare const offsetDate: (date: CalendarDay, offset: number) => CalendarDay;
/**
* 获取指定某年某月某天的日期,若指定天大于指定月的天数,则返回指定月最后一天
* @param year 指定年
* @param month 指定月
* @param day 指定天
*/
export declare const inMonthDate: (year: number, month: number, day: number) => CalendarDay;
/**
* 根据指定的周首日对星期重新排序
* @param weekstart 周首日
*/
export declare const sortWeeks: (weekstart: number) => string;
/**
* 获取指定日期所在的周
* @param date 指定日期
* @param weekstart 周首日
*/
export declare const weekRange: (date: CalendarDay, weekstart?: number) => [start: Date, end: Date];
/**
* 查找日期
* @param weeks 月份周数组
* @param predicate 查找条件
*/
export declare const findInWeeks: (weeks: Array<WcWeek>, predicate: (value: WcDate, index: number, obj: WcDate[]) => boolean) => WcDate | undefined;
/**
* 查找日期index
* @param weeks 月份周数组
* @param predicate 查找条件
*/
export declare const findDateIndex: (weeks: Array<WcWeek>, predicate: (value: WcDate, index: number, obj: WcDate[]) => boolean) => number;
/**
* 获取指定日期所在月份的周索引和所在周的日期索引
* @param date 制定日期
* @param weeks 所在月份的周数组
*/
export declare const getWeekDateIdx: (date: CalendarDay, weeks: Array<WcWeek>) => {
wdx: number;
ddx: number;
};
/**
* 计算两个月份相距多少个月(完全不考虑天,纯粹按月计算)
* @param start 起始月
* @param end 终止月
*/
export declare const monthDiff: (start: CalendarMonth, end: CalendarMonth) => number;
/**
* 获取指定日期与今日相距信息和所在周信息
* @param date 指定日期
* @param withWeek 周首日
*/
export declare const getDateInfo: (date: CalendarDay, weekstart: number, withWeek?: boolean | number) => string;
export declare const sameAnnualMarks: (m1: WcAnnualMarks, m2?: WcAnnualMarks) => boolean;
export declare const fillAnnualSubs: (uk: string, year: number, subinfos?: Array<WcAnnualSub>) => WcAnnualSub[] | undefined;
export declare const timestamp: (date: CalendarDay) => number;
export type WxCalendarPlugins<T extends WxCalendar<any>> = T extends WxCalendar<infer R> ? R : never;
interface ClearFilter {
(plugin: PluginUse): boolean;
}
export declare class WxCalendar<T extends Array<PluginConstructor> = Array<PluginConstructor>, U extends PluginConstructor = ArrItem<T>> {
/** 今天 */
static today: CalendarDay;
/** 预设插件 */
private static _PLUGINS_;
/** 插件服务 */
service: PluginService<T>;
constructor(component: CalendarInstance, services?: Array<PluginUse<U> | U>);
createMonth(mon: CalendarMonth, weekstart?: number): WcMonth;
createYear(year: number, weekstart?: number): WcFullYear;
static use<T extends {
new (...args: any[]): any;
}>(plugin: T, options?: ConstructorParameters<T>[0]): typeof WxCalendar;
/**
* 移除所有插件
*/
static clearPlugin(): void;
/**
* 移除某个插件
* @param key 插件 key
*/
static clearPlugin<T extends PluginService = UsePluginService>(key: PluginKeys<ServicePlugins<T>>): void;
/**
* 移除符合条件的插件
* @param filter 过滤条件
*/
static clearPlugin(filter: ClearFilter): void;
}
export {};