Update dashboard, memory, root (+40 ~22 -2)
This commit is contained in:
@@ -688,7 +688,7 @@
|
||||
}
|
||||
|
||||
.issue-checkbox.in-progress {
|
||||
background: rgba(59, 130, 246, 0.3);
|
||||
background: rgba(59, 130, 246, 0.5);
|
||||
border-color: #3b82f6;
|
||||
}
|
||||
|
||||
@@ -1071,6 +1071,10 @@
|
||||
<i data-lucide="file-text"></i>
|
||||
<span>KB</span>
|
||||
</a>
|
||||
<a href="/echo/habits.html" class="nav-item">
|
||||
<i data-lucide="dumbbell"></i>
|
||||
<span>Habits</span>
|
||||
</a>
|
||||
<a href="/echo/files.html" class="nav-item">
|
||||
<i data-lucide="folder"></i>
|
||||
<span>Files</span>
|
||||
@@ -1448,7 +1452,7 @@
|
||||
let issuesData = null;
|
||||
let activityData = [];
|
||||
let currentFilter = 'all';
|
||||
let collapsedPriorities = new Set(['backlog']);
|
||||
let collapsedPriorities = new Set(['backlog', 'done']);
|
||||
|
||||
// Priority labels
|
||||
const priorityLabels = {
|
||||
@@ -2171,39 +2175,40 @@
|
||||
filtered = filtered.filter(i => i.owner === currentFilter);
|
||||
}
|
||||
|
||||
// Group by priority
|
||||
// Separate done from active
|
||||
const activeIssues = filtered.filter(i => i.status !== 'done');
|
||||
const doneIssues = filtered.filter(i => i.status === 'done');
|
||||
|
||||
// Group active by priority
|
||||
const grouped = {};
|
||||
priorityOrder.forEach(p => grouped[p] = []);
|
||||
|
||||
filtered.forEach(issue => {
|
||||
activeIssues.forEach(issue => {
|
||||
const p = issue.priority || 'backlog';
|
||||
if (grouped[p]) grouped[p].push(issue);
|
||||
else grouped['backlog'].push(issue);
|
||||
});
|
||||
|
||||
// Sort each group: todo first, then by date
|
||||
// Sort each group by date (newest first)
|
||||
Object.keys(grouped).forEach(p => {
|
||||
grouped[p].sort((a, b) => {
|
||||
if (a.status === 'done' && b.status !== 'done') return 1;
|
||||
if (a.status !== 'done' && b.status === 'done') return -1;
|
||||
return new Date(b.created) - new Date(a.created);
|
||||
});
|
||||
grouped[p].sort((a, b) => new Date(b.created) - new Date(a.created));
|
||||
});
|
||||
|
||||
let html = '';
|
||||
|
||||
// Render active issues by priority
|
||||
priorityOrder.forEach(priority => {
|
||||
const issues = grouped[priority];
|
||||
if (issues.length === 0) return;
|
||||
|
||||
const isCollapsed = collapsedPriorities.has(priority);
|
||||
const todoCount = issues.filter(i => i.status !== 'done').length;
|
||||
|
||||
html += `
|
||||
<div class="priority-group">
|
||||
<div class="priority-header ${isCollapsed ? 'collapsed' : ''}" onclick="togglePriority('${priority}')">
|
||||
<i data-lucide="chevron-down"></i>
|
||||
<span>${priorityLabels[priority]}</span>
|
||||
<span style="margin-left: auto; opacity: 0.7">${todoCount}/${issues.length}</span>
|
||||
<span style="margin-left: auto; opacity: 0.7">${issues.length}</span>
|
||||
</div>
|
||||
<div class="priority-content ${isCollapsed ? 'hidden' : ''}">
|
||||
${issues.map(issue => renderIssueItem(issue)).join('')}
|
||||
@@ -2212,6 +2217,25 @@
|
||||
`;
|
||||
});
|
||||
|
||||
// Render done issues separately at the end
|
||||
if (doneIssues.length > 0) {
|
||||
const isDoneCollapsed = collapsedPriorities.has('done');
|
||||
doneIssues.sort((a, b) => new Date(b.completed || b.updated) - new Date(a.completed || a.updated));
|
||||
|
||||
html += `
|
||||
<div class="priority-group">
|
||||
<div class="priority-header ${isDoneCollapsed ? 'collapsed' : ''}" onclick="togglePriority('done')">
|
||||
<i data-lucide="chevron-down"></i>
|
||||
<span>✅ Executate</span>
|
||||
<span style="margin-left: auto; opacity: 0.7">${doneIssues.length}</span>
|
||||
</div>
|
||||
<div class="priority-content ${isDoneCollapsed ? 'hidden' : ''}">
|
||||
${doneIssues.map(issue => renderIssueItem(issue)).join('')}
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
body.innerHTML = html;
|
||||
lucide.createIcons();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user