From de9c0d4fbd13cc5c2c23c9ea4a3e479b1f3253a6 Mon Sep 17 00:00:00 2001 From: Tim Eertmoed Date: Fri, 11 Sep 2026 21:03:25 +0200 Subject: [PATCH] Version 2.6.1: die Speichernzeile fuehrt zur Entscheidung --- apps/tesm-license/pyproject.toml | 2 +- packages/tesm-core/pyproject.toml | 2 +- .../tesm-core/src/tesm_core/app_factory.py | 2 +- .../static/tesm_core/css/components.css | 19 +++++++++++++++++++ .../tesm_core/static/tesm_core/js/viewer.js | 13 ++++++++++++- packages/tesm-licensing-server/pyproject.toml | 4 ++-- packages/tesm-licensing/pyproject.toml | 2 +- 7 files changed, 37 insertions(+), 7 deletions(-) diff --git a/apps/tesm-license/pyproject.toml b/apps/tesm-license/pyproject.toml index ce46e8f..7956513 100644 --- a/apps/tesm-license/pyproject.toml +++ b/apps/tesm-license/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-license" -version = "2.6.0" +version = "2.6.1" description = "TESM-Lizenzserver -- Kunden, Tickets, Lizenzen, Aktivierung" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/pyproject.toml b/packages/tesm-core/pyproject.toml index 01b7128..2b5ed2c 100644 --- a/packages/tesm-core/pyproject.toml +++ b/packages/tesm-core/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-core" -version = "2.6.0" +version = "2.6.1" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = [ diff --git a/packages/tesm-core/src/tesm_core/app_factory.py b/packages/tesm-core/src/tesm_core/app_factory.py index 55a7993..dd7939c 100644 --- a/packages/tesm-core/src/tesm_core/app_factory.py +++ b/packages/tesm-core/src/tesm_core/app_factory.py @@ -148,7 +148,7 @@ def create_base_app( #: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide #: Anwendungen. auth_tagline: str = "", - app_version: str = "2.6.0", + app_version: str = "2.6.1", built_in_trusted_keys: tuple[str, ...] = (), enable_license: bool = True, template_folder: str | None = None, diff --git a/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css b/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css index 6a75b35..7d49fa0 100644 --- a/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css +++ b/packages/tesm-core/src/tesm_core/static/tesm_core/css/components.css @@ -847,6 +847,25 @@ flex: 1 1 12rem; margin: 0; } + /* Die Entscheidung steht rechts und der Haken darueber: er gehoert zum + Speichern, nicht zu den Feldern davor. */ + .viewer__saveaktionen { + margin-left: auto; + display: flex; + flex-direction: column; + align-items: flex-end; + gap: var(--sp-2); + } + .viewer__saveknoepfe { + display: flex; + gap: var(--sp-2); + } + /* Nach "gibt es schon": der Haken ist die Antwort -- also faellt er auf. */ + .viewer__saveaktionen .check.is-gefragt { + outline: 2px solid var(--accent); + outline-offset: 3px; + border-radius: var(--r-xs); + } /* Eigener Name: ".field--inline" gibt es schon und steht dort fuer "waagerecht" -- diese Regel haette sie app-weit umgestellt. */ .viewer__feld { diff --git a/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js b/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js index da9a7a8..8df28b2 100644 --- a/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js +++ b/packages/tesm-core/src/tesm_core/static/tesm_core/js/viewer.js @@ -699,6 +699,7 @@ export function initFilePreview(wurzel = document) { const ordnerFeld = stueck("ordner"); const nameFeld = stueck("name"); const ersetzenFeld = stueck("ersetzen"); + const ersetzenKasten = stueck("ersetzenfeld"); const jetzt = stueck("jetzt"); const abbrechen = stueck("abbrechen"); const modusFeld = stueck("modus"); @@ -846,8 +847,12 @@ export function initFilePreview(wurzel = document) { // Ohne Endung: die haengt der Server an. Eine Datei, die auf ".pdf.txt" // oder auf gar nichts endet, oeffnet auf einer Freigabe nichts mehr. // Der Zusatz haelt die Vorlage heil, auch wenn jemand blind speichert. - nameFeld.value = datei.replace(/\.pdf$/i, "") + "-ausgefuellt"; + // Einmal "-ausgefuellt" reicht: wer eine ausgefuellte Fassung noch einmal + // oeffnet und speichert, bekam sonst "...-ausgefuellt-ausgefuellt". + const rumpfname = datei.replace(/\.pdf$/i, ""); + nameFeld.value = /-ausgefuellt$/i.test(rumpfname) ? rumpfname : `${rumpfname}-ausgefuellt`; ersetzenFeld.checked = false; + ersetzenKasten?.classList.remove("is-gefragt"); }; /* Unterschreiben: Name tippen, zeichnen, ins Dokument setzen. */ @@ -973,6 +978,12 @@ export function initFilePreview(wurzel = document) { // Zeile bleibt offen: meist ist es ein Name, der schon vergeben ist. console.error("Formular speichern", fehler); window.tesm.showToast(fehler.message || "Speichern fehlgeschlagen.", "danger"); + // Genau dieser Fall hat eine Antwort auf der Zeile -- dann zeigen wir + // auch darauf, statt es bei einer Meldung zu belassen. + if (fehler.status === 409) { + ersetzenKasten?.classList.add("is-gefragt"); + ersetzenFeld?.focus(); + } } finally { jetzt.disabled = false; jetzt.textContent = vorher; diff --git a/packages/tesm-licensing-server/pyproject.toml b/packages/tesm-licensing-server/pyproject.toml index cb5bf31..621d26a 100644 --- a/packages/tesm-licensing-server/pyproject.toml +++ b/packages/tesm-licensing-server/pyproject.toml @@ -4,10 +4,10 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-licensing-server" -version = "2.6.0" +version = "2.6.1" description = "Serverhaelfte des TESM-Lizenzprotokolls: ausstellen, erneuern, antworten" requires-python = ">=3.11" -dependencies = ["tesm-licensing==2.6.0", "cryptography>=41"] +dependencies = ["tesm-licensing==2.6.1", "cryptography>=41"] [tool.setuptools.packages.find] where = ["src"] diff --git a/packages/tesm-licensing/pyproject.toml b/packages/tesm-licensing/pyproject.toml index a8f379e..fa24659 100644 --- a/packages/tesm-licensing/pyproject.toml +++ b/packages/tesm-licensing/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-licensing" -version = "2.6.0" +version = "2.6.1" description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = ["cryptography>=42"]