Repository navigation
feat(calendar): 公版日历与日程模块(关联 #48、#95) - #113
Open
Zewang0217 wants to merge 8 commits into
Open
Zewang0217 wants to merge 8 commits into
Zewang0217 wants to merge 8 commits into
Conversation
Zewang0217
force-pushed
the
feat/calendar
branch
2 times, most recently
from
October 10, 2026 14:31
211cc90 to
e4ff8dc
Compare
提案文档:目标、插件身份、范围、日程数据结构、为什么公版里没有课程实体、重复规则 与 ICS 边界、展示层与 Agent 读写边界、数据形态与存储、提醒与机构版边界、兼容性 边界、开发拆分与待明确项。中英文互为语言切换,并附两张界面截图。 Refs ECNU#48.
记录只有日程这一种:字段沿用 ICS 词汇(uid、title、start、end、location、 description、recurrence、exceptions、overrides、source、extensions),未识别字段 原样保留在 extensions;一批记录按 source 归属,同一来源的再次导入整体替换,其他 来源与手动记录不受影响。 存储域里一张 events 表,按 uid 存取:写入先落盘再可见,读取取自内存状态,变更以 domain/changed 通知,不联网、不上传、不写日志。记录契约曾带 courseId,旧存储仍能 打开,开库时改写成当前形状一次。 展开发生(occurrence)时按记录自身跨越的天数平移结束时间,多天的整日记录与跨午夜 的记录都不会退化成当天结束或结束早于开始。 ICS 是自研的最小实现(VEVENT、RRULE 子集、EXDATE、RECURRENCE-ID,行折叠、转义与 UTF-8 按 RFC 5545),不引入第三方日历解析依赖。 Host 半以 calendar 服务暴露上述读写,客户端半通过同一份 typert 描述符调用其中的 10 个方法。 Refs ECNU#48.
侧栏入口与主区面板复用产品既有的两个插槽。一周七列共用一条小时轴,今天列高亮, 当前时刻画一条线,同一时段重叠的日程并排分列;不带时间的全天记录画在它覆盖的每 一天的日期表头里,不占时间轴,跨天的一条在每一天都出现;打开时滚到这周有日程的 时段。 新建有四种入口:顶部「新建日程」、空日历的引导卡、双击空白时段(预填 1 小时), 以及在空白时段按住拖动(拖动中画出这一段的虚线框,松手后弹窗预填该段)。 点任意一条打开详情:改期或改地点、撤销改期、取消这一次、恢复、删除整条;只改开始 时间时结束时间跟着移动、条目保持原时长。日程页左栏改标题、日期、开始与结束时间、 地点与备注,右栏按月份列出最近一年的出现时间。 导入是弹窗,支持把 .ics 拖到面板任意位置、在弹窗里选择文件或粘贴文本,按来源作用域 替换;导出可复制或下载。颜色跟着来源,同一来源同一色调。 取轴、重叠分列几何与改期时的时长保持放在纯函数里单独测试。 Refs ECNU#48.
五个工具覆盖同一份日历:calendar_list_events 读一个区间,calendar_create_event、 calendar_update_event、calendar_delete_event 与 calendar_occurrence 写,最后一个 只处理系列的某一次(改期、复位、取消、恢复)。 区间一律有界:不写 from 就从今天往前 180 天,不写 to 就给一年,单次最多 3660 天。 写入只带要改的字段,留空保持原值,挪动开始时间时保留原时长。 写入在 tools/pre-execute 上统一判定:读取放行、写入询问、已经「无审批」的会话放行、 没有会话上下文的写入拒绝。工具与面板写同一份记录、走同一套校验。 Refs ECNU#48.
发行清单与机构装配各加一条插件登记,客户端构建脚本把 calendar 的 src/client.ts 纳入构建,插件单测挂进「钉住 DSH 候选源」的 CI 作业。 Refs ECNU#48.
Zewang0217
force-pushed
the
feat/calendar
branch
from
October 10, 2026 14:36
e4ff8dc to
4414439
Compare
Zewang0217
marked this pull request as ready for review
October 10, 2026 14:54
Author
|
你好,我已经更新了分支。请问 @freedomkk-qfeng 能否帮忙批准一下工作流,让它跑一下 CI 检查?谢谢! |
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
问题与修改
关联 #48,以及路线图 #95(EduWork Roadmap — 2026 Q4)里的「日历与日程 · 通用日历模块」。
本 PR 加入公版的日历与日程模块:一份提案文档(
docs/proposals/calendar/)与插件dsh-plugins/calendar(@eduwork/dsh-calendar)——周视图、本机存储、ICS 导入导出、新建与编辑日程的完整交互,并把同一份日历以工具的形式开放给会话里的模型读写。公版只有日程(event)这一种记录,不含任何学校专属字段。学校课表、校历与教务规则由机构插件作为数据来源注入:一门课的一次课就是一条日程,按
source归属与着色、按recurrence每周重复;同一个结构也装得下邮件、活动与个人安排。面板与交互:
exceptions)、恢复、删除整条;只改开始时间时结束时间跟着走,条目保持原时长。.ics拖到面板、在弹窗里选择文件或粘贴文本,按来源作用域替换;导出可复制或下载。对模型的读写接口:
calendar_list_events读一个区间;calendar_create_event、calendar_update_event、calendar_delete_event与calendar_occurrence(改期、复位、取消、恢复系列中的某一次)写。tools/pre-execute上统一判定:读取放行、写入询问、「无审批」会话放行、没有会话上下文的写入拒绝。数据与存储:
uid/title/start/end/location/description/recurrence/exceptions/overrides/source/extensions),未识别字段原样保留在extensions。events表(按uid):写入先落盘再可见,读取取自内存状态,变更以domain/changed通知;不联网、不上传、不写日志。source归属:同一来源再次导入整体替换,其他来源与手动记录不受影响。VEVENT、RRULE子集、EXDATE、RECURRENCE-ID,行折叠、转义与 UTF-8 按 RFC 5545),不引入第三方日历解析依赖。验证
node --test dsh-plugins/calendar/test/*.test.mjs:81 例通过(记录契约 8、发生展开 16、ICS 18、远端契约 5、存储 9、布局几何 16、工具 9)。EDUWORK_TEST_RUNTIME分别指向release-v0.1.5-rc.2与candidate-v0.2.0-rc.2,两条固定运行时线各 81 例通过,无跳过、无失败。scripts/check-source-docs.mjs通过:{ "files": 277, "links": 799, "readmePairs": 41, "broken": [], "readmeIssues": [] }。lib/client.js与按dsh-plugins/calendar/build-client.ps1重新构建的结果逐字节一致。scripts/ci-eduwork-web.ps1全量 Web 装配通过,插件正常进入装配与composition.json(bundles 3 / plugins 6 / schemaFields 28),eduwork-calendar与eduwork-calendar-tools都在清单里。exceptions与overrides;导入的选择文件、粘贴与拖拽三种入口及同来源替换;导出内容含RRULE、EXDATE、RECURRENCE-ID与DTSTART;VALUE=DATE且复制可用;空日历引导卡片。courseId与courses表的旧存储验证:应用能正常打开,盘上文档被改写成只剩events。README_EN.md同步了功能描述但界面未做本地化;桌面端与机构版行为不在本 PR 范围。两处截图中的数据是合成数据。可复核的命令:
兼容性与后续事项
@eduwork/dsh-calendar/tools出口,以及config/distributions/generic.json里一条insert注册(与search-auto同一种形式);发行清单既有插件的顺序与配置不变。.github/workflows/validate-pinned-dsh-source.yml两行:把插件的单元测试挂进这条既有 CI 作业(它本来就逐个插件列出测试,路径过滤含dsh-plugins/**)。位置是否合适请一并确认。schemaVersion仍是 2。记录契约曾带courseId:旧介质按「公开契约 + 已退休字段」的 schema 读取,开库时改写成当前形状一次,无其他迁移。core.lock.json钉住的公版版本接入,适配器放edition/plugins/,本 PR 不含edition/的任何改动。需要重点评审
lib/model.js的字段、schemaVersion、source与extensions的语义):这是本 PR 新增的唯一公开数据契约,机构版的数据注入与后续同步都会建立在它上面,字段的最终形态请在这里定。lib/typert-schemas.js、lib/typert-descriptors.js,共 10 个远端方法),以及五个工具的名字、参数与结果 schema(lib/tools.js)。calendar_update_event改整条记录(含重复记录的每一次),calendar_occurrence只改系列中的某一次。提案里记了取舍,若不认可可以合成为单个工具。