@visactor/vtable-calendar 1.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/cjs/custom/custom-handler.d.ts +46 -0
- package/cjs/custom/custom-handler.js +147 -0
- package/cjs/custom/custom-handler.js.map +1 -0
- package/cjs/custom/custom-layout.d.ts +6 -0
- package/cjs/custom/custom-layout.js +112 -0
- package/cjs/custom/custom-layout.js.map +1 -0
- package/cjs/date-util.d.ts +10 -0
- package/cjs/date-util.js +99 -0
- package/cjs/date-util.js.map +1 -0
- package/cjs/event/type.d.ts +39 -0
- package/cjs/event/type.js +12 -0
- package/cjs/event/type.js.map +1 -0
- package/cjs/index.d.ts +3 -0
- package/cjs/index.js +30 -0
- package/cjs/index.js.map +1 -0
- package/cjs/month-calendar.d.ts +65 -0
- package/cjs/month-calendar.js +177 -0
- package/cjs/month-calendar.js.map +1 -0
- package/cjs/style.d.ts +13 -0
- package/cjs/style.js +54 -0
- package/cjs/style.js.map +1 -0
- package/cjs/table/table-option.d.ts +7 -0
- package/cjs/table/table-option.js +61 -0
- package/cjs/table/table-option.js.map +1 -0
- package/dist/vtable-calendar.js +54526 -0
- package/dist/vtable-calendar.min.js +1 -0
- package/es/custom/custom-handler.d.ts +46 -0
- package/es/custom/custom-handler.js +140 -0
- package/es/custom/custom-handler.js.map +1 -0
- package/es/custom/custom-layout.d.ts +6 -0
- package/es/custom/custom-layout.js +105 -0
- package/es/custom/custom-layout.js.map +1 -0
- package/es/date-util.d.ts +10 -0
- package/es/date-util.js +88 -0
- package/es/date-util.js.map +1 -0
- package/es/event/type.d.ts +39 -0
- package/es/event/type.js +8 -0
- package/es/event/type.js.map +1 -0
- package/es/index.d.ts +3 -0
- package/es/index.js +4 -0
- package/es/index.js.map +1 -0
- package/es/month-calendar.d.ts +65 -0
- package/es/month-calendar.js +181 -0
- package/es/month-calendar.js.map +1 -0
- package/es/style.d.ts +13 -0
- package/es/style.js +45 -0
- package/es/style.js.map +1 -0
- package/es/table/table-option.d.ts +7 -0
- package/es/table/table-option.js +58 -0
- package/es/table/table-option.js.map +1 -0
- package/package.json +87 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Calendar } from '../month-calendar';
|
|
2
|
+
export interface ICustomEventOptions {
|
|
3
|
+
contentHeight?: number;
|
|
4
|
+
barHeight?: number;
|
|
5
|
+
fontSize?: number;
|
|
6
|
+
contentPadding?: number;
|
|
7
|
+
barCornerRadius?: number;
|
|
8
|
+
circleRadius?: number;
|
|
9
|
+
}
|
|
10
|
+
type ICellCustomEvent = {
|
|
11
|
+
keys: number[];
|
|
12
|
+
values: {
|
|
13
|
+
[key: number]: IEventData;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export interface ICustomEvent {
|
|
17
|
+
type: 'list' | 'bar';
|
|
18
|
+
id?: string;
|
|
19
|
+
startDate?: Date;
|
|
20
|
+
endDate?: Date;
|
|
21
|
+
date?: Date;
|
|
22
|
+
text: string;
|
|
23
|
+
color?: string;
|
|
24
|
+
bgColor?: string;
|
|
25
|
+
customInfo?: any;
|
|
26
|
+
}
|
|
27
|
+
export interface IEventData extends ICustomEvent {
|
|
28
|
+
col: number;
|
|
29
|
+
row: number;
|
|
30
|
+
index: number;
|
|
31
|
+
}
|
|
32
|
+
export declare class CustomEventHandler {
|
|
33
|
+
calendar: Calendar;
|
|
34
|
+
cellEvents: Map<string, ICellCustomEvent>;
|
|
35
|
+
events: ICustomEvent[];
|
|
36
|
+
customEventOptions: Required<ICustomEventOptions>;
|
|
37
|
+
constructor(calendar: Calendar, customEventOptions?: ICustomEventOptions);
|
|
38
|
+
getCellCustomEvent(col: number, row: number): ICellCustomEvent;
|
|
39
|
+
setCellCustomEvent(col: number, row: number, events: ICellCustomEvent): void;
|
|
40
|
+
addEvent(event: ICustomEvent): void;
|
|
41
|
+
addEvents(events: ICustomEvent[]): void;
|
|
42
|
+
removeEvents(ids: string[]): void;
|
|
43
|
+
_removeEvent(id: string): void;
|
|
44
|
+
updateEvents(events: ICustomEvent[]): void;
|
|
45
|
+
}
|
|
46
|
+
export {};
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { max, min } from "date-fns";
|
|
2
|
+
|
|
3
|
+
import { merge } from "@visactor/vutils";
|
|
4
|
+
|
|
5
|
+
const CUSTOM_CONTAINER_NAME = "custom-container";
|
|
6
|
+
|
|
7
|
+
export class CustomEventHandler {
|
|
8
|
+
constructor(calendar, customEventOptions) {
|
|
9
|
+
this.cellEvents = new Map, this.events = [], this.calendar = calendar, this.customEventOptions = merge({
|
|
10
|
+
contentHeight: 24,
|
|
11
|
+
barHeight: 18,
|
|
12
|
+
fontSize: 14,
|
|
13
|
+
contentPadding: 5,
|
|
14
|
+
barCornerRadius: 5,
|
|
15
|
+
circleRadius: 5
|
|
16
|
+
}, customEventOptions);
|
|
17
|
+
}
|
|
18
|
+
getCellCustomEvent(col, row) {
|
|
19
|
+
return this.cellEvents.get(`${col}-${row}`);
|
|
20
|
+
}
|
|
21
|
+
setCellCustomEvent(col, row, events) {
|
|
22
|
+
this.cellEvents.set(`${col}-${row}`, events);
|
|
23
|
+
}
|
|
24
|
+
addEvent(event) {
|
|
25
|
+
const {date: date, startDate: startDate, endDate: endDate} = event;
|
|
26
|
+
if (date || startDate && endDate) {
|
|
27
|
+
if ("list" === event.type) {
|
|
28
|
+
const location = this.calendar.getCellLocation(date);
|
|
29
|
+
if (!location) return;
|
|
30
|
+
const {col: col, row: row} = location, eventData = Object.assign(Object.assign({}, event), {
|
|
31
|
+
col: col,
|
|
32
|
+
row: row,
|
|
33
|
+
index: 0
|
|
34
|
+
}), cellCustomEvent = this.getCellCustomEvent(col, row);
|
|
35
|
+
if (!cellCustomEvent) {
|
|
36
|
+
const events = {
|
|
37
|
+
keys: [ 0 ],
|
|
38
|
+
values: {
|
|
39
|
+
0: eventData
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
return this.setCellCustomEvent(col, row, events), this.calendar.table.scenegraph.updateCellContent(col, row),
|
|
43
|
+
void this.events.push(event);
|
|
44
|
+
}
|
|
45
|
+
const keys = cellCustomEvent.keys;
|
|
46
|
+
if (0 === keys.length) return cellCustomEvent.keys.push(0), cellCustomEvent.values[0] = eventData,
|
|
47
|
+
this.calendar.table.scenegraph.updateCellContent(col, row), void this.events.push(event);
|
|
48
|
+
let isInsert = !1;
|
|
49
|
+
for (let i = 0; i < keys[keys.length - 1]; i++) if (!cellCustomEvent.values[i]) {
|
|
50
|
+
eventData.index = i, keys.push(i), keys.sort(((a, b) => a - b)), cellCustomEvent.values[i] = eventData,
|
|
51
|
+
isInsert = !0;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
if (!isInsert) {
|
|
55
|
+
const index = keys[keys.length - 1] + 1;
|
|
56
|
+
eventData.index = index, cellCustomEvent.keys.push(index), cellCustomEvent.values[index] = eventData;
|
|
57
|
+
}
|
|
58
|
+
this.calendar.table.scenegraph.updateCellContent(col, row);
|
|
59
|
+
} else {
|
|
60
|
+
const startLocation = this.calendar.getCellLocation(max([ startDate, this.calendar.startDate ])), endLocation = this.calendar.getCellLocation(min([ endDate, this.calendar.endDate ]));
|
|
61
|
+
if (!startLocation || !endLocation) return;
|
|
62
|
+
let col = startLocation.col, row = startLocation.row, maxIndex = -1;
|
|
63
|
+
for (;row < endLocation.row || col <= endLocation.col && row === endLocation.row; ) {
|
|
64
|
+
const cellCustomEvent = this.getCellCustomEvent(col, row);
|
|
65
|
+
if (cellCustomEvent) {
|
|
66
|
+
const keys = cellCustomEvent.keys, maxKey = keys[keys.length - 1];
|
|
67
|
+
maxKey > maxIndex && (maxIndex = maxKey);
|
|
68
|
+
}
|
|
69
|
+
col++, col > this.calendar.maxCol && (col = this.calendar.minCol, row++);
|
|
70
|
+
}
|
|
71
|
+
for (col = startLocation.col, row = startLocation.row; row < endLocation.row || col <= endLocation.col && row === endLocation.row; ) {
|
|
72
|
+
const cellCustomEvent = this.getCellCustomEvent(col, row), eventData = Object.assign(Object.assign({}, event), {
|
|
73
|
+
col: col,
|
|
74
|
+
row: row,
|
|
75
|
+
index: maxIndex + 1
|
|
76
|
+
});
|
|
77
|
+
if (cellCustomEvent) {
|
|
78
|
+
const keys = cellCustomEvent.keys;
|
|
79
|
+
keys.push(maxIndex + 1), keys.sort(((a, b) => a - b)), cellCustomEvent.values[maxIndex + 1] = eventData;
|
|
80
|
+
} else {
|
|
81
|
+
const events = {
|
|
82
|
+
keys: [ maxIndex + 1 ],
|
|
83
|
+
values: {
|
|
84
|
+
[maxIndex + 1]: eventData
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
this.setCellCustomEvent(col, row, events);
|
|
88
|
+
}
|
|
89
|
+
this.calendar.table.scenegraph.updateCellContent(col, row), col++, col > this.calendar.maxCol && (col = this.calendar.minCol,
|
|
90
|
+
row++);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
this.events.push(event);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
addEvents(events) {
|
|
97
|
+
events.forEach((event => {
|
|
98
|
+
this.addEvent(event);
|
|
99
|
+
}));
|
|
100
|
+
}
|
|
101
|
+
removeEvents(ids) {
|
|
102
|
+
ids.forEach((id => {
|
|
103
|
+
this._removeEvent(id);
|
|
104
|
+
}));
|
|
105
|
+
const newEvents = this.events.filter((event => !event.id || !ids.includes(event.id)));
|
|
106
|
+
this.events.length = 0, this.cellEvents.clear(), newEvents.forEach((event => {
|
|
107
|
+
this.addEvent(event);
|
|
108
|
+
}));
|
|
109
|
+
}
|
|
110
|
+
_removeEvent(id) {
|
|
111
|
+
if (!id) return;
|
|
112
|
+
const event = this.events.find((event => event.id === id));
|
|
113
|
+
if (!event) return;
|
|
114
|
+
const {date: date, startDate: startDate, endDate: endDate} = event;
|
|
115
|
+
if ("list" === event.type) {
|
|
116
|
+
const {col: col, row: row} = this.calendar.getCellLocation(date), cellGroup = this.calendar.table.scenegraph.getCell(col, row), customGroup = cellGroup.getChildByName("custom-container");
|
|
117
|
+
customGroup && cellGroup.removeChild(customGroup);
|
|
118
|
+
} else {
|
|
119
|
+
const startLocation = this.calendar.getCellLocation(max([ startDate, this.calendar.startDate ])), endLocation = this.calendar.getCellLocation(min([ endDate, this.calendar.endDate ]));
|
|
120
|
+
let col = startLocation.col, row = startLocation.row;
|
|
121
|
+
for (;row < endLocation.row || col <= endLocation.col && row === endLocation.row; ) {
|
|
122
|
+
const cellGroup = this.calendar.table.scenegraph.getCell(col, row), customGroup = cellGroup.getChildByName("custom-container");
|
|
123
|
+
customGroup && cellGroup.removeChild(customGroup), col++, col > this.calendar.maxCol && (col = this.calendar.minCol,
|
|
124
|
+
row++);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
updateEvents(events) {
|
|
129
|
+
events.forEach((event => {
|
|
130
|
+
this._removeEvent(event.id);
|
|
131
|
+
const oldEvent = this.events.find((e => e.id === event.id));
|
|
132
|
+
merge(oldEvent, event);
|
|
133
|
+
}));
|
|
134
|
+
const oldEvents = this.events;
|
|
135
|
+
this.events = [], this.cellEvents.clear(), oldEvents.forEach((event => {
|
|
136
|
+
this.addEvent(event);
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=custom-handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["custom/custom-handler.ts"],"names":[],"mappings":"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","file":"custom-handler.js","sourcesContent":["import { max, min } from 'date-fns';\nimport type { Calendar } from '../month-calendar';\nimport { merge } from '@visactor/vutils';\n\nconst CUSTOM_CONTAINER_NAME = 'custom-container';\n\nexport interface ICustomEventOptions {\n contentHeight?: number;\n barHeight?: number;\n fontSize?: number;\n contentPadding?: number;\n barCornerRadius?: number;\n circleRadius?: number;\n}\n\ntype ICellCustomEvent = {\n keys: number[];\n values: {\n [key: number]: IEventData;\n };\n};\n\nexport interface ICustomEvent {\n type: 'list' | 'bar';\n id?: string;\n\n // list: date; bar: startDate+endDate\n startDate?: Date;\n endDate?: Date;\n date?: Date;\n\n text: string;\n color?: string; // text color\n bgColor?: string; // bar background color\n // style config in global option\n // fontSize?: number;\n // fontFamily?: string;\n // fontWeight?: string;\n\n customInfo?: any; // user custom data\n}\n\nexport interface IEventData extends ICustomEvent {\n col: number;\n row: number;\n index: number; // event content index in all cells about this event\n}\n\nexport class CustomEventHandler {\n calendar: Calendar;\n cellEvents: Map<string, ICellCustomEvent> = new Map();\n events: ICustomEvent[] = [];\n customEventOptions: Required<ICustomEventOptions>;\n constructor(calendar: Calendar, customEventOptions?: ICustomEventOptions) {\n this.calendar = calendar;\n this.customEventOptions = merge(\n {\n contentHeight: 24,\n barHeight: 18,\n fontSize: 14,\n contentPadding: 5,\n barCornerRadius: 5,\n circleRadius: 5\n },\n customEventOptions\n );\n }\n\n getCellCustomEvent(col: number, row: number) {\n return this.cellEvents.get(`${col}-${row}`);\n }\n\n setCellCustomEvent(col: number, row: number, events: ICellCustomEvent) {\n this.cellEvents.set(`${col}-${row}`, events);\n }\n\n addEvent(event: ICustomEvent) {\n const { date, startDate, endDate } = event;\n if (!date && (!startDate || !endDate)) {\n return;\n }\n if (event.type === 'list') {\n const location = this.calendar.getCellLocation(date);\n if (!location) {\n return;\n }\n const { col, row } = location;\n const eventData: IEventData = { ...event, col, row, index: 0 };\n const cellCustomEvent = this.getCellCustomEvent(col, row);\n if (!cellCustomEvent) {\n const events = {\n keys: [0],\n values: {\n 0: eventData\n }\n };\n this.setCellCustomEvent(col, row, events);\n this.calendar.table.scenegraph.updateCellContent(col, row);\n this.events.push(event);\n return;\n }\n\n const keys = cellCustomEvent.keys;\n if (keys.length === 0) {\n cellCustomEvent.keys.push(0);\n cellCustomEvent.values[0] = eventData;\n this.calendar.table.scenegraph.updateCellContent(col, row);\n this.events.push(event);\n return;\n }\n\n // find single location from index 0\n let isInsert = false;\n for (let i = 0; i < keys[keys.length - 1]; i++) {\n if (!cellCustomEvent.values[i]) {\n eventData.index = i;\n // insert index into keys\n keys.push(i);\n keys.sort((a, b) => a - b);\n cellCustomEvent.values[i] = eventData;\n isInsert = true;\n break;\n }\n }\n\n if (!isInsert) {\n const index = keys[keys.length - 1] + 1;\n eventData.index = index;\n cellCustomEvent.keys.push(index);\n cellCustomEvent.values[index] = eventData;\n }\n\n this.calendar.table.scenegraph.updateCellContent(col, row);\n } else {\n // bar\n const startLocation = this.calendar.getCellLocation(max([startDate, this.calendar.startDate]));\n const endLocation = this.calendar.getCellLocation(min([endDate, this.calendar.endDate]));\n if (!startLocation || !endLocation) {\n return;\n }\n\n // get index of this evemt\n let col = startLocation.col;\n let row = startLocation.row;\n let maxIndex = -1;\n while (row < endLocation.row || (col <= endLocation.col && row === endLocation.row)) {\n const cellCustomEvent = this.getCellCustomEvent(col, row) as ICellCustomEvent;\n if (cellCustomEvent) {\n // get max index in this cellCustomEvent\n const keys = cellCustomEvent.keys;\n const maxKey = keys[keys.length - 1];\n if (maxKey > maxIndex) {\n maxIndex = maxKey;\n }\n }\n\n col++;\n if (col > this.calendar.maxCol) {\n col = this.calendar.minCol;\n row++;\n }\n }\n\n // insert into cellCustomEvent\n col = startLocation.col;\n row = startLocation.row;\n while (row < endLocation.row || (col <= endLocation.col && row === endLocation.row)) {\n const cellCustomEvent = this.getCellCustomEvent(col, row) as ICellCustomEvent;\n const eventData: IEventData = { ...event, col, row, index: maxIndex + 1 };\n if (!cellCustomEvent) {\n const events = {\n keys: [maxIndex + 1],\n values: {\n [maxIndex + 1]: eventData\n }\n };\n this.setCellCustomEvent(col, row, events);\n } else {\n const keys = cellCustomEvent.keys;\n keys.push(maxIndex + 1);\n keys.sort((a, b) => a - b);\n cellCustomEvent.values[maxIndex + 1] = eventData;\n }\n\n this.calendar.table.scenegraph.updateCellContent(col, row);\n\n col++;\n if (col > this.calendar.maxCol) {\n col = this.calendar.minCol;\n row++;\n }\n }\n }\n\n this.events.push(event);\n }\n\n addEvents(events: ICustomEvent[]) {\n events.forEach(event => {\n this.addEvent(event);\n });\n }\n\n removeEvents(ids: string[]) {\n ids.forEach(id => {\n this._removeEvent(id);\n });\n\n // readd custom event\n const newEvents = this.events.filter(event => {\n if (event.id && ids.includes(event.id)) {\n return false;\n }\n return true;\n });\n\n this.events.length = 0;\n this.cellEvents.clear();\n\n newEvents.forEach(event => {\n this.addEvent(event);\n });\n }\n\n _removeEvent(id: string) {\n if (!id) {\n return;\n }\n const event = this.events.find(event => {\n if (event.id === id) {\n return true;\n }\n return false;\n });\n\n if (!event) {\n return;\n }\n\n // clear custom graphic in this event\n const { date, startDate, endDate } = event;\n if (event.type === 'list') {\n const { col, row } = this.calendar.getCellLocation(date);\n const cellGroup = this.calendar.table.scenegraph.getCell(col, row);\n const customGroup = cellGroup.getChildByName(CUSTOM_CONTAINER_NAME);\n customGroup && cellGroup.removeChild(customGroup);\n } else {\n // bar\n const startLocation = this.calendar.getCellLocation(max([startDate, this.calendar.startDate]));\n const endLocation = this.calendar.getCellLocation(min([endDate, this.calendar.endDate]));\n\n let col = startLocation.col;\n let row = startLocation.row;\n while (row < endLocation.row || (col <= endLocation.col && row === endLocation.row)) {\n const cellGroup = this.calendar.table.scenegraph.getCell(col, row);\n const customGroup = cellGroup.getChildByName(CUSTOM_CONTAINER_NAME);\n customGroup && cellGroup.removeChild(customGroup);\n\n col++;\n if (col > this.calendar.maxCol) {\n col = this.calendar.minCol;\n row++;\n }\n }\n }\n }\n\n updateEvents(events: ICustomEvent[]) {\n events.forEach(event => {\n this._removeEvent(event.id);\n // replace event in this.events\n const oldEvent = this.events.find(e => {\n if (e.id === event.id) {\n return true;\n }\n return false;\n });\n // const newEvent = merge(oldEvent, event);\n // this.events.splice(this.events.indexOf(oldEvent), 1, newEvent);\n merge(oldEvent, event);\n });\n\n // readd custom event\n const oldEvents = this.events;\n this.events = [];\n this.cellEvents.clear();\n\n oldEvents.forEach(event => {\n this.addEvent(event);\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Group, Text, Rect, Circle } from "@visactor/vtable/es/vrender";
|
|
2
|
+
|
|
3
|
+
import { differenceInDays, startOfDay } from "date-fns";
|
|
4
|
+
|
|
5
|
+
export function calendarCustomLayout(args) {
|
|
6
|
+
const {table: table, row: row, col: col, rect: rect} = args, calendar = table.options._calendar, {height: height, width: width} = null != rect ? rect : table.getCellRect(col, row), cellDate = calendar.getCellDate(col, row), customEvents = calendar.customHandler.getCellCustomEvent(col, row), {contentHeight: contentHeight, barHeight: barHeight, fontSize: fontSize, contentPadding: contentPadding, barCornerRadius: barCornerRadius, circleRadius: circleRadius} = calendar.customHandler.customEventOptions;
|
|
7
|
+
if (!customEvents) return;
|
|
8
|
+
const textHeight = table.theme.bodyStyle.fontSize + 10, container = new Group({
|
|
9
|
+
x: 0,
|
|
10
|
+
y: textHeight,
|
|
11
|
+
height: height - textHeight,
|
|
12
|
+
width: width
|
|
13
|
+
}), {keys: keys, values: values} = customEvents, lastKey = keys[keys.length - 1];
|
|
14
|
+
let y = 0;
|
|
15
|
+
for (let i = 0; i <= lastKey; i++) {
|
|
16
|
+
const event = values[i];
|
|
17
|
+
if (event) if ("list" === event.type) {
|
|
18
|
+
const listGroup = new Group({
|
|
19
|
+
x: 0,
|
|
20
|
+
y: y,
|
|
21
|
+
width: width,
|
|
22
|
+
height: contentHeight,
|
|
23
|
+
fill: !1,
|
|
24
|
+
stroke: !1,
|
|
25
|
+
clip: !0,
|
|
26
|
+
cursor: "pointer"
|
|
27
|
+
});
|
|
28
|
+
container.add(listGroup), listGroup._role = "calendar-custom-event", listGroup._customEvent = event;
|
|
29
|
+
const circle = new Circle({
|
|
30
|
+
radius: circleRadius,
|
|
31
|
+
fill: event.color,
|
|
32
|
+
x: contentPadding + circleRadius,
|
|
33
|
+
y: contentHeight / 2,
|
|
34
|
+
pickable: !1
|
|
35
|
+
});
|
|
36
|
+
listGroup.add(circle);
|
|
37
|
+
const text = new Text({
|
|
38
|
+
x: contentPadding + 2 * circleRadius + contentPadding,
|
|
39
|
+
y: contentHeight / 2,
|
|
40
|
+
text: event.text,
|
|
41
|
+
fontSize: fontSize,
|
|
42
|
+
fill: event.color,
|
|
43
|
+
textAlign: "left",
|
|
44
|
+
textBaseline: "middle",
|
|
45
|
+
pickable: !1
|
|
46
|
+
});
|
|
47
|
+
listGroup.add(text);
|
|
48
|
+
} else {
|
|
49
|
+
const {startDate: startDate, endDate: endDate} = event, barGroup = new Group({
|
|
50
|
+
x: 0,
|
|
51
|
+
y: y,
|
|
52
|
+
width: width,
|
|
53
|
+
height: contentHeight,
|
|
54
|
+
fill: !1,
|
|
55
|
+
stroke: !1,
|
|
56
|
+
clip: !0,
|
|
57
|
+
cursor: "pointer"
|
|
58
|
+
});
|
|
59
|
+
container.add(barGroup), barGroup._role = "calendar-custom-event", barGroup._customEvent = event;
|
|
60
|
+
const rect = new Rect({
|
|
61
|
+
x: 0,
|
|
62
|
+
y: (contentHeight - barHeight) / 2,
|
|
63
|
+
width: width,
|
|
64
|
+
height: barHeight,
|
|
65
|
+
fill: event.bgColor,
|
|
66
|
+
cornerRadius: getRectCornerRadius(startDate, endDate, cellDate, barCornerRadius),
|
|
67
|
+
pickable: !1
|
|
68
|
+
});
|
|
69
|
+
barGroup.add(rect);
|
|
70
|
+
const days = differenceInDays(startOfDay(startDate), startOfDay(cellDate)), text = new Text({
|
|
71
|
+
x: contentPadding,
|
|
72
|
+
y: contentHeight / 2,
|
|
73
|
+
dx: days * width,
|
|
74
|
+
text: event.text,
|
|
75
|
+
fontSize: fontSize,
|
|
76
|
+
fill: event.color,
|
|
77
|
+
textAlign: "left",
|
|
78
|
+
textBaseline: "middle",
|
|
79
|
+
pickable: !1
|
|
80
|
+
});
|
|
81
|
+
barGroup.add(text);
|
|
82
|
+
} else {
|
|
83
|
+
const emptyGroup = new Group({
|
|
84
|
+
x: 0,
|
|
85
|
+
y: y,
|
|
86
|
+
width: width,
|
|
87
|
+
height: contentHeight,
|
|
88
|
+
fill: !1,
|
|
89
|
+
stroke: !1,
|
|
90
|
+
clip: !0
|
|
91
|
+
});
|
|
92
|
+
container.add(emptyGroup);
|
|
93
|
+
}
|
|
94
|
+
y += contentHeight;
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
rootContainer: container,
|
|
98
|
+
renderDefault: !0
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function getRectCornerRadius(startDate, endDate, cellDate, cornerRadius) {
|
|
103
|
+
return startDate.getDate() === endDate.getDate() ? cornerRadius : startDate.getDate() === cellDate.getDate() ? [ cornerRadius, 0, 0, cornerRadius ] : endDate.getDate() === cellDate.getDate() ? [ 0, cornerRadius, cornerRadius, 0 ] : 0;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=custom-layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["custom/custom-layout.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAExE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAExD,MAAM,UAAU,oBAAoB,CAAC,IAA6B;IAChE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACvC,MAAM,QAAQ,GAAI,KAAa,CAAC,OAAO,CAAC,SAAqB,CAAC;IAE9D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAE9D,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAChD,MAAM,YAAY,GAAG,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEzE,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,eAAe,EAAE,YAAY,EAAE,GACzF,QAAQ,CAAC,aAAa,CAAC,kBAAkB,CAAC;IAE5C,IAAI,CAAC,YAAY,EAAE;QACjB,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,UAAU,GAAI,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,QAAmB,GAAG,EAAE,CAAC;IAEnE,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;QAC1B,CAAC,EAAE,CAAC;QACJ,CAAC,EAAE,UAAU;QACb,MAAM,EAAE,MAAM,GAAG,UAAU;QAC3B,KAAK;KAIN,CAAC,CAAC;IAEH,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEtC,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,IAAI,CAAC,KAAK,EAAE;YAEV,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC;gBAC3B,CAAC,EAAE,CAAC;gBACJ,CAAC;gBACD,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI;aACX,CAAQ,CAAC;YACV,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;SAC3B;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;YAChC,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC;gBAC1B,CAAC,EAAE,CAAC;gBACJ,CAAC;gBACD,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,SAAS;aAClB,CAAQ,CAAC;YACV,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YACzB,SAAS,CAAC,KAAK,GAAG,uBAAuB,CAAC;YAC1C,SAAS,CAAC,YAAY,GAAG,KAAK,CAAC;YAE/B,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;gBACxB,MAAM,EAAE,YAAY;gBACpB,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,CAAC,EAAE,cAAc,GAAG,YAAY;gBAChC,CAAC,EAAE,aAAa,GAAG,CAAC;gBACpB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEtB,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;gBACpB,CAAC,EAAE,cAAc,GAAG,YAAY,GAAG,CAAC,GAAG,cAAc;gBACrD,CAAC,EAAE,aAAa,GAAG,CAAC;gBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ;gBACR,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,SAAS,EAAE,MAAM;gBACjB,YAAY,EAAE,QAAQ;gBACtB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACrB;aAAM;YACL,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;YAErC,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC;gBACzB,CAAC,EAAE,CAAC;gBACJ,CAAC;gBACD,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,IAAI;gBACV,MAAM,EAAE,SAAS;aAClB,CAAQ,CAAC;YACV,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,QAAQ,CAAC,KAAK,GAAG,uBAAuB,CAAC;YACzC,QAAQ,CAAC,YAAY,GAAG,KAAK,CAAC;YAE9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;gBACpB,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,CAAC,aAAa,GAAG,SAAS,CAAC,GAAG,CAAC;gBAClC,KAAK,EAAE,KAAK;gBACZ,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,KAAK,CAAC,OAAO;gBACnB,YAAY,EAAE,mBAAmB,CAAC,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC;gBAChF,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAEnB,MAAM,IAAI,GAAG,gBAAgB,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC3E,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC;gBACpB,CAAC,EAAE,cAAc;gBACjB,CAAC,EAAE,aAAa,GAAG,CAAC;gBACpB,EAAE,EAAE,IAAI,GAAG,KAAK;gBAChB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,QAAQ;gBACR,IAAI,EAAE,KAAK,CAAC,KAAK;gBACjB,SAAS,EAAE,MAAM;gBACjB,YAAY,EAAE,QAAQ;gBACtB,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;YACH,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;SACpB;QAED,CAAC,IAAI,aAAa,CAAC;KACpB;IAED,OAAO;QACL,aAAa,EAAE,SAAS;QACxB,aAAa,EAAE,IAAI;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,SAAe,EAAE,OAAa,EAAE,QAAc,EAAE,YAAoB;IAC/F,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,OAAO,EAAE,EAAE;QAC7C,OAAO,YAAY,CAAC;KACrB;SAAM,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;QACrD,OAAO,CAAC,YAAY,EAAE,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC,CAAC;KAC3C;SAAM,IAAI,OAAO,CAAC,OAAO,EAAE,KAAK,QAAQ,CAAC,OAAO,EAAE,EAAE;QACnD,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC;KAC3C;IACD,OAAO,CAAC,CAAC;AACX,CAAC","file":"custom-layout.js","sourcesContent":["import type { CustomRenderFunctionArg } from '@visactor/vtable/es/ts-types';\nimport { Group, Text, Rect, Circle } from '@visactor/vtable/es/vrender';\nimport type { Calendar } from '../month-calendar';\nimport { differenceInDays, startOfDay } from 'date-fns';\n\nexport function calendarCustomLayout(args: CustomRenderFunctionArg) {\n const { table, row, col, rect } = args;\n const calendar = (table as any).options._calendar as Calendar;\n // const record = table.getRecordByCell(col, row);\n const { height, width } = rect ?? table.getCellRect(col, row);\n\n const cellDate = calendar.getCellDate(col, row);\n const customEvents = calendar.customHandler.getCellCustomEvent(col, row);\n\n const { contentHeight, barHeight, fontSize, contentPadding, barCornerRadius, circleRadius } =\n calendar.customHandler.customEventOptions;\n\n if (!customEvents) {\n return undefined;\n }\n\n const textHeight = (table.theme.bodyStyle.fontSize as number) + 10; // padding\n\n const container = new Group({\n x: 0,\n y: textHeight,\n height: height - textHeight, // text height\n width\n // display: 'flex',\n // flexDirection: 'column',\n // flexWrap: 'nowrap'\n });\n\n const { keys, values } = customEvents;\n const lastKey = keys[keys.length - 1];\n\n let y = 0;\n for (let i = 0; i <= lastKey; i++) {\n const event = values[i];\n if (!event) {\n // add empty rect for ocupy space\n const emptyGroup = new Group({\n x: 0,\n y,\n width: width,\n height: contentHeight,\n fill: false,\n stroke: false,\n clip: true\n }) as any;\n container.add(emptyGroup);\n } else if (event.type === 'list') {\n const listGroup = new Group({\n x: 0,\n y,\n width: width,\n height: contentHeight,\n fill: false,\n stroke: false,\n clip: true,\n cursor: 'pointer'\n }) as any;\n container.add(listGroup);\n listGroup._role = 'calendar-custom-event';\n listGroup._customEvent = event;\n\n const circle = new Circle({\n radius: circleRadius,\n fill: event.color,\n x: contentPadding + circleRadius,\n y: contentHeight / 2,\n pickable: false\n });\n listGroup.add(circle);\n\n const text = new Text({\n x: contentPadding + circleRadius * 2 + contentPadding,\n y: contentHeight / 2,\n text: event.text,\n fontSize,\n fill: event.color,\n textAlign: 'left',\n textBaseline: 'middle',\n pickable: false\n });\n listGroup.add(text);\n } else {\n const { startDate, endDate } = event;\n // bar\n const barGroup = new Group({\n x: 0,\n y,\n width: width,\n height: contentHeight,\n fill: false,\n stroke: false,\n clip: true,\n cursor: 'pointer'\n }) as any;\n container.add(barGroup);\n barGroup._role = 'calendar-custom-event';\n barGroup._customEvent = event;\n\n const rect = new Rect({\n x: 0,\n y: (contentHeight - barHeight) / 2,\n width: width,\n height: barHeight,\n fill: event.bgColor,\n cornerRadius: getRectCornerRadius(startDate, endDate, cellDate, barCornerRadius),\n pickable: false\n });\n barGroup.add(rect);\n\n const days = differenceInDays(startOfDay(startDate), startOfDay(cellDate));\n const text = new Text({\n x: contentPadding,\n y: contentHeight / 2,\n dx: days * width,\n text: event.text,\n fontSize,\n fill: event.color,\n textAlign: 'left',\n textBaseline: 'middle',\n pickable: false\n });\n barGroup.add(text);\n }\n\n y += contentHeight;\n }\n\n return {\n rootContainer: container,\n renderDefault: true\n };\n}\n\nfunction getRectCornerRadius(startDate: Date, endDate: Date, cellDate: Date, cornerRadius: number) {\n if (startDate.getDate() === endDate.getDate()) {\n return cornerRadius;\n } else if (startDate.getDate() === cellDate.getDate()) {\n return [cornerRadius, 0, 0, cornerRadius];\n } else if (endDate.getDate() === cellDate.getDate()) {\n return [0, cornerRadius, cornerRadius, 0];\n }\n return 0;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function getStartAndEndDate(today: Date, daltaDays: number): {
|
|
2
|
+
startDate: Date;
|
|
3
|
+
endDate: Date;
|
|
4
|
+
};
|
|
5
|
+
export declare const defaultDayTitles: string[];
|
|
6
|
+
export type DateRecordKeys = 'year' | 'month' | 'Sun' | 'Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat';
|
|
7
|
+
export type DateRecord = Record<DateRecordKeys, number>;
|
|
8
|
+
export declare function getRecords(startDate: Date, endDate: Date): DateRecord[];
|
|
9
|
+
export declare function getMonthString(monthIndex: number): string;
|
|
10
|
+
export declare function getWeekdayString(weekdayIndex: number): string;
|
package/es/date-util.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { addDays, getDaysInMonth, isAfter, lastDayOfMonth } from "date-fns";
|
|
2
|
+
|
|
3
|
+
export function getStartAndEndDate(today, daltaDays) {
|
|
4
|
+
const startDate = addDays(today, -daltaDays);
|
|
5
|
+
startDate.setDate(1);
|
|
6
|
+
return {
|
|
7
|
+
startDate: startDate,
|
|
8
|
+
endDate: lastDayOfMonth(addDays(today, daltaDays))
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export const defaultDayTitles = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ];
|
|
13
|
+
|
|
14
|
+
export function getRecords(startDate, endDate) {
|
|
15
|
+
const records = [];
|
|
16
|
+
if (isAfter(startDate, endDate)) {
|
|
17
|
+
const temp = startDate;
|
|
18
|
+
startDate = endDate, endDate = temp;
|
|
19
|
+
}
|
|
20
|
+
const startYear = startDate.getFullYear(), startMonth = startDate.getMonth(), endYear = endDate.getFullYear(), endMonth = endDate.getMonth();
|
|
21
|
+
let year = startYear, month = startMonth;
|
|
22
|
+
for (;year !== endYear || month <= endMonth; ) {
|
|
23
|
+
const monthStartDate = new Date(year, month, 1), daysInMonth = getDaysInMonth(monthStartDate);
|
|
24
|
+
let record, week = monthStartDate.getDay();
|
|
25
|
+
0 === records.length ? 0 === week ? (record = {
|
|
26
|
+
year: year,
|
|
27
|
+
month: month
|
|
28
|
+
}, records.push(record)) : 0 === month ? (record = {
|
|
29
|
+
year: year - 1,
|
|
30
|
+
month: 11
|
|
31
|
+
}, records.push(record)) : (record = {
|
|
32
|
+
year: year,
|
|
33
|
+
month: month - 1
|
|
34
|
+
}, records.push(record)) : 0 === week ? (record = {
|
|
35
|
+
year: year,
|
|
36
|
+
month: month
|
|
37
|
+
}, records.push(record)) : record = records[records.length - 1];
|
|
38
|
+
for (let day = 1; day <= daysInMonth; day++) 7 === week && (week = 0, record = {
|
|
39
|
+
year: year,
|
|
40
|
+
month: month
|
|
41
|
+
}, records.push(record)), setDate(record, week, day), week += 1;
|
|
42
|
+
month += 1, 12 === month && (month = 0, year += 1);
|
|
43
|
+
}
|
|
44
|
+
return records;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function setDate(record, day, date) {
|
|
48
|
+
switch (day) {
|
|
49
|
+
case 0:
|
|
50
|
+
record.Sun = date;
|
|
51
|
+
break;
|
|
52
|
+
|
|
53
|
+
case 1:
|
|
54
|
+
record.Mon = date;
|
|
55
|
+
break;
|
|
56
|
+
|
|
57
|
+
case 2:
|
|
58
|
+
record.Tue = date;
|
|
59
|
+
break;
|
|
60
|
+
|
|
61
|
+
case 3:
|
|
62
|
+
record.Wed = date;
|
|
63
|
+
break;
|
|
64
|
+
|
|
65
|
+
case 4:
|
|
66
|
+
record.Thu = date;
|
|
67
|
+
break;
|
|
68
|
+
|
|
69
|
+
case 5:
|
|
70
|
+
record.Fri = date;
|
|
71
|
+
break;
|
|
72
|
+
|
|
73
|
+
case 6:
|
|
74
|
+
record.Sat = date;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const monthStrings = [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" ];
|
|
79
|
+
|
|
80
|
+
export function getMonthString(monthIndex) {
|
|
81
|
+
return monthStrings[monthIndex % monthStrings.length];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const weekdayStrings = [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ];
|
|
85
|
+
|
|
86
|
+
export function getWeekdayString(weekdayIndex) {
|
|
87
|
+
return weekdayStrings[weekdayIndex % weekdayStrings.length];
|
|
88
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["date-util.ts"],"names":[],"mappings":"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","file":"date-util.js","sourcesContent":["import { addDays, getDaysInMonth, isAfter, lastDayOfMonth } from 'date-fns';\n\nexport function getStartAndEndDate(today: Date, daltaDays: number) {\n const startDate = addDays(today, -daltaDays);\n startDate.setDate(1);\n const endDate = lastDayOfMonth(addDays(today, daltaDays));\n return { startDate, endDate };\n}\n\n// export const defaultDayTitles = ['year', 'month', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nexport const defaultDayTitles = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nexport type DateRecordKeys = 'year' | 'month' | 'Sun' | 'Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri' | 'Sat';\nexport type DateRecord = Record<DateRecordKeys, number>;\n\nexport function getRecords(startDate: Date, endDate: Date) {\n const records: DateRecord[] = [];\n\n if (isAfter(startDate, endDate)) {\n const temp = startDate;\n startDate = endDate;\n endDate = temp;\n }\n\n const startYear = startDate.getFullYear();\n const startMonth = startDate.getMonth();\n\n const endYear = endDate.getFullYear();\n const endMonth = endDate.getMonth();\n\n let year = startYear;\n let month = startMonth;\n while (year !== endYear || month <= endMonth) {\n const monthStartDate = new Date(year, month, 1);\n const daysInMonth = getDaysInMonth(monthStartDate);\n let week = monthStartDate.getDay();\n let record: DateRecord;\n if (records.length === 0) {\n if (week === 0) {\n record = { year, month } as DateRecord;\n records.push(record);\n } else if (month === 0) {\n record = { year: year - 1, month: 11 } as DateRecord;\n records.push(record);\n } else {\n record = { year, month: month - 1 } as DateRecord;\n records.push(record);\n }\n } else if (week === 0) {\n record = { year, month } as DateRecord;\n records.push(record);\n } else {\n record = records[records.length - 1];\n }\n\n for (let day = 1; day <= daysInMonth; day++) {\n if (week === 7) {\n week = 0;\n record = { year, month } as DateRecord;\n records.push(record);\n }\n setDate(record, week, day);\n week += 1;\n }\n\n month += 1;\n if (month === 12) {\n month = 0;\n year += 1;\n }\n }\n\n return records;\n}\n\nfunction setDate(record: DateRecord, day: number, date: number) {\n switch (day) {\n case 0:\n record.Sun = date;\n break;\n case 1:\n record.Mon = date;\n break;\n case 2:\n record.Tue = date;\n break;\n case 3:\n record.Wed = date;\n break;\n case 4:\n record.Thu = date;\n break;\n case 5:\n record.Fri = date;\n break;\n case 6:\n record.Sat = date;\n break;\n }\n}\n\nconst monthStrings = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nexport function getMonthString(monthIndex: number) {\n return monthStrings[monthIndex % monthStrings.length];\n}\n\nconst weekdayStrings = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\nexport function getWeekdayString(weekdayIndex: number) {\n return weekdayStrings[weekdayIndex % weekdayStrings.length];\n}\n"]}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { MousePointerCellEvent } from '@visactor/vtable';
|
|
2
|
+
import type { IEventData } from '../custom/custom-handler';
|
|
3
|
+
import type { SelectedCellEvent } from '@visactor/vtable/src/ts-types';
|
|
4
|
+
export interface CalendarEvents {
|
|
5
|
+
CALENDAR_DATE_CLICK: 'calendar_date_click';
|
|
6
|
+
SELECTED_DATE: 'selected_date';
|
|
7
|
+
SELECTED_DATE_CLEAR: 'selected_date_clear';
|
|
8
|
+
DRAG_SELECT_DATE_END: 'drag_select_date_end';
|
|
9
|
+
CALENDAR_CUSTOM_EVENT_CLICK: 'calendar_custom_event_click';
|
|
10
|
+
}
|
|
11
|
+
export declare const CALENDAR_EVENT_TYPE: CalendarEvents;
|
|
12
|
+
export interface CalendarEventHandlersEventArgumentMap {
|
|
13
|
+
calendar_date_click: {
|
|
14
|
+
date: Date;
|
|
15
|
+
tableEvent: MousePointerCellEvent;
|
|
16
|
+
};
|
|
17
|
+
selected_date: {
|
|
18
|
+
date: Date;
|
|
19
|
+
tableEvent: SelectedCellEvent;
|
|
20
|
+
};
|
|
21
|
+
selected_date_clear: void;
|
|
22
|
+
drag_select_date_end: {
|
|
23
|
+
dates: Date[];
|
|
24
|
+
tableEvent: MousePointerCellEvent;
|
|
25
|
+
};
|
|
26
|
+
calendar_custom_event_click: {
|
|
27
|
+
date: Date;
|
|
28
|
+
tableEvent: MousePointerCellEvent;
|
|
29
|
+
customEvent: IEventData;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
export interface CalendarEventHandlersReturnMap {
|
|
33
|
+
calendar_date_click: void;
|
|
34
|
+
selected_date: void;
|
|
35
|
+
selected_date_clear: void;
|
|
36
|
+
drag_select_date_end: void;
|
|
37
|
+
calendar_custom_event_click: void;
|
|
38
|
+
}
|
|
39
|
+
export type CalendarEventListener<TYPE extends keyof CalendarEventHandlersEventArgumentMap> = (args: CalendarEventHandlersEventArgumentMap[TYPE]) => CalendarEventHandlersReturnMap[TYPE];
|
package/es/event/type.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export const CALENDAR_EVENT_TYPE = {
|
|
2
|
+
CALENDAR_DATE_CLICK: "calendar_date_click",
|
|
3
|
+
SELECTED_DATE: "selected_date",
|
|
4
|
+
SELECTED_DATE_CLEAR: "selected_date_clear",
|
|
5
|
+
DRAG_SELECT_DATE_END: "drag_select_date_end",
|
|
6
|
+
CALENDAR_CUSTOM_EVENT_CLICK: "calendar_custom_event_click"
|
|
7
|
+
};
|
|
8
|
+
//# sourceMappingURL=type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["event/type.ts"],"names":[],"mappings":"AA8BA,MAAM,CAAC,MAAM,mBAAmB,GAAmB;IACjD,mBAAmB,EAAE,qBAAqB;IAC1C,aAAa,EAAE,eAAe;IAC9B,mBAAmB,EAAE,qBAAqB;IAC1C,oBAAoB,EAAE,sBAAsB;IAC5C,2BAA2B,EAAE,6BAA6B;CACzC,CAAC","file":"type.js","sourcesContent":["import type { MousePointerCellEvent } from '@visactor/vtable';\nimport type { IEventData } from '../custom/custom-handler';\nimport type { SelectedCellEvent } from '@visactor/vtable/src/ts-types';\n\nexport interface CalendarEvents {\n /**\n * 日期点击事件\n */\n CALENDAR_DATE_CLICK: 'calendar_date_click';\n /**\n * 日期选中状态改变事件\n */\n SELECTED_DATE: 'selected_date';\n /**\n * 日期选中状态改变事件\n */\n SELECTED_DATE_CLEAR: 'selected_date_clear';\n /**\n * 拖拽框选日期鼠标松开事件\n */\n DRAG_SELECT_DATE_END: 'drag_select_date_end';\n /**\n * 自定义事件点击事件\n */\n CALENDAR_CUSTOM_EVENT_CLICK: 'calendar_custom_event_click';\n}\n\n/**\n * Calendar event types\n */\nexport const CALENDAR_EVENT_TYPE: CalendarEvents = {\n CALENDAR_DATE_CLICK: 'calendar_date_click',\n SELECTED_DATE: 'selected_date',\n SELECTED_DATE_CLEAR: 'selected_date_clear',\n DRAG_SELECT_DATE_END: 'drag_select_date_end',\n CALENDAR_CUSTOM_EVENT_CLICK: 'calendar_custom_event_click'\n} as CalendarEvents;\n\nexport interface CalendarEventHandlersEventArgumentMap {\n calendar_date_click: { date: Date; tableEvent: MousePointerCellEvent };\n selected_date: { date: Date; tableEvent: SelectedCellEvent };\n selected_date_clear: void;\n drag_select_date_end: { dates: Date[]; tableEvent: MousePointerCellEvent };\n calendar_custom_event_click: { date: Date; tableEvent: MousePointerCellEvent; customEvent: IEventData };\n}\n\nexport interface CalendarEventHandlersReturnMap {\n calendar_date_click: void;\n selected_date: void;\n selected_date_clear: void;\n drag_select_date_end: void;\n calendar_custom_event_click: void;\n}\n\nexport type CalendarEventListener<TYPE extends keyof CalendarEventHandlersEventArgumentMap> = (\n args: CalendarEventHandlersEventArgumentMap[TYPE]\n) => CalendarEventHandlersReturnMap[TYPE]; //AnyFunction;\n"]}
|
package/es/index.d.ts
ADDED
package/es/index.js
ADDED
package/es/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC","file":"index.js","sourcesContent":["export * from './month-calendar';\nexport type { ICustomEvent } from './custom/custom-handler';\nexport { CALENDAR_EVENT_TYPE } from './event/type';\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { ListTable, EventTarget } from '@visactor/vtable';
|
|
2
|
+
import type { DateRecord } from './date-util';
|
|
3
|
+
import type { TYPES, ListTableConstructorOptions } from '@visactor/vtable';
|
|
4
|
+
import type { ICustomEvent, ICustomEventOptions, IEventData } from './custom/custom-handler';
|
|
5
|
+
import { CustomEventHandler } from './custom/custom-handler';
|
|
6
|
+
import type { CalendarEventHandlersEventArgumentMap, CalendarEventHandlersReturnMap, CalendarEventListener } from './event/type';
|
|
7
|
+
import type { EventListenerId } from '@visactor/vtable/src/ts-types';
|
|
8
|
+
export interface CalendarConstructorOptions {
|
|
9
|
+
startDate?: Date;
|
|
10
|
+
endDate?: Date;
|
|
11
|
+
currentDate?: Date;
|
|
12
|
+
rangeDays?: number;
|
|
13
|
+
dayTitles?: [string, string, string, string, string, string, string];
|
|
14
|
+
tableOptions?: ListTableConstructorOptions;
|
|
15
|
+
customEvents?: ICustomEvent[];
|
|
16
|
+
customEventOptions?: ICustomEventOptions;
|
|
17
|
+
}
|
|
18
|
+
export declare class Calendar extends EventTarget {
|
|
19
|
+
container: HTMLElement;
|
|
20
|
+
options: CalendarConstructorOptions;
|
|
21
|
+
table: ListTable;
|
|
22
|
+
startDate: Date;
|
|
23
|
+
endDate: Date;
|
|
24
|
+
currentDate: Date;
|
|
25
|
+
rangeDays: number;
|
|
26
|
+
tableStartDate: Date;
|
|
27
|
+
records: DateRecord[];
|
|
28
|
+
currentMonthCellRanges: {
|
|
29
|
+
range: TYPES.CellRange;
|
|
30
|
+
}[];
|
|
31
|
+
currentMonth: number;
|
|
32
|
+
currentYear: number;
|
|
33
|
+
titleClickHandler: () => void;
|
|
34
|
+
maxCol: number;
|
|
35
|
+
minCol: number;
|
|
36
|
+
customHandler: CustomEventHandler;
|
|
37
|
+
constructor(container: HTMLElement, options?: CalendarConstructorOptions);
|
|
38
|
+
_createTable(): void;
|
|
39
|
+
getYearAndMonth(): any;
|
|
40
|
+
jumpToDate(date: Date, animation?: boolean | TYPES.ITableAnimationOption): void;
|
|
41
|
+
jumpToCurrentMonth(animation?: boolean | TYPES.ITableAnimationOption): void;
|
|
42
|
+
_updateMonthCustomStyle(year: number, month: number): void;
|
|
43
|
+
fireListeners<TYPE extends keyof CalendarEventHandlersEventArgumentMap>(type: TYPE, event: CalendarEventHandlersEventArgumentMap[TYPE]): CalendarEventHandlersReturnMap[TYPE][];
|
|
44
|
+
on<TYPE extends keyof CalendarEventHandlersEventArgumentMap>(type: TYPE, listener: CalendarEventListener<TYPE>): EventListenerId;
|
|
45
|
+
_bindEvent(): void;
|
|
46
|
+
release(): void;
|
|
47
|
+
getCellLocation(date: Date): {
|
|
48
|
+
row: number;
|
|
49
|
+
col: number;
|
|
50
|
+
};
|
|
51
|
+
getCellDate(col: number, row: number): Date;
|
|
52
|
+
get selectedDate(): {
|
|
53
|
+
date: Date;
|
|
54
|
+
col: number;
|
|
55
|
+
row: number;
|
|
56
|
+
}[];
|
|
57
|
+
addCustomEvent(event: ICustomEvent): void;
|
|
58
|
+
removeCustomEvent(id: string): void;
|
|
59
|
+
updateCustomEvent(event: ICustomEvent): void;
|
|
60
|
+
addCustomEvents(events: ICustomEvent[]): void;
|
|
61
|
+
removeCustomEvents(ids: string[]): void;
|
|
62
|
+
updateCustomEvents(events: ICustomEvent[]): void;
|
|
63
|
+
getCellCustomEventByDate(date: Date): IEventData[];
|
|
64
|
+
getCellCustomEventByLocation(col: number, row: number): IEventData[];
|
|
65
|
+
}
|