diff --git a/xian_favor/api.py b/xian_favor/api.py index 189d07f..4907fb2 100644 --- a/xian_favor/api.py +++ b/xian_favor/api.py @@ -718,8 +718,8 @@ INDEX_TEMPLATE = '''
- - + +
@@ -825,8 +825,8 @@ INDEX_TEMPLATE = '''
- - + +
@@ -1060,8 +1060,8 @@ INDEX_TEMPLATE = '''
- - + +
@@ -1187,7 +1187,7 @@ function renderItems(items) {

${item.url ? truncate(item.url, 50) : item.content ? truncate(item.content, 50) : item.note ? truncate(item.note, 50) : ''} - ${item.type === 'todo' ? `${getStatusLabelShort(item.status)} ${getPriorityLabelShort(item.priority)} ${item.due_date ? '📅' + item.due_date : ''}` : ''} + ${item.type === 'todo' ? `${getStatusLabelShort(item.status)} ${getPriorityLabelShort(item.priority)} ${item.due_date ? '📅' + formatDueDate(item.due_date) : ''}` : ''}

@@ -1437,7 +1437,7 @@ async function showDetail(id) { html += `
状态: ${getStatusLabel(item.status)}
`; html += `
优先级: ${getPriorityLabel(item.priority)}
`; if (item.due_date) { - html += `
截止日期: ${item.due_date}
`; + html += `
截止时间: ${formatDueDateFull(item.due_date)}
`; } } @@ -1509,7 +1509,21 @@ async function openEditModal(id) { if (type === 'todo') { document.getElementById('editStatus').value = item.status; document.getElementById('editPriority').value = item.priority; - document.getElementById('editDueDate').value = item.due_date || ''; + // 处理 datetime-local 格式 + if (item.due_date) { + // 尝试解析日期时间格式 + let dueDate = item.due_date; + if (dueDate.includes('T')) { + // ISO 格式,截取到分钟 + dueDate = dueDate.substring(0, 16); + } else if (dueDate.length === 10) { + // 只有日期,添加默认时间 00:00 + dueDate = dueDate + 'T00:00'; + } + document.getElementById('editDueDate').value = dueDate; + } else { + document.getElementById('editDueDate').value = ''; + } } new bootstrap.Modal(document.getElementById('editModal')).show(); @@ -1592,6 +1606,64 @@ function formatDate(dateStr) { return new Date(dateStr).toLocaleString('zh-CN'); } +// 格式化截止时间(友好显示) +function formatDueDate(dueDate) { + if (!dueDate) return ''; + + let date; + if (dueDate.includes('T')) { + date = new Date(dueDate); + } else if (dueDate.length === 10) { + // 只有日期 + date = new Date(dueDate + 'T00:00:00'); + } else { + date = new Date(dueDate); + } + + // 格式化为友好格式 + const now = new Date(); + const today = new Date(now.getFullYear(), now.getMonth(), now.getDate()); + const targetDay = new Date(date.getFullYear(), date.getMonth(), date.getDate()); + const daysDiff = Math.floor((targetDay - today) / (1000 * 60 * 60 * 24)); + + let datePart; + if (daysDiff === 0) { + datePart = '今天'; + } else if (daysDiff === 1) { + datePart = '明天'; + } else if (daysDiff === -1) { + datePart = '昨天'; + } else { + datePart = date.toLocaleDateString('zh-CN', {month: 'short', day: 'numeric'}); + } + + const timePart = date.toLocaleTimeString('zh-CN', {hour: '2-digit', minute: '2-digit'}); + + return `${datePart} ${timePart}`; +} + +// 格式化截止时间(完整显示) +function formatDueDateFull(dueDate) { + if (!dueDate) return ''; + + let date; + if (dueDate.includes('T')) { + date = new Date(dueDate); + } else if (dueDate.length === 10) { + date = new Date(dueDate + 'T00:00:00'); + } else { + date = new Date(dueDate); + } + + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: 'long', + day: 'numeric', + hour: '2-digit', + minute: '2-digit' + }); +} + function escapeHtml(str) { if (!str) return ''; return str.replace(/&/g, '&').replace(//g, '>'); @@ -2162,7 +2234,7 @@ function showRemindersModal() { html += `
${item.title || '(无标题)'} -
截止: ${item.due_date} | 已过期 ${item.days_overdue} 天 +
截止: ${formatDueDateFull(item.due_date)} | 已过期 ${item.days_overdue} 天