feat: 添加起始日期功能并更新相关组件与测试用例
CI / verify (push) Successful in 1m57s
CI / 部署到服务器 (push) Successful in 29s

- 在任务创建和编辑界面中新增起始日期字段,默认值为当天。
- 更新任务卡片展示逻辑,仅在起始日期不是当天时显示相关信息。
- 修改相关测试用例以覆盖起始日期的功能,包括批量创建和编辑任务的场景。
- 数据库模式版本更新至4,以支持起始日期字段的存储与迁移。
This commit is contained in:
chenshoulin
2026-11-02 00:17:14 +08:00
parent 6cbc0cfc0f
commit 6d58227614
25 changed files with 204 additions and 13 deletions
+38 -2
View File
@@ -21,6 +21,7 @@ function validTask(overrides: Record<string, unknown> = {}): Record<string, unkn
priority: 2,
tags: ['设计'],
dueDate: '2026-10-20',
startDate: null,
sortOrder: 1024,
createdAt: '2026-10-18T00:00:00.000Z',
updatedAt: '2026-10-18T00:00:00.000Z',
@@ -97,6 +98,12 @@ describe('coerceTask', () => {
expect(result?.sortOrder).toBe(0)
})
it('合法 startDate 保留,非法 startDate 收敛为 null', () => {
expect(coerceTask(validTask({ startDate: '2026-10-01' }))?.startDate).toBe('2026-10-01')
expect(coerceTask(validTask({ startDate: '2026-02-31' }))?.startDate).toBeNull()
expect(coerceTask(validTask({ startDate: undefined }))?.startDate).toBeNull()
})
it('tags 过滤掉非字符串与空白项', () => {
const result = coerceTask(validTask({ tags: ['ok', 1, null, ' ', 'ok2'] }))
expect(result?.tags).toEqual(['ok', 'ok2'])
@@ -265,17 +272,46 @@ describe('版本迁移', () => {
expect(state.tasks[0]?.archivedAt).toBe('2026-01-03T00:00:00.000Z')
})
it('v0/v1/v2 都能一路迁移到 v3', () => {
it('v3 数据迁移到 v4 时补上 startDate,其余字段不变', () => {
const v3 = JSON.stringify({
schemaVersion: 3,
tasks: [
{
id: 'legacy',
title: '旧任务',
status: 'todo',
priority: 2,
sortOrder: 1024,
createdAt: '2026-01-01T00:00:00.000Z',
updatedAt: '2026-01-01T00:00:00.000Z',
completedAt: null,
archivedAt: null,
deletedAt: null,
},
],
})
const state = parsePersistedState(v3)
expect(state.schemaVersion).toBe(SCHEMA_VERSION)
expect(state.tasks[0]?.startDate).toBeNull()
expect(state.tasks[0]?.deletedAt).toBeNull()
expect(state.tasks[0]?.title).toBe('旧任务')
})
it('v0/v1/v2/v3 都能一路迁移到当前版本', () => {
const builds = [
() => ({ tasks: [{ id: 'a', title: 'A', status: 'todo', priority: 2 }] }),
() => ({ schemaVersion: 1, tasks: [{ id: 'a', title: 'A', status: 'todo', priority: 2 }] }),
() => ({ schemaVersion: 2, tasks: [{ id: 'a', title: 'A', status: 'todo', priority: 2 }] }),
() => ({ schemaVersion: 3, tasks: [{ id: 'a', title: 'A', status: 'todo', priority: 2 }] }),
]
for (const build of builds) {
const state = parsePersistedState(JSON.stringify(build()))
expect(state.schemaVersion).toBe(3)
expect(state.schemaVersion).toBe(SCHEMA_VERSION)
expect(state.tasks[0]?.deletedAt).toBeNull()
expect(state.tasks[0]?.startDate).toBeNull()
}
})