diff --git a/aria-brain/main.py b/aria-brain/main.py index 5800bee..c4b6902 100644 --- a/aria-brain/main.py +++ b/aria-brain/main.py @@ -817,6 +817,7 @@ def projects_archive(project_id: str): class ProjectUpdateBody(BaseModel): name: Optional[str] = None description: Optional[str] = None + hidden: Optional[bool] = None @app.patch("/projects/{project_id}") diff --git a/aria-brain/projects.py b/aria-brain/projects.py index fedd7f5..5d8bebe 100644 --- a/aria-brain/projects.py +++ b/aria-brain/projects.py @@ -132,6 +132,7 @@ def create_project(name: str, description: str = "") -> dict: "name": name, "description": description.strip(), "status": "active", # active | ended | archived + "hidden": False, # optisch aus Listen ausblenden (bleibt nutzbar) "created_at": now, "updated_at": now, "last_activity_at": now, @@ -148,7 +149,7 @@ def update_project(project_id: str, patch: dict) -> Optional[dict]: projects = _load_all() for p in projects: if p["id"] == project_id: - for k in ("name", "description", "status"): + for k in ("name", "description", "status", "hidden"): if k in patch and patch[k] is not None: p[k] = patch[k] p["updated_at"] = _now() diff --git a/diagnostic/index.html b/diagnostic/index.html index 68edfa2..d2fe822 100644 --- a/diagnostic/index.html +++ b/diagnostic/index.html @@ -1095,6 +1095,7 @@

πŸ“ Projekte

+
@@ -3002,16 +3003,28 @@
πŸ’¬ Hauptchat ${!activeId ? 'βœ“ AKTIV' : ''}
Standard-Verlauf, keine Projekt-Zuordnung
`); + const showHidden = !!window.__showHidden; + let hiddenCount = 0, shownCount = 0; for (const p of projects) { + const hidden = !!p.hidden; + if (hidden) hiddenCount++; + // Versteckte nur zeigen wenn der Toggle an ist. + if (hidden && !showHidden) continue; + shownCount++; const isActive = p.id === activeId; const since = p.last_activity_at ? new Date(p.last_activity_at * 1000).toLocaleString('de-DE') : '?'; const ended = p.status === 'ended'; + // Auge: versteckt β†’ πŸ‘ (wieder sichtbar machen), sichtbar β†’ πŸ™ˆ (verstecken). + const eyeIcon = hidden ? 'πŸ‘' : 'πŸ™ˆ'; + const eyeTitle = hidden ? 'Wieder dauerhaft sichtbar machen' : 'Verstecken (aus Listen ausblenden)'; + const eyeColor = hidden ? '#B392F0' : '#8888AA'; rows.push(` -
+
- πŸ“ ${escapeHtml(p.name)} + ${hidden ? 'πŸ™ˆ' : 'πŸ“'} ${escapeHtml(p.name)} + ${hidden ? 'versteckt' : ''} ${ended ? 'beendet' : ''} ${isActive ? 'βœ“ AKTIV' : ''}
@@ -3019,6 +3032,7 @@
${p.turn_count} Turns Β· zuletzt ${since}
+ ${!ended ? `` : ''}
@@ -3027,13 +3041,43 @@ } if (projects.length === 0) { rows.push('
Noch keine Projekte. β€ž+ Neues Projekt" oder sag ARIA β€žlass uns ein Projekt anlegen".
'); + } else if (shownCount === 0) { + rows.push(`
Alle ${hiddenCount} Projekte sind versteckt. Klick β€žπŸ‘ Versteckte anzeigen".
`); } listEl.innerHTML = rows.join(''); + + // Toggle-Button beschriften (mit Anzahl) + Zustand spiegeln. + const thBtn = document.getElementById('toggle-hidden-btn'); + if (thBtn) { + thBtn.textContent = showHidden + ? `πŸ™ˆ Versteckte ausblenden${hiddenCount ? ' ('+hiddenCount+')' : ''}` + : `πŸ‘ Versteckte anzeigen${hiddenCount ? ' ('+hiddenCount+')' : ''}`; + thBtn.style.opacity = hiddenCount ? '1' : '0.5'; + } } catch (e) { listEl.innerHTML = `
Fehler: ${e.message}
`; } } + function toggleShowHidden() { + window.__showHidden = !window.__showHidden; + loadProjects(); + } + + async function setProjectHidden(id, hidden) { + try { + const r = await fetch(`/api/brain/projects/${encodeURIComponent(id)}`, { + method: 'PATCH', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ hidden: !!hidden }), + }); + if (!r.ok) throw new Error('HTTP ' + r.status); + // Beim Verstecken bleibt der β€žanzeigen"-Modus wie er ist; beim + // Wieder-Sichtbarmachen sieht man es sofort ohne Umschalten. + loadProjects(); + } catch (e) { alert('Verstecken/Anzeigen fehlgeschlagen: ' + e.message); } + } + async function switchProject(projectId) { try { await fetch('/api/brain/projects/switch', {