|
|
|
|
@@ -1090,6 +1090,17 @@ INDEX_TEMPLATE = '''
|
|
|
|
|
<script>
|
|
|
|
|
const API_BASE = '/api';
|
|
|
|
|
let currentFilter = { type: '', status: '' };
|
|
|
|
|
let currentPage = 1;
|
|
|
|
|
const pageSize = 20;
|
|
|
|
|
|
|
|
|
|
// 工具函数 - 必须先定义
|
|
|
|
|
function debounce(fn, delay) {
|
|
|
|
|
let timer;
|
|
|
|
|
return function(...args) {
|
|
|
|
|
clearTimeout(timer);
|
|
|
|
|
timer = setTimeout(() => fn.apply(this, args), delay);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始化
|
|
|
|
|
document.addEventListener('DOMContentLoaded', async () => {
|
|
|
|
|
@@ -1179,14 +1190,14 @@ function renderItems(items) {
|
|
|
|
|
<h6 class="card-title text-truncate mb-1 ${item.type === 'todo' && item.status === 'completed' ? 'text-muted' : ''}">
|
|
|
|
|
${getTypeIcon(item.type)} ${item.title || truncate(item.content || item.url, 30)}
|
|
|
|
|
${item.type === 'todo' && item.status === 'completed' ? ' ✓' : ''}
|
|
|
|
|
<span style="font-size:10px; opacity:0.5; margin-left:8px;">
|
|
|
|
|
${formatShortDate(item.created_at)}${item.updated_at && item.updated_at !== item.created_at ? '→' + formatShortDate(item.updated_at) : ''}
|
|
|
|
|
</span>
|
|
|
|
|
</h6>
|
|
|
|
|
<p class="card-text text-muted small mb-0 text-truncate" style="font-size:12px;">
|
|
|
|
|
${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 ? '📅' + formatDueDate(item.due_date) : ''}` : ''}
|
|
|
|
|
</p>
|
|
|
|
|
<p class="text-muted mb-0" style="font-size:10px; opacity:0.6;">
|
|
|
|
|
${formatShortDate(item.created_at)}${item.updated_at && item.updated_at !== item.created_at ? ' → ' + formatShortDate(item.updated_at) : ''}
|
|
|
|
|
</p>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="d-flex align-items-center gap-1 flex-wrap ms-2" onclick="event.stopPropagation();">
|
|
|
|
|
${item.tags.slice(0, 2).map(t => `<span class="badge bg-secondary" style="font-size:10px;">${t}</span>`).join('')}
|
|
|
|
|
@@ -2196,14 +2207,6 @@ async function sendItemEmail() {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function debounce(fn, delay) {
|
|
|
|
|
let timer;
|
|
|
|
|
return function(...args) {
|
|
|
|
|
clearTimeout(timer);
|
|
|
|
|
timer = setTimeout(() => fn.apply(this, args), delay);
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ============ 提醒功能 ============
|
|
|
|
|
|
|
|
|
|
let reminderData = null;
|
|
|
|
|
|