@@ -1169,7 +1163,7 @@
-
+
diff --git a/src/static/js/app.js b/src/static/js/app.js
index 098d7b8..3dae1e3 100644
--- a/src/static/js/app.js
+++ b/src/static/js/app.js
@@ -306,6 +306,29 @@ document.addEventListener("DOMContentLoaded", () => {
});
// --- Open Org Detail ---
+let currentOrgData = null; // zuletzt geladene Org (fuer Inline-Einstellungen)
+
+function renderOrgHeader(org) {
+ const kpiAlt = document.getElementById("orgKpiCredits");
+ const kpiText = kpiAlt ? kpiAlt.textContent : "wird geladen …";
+ document.getElementById("orgDetailHeader").innerHTML = `
+
+
+
${esc(org.name)} ${org.is_active ? "Aktiv" : "Inaktiv"}
+
Slug: ${esc(org.slug)} | Nutzer: ${org.user_count} | Lizenz: ${org.license_type || "Keine"} | Kontingent: ${esc(kpiText)}
+
+
+
+ Umbenennen
+
+
+
+ Löschen
+
+
+ `;
+}
+
async function openOrg(orgId) {
currentOrgId = orgId;
document.getElementById("orgListView").style.display = "none";
@@ -315,15 +338,8 @@ async function openOrg(orgId) {
try {
const org = await API.get(`/api/orgs/${orgId}`);
- document.getElementById("orgDetailHeader").innerHTML = `
-
${esc(org.name)} ${org.is_active ? "Aktiv" : "Inaktiv"}
-
Slug: ${esc(org.slug)} | Nutzer: ${org.user_count} | Lizenz: ${org.license_type || "Keine"} | Kontingent: wird geladen …
- `;
-
- document.getElementById("editOrgName").value = org.name;
- document.getElementById("editOrgActive").value = org.is_active ? "true" : "false";
- const langEl = document.getElementById("editOrgLanguage");
- if (langEl) langEl.value = org.output_language || "de";
+ currentOrgData = org;
+ renderOrgHeader(org);
// Alle Bereiche sofort laden, es gibt keine Unterreiter mehr
loadOrgUsers(orgId);
@@ -334,6 +350,60 @@ async function openOrg(orgId) {
}
}
+// --- Inline-Einstellungen (ersetzen den frueheren Einstellungen-Block) ---
+
+async function _saveOrgSetting(patch, meldung) {
+ try {
+ await API.put(`/api/orgs/${currentOrgId}`, patch);
+ currentOrgData = await API.get(`/api/orgs/${currentOrgId}`);
+ renderOrgHeader(currentOrgData);
+ loadOrgLicenses(currentOrgId);
+ loadOrgs();
+ showToast(meldung, "success");
+ } catch (err) {
+ showToast(err.message, "error");
+ loadOrgLicenses(currentOrgId); // Auswahl auf den echten Stand zuruecksetzen
+ }
+}
+
+function setOrgActive(wert) {
+ _saveOrgSetting({ is_active: wert === "true" },
+ wert === "true" ? "Organisation aktiviert" : "Organisation deaktiviert");
+}
+
+function setOrgLanguage(wert) {
+ _saveOrgSetting({ output_language: wert }, "Pipeline-Sprache gespeichert");
+}
+
+function renameOrg() {
+ const input = document.getElementById("renameOrgName");
+ const errEl = document.getElementById("renameOrgError");
+ if (errEl) errEl.style.display = "none";
+ if (input && currentOrgData) input.value = currentOrgData.name;
+ openModal("modalRenameOrg");
+ if (input) input.focus();
+}
+
+function confirmDeleteOrg() {
+ showConfirm(
+ "Organisation löschen",
+ "Soll die Organisation mit allen Nutzern und Lizenzen endgültig gelöscht werden? Diese Aktion kann nicht rückgängig gemacht werden.",
+ async () => {
+ try {
+ await API.del(`/api/orgs/${currentOrgId}`);
+ document.getElementById("orgListView").style.display = "";
+ document.getElementById("orgDetail").classList.remove("active");
+ currentOrgId = null;
+ currentOrgData = null;
+ loadOrgs();
+ loadDashboard();
+ } catch (err) {
+ showToast(err.message, "error");
+ }
+ }
+ );
+}
+
// --- Org Users ---
async function loadOrgUsers(orgId) {
try {
@@ -436,9 +506,21 @@ async function loadOrgLicenses(orgId) {
const licenses = await API.get(`/api/licenses?org_id=${orgId}`);
const tbody = document.getElementById("licenseTable");
if (licenses.length === 0) {
- tbody.innerHTML = '
Keine Lizenzen ';
+ tbody.innerHTML = '
Keine Lizenzen ';
return;
}
+ // Org-Status und Pipeline-Sprache sind Org-Einstellungen und stehen nur in
+ // der aktiven Zeile, direkt umschaltbar (Sofort-Speicherung).
+ const org = currentOrgData || {};
+ const orgZellen = `
+
+ Aktiv
+ Deaktiviert
+
+
+ Deutsch
+ English
+ `;
tbody.innerHTML = licenses.map(l => `
${l.license_type}
@@ -446,6 +528,7 @@ async function loadOrgLicenses(orgId) {
${formatDate(l.valid_from)}
${l.valid_until ? formatDate(l.valid_until) : "Unbegrenzt"}
${l.status}
+ ${l.status === "active" ? orgZellen : '– – '}
${l.status === "active" ? `
Verlängern
@@ -683,42 +766,27 @@ function setupForms() {
}
});
- // Org Edit
- document.getElementById("orgEditForm").addEventListener("submit", async (e) => {
- e.preventDefault();
- try {
- await API.put(`/api/orgs/${currentOrgId}`, {
- name: document.getElementById("editOrgName").value,
- is_active: document.getElementById("editOrgActive").value === "true",
- output_language: document.getElementById("editOrgLanguage").value || "de",
- });
- openOrg(currentOrgId);
- loadOrgs();
- loadDashboard();
- } catch (err) {
- showToast(err.message, "error");
- }
- });
-
- // Delete Org
- document.getElementById("deleteOrgBtn").addEventListener("click", () => {
- showConfirm(
- "Organisation löschen",
- "Soll die Organisation mit allen Nutzern und Lizenzen endgültig gelöscht werden? Diese Aktion kann nicht rückgängig gemacht werden.",
- async () => {
- try {
- await API.del(`/api/orgs/${currentOrgId}`);
- document.getElementById("orgListView").style.display = "";
- document.getElementById("orgDetail").classList.remove("active");
- currentOrgId = null;
- loadOrgs();
- loadDashboard();
- } catch (err) {
- showToast(err.message, "error");
- }
+ // Org umbenennen (kleines Modal, Rest der frueheren Einstellungen ist
+ // inline in Kopfzeile und Lizenz-Tabelle gewandert)
+ const renameForm = document.getElementById("renameOrgForm");
+ if (renameForm) {
+ renameForm.addEventListener("submit", async (e) => {
+ e.preventDefault();
+ const errEl = document.getElementById("renameOrgError");
+ if (errEl) errEl.style.display = "none";
+ try {
+ await API.put(`/api/orgs/${currentOrgId}`, {
+ name: document.getElementById("renameOrgName").value,
+ });
+ closeModal("modalRenameOrg");
+ currentOrgData = await API.get(`/api/orgs/${currentOrgId}`);
+ renderOrgHeader(currentOrgData);
+ loadOrgs();
+ } catch (err) {
+ if (errEl) { errEl.textContent = err.message; errEl.style.display = "block"; }
}
- );
- });
+ });
+ }
}
// --- Modal helpers ---