feat: Token-Nutzung Tab sichtbar + Budget-Bearbeitung

- display:none entfernt, .active-Klasse greift jetzt korrekt
- Budget-Formular mit 4 Feldern (Credits, Kosten/Credit, Budget-Limit, Verbrauch)
- Formular wird mit aktuellen Werten vorbelegt
- Speichern aktualisiert Lizenz und lädt Daten neu
Dieser Commit ist enthalten in:
Claude Dev
2026-03-18 00:12:51 +01:00
Ursprung 7cd36959b0
Commit 44425c6ef8
2 geänderte Dateien mit 84 neuen und 1 gelöschten Zeilen

Datei anzeigen

@@ -595,6 +595,8 @@ async function loadOrgTokenUsage(orgId) {
}
if (percentEl) percentEl.textContent = percent.toFixed(1) + '%';
fillBudgetForm(budget);
const tbody = document.getElementById('tokenMonthlyTable');
if (tbody) {
tbody.innerHTML = monthly.map(function(m) {
@@ -613,6 +615,15 @@ async function loadOrgTokenUsage(orgId) {
}
}
// Budget-Formular Felder befuellen
function fillBudgetForm(budget) {
const el = (id, val) => { const e = document.getElementById(id); if (e && val != null) e.value = val; };
el('editCreditsTotal', budget.credits_total);
el('editCostPerCredit', budget.cost_per_credit);
el('editBudgetUsd', budget.token_budget_usd);
el('editCreditsUsed', budget.credits_used ? Math.round(budget.credits_used) : 0);
}
async function loadDashboardTokenStats() {
try {
const data = await API.get('/api/token-usage/overview');
@@ -636,3 +647,47 @@ async function loadDashboardTokenStats() {
console.error('Token-Overview laden fehlgeschlagen:', err);
}
}
// Budget-Formular Submit
document.addEventListener('DOMContentLoaded', function() {
var form = document.getElementById('tokenBudgetForm');
if (form) {
form.addEventListener('submit', async function(e) {
e.preventDefault();
var msgEl = document.getElementById('tokenBudgetMsg');
if (msgEl) msgEl.textContent = 'Speichern...';
// Lizenz-ID fuer die aktuelle Org ermitteln
try {
var licenses = await API.get('/api/licenses?org_id=' + currentOrgId);
var activeLic = licenses.find(function(l) { return l.status === 'active'; });
if (!activeLic) {
if (msgEl) msgEl.textContent = 'Keine aktive Lizenz gefunden';
return;
}
var body = {};
var creditsTotal = document.getElementById('editCreditsTotal');
var costPerCredit = document.getElementById('editCostPerCredit');
var budgetUsd = document.getElementById('editBudgetUsd');
var creditsUsed = document.getElementById('editCreditsUsed');
if (creditsTotal && creditsTotal.value) body.credits_total = parseInt(creditsTotal.value);
if (costPerCredit && costPerCredit.value) body.cost_per_credit = parseFloat(costPerCredit.value);
if (budgetUsd && budgetUsd.value) body.token_budget_usd = parseFloat(budgetUsd.value);
if (creditsUsed && creditsUsed.value !== '') body.credits_used = parseFloat(creditsUsed.value);
await API.put('/api/token-usage/budget/' + activeLic.id, body);
if (msgEl) msgEl.textContent = 'Gespeichert!';
setTimeout(function() { if (msgEl) msgEl.textContent = ''; }, 3000);
// Daten neu laden
loadOrgTokenUsage(currentOrgId);
} catch (err) {
if (msgEl) msgEl.textContent = 'Fehler: ' + err.message;
console.error('Budget speichern fehlgeschlagen:', err);
}
});
}
});