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:
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren