diff --git a/apps/tesm-license/pyproject.toml b/apps/tesm-license/pyproject.toml index e66ce00..02cc485 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.3.1" +version = "2.3.2" 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 69a6106..fbfe914 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.3.1" +version = "2.3.2" 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 ed1e30c..603dff5 100644 --- a/packages/tesm-core/src/tesm_core/app_factory.py +++ b/packages/tesm-core/src/tesm_core/app_factory.py @@ -135,7 +135,7 @@ def create_base_app( #: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide #: Anwendungen. auth_tagline: str = "", - app_version: str = "2.3.1", + app_version: str = "2.3.2", 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 d541c35..7d682b4 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 @@ -720,6 +720,16 @@ min-height: 220px; background: var(--surface-1); } + /* Hochkant -- Tablet oder Monitor im Hochformat -- gibt es unter dem Dialog + viel Platz, den die Obergrenze verschenkt. Beim Ausfuellen eines + Formulars zaehlt jede sichtbare Zeile, also nehmen wir dort die Hoehe, + die da ist. Der Rest (Kopf, Dateiname, Fusszeile) braucht rund 200 Pixel; + die 240 lassen etwas Luft. */ + @media (orientation: portrait) { + .viewer { + height: calc(100dvh - 240px); + } + } .viewer > .file-preview { flex: 1; height: auto; @@ -763,6 +773,11 @@ position: relative; flex: 1; min-height: 0; + /* Ein PDF ist weisses Papier. pdf.js malt Formularfelder mit Systemfarben + und ueberlaesst Ankreuzfelder dem Browser -- im dunklen Design heisst + CanvasText weiss, und die Haken waren auf dem Papier unsichtbar. Fuer + diesen Ausschnitt gilt deshalb immer das helle Schema. */ + color-scheme: light; } /* pdf.js rechnet fuer die Seite mit dem Standard "content-box": ihr 9-Pixel-Rahmen liegt *ausserhalb* der angegebenen Breite. Unser globales 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 6eb0e60..50c9821 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 @@ -593,9 +593,10 @@ export function initFilePreview(wurzel = document) { const teile = aktuell.pfad.split("/"); const datei = teile.pop() || "formular.pdf"; ordnerFeld.value = teile.join("/"); - // Der Name der Vorlage mit Zusatz -- die Vorlage selbst bleibt so heil, - // auch wenn jemand blind auf Speichern drueckt. - nameFeld.value = datei.replace(/\.pdf$/i, "") + "-ausgefuellt.pdf"; + // 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"; ersetzenFeld.checked = false; }; @@ -627,7 +628,7 @@ export function initFilePreview(wurzel = document) { daten.append( "datei", new Blob([bytes], { type: "application/pdf" }), - nameFeld.value.trim() || "formular.pdf" + `${nameFeld.value.trim() || "formular"}.pdf` ); const antwort = await window.tesm.api(ziel, { method: "POST", body: daten }); window.tesm.showToast(antwort.message || "Gespeichert.", "success"); diff --git a/packages/tesm-licensing-server/pyproject.toml b/packages/tesm-licensing-server/pyproject.toml index 6b8a3ee..5bf6320 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.3.1" +version = "2.3.2" description = "Serverhaelfte des TESM-Lizenzprotokolls: ausstellen, erneuern, antworten" requires-python = ">=3.11" -dependencies = ["tesm-licensing==2.3.1", "cryptography>=41"] +dependencies = ["tesm-licensing==2.3.2", "cryptography>=41"] [tool.setuptools.packages.find] where = ["src"] diff --git a/packages/tesm-licensing/pyproject.toml b/packages/tesm-licensing/pyproject.toml index f629b93..b781074 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.3.1" +version = "2.3.2" description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver" requires-python = ">=3.11" dependencies = ["cryptography>=42"]