Git-Status Endpoint mit Outgoing-Commits und Dashboard-Badges

- GET /api/sessions/{id}/git-status: Parsed git status --porcelain in add/edit/delete Listen
- Outgoing-Commits: Zählt unpushed Commits via git rev-list --count @{u}..HEAD
- Dashboard: Zeigt Git-Badges asynchron pro Session (+N, ~N, -N, ↑N)
- CSS: Farbige Badges (grün=add, orange=edit, rot=delete, blau=outgoing)
This commit is contained in:
Meleki committed 2026-02-28 23:23:52 +01:00
1 parent 166465fd54
commit ac150af4c5
4 files changed
+195

No files matched your search

+34
View File
@@ -114,3 +114,37 @@
overflow: hidden;
text-overflow: ellipsis;
}
.card-git-status {
display: flex;
align-items: center;
gap: var(--badge-spacing);
opacity: 1;
}
.git-badge {
padding: var(--badge-padding);
font-family: var(--mono);
font-size: var(--mono-size);
border-radius: var(--border-radius);
}
.git-add {
background: rgba(68, 170, 17, 0.15);
color: var(--secondary);
}
.git-edit {
background: rgba(255, 170, 0, 0.15);
color: var(--warning);
}
.git-delete {
background: rgba(255, 102, 102, 0.15);
color: var(--dangerous);
}
.git-outgoing {
background: rgba(100, 149, 237, 0.15);
color: var(--primary);
}
+6
View File
@@ -131,6 +131,12 @@ async function apiGetChain(chainId) {
return resp.json();
}
async function apiGitStatus(sessionId) {
const resp = await fetch(`/api/sessions/${sessionId}/git-status`);
if (!resp.ok) return null;
return resp.json();
}
async function apiBackupDb() {
const resp = await fetch('/api/backup', { method: 'POST' });
if (!resp.ok) throw new Error('Backup fehlgeschlagen');
+26
View File
@@ -36,6 +36,32 @@ registerPage('dashboard', {
`;
card.addEventListener('click', () => navigateTo('session', { id: s.sessionId }));
grid.appendChild(card);
// Git-Status asynchron laden
if (s.workspace) {
apiGitStatus(s.sessionId).then(status => {
if (!status || !status.success) return;
const addCount = (status.add || []).length;
const editCount = (status.edit || []).length;
const deleteCount = (status.delete || []).length;
const outgoing = status.outgoing || 0;
if (addCount + editCount + deleteCount + outgoing === 0) return;
const metaEl = card.querySelector('.card-meta');
if (!metaEl) return;
const parts = [];
if (addCount > 0) parts.push(`<span class="git-badge git-add">+${addCount}</span>`);
if (editCount > 0) parts.push(`<span class="git-badge git-edit">~${editCount}</span>`);
if (deleteCount > 0) parts.push(`<span class="git-badge git-delete">-${deleteCount}</span>`);
if (outgoing > 0) parts.push(`<span class="git-badge git-outgoing"><i class="fa fa-arrow-up"></i> ${outgoing}</span>`);
const gitEl = document.createElement('span');
gitEl.className = 'card-meta-item card-git-status';
gitEl.innerHTML = `<i class="fa fa-code-fork"></i> ${parts.join(' ')}`;
metaEl.appendChild(gitEl);
});
}
}
// Neue Session Placeholder