feat(org-detail): Verbrauch weiter aufgeräumt, Lizenz und Kontingent in einer Karte

Auf Nutzerwunsch vier Änderungen im Org-Detail.

1. Kundensicht (Credits) und interner Einkauf (USD) stehen in EINER
   Karten-Reihe (Verbraucht, Verbleibend, API-Kosten Monat). Die Karte
   "Budget-Limit (USD, Altmodus)" entfällt in der Anzeige, das Feld
   bleibt im Erweitert-Bereich des Formulars erhalten.
2. Die Laufzeitwerte-Karte (Übertrag, laufende Periode, Verfügbar
   gesamt) ist raus. Der Übertrag bleibt im Verbleibend-Wert als
   Zusatz "(inkl. X Übertrag)" sichtbar.
3. "Lizenz & Credits-Kontingent bearbeiten" steht jetzt an zweiter
   Stelle direkt unter der Karten-Reihe und enthält BEIDES, die
   Lizenz-Verwaltung (Tabelle, Neue Lizenz, Verlängern, Widerrufen)
   und darunter das Kontingent-Formular. Der eigene Lizenzen-Block
   entfällt, der Monatliche Verlauf rückt ans Ende.
4. Die Sprungmarken-Leiste (Verbrauch/Nutzer/Lizenzen/Einstellungen)
   oben im Org-Detail ist entfernt, die Seite ist kurz genug.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-07-25 15:22:45 +00:00
Ursprung 25ec80c8e4
Commit 863e8835e4
3 geänderte Dateien mit 50 neuen und 122 gelöschten Zeilen

Datei anzeigen

@@ -161,17 +161,8 @@ function setupNavTabs() {
}
function setupOrgDetailTabs() {
// Das Org-Detail ist eine durchgehende Seite, die Pillen scrollen nur noch
// zum jeweiligen Bereich, statt Unterreiter umzuschalten.
document.querySelectorAll("#orgDetailTabs .nav-tab").forEach(tab => {
tab.addEventListener("click", () => {
document.querySelectorAll("#orgDetailTabs .nav-tab").forEach(t => t.classList.remove("active"));
tab.classList.add("active");
const block = document.getElementById(`sub-${tab.dataset.subtab}`);
if (block) block.scrollIntoView({ behavior: "smooth", block: "start" });
});
});
// Das Org-Detail ist eine durchgehende Seite ohne Unterreiter oder
// Sprungmarken, hier bleibt nur der Zurück-Knopf zu verdrahten.
document.getElementById("orgBackBtn").addEventListener("click", () => {
document.getElementById("orgListView").style.display = "";
document.getElementById("orgDetail").classList.remove("active");
@@ -320,10 +311,6 @@ async function openOrg(orgId) {
document.getElementById("orgListView").style.display = "none";
document.getElementById("orgDetail").classList.add("active");
// Erste Pille aktiv (Verbrauch), Ansicht nach oben
document.querySelectorAll("#orgDetailTabs .nav-tab").forEach(t => t.classList.remove("active"));
const firstPill = document.querySelector("#orgDetailTabs .nav-tab");
if (firstPill) firstPill.classList.add("active");
window.scrollTo({ top: 0 });
try {
@@ -978,14 +965,12 @@ async function loadOrgTokenUsage(orgId) {
el('tokenCreditsUsed', budget.credits_used != null ? Math.round(budget.credits_used).toLocaleString('de-DE') : '-');
if (unlimited) {
el('tokenCreditsRemaining', '∞ Unbegrenzt');
el('tokenBudgetUsd', '—');
} else {
var remainingTxt = budget.credits_remaining != null ? budget.credits_remaining.toLocaleString('de-DE') : '-';
if (budget.credits_carried > 0 && budget.credits_remaining != null) {
remainingTxt += ' (inkl. ' + Math.round(budget.credits_carried).toLocaleString('de-DE') + ' Übertrag)';
}
el('tokenCreditsRemaining', remainingTxt);
el('tokenBudgetUsd', budget.token_budget_usd != null ? '$' + Number(budget.token_budget_usd).toFixed(2) : '-');
}
el('tokenCostUsd', usage.total_cost_usd != null ? '$' + Number(usage.total_cost_usd).toFixed(2) : '-');
@@ -1075,14 +1060,6 @@ function fillBudgetForm(budget) {
onUnlimitedToggle();
}
// Laufzeitwerte (verwaltet der Monitor, hier nur Anzeige)
const txt = (id, val) => { const e = document.getElementById(id); if (e) e.textContent = val; };
const carried = budget.credits_carried || 0;
txt('viewCreditsCarried', carried > 0 ? Math.round(carried).toLocaleString('de-DE') + ' Credits' : 'Kein Übertrag');
txt('viewCreditsPeriodStart', budget.credits_period_start || 'Noch nicht initialisiert');
txt('viewCreditsAvailable', budget.unlimited_budget
? '∞ Unbegrenzt'
: (budget.credits_available != null ? Math.round(budget.credits_available).toLocaleString('de-DE') + ' Credits' : '-'));
}
// Unlimited-Toggle: Felder ausgrauen wenn aktiv