Skip to content

feat: Usability-Test — Gliederung, Verständlichkeit, Datei-Upload (v2.35.8) - #98

Merged
daimpad merged 2 commits into
mainfrom
claude/fix-data-prep-errors-kJYpl
Aug 7, 2026
Merged

feat: Usability-Test — Gliederung, Verständlichkeit, Datei-Upload (v2.35.8)#98
daimpad merged 2 commits into
mainfrom
claude/fix-data-prep-errors-kJYpl

Conversation

@daimpad

@daimpad daimpad commented Aug 7, 2026

Copy link
Copy Markdown
Owner

Setzt die vier Punkte um, die aus dem Usability-Test noch offen waren.

Tab-Zuschnitt nach inhaltlicher Zusammengehörigkeit

Schlagworte stehen jetzt in Tab 1 bei Thema, CESSDA-Klassifikation und Engagementfeld — alle vier beschreiben, worum es geht. Bei Sprache und Datumsangaben waren sie fehl am Platz. Sie bleiben oberhalb der aufklappbaren Untergruppe sichtbar; an ihnen hängen 30 MQA-Punkte, sie gehören nicht ins Optionale.

Die Erstveröffentlichung ist nach Tab 4 zur Aktualisierungsfrequenz gewandert — beide beschreiben die Aktualität des Datensatzes.

Tab 2 heißt „Sprache & Übersetzungen" und trägt jetzt sämtliche Übersetzungs-Repeater. Titel- und Beschreibungsübersetzungen standen vorher in Tab 1, die Schlagwortübersetzungen in Tab 2 — getrennt von ihresgleichen.

Zugriffsrechte vorbelegt

Neue Datensätze starten mit „Öffentlich" — sichtbar im Formular, jederzeit änderbar. Für ein Open-Data-Plugin ist das der Normalfall.

Bewusst kein Automatismus aus dem Beitragsstatus, obwohl der Tester das vorschlug: Das würde Metadaten im Hintergrund schreiben und nebenbei 20 MQA-Punkte vergeben — dasselbe Muster, das in v2.35.5 als Ursache des unerklärlichen Startwerts von 2 % behoben wurde.

HVD-Felder nennen ihre Geltung

High-Value-Datensätze sind eine Rechtskategorie der EU-Durchführungsverordnung 2023/138 und richten sich an öffentliche Stellen. Beschriftung und Hilfetext sagen das jetzt ausdrücklich, damit Vereine und Verbände die Felder überspringen können, ohne zu rätseln. Für Kommunen — ebenfalls Zielgruppe und öffentliche Stellen — bleiben sie unverändert nutzbar.

CESSDA-Feld war zu schmal

Das Eingabefeld war rund ein Fünftel so breit wie alle anderen und schnitt seinen Platzhalter ab. Ursache: Das Widget wird als Geschwister neben das ausgeblendete Carbon-Fields-Feld gesetzt und steht damit außerhalb von .cf-field. Dessen Breitenregeln greifen dort nicht, und der Browser fiel auf die Standardbreite eines Textfelds zurück (size=20, ~250 px). Die neue Selektorkette setzt die Breite unabhängig davon.

Mitgezogen

Feld-Katalog (Tab-Zuordnung, Reihenfolge, sowie die Engagementfeld-Frage, die noch die in v2.35.5 korrigierte alte Formulierung trug), Validierungs-Tabname, Einstiegsseite, E2E-Spec, README, CLAUDE.md, docs/FELD-REFERENZ.md neu generiert.

Neu: bin/check-i18n.py — vergleicht alle übersetzbaren Zeichenketten des Quellcodes gegen den Katalog und meldet Lücken mit Exit-Code 1. Bei elf umformulierten Zeichenketten in einem Durchgang ist Nachhalten von Hand unzuverlässig; das Skript hat prompt zwei Stellen gefunden, die ich übersehen hatte.

Zur Prüfung

Der lokale Composer-Toolchain ist weiterhin nicht herstellbar (der Proxy blockt api.github.com und codeload.github.com, dort holt Composer jede Dist-Datei). Lokal verifiziert wurden:

  • php -l über alle geänderten PHP-Dateien, node --check für JS
  • Die Logik von test_catalog_covers_all_form_fields nachgestellt — beide Richtungen leer
  • docs/FELD-REFERENZ.md deckungsgleich mit dem Generator (erneuter Lauf erzeugt keine Änderung)
  • bin/check-i18n.py meldet 0 fehlende Übersetzungen; .mo per gettext geprüft

PHPUnit, PHPCS und PHPStan laufen in der CI. Bei Rot bessere ich anhand des Logs nach.

Nicht in diesem PR

Der Umzug des Upload-Buttons aus der Seitenleiste ins Formular folgt separat. Er berührt wp.media, Nonce und Speicherpfad einer Kernfunktion, und ob die Skript-Bindung ein React-gerendertes Feld übersteht, lässt sich nur in einer laufenden Instanz feststellen — als eigener PR ist ein Fehler dort isoliert und leicht rückgängig zu machen.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq


Generated by Claude Code

claude added 2 commits August 7, 2026 11:27
…v2.35.7)

Tab-Zuschnitt nach inhaltlicher Zusammengehörigkeit:
- Schlagworte stehen jetzt in Tab 1 bei Thema, CESSDA-Klassifikation und
  Engagementfeld. Alle vier beschreiben, worum es geht; bei Sprache und
  Datumsangaben waren sie fehl am Platz. Sie bleiben oberhalb der
  aufklappbaren Untergruppe sichtbar — an ihnen hängen 30 MQA-Punkte.
- Die Erstveröffentlichung ist nach Tab 4 zur Aktualisierungsfrequenz
  gewandert; beide beschreiben die Aktualität des Datensatzes.
- Tab 2 heißt "Sprache & Übersetzungen" und trägt sämtliche
  Übersetzungs-Repeater, die vorher auf zwei Tabs verteilt waren.

Zugriffsrechte mit "Öffentlich" vorbelegt — sichtbar im Formular und
änderbar. Bewusst kein Automatismus aus dem Beitragsstatus: Metadaten
sollen nicht im Hintergrund entstehen.

HVD-Felder nennen ihre Geltung. High-Value-Datensätze sind eine
Rechtskategorie der EU-Durchführungsverordnung 2023/138 für öffentliche
Stellen; Beschriftung und Hilfetext sagen das jetzt, damit Vereine und
Verbände sie überspringen können. Für Kommunen unverändert nutzbar.

CESSDA-Eingabefeld war viel zu schmal und schnitt seinen Platzhalter ab.
Das Widget steht als Geschwister neben dem ausgeblendeten .cf-field, also
außerhalb des Carbon-Fields-Kontexts — dessen Breitenregeln griffen nicht
und der Browser fiel auf size=20 zurück (~250 px).

Mitgezogen: Feld-Katalog (Tab-Zuordnung, Reihenfolge, korrigierte
Engagementfeld-Frage), Validierungs-Tabname, Einstiegsseite, E2E-Spec,
README, CLAUDE.md, docs/FELD-REFERENZ.md neu generiert.

i18n: 11 geänderte Zeichenketten, .mo neu kompiliert (628 Einträge).
Neu bin/check-i18n.py — vergleicht alle übersetzbaren Zeichenketten des
Quellcodes gegen den Katalog und meldet Lücken mit Exit-Code 1.

Verifiziert ohne lokalen Composer-Toolchain (Proxy blockt weiterhin
api.github.com): php -l über alle geänderten Dateien, node --check,
Katalog-Abdeckungslogik nachgestellt (beide Richtungen leer),
Feld-Referenz deckungsgleich mit dem Generator, check-i18n.py bei 0.

https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq
Der Upload stand als eigene Meta-Box in der Seitenleiste, während die
Zugriffs-URL in Tab 3 lag — zwei Orte für denselben Sachverhalt, die zu
widersprüchlichen Angaben einluden, ohne dass die Oberfläche den
Zusammenhang zeigte. Das Widget steht jetzt unmittelbar unter der
Zugriffs-URL, die Hilfetexte beider Felder verweisen aufeinander.

Umsetzung:
- render_file_meta_box() wird zu file_upload_html() und liefert Markup als
  String statt es auszugeben.
- Eingehängt als Carbon-Fields-html-Feld mit Callback. Html_Field::to_json()
  ruft den Callback erst beim Rendern auf, dort steht der Beitragskontext
  zur Verfügung — der Dateizustand kommt also weiterhin vom Server und
  hängt nicht daran, dass JavaScript ihn nachträgt.
- odw-file-upload.js nutzt delegierte Handler an document. Carbon Fields
  hängt Felder erst nach DOMContentLoaded ein und kann sie neu rendern;
  direkt gebundene Handler hätten ins Leere gegriffen.
- save_file_attachment() unverändert; bricht weiterhin ohne Nonce ab, eine
  bestehende Verknüpfung geht also auch dann nicht verloren, wenn das
  Widget einmal nicht rendert.

Verifiziert: php -l, node --check, Katalog-Abdeckung, check-i18n.py bei 0,
Feld-Referenz unverändert. Die Interaktion mit wp.media lässt sich nur in
einer laufenden Instanz prüfen — Auswahl, Speichern und Entfernen bitte
einmal manuell testen.

https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq
@daimpad daimpad changed the title feat: Zweite Runde Usability-Test — Gliederung und Verständlichkeit (v2.35.7) feat: Usability-Test — Gliederung, Verständlichkeit, Datei-Upload (v2.35.8) Aug 7, 2026

daimpad commented Aug 7, 2026

Copy link
Copy Markdown
Owner Author

Nachtrag: Datei-Upload ins Formular geholt (v2.35.8)

Der Upload-Umzug ist als eigener Commit (f554d41) hinzugekommen — nicht als separater PR, wie ursprünglich angekündigt. Grund ist banal: Diese Sitzung ist auf einen Branch festgelegt, ein zweiter PR hätte einen zweiten Branch gebraucht. Der Commit ist aber sauber isoliert und lässt sich einzeln zurücknehmen, falls beim Test etwas klemmt.

Was sich ändert

Der Upload stand als eigene Meta-Box in der Seitenleiste, die Zugriffs-URL in Tab 3 — zwei Orte für denselben Sachverhalt, ohne dass die Oberfläche den Zusammenhang zeigte. Das Widget steht jetzt unmittelbar unter der Zugriffs-URL, die Hilfetexte verweisen aufeinander.

Wie

  • render_file_meta_box()file_upload_html(), liefert Markup als String statt es auszugeben.
  • Eingehängt als Carbon-Fields-html-Feld mit Callback. Html_Field::to_json() ruft ihn erst beim Rendern des Containers auf — dort steht der Beitragskontext zur Verfügung, der Dateizustand kommt also weiterhin vom Server. Hätte ich die Zustandswiederherstellung JavaScript überlassen, wäre bei deaktiviertem oder fehlgeschlagenem JS beim Speichern eine bestehende Verknüpfung verloren gegangen.
  • odw-file-upload.js nutzt jetzt durchgehend delegierte Handler an document. Carbon Fields hängt seine Felder erst nach DOMContentLoaded ein und kann sie neu rendern; die bisherige direkte Bindung beim Laden hätte ins Leere gegriffen.
  • save_file_attachment() ist unverändert und bricht weiterhin ab, wenn die Nonce fehlt — sollte das Widget einmal nicht rendern, geht nichts verloren.

Was ich nicht prüfen konnte

Die Interaktion mit wp.media — Frame öffnen, Auswahl übernehmen, Entfernen — lässt sich nur in einer laufenden Instanz testen. Bitte einmal manuell durchspielen: Datei auswählen, speichern, Seite neu laden (bleibt die Verknüpfung?), dann entfernen und erneut speichern.

Ein Restrisiko bleibt benennbar: Sollte Carbon Fields das html-Feld nach einer Auswahl neu rendern, würde die Anzeige auf den serverseitigen Stand zurückspringen. Beobachtet habe ich das nicht, und die Sektion hat keine Conditional Logic, die ein Re-Rendering auslösen würde — falls es doch auftritt, ist es genau bei diesem Test zu sehen.


Generated by Claude Code

@daimpad
daimpad merged commit 6dc1f76 into main Aug 7, 2026
12 checks passed
@daimpad
daimpad deleted the claude/fix-data-prep-errors-kJYpl branch August 7, 2026 11:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants