diff --git a/apps/tesm/pyproject.toml b/apps/tesm/pyproject.toml
index 78afbc9..d19271a 100644
--- a/apps/tesm/pyproject.toml
+++ b/apps/tesm/pyproject.toml
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project]
name = "tesm"
-version = "2.6.0"
+version = "2.6.1"
description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen"
requires-python = ">=3.11"
dependencies = [
diff --git a/apps/tesm/src/tesm/blueprints/fileshare.py b/apps/tesm/src/tesm/blueprints/fileshare.py
index a267265..46eacb2 100644
--- a/apps/tesm/src/tesm/blueprints/fileshare.py
+++ b/apps/tesm/src/tesm/blueprints/fileshare.py
@@ -304,8 +304,8 @@ def save_form(token: str):
ziel = zielordner / name
if ziel.exists() and not ersetzen:
return {
- "error": f"'{name}' gibt es dort schon. Anderen Namen waehlen oder "
- "'Vorhandene ersetzen' ankreuzen."
+ "error": f"In '{ziel_mount.label}' gibt es '{name}' schon. Anderen "
+ "Namen waehlen oder 'Vorhandene ersetzen' ankreuzen."
}, 409
else:
# Ohne Angabe wie bisher: neben das Original, ohne etwas zu ueberschreiben.
diff --git a/apps/tesm/src/tesm/templates/tesm/fileshare.html b/apps/tesm/src/tesm/templates/tesm/fileshare.html
index 621b7c7..b23ea57 100644
--- a/apps/tesm/src/tesm/templates/tesm/fileshare.html
+++ b/apps/tesm/src/tesm/templates/tesm/fileshare.html
@@ -313,12 +313,23 @@
-
-
-
+ {# Haken über den Knöpfen und beides rechts: gelesen wird die Zeile von
+ links nach rechts (wohin, wie es heißt, wie gespeichert), und die
+ Entscheidung steht am Ende. #}
+
+
+
+
+
+
+
{% endif %}
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/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"]