Compare commits

...
2 Commits
6 changed files with 50 additions and 10 deletions

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "tesm" name = "tesm"
version = "2.7.5" version = "2.7.7"
description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen" description = "TESM -- Verwaltung und Ueberwachung von PoE-Endgeraeten und Aruba-Switchen"
requires-python = ">=3.11" requires-python = ">=3.11"
dependencies = [ dependencies = [
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "tesm-core" name = "tesm-core"
version = "2.7.5" version = "2.7.7"
description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver" description = "Gemeinsames Anwendungsgeruest (Auth, RBAC, Navigation, Design-System, Migrationen) fuer TESM und TESM-Lizenzserver"
requires-python = ">=3.11" requires-python = ">=3.11"
dependencies = [ dependencies = [
@@ -148,7 +148,7 @@ def create_base_app(
#: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide #: Wortmarke, ohne Zeile darunter; die Marke selbst zeigen beide
#: Anwendungen. #: Anwendungen.
auth_tagline: str = "", auth_tagline: str = "",
app_version: str = "2.7.5", app_version: str = "2.7.7",
built_in_trusted_keys: tuple[str, ...] = (), built_in_trusted_keys: tuple[str, ...] = (),
enable_license: bool = True, enable_license: bool = True,
template_folder: str | None = None, template_folder: str | None = None,
@@ -1461,7 +1461,6 @@
z-index: 3; z-index: 3;
cursor: grab; cursor: grab;
touch-action: none; touch-action: none;
container-type: inline-size;
border: 1px dashed transparent; border: 1px dashed transparent;
} }
@@ -1483,7 +1482,14 @@
wie im PDF. Waere er so breit wie der Block, zeigte die Vorschau etwas wie im PDF. Waere er so breit wie der Block, zeigte die Vorschau etwas
anderes als die Datei. */ anderes als die Datei. */
.viewer__unterschrifttext { .viewer__unterschrifttext {
font-size: 5.6cqw; /* Helvetica: dieselbe Schrift, die das PDF benutzt (StandardFonts.Helvetica).
Mit der Hausschrift sah die Vorschau anders aus als das Ergebnis. Die
Groesse setzt das Skript je Unterschrift -- hier steht nur ein Rueckfall. */
font-family: Helvetica, Arial, sans-serif;
/* Die tatsaechliche Groesse setzt das Skript in Pixeln (Punkte mal
Pixel-je-Punkt der Seite). Dieser Wert gilt nur, solange sie noch nicht
gerechnet wurde -- geerbt wuerde sonst die Schriftgroesse der Seite. */
font-size: 8px;
line-height: 1.15; line-height: 1.15;
color: #111; color: #111;
border-top: 1px solid rgba(0, 0, 0, 0.85); border-top: 1px solid rgba(0, 0, 0, 0.85);
@@ -346,8 +346,8 @@ async function nachbearbeiten(
* *
* Ein Achtzehntel: bei den 150 Punkt der vollen Breite sind das gut acht * Ein Achtzehntel: bei den 150 Punkt der vollen Breite sind das gut acht
* Punkt -- die uebliche Groesse einer Unterschriftszeile auf Papier. Dieselbe * Punkt -- die uebliche Groesse einer Unterschriftszeile auf Papier. Dieselbe
* Rechnung benutzt die Vorschau (als ``cqw``), damit auf dem Schirm steht, * Rechnung benutzt die Vorschau -- in Pixeln umgerechnet --, damit auf dem
* was spaeter im PDF steht. * Schirm steht, was spaeter im PDF steht.
*/ */
function schriftgroesse(breite) { function schriftgroesse(breite) {
return Math.max(5, Math.min(10, breite / 18)); return Math.max(5, Math.min(10, breite / 18));
@@ -637,6 +637,8 @@ async function pdfBetrachter(behaelter, seiten, url, basis, { formulare = true }
const MAX_BREITE = 150; const MAX_BREITE = 150;
const MAX_HOEHE = 50; const MAX_HOEHE = 50;
const unterschriften = []; const unterschriften = [];
//: Je gesetzte Unterschrift eine Funktion, die ihre Marke neu vermisst.
const neuzeichnen = new Set();
let wartendeUnterschrift = null; let wartendeUnterschrift = null;
let zeugenzeile = () => ""; let zeugenzeile = () => "";
@@ -684,11 +686,20 @@ async function pdfBetrachter(behaelter, seiten, url, basis, { formulare = true }
const bild = document.createElement("img"); const bild = document.createElement("img");
bild.src = eintrag.vorschau; bild.src = eintrag.vorschau;
bild.alt = ""; bild.alt = "";
// Genau der Aufbau der spaeteren Datei: eine Zeile mit Namen und
// Zeitpunkt, darunter -- als eigene Zeile -- der Zeugenvermerk. In der
// Vorschau standen beide hintereinander, getrennt durch einen
// Schraegstrich; beim Positionieren sah der Block dadurch breiter und
// flacher aus als das Ergebnis.
const text = document.createElement("div"); const text = document.createElement("div");
text.className = "viewer__unterschrifttext"; text.className = "viewer__unterschrifttext";
text.textContent = `${eintrag.name} | ${eintrag.zeit}`; const namenszeile = document.createElement("div");
namenszeile.textContent = `${eintrag.name} | ${eintrag.zeit}`;
text.append(namenszeile);
if (zeuge && eintrag === unterschriften[0]) { if (zeuge && eintrag === unterschriften[0]) {
text.textContent += ` / In TESM abgelegt durch ${zeuge}`; const zeugenzeile = document.createElement("div");
zeugenzeile.textContent = `In TESM abgelegt durch ${zeuge}`;
text.append(zeugenzeile);
} }
const griff = document.createElement("button"); const griff = document.createElement("button");
griff.type = "button"; griff.type = "button";
@@ -708,13 +719,24 @@ async function pdfBetrachter(behaelter, seiten, url, basis, { formulare = true }
marke.style.left = `${(eintrag.x / blick.width) * 100}%`; marke.style.left = `${(eintrag.x / blick.width) * 100}%`;
marke.style.bottom = `${(eintrag.y / blick.height) * 100}%`; marke.style.bottom = `${(eintrag.y / blick.height) * 100}%`;
marke.style.width = `${(eintrag.breite / blick.width) * 100}%`; marke.style.width = `${(eintrag.breite / blick.width) * 100}%`;
// Die Schriftgroesse wird gerechnet, nicht vom Stylesheet abgeleitet:
// Punkte mal Pixel-je-Punkt der gerade dargestellten Seite. Ueber
// Container-Einheiten ("cqw") ging das auch -- aber nur dort, wo der
// Browser sie kennt; wo nicht, erbte der Block die Schriftgroesse der
// Seite, und der Text war um die Haelfte zu breit. Genau das war der
// Unterschied zwischen Vorschau und Datei.
const proPunkt = seitenEl.getBoundingClientRect().width / blick.width;
text.style.fontSize = `${schriftgroesse(eintrag.breite) * proPunkt}px`;
}; };
// Beim Zoomen aendert sich Pixel-je-Punkt -- dann neu rechnen.
neuzeichnen.add(zeichnen);
zeichnen(); zeichnen();
weg.addEventListener("click", (event) => { weg.addEventListener("click", (event) => {
event.stopPropagation(); event.stopPropagation();
const stelle = unterschriften.indexOf(eintrag); const stelle = unterschriften.indexOf(eintrag);
if (stelle >= 0) unterschriften.splice(stelle, 1); if (stelle >= 0) unterschriften.splice(stelle, 1);
neuzeichnen.delete(zeichnen);
marke.remove(); marke.remove();
}); });
@@ -766,6 +788,18 @@ async function pdfBetrachter(behaelter, seiten, url, basis, { formulare = true }
platzieren(event).catch((fehler) => console.error("Unterschrift", fehler)); platzieren(event).catch((fehler) => console.error("Unterschrift", fehler));
}); });
// Nach dem Zoomen stehen die Marken anteilig richtig, aber die Schrift
// haengt an der Pixelgroesse der Seite -- die ist jetzt eine andere.
eventBus.on("scalechanging", () => {
for (const zeichnen of neuzeichnen) {
try {
zeichnen();
} catch (fehler) {
console.error("Unterschrift neu vermessen", fehler);
}
}
});
return { return {
hinein: () => { hinein: () => {
viewer.currentScale = Math.min(MAX_ZOOM, viewer.currentScale * 1.2); viewer.currentScale = Math.min(MAX_ZOOM, viewer.currentScale * 1.2);
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
[project] [project]
name = "tesm-licensing" name = "tesm-licensing"
version = "2.7.5" version = "2.7.7"
description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver" description = "Ed25519-basiertes Lizenz- und Aktivierungsprotokoll fuer TESM und TESM-Lizenzserver"
requires-python = ">=3.11" requires-python = ">=3.11"
dependencies = ["cryptography>=42"] dependencies = ["cryptography>=42"]