fix: simplify date-only due labels
ci / gitleaks (push) Successful in 7s
ci / docker (push) Successful in 3m29s

This commit is contained in:
2026-09-10 17:22:06 +08:00
parent 1366f302ec
commit ab8c0a5138
6 changed files with 76 additions and 47 deletions
+14 -14
View File
@@ -66,15 +66,15 @@ describe('getTaskDuePresentation date-only tasks', () => {
})
it.each([
['2026-09-09', '9月9日', '已过期1天', 'overdue'],
['2026-09-10', '9月10日', '今天', 'neutral'],
['2026-09-11', '9月11日', '还有1天', 'neutral'],
['2027-01-02', '2027年1月2日', '还有114天', 'neutral'],
] as const)('formats %s by local calendar day', (dueAt, absoluteText, relativeText, state) => {
['2026-09-08', '2天', 'overdue', '已过期2天'],
['2026-09-10', '今天', 'neutral', '今天'],
['2026-09-12', '2天', 'neutral', '还有2天'],
] as const)('uses compact visual copy for %s while preserving the full description', (dueAt, relativeText, state, fullRelativeText) => {
const result = getTaskDuePresentation({ dueAt, dueHasTime: false, completed: false, nowMs })
expect(result).toMatchObject({ datetime: dueAt, absoluteText, relativeText, state })
expect(result?.fullText).toContain('截止日期:')
expect(result?.fullText).toContain('2026年' === absoluteText.slice(0, 5) ? absoluteText : dueAt.startsWith('2026') ? `2026年${absoluteText}` : absoluteText)
expect(result).toMatchObject({ datetime: dueAt, relativeText, state })
expect(result?.relativeText).not.toMatch(/还有|已过期|月|日/)
expect(result?.fullText).toContain(`截止日期:2026年${Number(dueAt.slice(5, 7))}${Number(dueAt.slice(8, 10))}`)
expect(result?.fullText).toContain(fullRelativeText)
})
it('compares calendar dates across a DST-sized 23 hour gap', () => {
@@ -86,18 +86,18 @@ describe('getTaskDuePresentation date-only tasks', () => {
completed: false,
nowMs: before.getTime(),
})
expect(result?.relativeText).toBe('还有1天')
expect(result?.relativeText).toBe('1天')
expect(result?.fullText).toContain('还有1天')
})
it.each([
['2026-09-09', '已完成(原定1天前)'],
['2026-09-10', '已完成(原定今天)'],
['2026-09-12', '已完成(原定2天后)'],
])('uses completed neutral wording for %s', (dueAt, relativeText) => {
expect(getTaskDuePresentation({ dueAt, dueHasTime: false, completed: true, nowMs })).toMatchObject({
relativeText,
state: 'completed',
})
])('uses minimal completed visual copy and preserves the detailed description for %s', (dueAt, fullRelativeText) => {
const result = getTaskDuePresentation({ dueAt, dueHasTime: false, completed: true, nowMs })
expect(result).toMatchObject({ relativeText: '已完成', state: 'completed' })
expect(result?.fullText).toContain(fullRelativeText)
})
})
+7 -5
View File
@@ -161,13 +161,15 @@ export function getTaskDuePresentation(input: {
const dayDelta = calendarDelta(parsed.date, now)
const absoluteDateText = absoluteDate(parsed.date, now.getFullYear())
const absoluteText = input.dueHasTime ? `${absoluteDateText} ${localTime(parsed.date)}` : absoluteDateText
const completedDescription = completedRelative(dayDelta)
const dateOnlyDescription = dayDelta === 0
? '今天'
: dayDelta > 0 ? `还有${dayDelta}` : `已过期${Math.abs(dayDelta)}`
const relativeText = input.completed
? completedRelative(dayDelta)
? (input.dueHasTime ? completedDescription : '已完成')
: input.dueHasTime
? timedRelative(parsed.date.getTime() - input.nowMs)
: dayDelta === 0
? '今天'
: dayDelta > 0 ? `还有${dayDelta}` : `已过期${Math.abs(dayDelta)}`
: dayDelta === 0 ? '今天' : `${Math.abs(dayDelta)}`
const state: TaskDueState = input.completed
? 'completed'
: input.dueHasTime ? (parsed.date.getTime() < input.nowMs ? 'overdue' : 'neutral') : (dayDelta < 0 ? 'overdue' : 'neutral')
@@ -178,7 +180,7 @@ export function getTaskDuePresentation(input: {
datetime: parsed.datetime,
absoluteText,
relativeText,
fullText: `${kind}${fullAbsolute}${relativeText}`,
fullText: `${kind}${fullAbsolute}${input.completed ? completedDescription : input.dueHasTime ? relativeText : dateOnlyDescription}`,
state,
}
}