@voplus/morpho-workspace 11.2.1 → 11.2.3

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.
Files changed (42) hide show
  1. package/es/modules/calendar/pages/CalendarMonth/index.d.ts +0 -1
  2. package/es/modules/calendar/pages/CalendarMonth/index.js +55 -23
  3. package/es/modules/calendar/pages/CalendarMonth/index.js.map +1 -1
  4. package/es/modules/tasks/components/TaskItem/SubTaskItem.js +4 -1
  5. package/es/modules/tasks/components/TaskItem/SubTaskItem.js.map +1 -1
  6. package/es/routes.js +2 -2
  7. package/es/routes.js.map +1 -1
  8. package/package.json +1 -1
  9. package/es/modules/calendar-board/CalendarBoardRoutes.d.ts +0 -12
  10. package/es/modules/calendar-board/CalendarBoardRoutes.js +0 -28
  11. package/es/modules/calendar-board/CalendarBoardRoutes.js.map +0 -1
  12. package/es/modules/calendar-board/components/CalendarBoardGrid/index.d.ts +0 -45
  13. package/es/modules/calendar-board/components/CalendarBoardGrid/index.js +0 -48
  14. package/es/modules/calendar-board/components/CalendarBoardGrid/index.js.map +0 -1
  15. package/es/modules/calendar-board/components/CalendarEventChip/index.d.ts +0 -22
  16. package/es/modules/calendar-board/components/CalendarEventChip/index.js +0 -20
  17. package/es/modules/calendar-board/components/CalendarEventChip/index.js.map +0 -1
  18. package/es/modules/calendar-board/components/CalendarLegend/index.d.ts +0 -37
  19. package/es/modules/calendar-board/components/CalendarLegend/index.js +0 -81
  20. package/es/modules/calendar-board/components/CalendarLegend/index.js.map +0 -1
  21. package/es/modules/calendar-board/components/CalendarMoreLink/index.d.ts +0 -11
  22. package/es/modules/calendar-board/components/CalendarMoreLink/index.js +0 -12
  23. package/es/modules/calendar-board/components/CalendarMoreLink/index.js.map +0 -1
  24. package/es/modules/calendar-board/components/CalendarSidebar/index.d.ts +0 -27
  25. package/es/modules/calendar-board/components/CalendarSidebar/index.js +0 -43
  26. package/es/modules/calendar-board/components/CalendarSidebar/index.js.map +0 -1
  27. package/es/modules/calendar-board/components/CalendarToolbar/index.d.ts +0 -23
  28. package/es/modules/calendar-board/components/CalendarToolbar/index.js +0 -28
  29. package/es/modules/calendar-board/components/CalendarToolbar/index.js.map +0 -1
  30. package/es/modules/calendar-board/event-meta.d.ts +0 -160
  31. package/es/modules/calendar-board/event-meta.js +0 -209
  32. package/es/modules/calendar-board/event-meta.js.map +0 -1
  33. package/es/modules/calendar-board/pages/CalendarBoard/index.css +0 -262
  34. package/es/modules/calendar-board/pages/CalendarBoard/index.d.ts +0 -4
  35. package/es/modules/calendar-board/pages/CalendarBoard/index.js +0 -181
  36. package/es/modules/calendar-board/pages/CalendarBoard/index.js.map +0 -1
  37. package/es/modules/calendar-board/pages/CalendarBoard/state.d.ts +0 -116
  38. package/es/modules/calendar-board/pages/CalendarBoard/state.js +0 -232
  39. package/es/modules/calendar-board/pages/CalendarBoard/state.js.map +0 -1
  40. package/es/modules/calendar-board/sidebar-data.d.ts +0 -27
  41. package/es/modules/calendar-board/sidebar-data.js +0 -19
  42. package/es/modules/calendar-board/sidebar-data.js.map +0 -1
@@ -1,43 +0,0 @@
1
- import React from "react";
2
- import classnames from "classnames";
3
- import { Empty } from "antd";
4
- import { FontAwesomeIcon as FAIcon, faSearchRegular } from "@voplus/morpho-ui/es/faIcons";
5
- import { Scrollbars } from "react-custom-scrollbars-2";
6
- import { DOT_COLOR_CLASS } from "../../event-meta";
7
- /**
8
- * 右侧栏:Search / UPCOMING·ACTIVITY / UPCOMING DEADLINES。
9
- *
10
- * - 搜索是纯前端过滤(见 sidebar-data.ts),不触发重新请求
11
- * - ACTIVITY 暂无数据源,先渲染空态并留 TODO
12
- * - 分类列表(原来的 CATEGORIES 段与它的显示 / 隐藏开关)已从侧栏移除,
13
- * 因此这里不再接收 categories / hiddenTypes / onToggleType
14
- *
15
- * 注:设计稿的 `hidden md:flex` 是整页 demo 的响应式写法;这里日历是嵌在工作区
16
- * 面板里的,视口宽度不代表面板宽度,因此侧栏常驻显示。
17
- *
18
- * 布局用 flex 分两段,整栏本身不滚:
19
- * 搜索 / 页签 —— shrink-0,固定在顶部
20
- * UPCOMING·ACTIVITY —— flex-1 min-h-0,占满剩余高度,内部交给 Scrollbars 自己滚
21
- */
22
- const CalendarSidebar = (props) => (React.createElement("aside", { className: "flex w-[280px] lg:w-[340px] shrink-0 flex-col border-l border-border overflow-hidden bg-bg-white" },
23
- React.createElement("div", { className: "p-4 shrink-0" },
24
- React.createElement("div", { className: "relative" },
25
- React.createElement(FAIcon, { icon: faSearchRegular, className: "absolute left-3 top-1/2 -translate-y-1/2 text-font-grey" }),
26
- React.createElement("input", { type: "text", value: props.search, placeholder: "Search in event ...", className: "w-full pl-9 pr-3 py-2 text-sm border border-border rounded-base text-font-primary placeholder:text-font-grey focus:outline-none", onChange: (ev) => props.onSearch(ev.target.value) }))),
27
- React.createElement("div", { className: "flex items-center bg-bg-grey rounded-base px-[5px] py-[7px] mx-4 shrink-0 text-sm font-bold uppercase tracking-wide" }, [
28
- { value: "upcoming", label: "UPCOMING" },
29
- { value: "activity", label: "ACTIVITY" },
30
- ].map((tab) => (React.createElement("button", { key: tab.value, className: classnames("flex-1 px-4 py-2 rounded-base cursor-pointer", tab.value === props.tab ? "bg-bg-white text-font-secondary shadow-sm" : "text-font-grey"), onClick: () => props.onChangeTab(tab.value) }, tab.label)))),
31
- React.createElement("div", { className: "flex-1 min-h-0" },
32
- React.createElement(Scrollbars, { autoHide: true, className: "calendar-sidebar-scroll" }, props.tab === "upcoming" ? (React.createElement("div", { className: "px-4 pt-4" },
33
- React.createElement("div", { className: classnames("field-label mb-2") }, "UPCOMING DEADLINES"),
34
- React.createElement("ul", { className: "flex flex-col gap-2.5 pb-4" }, props.upcoming.map((item) => (React.createElement("li", { key: item.id, className: "flex items-start justify-between gap-2 cursor-pointer border border-border rounded-base p-3.5", onClick: () => props.onSelectEvent(item.source) },
35
- React.createElement("div", { className: "flex items-start gap-2 min-w-0" },
36
- React.createElement("span", { className: classnames("w-2 h-2 rounded-full mt-1.5 inline-block shrink-0", DOT_COLOR_CLASS[item.color]) }),
37
- React.createElement("div", { className: "min-w-0" },
38
- React.createElement("div", { className: "text-sm font-bold text-font-primary truncate" }, item.title),
39
- React.createElement("div", { className: "text-sm font-semibold text-font-grey" }, item.timeLabel))),
40
- React.createElement("span", { className: "text-sm font-semibold text-font-secondary shrink-0" }, item.remainingLabel))))))) : (React.createElement("div", { className: "px-4 pt-4 text-xs text-font-grey" },
41
- React.createElement(Empty, { image: Empty.PRESENTED_IMAGE_SIMPLE })))))));
42
- export default CalendarSidebar;
43
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/calendar-board/components/CalendarSidebar/index.tsx"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import React from "react";
2
- import { type CalendarViewType } from "../../pages/CalendarBoard/state";
3
- /**
4
- * 顶部工具栏:TODAY / ← 日期 → / MONTH·WEEK·DAY。
5
- *
6
- * FullCalendar 自带工具栏已由 headerToolbar={false} 关闭,这里完全自绘。
7
- * 日期标题上盖一个透明的 DatePicker,沿用 CalendarMonth 的做法
8
- * (点标题即可跳到某月 / 某周 / 某天)。
9
- */
10
- declare const CalendarToolbar: (props: {
11
- type: CalendarViewType;
12
- title?: string;
13
- /** DatePicker 的受控值 */
14
- currentTime?: any;
15
- onChangeType: (type: CalendarViewType) => void;
16
- onToday: () => void;
17
- onPrev: () => void;
18
- onNext: () => void;
19
- onChangeDate: (date: any, dateString: string | string[] | null) => void;
20
- /** 右侧补充区(OwnerType 过滤器) */
21
- children?: React.ReactNode;
22
- }) => React.JSX.Element;
23
- export default CalendarToolbar;
@@ -1,28 +0,0 @@
1
- import React from "react";
2
- import classnames from "classnames";
3
- import { FontAwesomeIcon as FAIcon, faAngleLeftRegular, faAngleRightRegular, } from "@voplus/morpho-ui/es/faIcons";
4
- import { UTCDatePicker as DatePicker } from "@voplus/morpho-ui";
5
- import { VIEW_TYPE_OPTIONS } from "../../pages/CalendarBoard/state";
6
- /**
7
- * 顶部工具栏:TODAY / ← 日期 → / MONTH·WEEK·DAY。
8
- *
9
- * FullCalendar 自带工具栏已由 headerToolbar={false} 关闭,这里完全自绘。
10
- * 日期标题上盖一个透明的 DatePicker,沿用 CalendarMonth 的做法
11
- * (点标题即可跳到某月 / 某周 / 某天)。
12
- */
13
- const CalendarToolbar = (props) => (React.createElement("div", { className: "flex items-center gap-4 px-6 h-[90px] shrink-0 flex-wrap" },
14
- React.createElement("button", { className: "secondary-button h-[45px] px-5 tracking-wide", onClick: props.onToday }, "TODAY"),
15
- React.createElement("div", { className: "flex-1 flex items-center justify-center gap-3" },
16
- React.createElement("button", { className: "w-10 h-10 rounded-full border border-border flex items-center justify-center text-font-grey cursor-pointer hover:text-font-secondary hover:border-font-secondary", onClick: props.onPrev },
17
- React.createElement(FAIcon, { icon: faAngleLeftRegular })),
18
- React.createElement("div", { className: "relative px-2 text-xl font-bold text-font-primary" },
19
- props.title,
20
- React.createElement(DatePicker, { picker: props.type === "month" ? "month" : props.type === "week" ? "week" : "date", className: "calendar-board-picker", defaultValue: props.currentTime, placeholder: "", onChange: props.onChangeDate })),
21
- React.createElement("button", { className: "w-10 h-10 rounded-full border border-border flex items-center justify-center text-font-grey cursor-pointer hover:text-font-secondary hover:border-font-secondary", onClick: props.onNext },
22
- React.createElement(FAIcon, { icon: faAngleRightRegular }))),
23
- props.children,
24
- React.createElement("div", { className: "flex items-center bg-bg-grey rounded-base p-1 h-[50px] text-sm font-bold uppercase tracking-wide" }, VIEW_TYPE_OPTIONS.map((option) => (React.createElement("button", { key: option.value, className: classnames("px-6 h-[35px] flex items-center justify-center rounded-base cursor-pointer", option.value === props.type
25
- ? "bg-bg-white text-font-secondary shadow-sm"
26
- : "text-font-grey"), onClick: () => props.onChangeType(option.value) }, option.label))))));
27
- export default CalendarToolbar;
28
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/modules/calendar-board/components/CalendarToolbar/index.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,UAAU,MAAM,YAAY,CAAC;AACpC,OAAO,EACN,eAAe,IAAI,MAAM,EACzB,kBAAkB,EAClB,mBAAmB,GACnB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,aAAa,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAyB,MAAM,iCAAiC,CAAC;AAE3F;;;;;;GAMG;AACH,MAAM,eAAe,GAAG,CAAC,KAYxB,EAAE,EAAE,CAAC,CACL,6BAAK,SAAS,EAAC,0DAA0D;IACxE,gCAAQ,SAAS,EAAC,8CAA8C,EAAC,OAAO,EAAE,KAAK,CAAC,OAAO,YAE9E;IAET,6BAAK,SAAS,EAAC,+CAA+C;QAC7D,gCACC,SAAS,EAAC,kKAAkK,EAC5K,OAAO,EAAE,KAAK,CAAC,MAAM;YAErB,oBAAC,MAAM,IAAC,IAAI,EAAE,kBAAkB,GAAI,CAC5B;QACT,6BAAK,SAAS,EAAC,mDAAmD;YAChE,KAAK,CAAC,KAAK;YACZ,oBAAC,UAAU,IACV,MAAM,EAAE,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAClF,SAAS,EAAC,uBAAuB,EACjC,YAAY,EAAE,KAAK,CAAC,WAAW,EAC/B,WAAW,EAAC,EAAE,EACd,QAAQ,EAAE,KAAK,CAAC,YAAY,GAC3B,CACG;QACN,gCACC,SAAS,EAAC,kKAAkK,EAC5K,OAAO,EAAE,KAAK,CAAC,MAAM;YAErB,oBAAC,MAAM,IAAC,IAAI,EAAE,mBAAmB,GAAI,CAC7B,CACJ;IACL,KAAK,CAAC,QAAQ;IACf,6BAAK,SAAS,EAAC,kGAAkG,IAC/G,iBAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAClC,gCACC,GAAG,EAAE,MAAM,CAAC,KAAK,EACjB,SAAS,EAAE,UAAU,CACpB,4EAA4E,EAC5E,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI;YAC1B,CAAC,CAAC,2CAA2C;YAC7C,CAAC,CAAC,gBAAgB,CACnB,EACD,OAAO,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,IAE9C,MAAM,CAAC,KAAK,CACL,CACT,CAAC,CACG,CACD,CACN,CAAC;AAEF,eAAe,eAAe,CAAC"}
@@ -1,160 +0,0 @@
1
- import dayjs from "dayjs";
2
- import type { ICalendar } from "../../data/calendar";
3
- /** 日历事件来源(服务端返回的 source 字段,运行时还会被写入 title) */
4
- export type CalendarBoardSource = {
5
- id: string;
6
- type: string;
7
- nodeType?: string;
8
- title?: string;
9
- };
10
- /**
11
- * 日历事件:字段与 src/data/calendar 的 ICalendar 兼容。
12
- *
13
- * 对 ICalendar 做了两处收窄 / 补充:
14
- * - `source` 用更完整的 CalendarBoardSource(运行时还带 nodeType / title,ICalendar 只声明了 id 与 type);
15
- * - 补上 FullCalendar 运行时字段:`start` / `end` 是 FullCalendar 读取的字段,服务端实际会返回;
16
- * `extendedProps.source` 是 FullCalendar 把非标准字段(source)收拢后的位置,
17
- * 现有 CalendarMonth 就是通过 `info.event.extendedProps.source` 拿到事件的。
18
- */
19
- export type CalendarBoardEvent = Omit<ICalendar, "source"> & {
20
- source?: CalendarBoardSource;
21
- start?: string | Date;
22
- end?: string | Date;
23
- extendedProps?: {
24
- source?: CalendarBoardSource;
25
- };
26
- };
27
- /**
28
- * 分类色板:沿用 calendar-recreation.html 的事件卡原色(蓝 / 红 / 绿 / 橙)。
29
- *
30
- * 顺序即取色顺序,见 buildColorMap —— 同一 source.type 永远落在同一颜色上,
31
- * 与现有 CalendarMonth 用 generateLightColorFromHash(source.type) 的意图一致。
32
- */
33
- export declare const CATEGORY_COLORS: readonly ["blue", "red", "green", "orange"];
34
- export type CategoryColor = (typeof CATEGORY_COLORS)[number];
35
- /** 事件卡配色:逐字取自 HTML 的 `border border-{c}-400 bg-{c}-50 text-{c}-600` */
36
- export declare const CHIP_COLOR_CLASS: Record<CategoryColor, string>;
37
- /** 事件卡内的时间行配色,取自 calendar-day-view.html 的 `text-amber-600` / `text-red-500` */
38
- export declare const CHIP_TIME_CLASS: Record<CategoryColor, string>;
39
- /** 图例 / 侧栏分类列表的圆点配色,取自 HTML 的 `bg-blue-600 / bg-red-500 / ...` */
40
- export declare const DOT_COLOR_CLASS: Record<CategoryColor, string>;
41
- /**
42
- * 事件卡外壳:HTML 的 `text-[10px] font-bold uppercase rounded-md px-2 py-0.5 border-l-4 truncate`。
43
- *
44
- * 用 overflow-hidden 而不是 truncate:日视图的卡片里还有第二行时间文案,
45
- * 文字截断交给内层每一行的 truncate。
46
- */
47
- export declare const CHIP_BASE_CLASS = "border border-l-4 text-2xs text-font-primary font-bold uppercase rounded-base px-2 py-0.5 cursor-pointer overflow-hidden";
48
- /** 没有 source.type 时归入的分类名 */
49
- export declare const DEFAULT_CATEGORY_TYPE = "Other";
50
- /** 事件的分类名(source.type) */
51
- export declare const getEventType: (event: CalendarBoardEvent) => string;
52
- /**
53
- * 事件的起始时间。
54
- *
55
- * ICalendar 声明的是 startDate,FullCalendar 读的是 start,两者都被兼容;
56
- * 都缺失时退回 dueDate,仍缺失则返回 undefined(该事件不参与侧栏推导)。
57
- */
58
- export declare const getEventStart: (event: CalendarBoardEvent) => Date | undefined;
59
- /** 事件标题:优先 FullCalendar 解析出的 title,退回 source.title */
60
- export declare const getEventTitle: (event: CalendarBoardEvent) => string;
61
- /**
62
- * 按 source.type 去重排序后依次取色。
63
- *
64
- * 排序保证映射只取决于「出现了哪些 type」,与事件顺序无关,
65
- * 因此事件卡、图例、侧栏分类三处拿到的颜色必然一致。
66
- */
67
- export declare const buildColorMap: (types: Iterable<string>) => Map<string, CategoryColor>;
68
- export interface ICategorySummary {
69
- /** source.type */
70
- type: string;
71
- color: CategoryColor;
72
- count: number;
73
- /**
74
- * 该分类下的事件,供图例 hover 时列出。
75
- *
76
- * 与 count 同源(都基于传入的全量事件),所以「图例上的数字」和「浮层里的条数」
77
- * 永远一致;按开始时间升序,方便直接渲染。
78
- */
79
- events: CalendarBoardEvent[];
80
- }
81
- export interface IEventSummary {
82
- colorMap: Map<string, CategoryColor>;
83
- categories: ICategorySummary[];
84
- }
85
- /** 一次算出 type → 颜色映射与分类明细(计数 + 成员),供事件卡、图例、侧栏共用 */
86
- export declare const summarizeEvents: (events: CalendarBoardEvent[]) => IEventSummary;
87
- /** 取某个事件的颜色;映射缺失时退回色板首色 */
88
- export declare const resolveColor: (colorMap: Map<string, CategoryColor>, type: string) => CategoryColor;
89
- /**
90
- * 本地过滤:搜索关键字 + 被隐藏的分类。
91
- *
92
- * 纯前端过滤,不触发重新请求;日历与侧栏 UPCOMING 列表共用同一份结果。
93
- */
94
- export declare const filterEvents: (events: CalendarBoardEvent[], options?: {
95
- search?: string;
96
- hiddenTypes?: Iterable<string>;
97
- }) => CalendarBoardEvent[];
98
- export interface IUpcomingEvent {
99
- id: string;
100
- title: string;
101
- type: string;
102
- color: CategoryColor;
103
- /** 形如 `Aug 20 | 4PM`;全天事件只有日期 */
104
- timeLabel: string;
105
- /** 剩余天数,形如 `10D` */
106
- remainingLabel: string;
107
- source?: CalendarBoardSource;
108
- }
109
- /** 侧栏 UPCOMING DEADLINES 的默认条数,与 HTML 稿一致 */
110
- export declare const UPCOMING_LIMIT = 5;
111
- /** 相对今天还有几天(今天为 0D) */
112
- export declare const formatRemaining: (start: Date, from: dayjs.Dayjs) => string;
113
- /**
114
- * UPCOMING DEADLINES:今天及以后的事件,按起始时间升序取前 N 条。
115
- *
116
- * @param from 以哪一天为「今天」,默认取当前时间;测试注入固定日期用。
117
- */
118
- export declare const buildUpcoming: (events: CalendarBoardEvent[], summary: IEventSummary, options?: {
119
- from?: dayjs.Dayjs;
120
- limit?: number;
121
- }) => IUpcomingEvent[];
122
- /**
123
- * 写回服务端时的时间格式:**本地时间**,不带时区后缀。
124
- *
125
- * 与仓库里其它写时间属性的地方保持一致(见 MeetingHeader 的 StartTime/EndTime)。
126
- * 注意不要用 toISOString():它产出 UTC 时刻,UTC+8 下把事件拖到某天零点时,
127
- * 日期部分会退回前一天,服务端按本地时间解析就落到错误的日期上。
128
- */
129
- export declare const DATE_TIME_FORMAT = "YYYY-MM-DDTHH:mm:ss.SSS";
130
- /** 拖拽落点 → 服务端要写的时间字段 */
131
- export type DropPayload = {
132
- Start: string;
133
- End?: string;
134
- };
135
- /**
136
- * 把 FullCalendar 给出的落点转成服务端载荷。
137
- *
138
- * @returns 起止时间都拿不到(或非法)时返回 undefined,调用方应当放弃这次拖拽
139
- */
140
- export declare const buildDropPayload: (options: {
141
- start?: Date | string | null;
142
- end?: Date | string | null;
143
- }) => DropPayload | undefined;
144
- /** 按事件 id 在列表里找对应的那条(id 比较规则见 isSameEvent) */
145
- export declare const findEventById: (events: CalendarBoardEvent[], id?: string) => CalendarBoardEvent | undefined;
146
- /**
147
- * 把拖拽结果写回页面自己的事件列表。
148
- *
149
- * 必须做这一步:`state.listOptions` 只在挂载时加载一次,而事件数据会交给 FullCalendar
150
- * 当 eventSources —— 列表里还是旧位置的话,任何一次事件源重置都会把刚拖出去的事件打回原位。
151
- *
152
- * ⚠️ 没命中任何一条时必须**原样返回同一个数组**:`.map()` 那种写法即使什么都没改也会造出
153
- * 新引用,而新引用本身就会触发 FullCalendar 重置事件源,反而把拖拽结果覆盖掉。
154
- */
155
- export declare const applyDropToEvents: (events: CalendarBoardEvent[], id: string, drop: {
156
- start?: Date | string | null;
157
- end?: Date | string | null;
158
- }) => CalendarBoardEvent[];
159
- /** 图例浮层里的日期文案,设计稿是 `Aug 3`;拿不到时间时返回空串 */
160
- export declare const formatEventDate: (event: CalendarBoardEvent) => string;
@@ -1,209 +0,0 @@
1
- import dayjs from "dayjs";
2
- /**
3
- * 分类色板:沿用 calendar-recreation.html 的事件卡原色(蓝 / 红 / 绿 / 橙)。
4
- *
5
- * 顺序即取色顺序,见 buildColorMap —— 同一 source.type 永远落在同一颜色上,
6
- * 与现有 CalendarMonth 用 generateLightColorFromHash(source.type) 的意图一致。
7
- */
8
- export const CATEGORY_COLORS = ["blue", "red", "green", "orange"];
9
- /** 事件卡配色:逐字取自 HTML 的 `border border-{c}-400 bg-{c}-50 text-{c}-600` */
10
- export const CHIP_COLOR_CLASS = {
11
- blue: "border-blue-400 bg-blue-50",
12
- red: "border-red-400 bg-red-50",
13
- green: "border-green-400 bg-green-50",
14
- orange: "border-amber-400 bg-amber-50",
15
- };
16
- /** 事件卡内的时间行配色,取自 calendar-day-view.html 的 `text-amber-600` / `text-red-500` */
17
- export const CHIP_TIME_CLASS = {
18
- blue: "text-blue-500",
19
- red: "text-red-500",
20
- green: "text-green-600",
21
- orange: "text-amber-600",
22
- };
23
- /** 图例 / 侧栏分类列表的圆点配色,取自 HTML 的 `bg-blue-600 / bg-red-500 / ...` */
24
- export const DOT_COLOR_CLASS = {
25
- blue: "bg-blue-600",
26
- red: "bg-red-500",
27
- green: "bg-green-600",
28
- orange: "bg-orange-500",
29
- };
30
- /**
31
- * 事件卡外壳:HTML 的 `text-[10px] font-bold uppercase rounded-md px-2 py-0.5 border-l-4 truncate`。
32
- *
33
- * 用 overflow-hidden 而不是 truncate:日视图的卡片里还有第二行时间文案,
34
- * 文字截断交给内层每一行的 truncate。
35
- */
36
- export const CHIP_BASE_CLASS = "border border-l-4 text-2xs text-font-primary font-bold uppercase rounded-base px-2 py-0.5 cursor-pointer overflow-hidden";
37
- /** 没有 source.type 时归入的分类名 */
38
- export const DEFAULT_CATEGORY_TYPE = "Other";
39
- /** 事件的分类名(source.type) */
40
- export const getEventType = (event) => event.source?.type || DEFAULT_CATEGORY_TYPE;
41
- /**
42
- * 事件的起始时间。
43
- *
44
- * ICalendar 声明的是 startDate,FullCalendar 读的是 start,两者都被兼容;
45
- * 都缺失时退回 dueDate,仍缺失则返回 undefined(该事件不参与侧栏推导)。
46
- */
47
- export const getEventStart = (event) => {
48
- const source = event;
49
- const raw = event.start ?? source.startDate ?? source.dueDate;
50
- if (!raw)
51
- return undefined;
52
- const date = dayjs(raw);
53
- return date.isValid() ? date.toDate() : undefined;
54
- };
55
- /** 事件标题:优先 FullCalendar 解析出的 title,退回 source.title */
56
- export const getEventTitle = (event) => event.title || event.source?.title || "";
57
- /**
58
- * 按 source.type 去重排序后依次取色。
59
- *
60
- * 排序保证映射只取决于「出现了哪些 type」,与事件顺序无关,
61
- * 因此事件卡、图例、侧栏分类三处拿到的颜色必然一致。
62
- */
63
- export const buildColorMap = (types) => new Map(Array.from(new Set(types))
64
- .sort()
65
- .map((type, index) => [type, CATEGORY_COLORS[index % CATEGORY_COLORS.length]]));
66
- /** 一次算出 type → 颜色映射与分类明细(计数 + 成员),供事件卡、图例、侧栏共用 */
67
- export const summarizeEvents = (events) => {
68
- const colorMap = buildColorMap(events.map(getEventType));
69
- const groups = new Map();
70
- events.forEach((event) => {
71
- const type = getEventType(event);
72
- const group = groups.get(type);
73
- if (group) {
74
- group.push(event);
75
- }
76
- else {
77
- groups.set(type, [event]);
78
- }
79
- });
80
- const categories = Array.from(groups, ([type, group]) => ({
81
- type,
82
- count: group.length,
83
- color: colorMap.get(type) ?? CATEGORY_COLORS[0],
84
- events: sortByStart(group),
85
- })).sort((a, b) => b.count - a.count || a.type.localeCompare(b.type));
86
- return { colorMap, categories };
87
- };
88
- /** 按开始时间升序;拿不到时间的排在最后(保持稳定,不改变其余相对顺序) */
89
- const sortByStart = (events) => events
90
- .map((event, index) => ({ event, index, time: getEventStart(event)?.getTime() ?? Infinity }))
91
- .sort((a, b) => a.time - b.time || a.index - b.index)
92
- .map((item) => item.event);
93
- /** 取某个事件的颜色;映射缺失时退回色板首色 */
94
- export const resolveColor = (colorMap, type) => colorMap.get(type) ?? CATEGORY_COLORS[0];
95
- /**
96
- * 本地过滤:搜索关键字 + 被隐藏的分类。
97
- *
98
- * 纯前端过滤,不触发重新请求;日历与侧栏 UPCOMING 列表共用同一份结果。
99
- */
100
- export const filterEvents = (events, options) => {
101
- const keyword = options?.search?.trim().toLowerCase() ?? "";
102
- const hidden = new Set(options?.hiddenTypes ?? []);
103
- return events.filter((event) => {
104
- if (hidden.has(getEventType(event)))
105
- return false;
106
- if (!keyword)
107
- return true;
108
- return getEventTitle(event).toLowerCase().includes(keyword);
109
- });
110
- };
111
- /** 侧栏 UPCOMING DEADLINES 的默认条数,与 HTML 稿一致 */
112
- export const UPCOMING_LIMIT = 5;
113
- /** 相对今天还有几天(今天为 0D) */
114
- export const formatRemaining = (start, from) => `${Math.max(0, dayjs(start).startOf("day").diff(from.startOf("day"), "day"))}D`;
115
- /**
116
- * UPCOMING DEADLINES:今天及以后的事件,按起始时间升序取前 N 条。
117
- *
118
- * @param from 以哪一天为「今天」,默认取当前时间;测试注入固定日期用。
119
- */
120
- export const buildUpcoming = (events, summary, options) => {
121
- const from = options?.from ?? dayjs();
122
- const limit = options?.limit ?? UPCOMING_LIMIT;
123
- return events
124
- .map((event) => ({ event, start: getEventStart(event) }))
125
- .filter((item) => {
126
- if (!item.start)
127
- return false;
128
- return !dayjs(item.start).startOf("day").isBefore(from.startOf("day"));
129
- })
130
- .sort((a, b) => a.start.getTime() - b.start.getTime())
131
- .slice(0, limit)
132
- .map(({ event, start }) => {
133
- const type = getEventType(event);
134
- return {
135
- id: event.id,
136
- title: getEventTitle(event),
137
- type,
138
- color: resolveColor(summary.colorMap, type),
139
- timeLabel: event.allDay
140
- ? dayjs(start).format("MMM D")
141
- : `${dayjs(start).format("MMM D")} | ${dayjs(start).format("hA")}`,
142
- remainingLabel: formatRemaining(start, from),
143
- source: event.source,
144
- };
145
- });
146
- };
147
- /**
148
- * 写回服务端时的时间格式:**本地时间**,不带时区后缀。
149
- *
150
- * 与仓库里其它写时间属性的地方保持一致(见 MeetingHeader 的 StartTime/EndTime)。
151
- * 注意不要用 toISOString():它产出 UTC 时刻,UTC+8 下把事件拖到某天零点时,
152
- * 日期部分会退回前一天,服务端按本地时间解析就落到错误的日期上。
153
- */
154
- export const DATE_TIME_FORMAT = "YYYY-MM-DDTHH:mm:ss.SSS";
155
- /**
156
- * 把 FullCalendar 给出的落点转成服务端载荷。
157
- *
158
- * @returns 起止时间都拿不到(或非法)时返回 undefined,调用方应当放弃这次拖拽
159
- */
160
- export const buildDropPayload = (options) => {
161
- const start = options.start ? dayjs(options.start) : undefined;
162
- if (!start || !start.isValid())
163
- return undefined;
164
- const payload = { Start: start.format(DATE_TIME_FORMAT) };
165
- const end = options.end ? dayjs(options.end) : undefined;
166
- if (end && end.isValid())
167
- payload.End = end.format(DATE_TIME_FORMAT);
168
- return payload;
169
- };
170
- /**
171
- * 事件 id 比较。
172
- *
173
- * FullCalendar 会把事件 id 强转成字符串(其内部 EVENT_NON_DATE_REFINERS 里 id: String),
174
- * 所以服务端下发的数字 id 到了这边就成了 "123" —— 用 `===` 直接比会永远不相等,
175
- * 拖拽结果就同步不回列表。这里统一按字符串比。
176
- */
177
- const isSameEvent = (item, id) => item.id !== undefined && item.id !== null && String(item.id) === id;
178
- /** 按事件 id 在列表里找对应的那条(id 比较规则见 isSameEvent) */
179
- export const findEventById = (events, id) => id ? events.find((item) => isSameEvent(item, id)) : undefined;
180
- /**
181
- * 把拖拽结果写回页面自己的事件列表。
182
- *
183
- * 必须做这一步:`state.listOptions` 只在挂载时加载一次,而事件数据会交给 FullCalendar
184
- * 当 eventSources —— 列表里还是旧位置的话,任何一次事件源重置都会把刚拖出去的事件打回原位。
185
- *
186
- * ⚠️ 没命中任何一条时必须**原样返回同一个数组**:`.map()` 那种写法即使什么都没改也会造出
187
- * 新引用,而新引用本身就会触发 FullCalendar 重置事件源,反而把拖拽结果覆盖掉。
188
- */
189
- export const applyDropToEvents = (events, id, drop) => {
190
- const index = events.findIndex((item) => isSameEvent(item, id));
191
- if (index === -1)
192
- return events;
193
- const next = { ...events[index] };
194
- if (drop.start) {
195
- next.start = drop.start;
196
- next.startDate = dayjs(drop.start).toDate();
197
- }
198
- if (drop.end)
199
- next.end = drop.end;
200
- const result = events.slice();
201
- result[index] = next;
202
- return result;
203
- };
204
- /** 图例浮层里的日期文案,设计稿是 `Aug 3`;拿不到时间时返回空串 */
205
- export const formatEventDate = (event) => {
206
- const start = getEventStart(event);
207
- return start ? dayjs(start).format("MMM D") : "";
208
- };
209
- //# sourceMappingURL=event-meta.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"event-meta.js","sourceRoot":"","sources":["../../../src/modules/calendar-board/event-meta.ts"],"names":[],"mappings":"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"}