任务

任务与普通事件共用 Event 数据模型和日历归属。任务只有一个截止日期或时间, 不表示持续时长。左侧圆圈用于切换完成状态,整条斜纹背景和文字颜色用于区分优先级。

启用任务创建

设置 enableTasks: true,即可在内置桌面详情面板、弹窗和移动端编辑器中显示 Event / Task 切换选项。默认值为 false,保持原有事件创建界面。 关闭此选项后,已有任务仍可显示和编辑。

import {
  DayFlowCalendar,
  createMonthView,
  useCalendarApp,
} from '@dayflow/react';
import '@dayflow/core/dist/styles.css';

export function TaskCalendar() {
  const calendar = useCalendarApp({
    views: [createMonthView()],
    enableTasks: true,
  });

  return <DayFlowCalendar calendar={calendar} />;
}

该选项属于 CalendarAppConfig,适用于所有框架适配器。已有 core 实例也可动态修改:

app.updateConfig({ enableTasks: true });

这是运行时的编辑器选项,关闭它不会从构建产物中移除任务代码。

创建定时或全天任务

使用 kind: 'task',并将 start 和 end 设为相同的截止值。 没有截止时间的任务使用 allDay: true 和 Temporal.PlainDate。

import type { Event } from '@dayflow/core';
import { Temporal } from 'temporal-polyfill';

const due = Temporal.ZonedDateTime.from(
  '2026-10-23T11:00:00[Australia/Sydney]'
);
const date = Temporal.PlainDate.from('2026-10-23');

const tasks: Event[] = [
  {
    id: 'review',
    title: '审阅设计反馈',
    kind: 'task',
    start: due,
    end: due,
    task: { completed: false, priority: 'medium' },
  },
  {
    id: 'launch',
    title: '发送发布清单',
    kind: 'task',
    allDay: true,
    start: date,
    end: date,
    task: { priority: 'high' },
  },
];

通过 events 配置传入这些任务,或使用普通事件 API 添加、更新和删除。 可设置 calendarId,指定任务所属的日历。

字段类型含义
kind'event' | 'task'省略时默认为 'event'。
task.completedboolean默认未完成。
task.completedAtTemporal.ZonedDateTime完成时间;重新打开任务时清除。
task.priority'none' | 'low' | 'medium' | 'high'默认为 'none'。

完成任务与修改优先级

点击左侧圆圈即可完成或重新打开任务,不会打开详情面板或触发拖拽。 键盘用户可聚焦圆圈后按空格或 Enter。已完成任务的标题会显示删除线。

打开任务详情,可编辑标题、截止日期与时间、备注和优先级。 设为全天会移除截止时间,添加时间则恢复截止时间。任务可以移动,但不能拉伸调整时长。

优先级斜纹背景和文字颜色
none灰色
low绿色
medium橙色
high红色

斜纹覆盖整条任务。圆圈使用所属日历的颜色,选中任务时变为白色。 优先级不改变日历按时间排列的顺序。月视图中的全天任务保留任务行样式, 不显示时间;日视图和周视图中的任务不显示事件色条。

交互 Demo 提供 Tasks 开关,旁边的 Preview 提示会演示完成任务、 打开详情面板和切换优先级。

程序更新与持久化

任务变更使用与普通事件相同的 onEventUpdate 回调。 保存数据时,应同时保留 kind、task 元数据和日期字段。

import { setTaskCompleted, setTaskPriority } from '@dayflow/core';

// taskEvent 是已有的 kind: 'task' 的 Event。
const completed = setTaskCompleted(taskEvent, true, app.timeZone);
await app.updateEvent(taskEvent.id, { task: completed.task });

const prioritized = setTaskPriority(taskEvent, 'high');
await app.updateEvent(taskEvent.id, { task: prioritized.task });

辅助函数只返回更新后的值,不会自动保存。 只读模式 禁止通过内置 UI 完成或编辑任务, 但仍允许程序调用更新 API。

自动生成的重复任务实例暂不支持独立完成。外部 CalDAV 任务(VTODO)同步尚未实现, 不要假定普通事件同步会保留任务专属字段。