Skip to content

日历

跨模块时间视图 / 入口:自有 事件calendar_event)+ 带计划时间的任务(清单/backlog 与项目内,含重复虚拟展开)+ 项目 start_at/end_at,经 calendar.range 聚合到月/周网格;日 / 近三天 / 近七天议程另并入仅有 due_at 的 pending 任务。开启「显示已完成」时另并入已完成任务(计划段与完成日双轴)。
不是清单管理宿主——Inbox、清单树、智能清单规则与归档仍在 任务。到期浏览与完成回顾以本模块为准(任务侧不再提供今天/明天/未来7天或今日/昨日/近7天完成等内置清单)。

能力日历任务项目
自有时段条目calendar_event CRUD
任务安排range 内展示计划区间;可选已完成双轴;点击 → overlay清单管理、计划/截止/提醒编辑、智能清单
重复任务展开range 虚拟画出后续实例A′ live + occurrence
项目窗口range 内展示相交项目;点击 → /projectsstart/end 编辑
重复规则事件不做任务 recurrence
智能清单导航不迁入(#14668 定论)宿主
完成回顾按完成日(可与计划段同显)自定义智能清单仍可用完成过滤
  • 日历 = 统一时间视图与入口(日常按时间浏览)
  • 展示来源:日程事件、清单带日期任务、项目本身、项目内带日期任务;可选已完成任务
  • 交互:点击 → 弹出层(entity overlay / 事件 Dialog);需要完整上下文时跳转对应模块
  • 议程行溢出菜单(pointer 右键 / touch 长按):事件 编辑 · 开始番茄 · 转为任务 · 删除;任务 编辑 · 开始番茄(pending)· 标记完成/未完成 · 转为事件(有计划/截止时)· 删除;项目 打开;节日 无菜单(只读)
  • 把智能清单侧栏或清单 CRUD 搬进日历

实体:type=contentprimary_component: calendar_event,归属 subject 默认 private world(壳 subject_kind)。

字段位置说明
title / contententity 列标题与备注
start_atbody必填 ISO8601(计划开始)
end_atbody可空;空则瞬时点
all_daybody全天
remind_at / reminders[]body相对开始的提醒;remind_at 为最早一项镜像
last_notified_atbodyInbox 幂等
tag_idsentity 列可选
client_op_id实体顶层列离线幂等

时间基准:全局 i18n.timezone(IANA,默认 Asia/Shanghai)。事件 due_at

方法用途
calendar.list / get / create / patch / delete事件 CRUD
calendar.convertToTask同 id retype → task_item(默认 Inbox;有损丢弃 all_day
calendar.rangefrom/to + 可选 kinds[] / sources[] / include_completed
calendar.prefs.get / calendar.prefs.update日程显示偏好(独立 entity calendar_ui_prefs;按视图拆分)

反向:task.convertToEvent(见 task.md)。形态约定见 entity-model.md

calendar.range 规则:

  • event:区间与 [from,to] 相交
  • taskstatus=pending 根任务(按清单侧过滤:TaskContainer.ANY,含清单与项目内);计划区间start_at/end_at)与查询窗相交,或带 recurrence 时在区间内 虚拟展开后续实例(virtual: true,不写库)。独立 due_at 不作为日历条带终点。
  • include_completed:另并入已完成根任务(TaskContainer.ANY:清单 + 项目内;含 occurrence 历史):计划与窗相交, completed_at 落窗。同一 live id 只返回一条(保留计划字段 + completed_at);前端按计划段 + 完成日双轴展示,同日去重。
  • projectstatus=active,有 start_at,且与区间相交(不含已完成 / 搁置 / 取消)
  • holiday:内置日历源合成的只读全天项(不写库、无提醒)。kindsholiday 且未传 sources 时启用全部已实现源;按公历年懒加载并 Redis 缓存(anima:cache:calendar:builtin:{source}:{year})。
  • habit:active 习惯在区间内应打卡日展开;有 reminders 则按 HH:mm 时间点,否则全天;带当日 amount / met / check_in_id。prefs「显示打卡」对应 kind=habit
source文案内容
cn_holiday中国节假日命名日(元旦、春节、清明、劳动节、端午、中秋、国庆等);不含连休假期条与调休上班日
traditional传统节日农历民俗白名单(元宵、七夕、重阳、腊八、除夕等)
international国际节日公历固定日(情人节、妇女节、愚人节、万圣节、平安夜、圣诞节等)
solar_term二十四节气全年节气日

同日同标题跨源去重。后续活动/佛教等日历可挂同一注册表、独立开关。

task-reminder-scheduler(睡到下次)扫描同时覆盖 calendar_eventreminders[](相对开始;兼容 remind_at / 缺省=start_at)→ Inbox,source_ref = calendar_event:{id}:trigger:{iso}。见 notification-and-reminder

  • 工具栏:视图菜单、日期导航、显示(弹层:条目 / 内置日历 / 本视图:重复展开、显示已完成任务、显示已过期事件)、刷新、新建;固定用户 subject(不暴露 user/agent 切换)。

  • 日视图:单日议程,上一页/下一页按自然日切换(可到明天、后天);「今天」跳回当日。议程列表分段:逾期(仅今天;截止日或计划结束日早于今天的 pending,含项目内)→ 安排(事件 + 无项目 pending)→ 项目(可折叠;其下嵌套该项目当日非逾期的 pending/已完成)→ 节日已完成(无项目归属)。同刻按优先级二级排序。已过期事件由本视图开关控制。

  • 近三天 / 近七天:相对真实今天的滚动议程(3 / 7 个自然日);每个自然日同一套分段;逾期仅挂在真实今天

  • 月 / 周 · 选中日议程:与日视图同一套分段与项目嵌套;月格/周格条带布局不变

  • 月视图:月网格按周行展示彩色事件条(跨日贯穿、同行 lane 错开;超出约 3 行显示 +N)+ 选中日议程;月格任务条显示优先级色点;窄布局减小外边距以腾出格子空间

  • 周视图:周一至周日列,同样用跨列事件条;pending 任务可拖拽改计划task.patch + only_this: true);已完成不可拖

  • 已完成双轴:开启「显示已完成任务」后,同一任务可出现在计划日(段)与 completed_at 完成日;两轴同日只显示一次

  • 着色:按条目 kind(事件 / 任务 / 项目 / 节日)语义色区分,与议程徽章一致;已完成弱化/划线

  • 显示偏好:Habitat 独立配置块 calendar_ui_prefscalendar.prefs.get / update),按视图拆分 kinds / 内置源 / 重复展开 / 已完成 / 已过期。前端本地缓存优先渲染,进入日程时刷新;改开关先写本地再同步 Habitat

  • 窄布局工具栏开关使用更大触控尺寸;宽布局保持紧凑 sm

  • 创建/编辑事件 Dialog。点击任务走 entity overlay;项目进 /projects节日只读(轻提示,无编辑)。清单管理回 /tasks

  • 月/周网格仍只画计划条带(独立 due_at 不当条带终点);完成日若不在计划条内另画单日条;议程额外并入仅有截止的 pending 任务

calendar_list / calendar_create / calendar_update / calendar_delete / calendar_get / calendar_convert_to_task / calendar_range;默认 caller private world,可选 world_id / subject_kind

  • 年/多周视图、事件自身重复、第三方日历订阅(内置日历源为本地合成,不是 ICS 订阅)