From 6ebc178ba926aa9bd66ff5ede6aab88180eaa0e6 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 11 Aug 2026 23:05:30 +0000 Subject: [PATCH 1/2] feat(home): echtes DatenGraf-Logo in der Bruecke (v69) v68 musste sich mit fa-circle-nodes behelfen, weil die Netzwerkrichtlinie datengraf.nozilla.net sperrt und der Repo-Zugriff dieser Sitzung nicht ueber daimpad/datenlotse hinausreicht. Die Rohdatei-Adresse wurde nachgereicht. Das Logo liegt als datengraf-logo.svg im Repo und wird lokal ausgeliefert - ein Hotlink waere ein zweiter externer Aufruf und machte den Test "null externe Requests" rot. Vor dem Uebernehmen geprueft: kein + ``` ### Externe Aufrufe @@ -66,7 +66,7 @@ Die App hat keinen Build-Schritt – getestet wird **die ausgelieferte App**, al ```bash npm install # nur Dev: @playwright/test (exakt gepinnt) npx playwright install chromium # einmalig -npm test # 379 Tests, ~150 s +npm test # 380 Tests, ~150 s npm run test:ui # interaktiver Modus ``` @@ -516,6 +516,8 @@ Eigener Startseiten-Abschnitt **unterhalb der Modul-Karten** (`.graf-bridge`/`.g Der Abschnitt erklärt jetzt auch, **was** die Brücke leistet (`GRAF_COLUMNS` 1:1, Vorbelegung von `accessRights` und `accrualPeriodicity` aus der Kartierung, nachzuerfassen bleiben Lizenz, Schlagwörter und Adresse) und bietet zwei Wege: `#graf-bridge-import` → **direkt** `pickAndImport()` (nicht über `openInventoryModal()` – wer kartiert hat, braucht das Erklär-Modal nicht mehr) und einen Verweis auf DatenGraf für alle, die noch nicht kartiert haben. +**Das Zeichen ist seit v69 das echte DatenGraf-Logo** (`datengraf-logo.svg`, lokal im Repo – die beiden Werkzeuge teilen ihre Bildsprache, und das Logo sagt sofort, wovon die Rede ist). Runde Fassung wie `.hero-logo`, damit die beiden als Geschwister lesbar bleiben. Die Datei stammt aus dem DatenGraf-Repo und wird **lokal ausgeliefert** – ein Hotlink auf `datengraf.nozilla.net` wäre ein zweiter externer Aufruf und würde den Test „null externe Requests" rot machen. Ein Test prüft Quelle, Alt-Text und dass das Bild wirklich lädt (`naturalWidth > 0`); ein ``, das 404 liefert, sähe im Markup korrekt aus. + ### Hero je Ansicht (`.view-hero`, `.hero-panel`) Jede Unterseite trägt ihren Kopf in einem eigenen weißen Container; die Startseite ebenso (`.hero-panel`). Vorher folgten Badge, Titel, Untertitel, Aktionsbutton und Einleitungstext ohne Abstand auf die Topbar – fünf Bausteine in fünf Formaten direkt untereinander. @@ -697,6 +699,7 @@ Nach Änderungen an `app.js` `?v=N` im Script-Tag **und** die `v{N}` im Footer e | v16 | Daten-Kompass (Herzstück) – eigene View + Hero-Haupt-CTA (Topbar-„Loslegen" zeigt ebenfalls darauf): ausführliche Open-Data-Reifegrad-Checkliste nach ODRA / EU Open Data Maturity / 5-Sterne / DCAT-AP.de / DSGVO·FAIR (7 Dimensionen, Quellenangaben), Status je Item mit Score & Ampel, Vorbelegung aus dem App-Stand, adaptive Sprünge in die passenden Bausteine, Persistenz (`datenlotse_kompass`) und PDF-Export; leeres „Loslegen"-Platzhalter-Modal entfernt | | v17 | Weiterer Ausbau (1/4) – Inventar Suche, Filter & Sortierung: `renderInventory()` in `renderInventory()` + `renderInventoryBody()` aufgeteilt; `.inv-controls` (Volltextsuche + Schutzbedarf-/Clearing-Ampel-Filter + Sortierung Titel/Vollständigkeit) über `invFilter`-State und `filteredInventory()`; der echte `idx` wird durch den Filter mitgeführt, sodass Editieren über gefilterten Teilmengen weiterhin den richtigen Datensatz trifft; Live-Meta „X von Y" + Empty-State | | v18 | Weiterer Ausbau (2/4) – Pseudonymisierung erweitert: drei neue Muster (Sozialversicherungsnummer, Steuer-ID *kontextgetriggert*, Kfz-Kennzeichen), Aktenzeichen um Geschäftszeichen/„Gz." und buchstabenhaltige Kerne erweitert, zusätzliche Geburtsdatum-Trigger („Geburtsdatum"/„Geburtstag"); Mapping-Export als CSV (`buildPseudoMappingCSV` + Button im Mapping-Kopf); Demo-Text und Grenzen-Liste aktualisiert; verifiziert auf Determinismus, Platzhalter-Konsistenz und Null-Falschtreffer auf neutralem Verwaltungstext | +| v69 | **Das echte DatenGraf-Logo.** v68 musste sich mit `fa-circle-nodes` behelfen, weil die Netzwerkrichtlinie `datengraf.nozilla.net` sperrt und der Repo-Zugriff dieser Sitzung nicht über `daimpad/datenlotse` hinausreicht. Der Nutzer hat die Rohdatei-Adresse nachgereicht; das Logo liegt jetzt als `datengraf-logo.svg` **im Repo** und wird lokal ausgeliefert – ein Hotlink wäre ein zweiter externer Aufruf und machte den Test „null externe Requests" rot. Vor dem Übernehmen geprüft: kein ` - + diff --git a/index.html b/index.html index 2c9086f..03e0de1 100644 --- a/index.html +++ b/index.html @@ -125,10 +125,10 @@ - + - - + + @@ -325,7 +325,7 @@

Risiko & Pseudonymisierung

der Stelle, an der sie die Module ohnehin überflogen haben. -->
-
+ DatenGraf

Schon mit DatenGraf kartiert?

Dann brauchen Sie hier nicht von vorn anzufangen. DatenLotse liest genau das CSV-Schema, das DatenGraf exportiert: Aus jeder Kombination aus Quelle und Datentyp wird ein Datensatz-Kandidat nach DCAT-AP.de – samt Vorbelegung von Zugriffsrechten und Aktualisierungszyklus aus Ihrer Kartierung. Sie ergänzen nur noch, was DatenGraf nicht kennt: Lizenz, Schlagwörter und die Adresse, unter der die Daten liegen.

@@ -915,7 +915,7 @@

Umsetzung besprechen

Brands-Familie und hätte dafür 116 KB Schrift nachgeladen. --> - v68 + v69 @@ -1131,7 +1131,7 @@

Lizenz-Wegweiser

- +
- DatenGraf + DatenGraf

Schon mit DatenGraf kartiert?

Dann brauchen Sie hier nicht von vorn anzufangen. DatenLotse liest genau das CSV-Schema, das DatenGraf exportiert: Aus jeder Kombination aus Quelle und Datentyp wird ein Datensatz-Kandidat nach DCAT-AP.de – samt Vorbelegung von Zugriffsrechten und Aktualisierungszyklus aus Ihrer Kartierung. Sie ergänzen nur noch, was DatenGraf nicht kennt: Lizenz, Schlagwörter und die Adresse, unter der die Daten liegen.

diff --git a/tests/assets.spec.js b/tests/assets.spec.js index f7da4fd..f390960 100644 --- a/tests/assets.spec.js +++ b/tests/assets.spec.js @@ -12,6 +12,7 @@ * reale Fehlerfall – ein neues Icon im Markup, ohne `npm run icons`. */ const { test, expect } = require('@playwright/test'); +const { ZAEHLUNG_HOSTS } = require('./helpers'); const fs = require('fs'); const path = require('path'); @@ -127,6 +128,16 @@ test.describe('Ladegewicht', () => { let bytes = 0; page.on('response', async res => { try { + /* Der Zähl-Aufruf zählt nicht mit – gemessen wird, was DatenLotse + selbst ausliefert. Regression v69: er hing daran, ob die Umgebung + `gc.zgo.at` erreicht. In der CI ging er durch und brachte rund 9 KB + mit, im Entwicklungscontainer sperrt die Netzwerkrichtlinie ihn – + derselbe Commit maß zwei verschiedene Zahlen, das Urteil hing am Netz + statt am Repo. Gefiltert wird beim Zählen, NICHT über `page.route()`: + ein Interceptor umgeht den Speicher-Cache und zieht dann Dateien ein + zweites Mal über die Leitung. Dass es genau einen fremden Aufruf gibt, + hält `tests/smoke.spec.js` fest. */ + if (ZAEHLUNG_HOSTS.includes(new URL(res.url()).hostname)) return; const len = res.headers()['content-length']; bytes += len ? Number(len) : (await res.body()).length; } catch { /* abgebrochene Antworten zählen nicht */ } diff --git a/tests/smoke.spec.js b/tests/smoke.spec.js index 7c41bac..065e368 100644 --- a/tests/smoke.spec.js +++ b/tests/smoke.spec.js @@ -85,6 +85,9 @@ test.describe('Grundgerüst & Navigation', () => { test('die DatenGraf-Brücke trägt das echte Logo, lokal ausgeliefert', async ({ page }) => { await openApp(page); const logo = page.locator('img.graf-bridge-icon'); + // `loading="lazy"`: der Abschnitt steht weit unter dem Falz, das Bild wird + // beim ersten Laden bewusst nicht mitgeholt (siehe Ladegewicht-Budget). + await logo.scrollIntoViewIfNeeded(); await expect(logo).toBeVisible(); const bild = await logo.evaluate(el => ({ quelle: el.getAttribute('src'),