ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Super Productivity 定时任务机制解析:到期日、到期时间与提醒如何驱动 Today、Schedule 与 Scheduled List

Super Productivity 定时任务机制解析:到期日、到期时间与提醒如何驱动 Today、Schedule 与 Scheduled List Super Productivity 定时任务机制解析到期日、到期时间与提醒如何驱动 Today、Schedule 与 Scheduled List【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivitySuper Productivity 中的定时任务Scheduled Tasks是带有到期日due date、可选到期时间due time和提醒reminder的任务它决定了任务在 Today View、Schedule 时间轴和专用定时任务列表中的呈现方式。本文基于仓库文档 4.12-Scheduled-Tasks 的核心概念展开并结合 task.selectors.ts、task-due.effects.ts 等源码讲解调度的独立性、逾期任务的处理规则、各视图的展示逻辑以及later today过滤在代码层面是如何实现的帮助读者既能正确使用定时任务也能理解其底层数据流。定时任务的概念调度数据与完成状态相互独立在 Super Productivity 中定时任务并不是一个独立的任务类型而是普通任务上的一组调度字段到期日、到期时间、提醒时间。文档给出的定义是Scheduled tasks in Super Productivity are tasks that have a due date, and optionally a specific due time and a reminder.调度的作用是把工作钉在某个日期或某个时刻上使其出现在 Today View、Schedule 时间轴以及专用的 scheduled-tasks 列表中。调度和完成状态是相互独立的。当你为一个任务设置到期日、到期时间或提醒时应用只更新任务的调度数据不会改变任务的完成状态。这意味着你可以为一个未完成的任务排期可以完成任务后仍保留其到期日无论任务是否已完成都可以随时重新排期。这种分离让调度表达计划你打算何时做某事完成表达现实你实际做了什么两者互不覆盖。从源码结构看这种独立性体现在字段层面任务模型中dueDay到期日YYYY-MM-DD 字符串与dueWithTime到期时间戳毫秒数是各自独立的字段与任务的isDone完成标记没有任何联动写入。task.selectors.ts 中的选择器按这两个字段分别筛选任务正是这种调度字段独立于状态设计的直接体现export const selectTasksDueForDay createSelector( selectAllTasksInActiveProjects, (tasks: Task[], props: { day: string }): TaskWithDueDay[] { return tasks.filter( (task) !!task task.dueDay props.day, ) as TaskWithDueDay[]; }, ); export const selectTasksWithDueTimeForRange createSelector( selectAllTasksInActiveProjects, (tasks: Task[], props: { start: number; end: number }): TaskWithDueTime[] { return tasks.filter( (task) !!task typeof task.dueWithTime number task.dueWithTime props.start task.dueWithTime props.end, ) as TaskWithDueTime[]; }, );值得注意的细节是selectTasksDueAndOverdueForDay的实现由于dueDay采用 YYYY-MM-DD 格式字符串按字典序比较即可正确判断到期日小于等于某日从而避免创建 Date 对象带来的时区转换问题——这是文档所说字符串比较正确工作这一行为在源码中的依据。设置调度调度对话框、快捷按钮与提醒在实际操作中设置到期日、时间和提醒的方式由 2.05-Manage-Scheduled-Tasks 完整定义这里完整继承其关键操作步骤打开调度对话框右键菜单方式右键点击任务菜单顶部有一排图标按钮Schedule today太阳图标、Schedule tomorrow、Schedule next week以及一个日历图标。点击日历图标打开完整的调度对话框若任务已有排期tooltip 会显示 Reschedule并提示默认快捷键S。键盘方式聚焦任务点击或用方向键选中后按SSchedule task 的默认快捷键。排期到某一天打开调度对话框在日历中点击一个日期或使用顶部的快捷按钮Today / Tomorrow / Next week / Next month选中日期会高亮点击底部的Schedule按钮。任务将在该日到期不带具体时间。排期到具体时间点打开调度对话框在日历中选择日期在Time字段时钟图标输入 HH:MM 时间如 09:00 或 21:00可用时间选择器或直接键入点击字段右侧的X图标可清除时间点击Schedule任务会在 Schedule 视图的该时间点出现。快速排期不打开对话框右键任务后直接点击菜单顶部的图标按钮即可立即排期并关闭菜单太阳图标— Schedule today仅排到今天不带时间Tomorrow 图标— Schedule tomorrowNext week 图标— Schedule next week按本地化规则取下一周的第一天。要选任意日期或设置时间则仍需用日历图标打开完整对话框。为定时任务设置提醒打开调度对话框并设置Time——Remind at下拉框仅在已设置时间后才出现在Remind at中选择提醒时机应用提供的选项为Never、when it starts、5 minutes before it starts、10 minutes before it starts、15 minutes before it starts、30 minutes before it starts、1 hour before it starts点击Schedule。当提醒弹窗出现时可选择稍后提醒snooze、取消排期unschedule、关闭提醒、加入今天add to today、开始、完成等动作。直接点击弹窗外区域或按 Escape 只是关闭弹窗定时任务提醒会保持激活状态稍后再次弹出直到你做出处理而截止提醒deadline reminders在关闭后即被清除。取消排期右键菜单对已排期任务日历图标旁有Unschedule task按钮event_busy 图标点击即可清除到期日和时间调度对话框若任务已有到期日或时间对话框中会出现Unschedule按钮alarm_off 或 event_busy 图标键盘聚焦任务后按UUnschedule task 的默认快捷键如已配置。调度与 Today View基于到期日的成员资格计算Today View 用一条基于时间的规则决定哪些任务出现一个任务的到期日是今天或者其到期时间落在今天它就属于今天。应用并不在任务上使用 today 标签今天列表的成员资格完全由到期日及到期时间推导而来。Today View 中任务的排序是单独存储的你可以拖拽重排而成员资格一个任务是否出现始终由任务的调度字段计算得出。这保证了单一数据源到期日和时间同时驱动 Schedule 和 Today 列表。从源码结构看虚拟 TODAY 标签架构正是这一设计的实现task.selectors.ts 中有一处关键注释——With the virtual TODAY_TAG architecture, overdue tasks (dueDay today) can never be on todays list (dueDay today)即今天列表的成员资格判定本质上就是dueDay today的比较而不是维护一个真实的标签成员集合。task-due.effects.ts 中的三个 effect 则负责在日期变化时维护这一成员资格createRepeatableTasksAndAddDueToday$在todayDateStr$变化跨天且同步完成后调用addAllDueToday()把到期任务与重复任务实例加入今天的计划。代码注释还记录了一个已知缺陷#6230该 effect 只在日期字符串变化时触发跨天后当天内不再有复查若凌晨附近因浏览器定时器节流或系统休眠导致错过触发重复任务要等下一次日期变化或应用重启才出现removeOverdueFormToday$跨天时读取selectOverdueTasksOnToday把逾期任务从今天列表中移除。注意它派发的是非持久化actionlocalRemoveOverdueFromToday注释解释这样做是为了避免与其他设备上的用户操作产生 LWWlast-write-wins冲突#6992——每台设备独立运行该 effect同步这次移除是冗余的ensureTasksDueTodayInTodayTag$一个防御性 effect交叉检查selectTasksDueForDay按dueDay与selectTasksWithDueTimeForRange按dueWithTime落在今天的毫秒区间两类到期任务确保所有今天到期的任务都出现在今天的任务集合中。由于设置了dueWithTime的任务会清空dueDay两者互斥必须同时检查两个选择器才能捕获全部已排期任务——这段逻辑正是文档所说到期日或到期时间落在今天即属于今天在实现层的直接对应。逾期任务会发生什么不自动变更靠提醒与用户决定应用不会在任务逾期时自动修改或删除它。到期日在昨天的任务仍以该到期日留在系统中在完成、重新排期或删除之前一直是未完成状态。提醒按任务配置可以在选定时间通知你帮助你关注即将到期或已逾期的工作但提醒不改变任务的到期日或完成状态。在 Today View 中应用聚焦于当下可执行的事项。当你处于 Today 上下文时今天稍后才到期的任务到期时间仍在未来的任务可以从主列表中过滤掉让你只看到当前已到期或今天更早到期的任务、以及没有具体时间要求的任务。这减少了干扰帮助你专注下一步。这些稍后才到期的任务仍是排期状态到时间时会在 Today 列表出现或始终出现在 Schedule、定时任务列表中——只是在 Today 列表中被临时隐藏。另一个规则由应用行为控制排期到今天的任务留在今天列表中排期到未来日期的任务则从今天列表移除转而出现在那一天的 Planner 和 Schedule 中。later today过滤在源码中有专门的实现task-later-today.selectors.spec.ts 测试的selectLaterTodayTasksWithSubTasks选择器按文档注释所述拆分为基于快照的结构决策selectLaterTodayStructure → 有序的 {id, subTaskIds} 基于实时实体的重映射两部分配合 later-today-window.spec.ts 中的时间窗工具函数共同决定哪些任务被归入今天稍后。work-context.service.ts 则根据当前工作上下文Today、Planner 等参与决定这一过滤是否生效而 get-later-today-calendar-events.ts 说明日历事件中同样存在对应的 later-today 分离逻辑。各视图中定时任务的呈现方式定时任务在多处呈现各处目的不同。Today ViewToday View 展示今天到期的任务到期日是今天、或到期时间落在今天的任务都会出现。任务顺序就是你设置的顺序如拖拽得到的该顺序被保存成员资格——这个任务属于今天吗——始终由到期日和时间决定而非标签。因此把任务排到今天或把到期日改成今天它就会出现把到期日改成其他天它就离开 Today View。当 Today 列表被过滤为立即可执行项时今天稍后才到期的任务可能在其时间临近前被隐藏。Scheduled List带时间的任务列表专用的定时任务列表scheduled-tasks 页面展示所有带有具体到期时间的任务——不只是到期日而是日期加时间。该列表包含未来和过去的定时任务让你在一个地方看到所有曾经或正在被时间化的安排每个任务显示其日期和时间若设置了提醒也一并显示。该视图适合回顾我排了什么、排在何时而不像 Schedule 那样使用时间轴布局。在仓库中对应实现是 scheduled-list-page 页面它先渲染重复任务配置REPEATED_TASKS 区块随后通过tasksPlannedWithTime$选择器渲染所有带到期时间的任务与文档描述一一对应。Schedule ViewSchedule View 在未来 30 天的时间轴上展示任务带有到期日和时间的任务以块的形式出现在对应时间块在时间轴上的时长来自任务的时间估计未设置时取默认值只有到期日无具体时间的任务作为弹性工作出现在时间固定的任务周围流动排布。因此 Schedule 视图是查看定时任务一天中的何时发生、如何与其他工作搭配的地方。可参见 4.04-Schedule-View 与 4.08-Time-Estimates。工作上下文与 Later Today 过滤当你的工作上下文是 Today View 时应用可以过滤掉今天稍后才排期的任务使列表强调当下可做的事。今天更早到期的任务、或今天到期但无具体时间的任务留在列表中到期时间仍在今天未来的任务则被隐藏直到那个时刻。它们没有被删除或改期只是在 Today 上下文中被隐藏以减少噪音。已开始跟踪任务时间的任务总是显示在主列表中即使其到期时间还没到。在其他上下文Schedule、定时任务列表中这些任务仍然出现。小结调度机制一览调度只更新任务的到期日、到期时间和提醒不改变完成状态Today 成员资格仅基于到期日及到期时间计算——没有 today 标签由应用推导源码中体现为虚拟 TODAY 标签与dueDay today的比较逾期任务不被自动处理提醒可以通知你但任务在完成或重新排期之前保持原样Today 列表可隐藏今天稍后的任务以聚焦当下这些任务仍出现在 Schedule 和定时任务列表中排到今天的任务留在今天列表排到未来日期的任务离开今天列表出现在该日的 Planner 和 Schedule 中跨天维护由 task-due.effects.ts 中的removeOverdueFormToday$与ensureTasksDueTodayInTodayTag$等 effect 保障。相关文档2.05-Manage-Scheduled-Tasks — 如何设置到期日、时间和提醒4.01-The-Today-View — Today 列表如何使用到期日和时间及 later today 过滤4.04-Schedule-View — Schedule 时间轴如何展示定时任务4.03-Planner-View — 天级规划有日期但无时间的任务4.09-Task-Attributes — 到期日、到期时间和提醒在任务模型中的位置【免费下载链接】super-productivitySuper Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitLab, GitHub and Open Project.项目地址: https://gitcode.com/GitHub_Trending/su/super-productivity创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表