Skip to content

Gemeinsames Codebook mit Studio als UI- und Ausgabereferenz - #239

Open
jurei733 wants to merge 10 commits into
masterfrom
shared-codebook
Open

jurei733 wants to merge 10 commits into
masterfrom
shared-codebook

Conversation

@jurei733

@jurei733 jurei733 commented Sep 28, 2026 •

Copy link
Copy Markdown
Collaborator

Studio und Kodierbox erzeugen ihre Codebooks künftig mit derselben Studio-basierten Oberfläche und demselben JSON-/DOCX-Generator. Die gewohnte Anordnung und Dokumentdarstellung bleiben die Referenz; die vereinbarten Filterkorrekturen und „IQB Codebook“ sind ausdrücklich dokumentiert.

Umsetzung

  • Drei Einstiegspunkte: codebook-models, codebook-generator, codebook-export. Generator mit ESM/CommonJS ohne Angular-Laufzeit; gemeinsame Regeltexte fest mit @iqb/responses 5.2.2.
  • Studio-Dialog mit Suche, Sortierung, Vorauswahl, Missingprofilen, Speichersperre und Gesamtauswahl einschließlich ausgeblendeter Suchtreffer. Gesperrte Aufgaben bleiben ausgeschlossen.
  • Nach Präzisierung in (Gemeinsame Codebook-Logik fuer manuelle Codes bereitstellen #176): Schulungsbedarf in beiden Anwendungen, Gruppenspalte nur in Studio; Kodierbox ergänzt ihren Jobdefinitionsfilter. Variablenbündel werden im Dialog nicht mehr angeboten, bestehende Host-API-Verträge bleiben erhalten.
  • Gemeinsame Regeln für manuelle/geschlossene und abgeleitete Variablen, gemischte Codes, HTML-/Bild-/Formelinstruktionen, Code/Missing 0, Scores, Itembeziehungen, leere Exporte und Schemafehler.
  • Direkte Listentexte und Klartext vor, zwischen und nach HTML-Absätzen bleiben im DOCX erhalten. Fünf neue Regressionstests prüfen Quellreihenfolge, Formatierung, verschachtelte Listen, Bilder/Formeln ohne Duplikate sowie vollständige Exporte über ESM/CommonJS.
  • Verschachtelte Textmarkierungen bleiben kombiniert erhalten; Leerzeichen zwischen Inline-Elementen gehen nicht verloren. Auswahl ist auch während des Ladens gesperrt; ungültig gewordene Auswahlen werden dem Host gemeldet. Checkbox-Beschriftungen erreichen die tatsächlichen Eingabefelder.
  • Keine Job-IDs, Queue-Aufrufe, Statusabfragen oder Downloads in der gemeinsamen Komponente. Allgemeine Lade-/Sperrzustände und Projektionsflächen besitzen keine Jobsemantik.

Verifiziert

Aktueller CI-Stand: 516 Angular-Tests, 6 Schemer-Tests und 31 Generator-Vertragstests bestanden; Build, Lint, Responsive- und Sicherheitsprüfungen grün. Lokal ebenfalls Build, 31 Generator-Vertragstests und Lint ohne Fehler. Die fünf neuen Regressionstests scheiterten mit dem bisherigen Renderer und bestehen mit der Korrektur. Der Studio-Referenzvergleich bleibt unverändert.

Der Studio-Referenzvergleich normalisiert ausschließlich Kennzeichnung und Datum und prüft Dokument-XML, Styles, Nummerierung, Einstellungen und Fußzeile. Rich Text einschließlich verschachtelter Markierungen ist zusätzlich abgesichert. Die gemeinsame gepackte UI wurde mit Playwright bei 1440 und 700 Pixeln in beiden Spaltenkonfigurationen geprüft: Schulungsfilter, JSON, Gesamtauswahl trotz Suche, gesperrte Aufgaben und Speichersperre; keine Browserfehler. Die mehrseitige LibreOffice-Sichtprüfung vom 28.09.2026 bleibt ergänzende Layoutevidenz.

Vor Freigabe

4.1.0 bleibt ein unveröffentlichter Release-Kandidat. Beide Host-PRs verwenden denselben eingecheckten Tarball. Die Browserprüfung betrifft die isolierte gemeinsame UI; die vollständige Systemabnahme in beiden laufenden Anwendungen mit realer Datenbank, Redis/Queue, Berechtigungen und Downloads ist weiterhin offen. Keine vollständigen Docker-Images gebaut, nichts veröffentlicht oder ausgerollt.

Nach gemeinsamer Abnahme Bibliothek veröffentlichen, beide Hosts auf dieselbe Registry-Version umstellen und koordiniert ausrollen. Fachliche Korrekturen und Integrationsvertrag: docs/shared-codebook.md.

Zusammengehörige PRs

@jurei733
jurei733 marked this pull request as ready for review September 29, 2026 06:44

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 853c733b54

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +442 to +445
if (tagName === 'strong' || tagName === 'b') {
if (element.children) {
element.children.forEach(child => {
if (child.type === 'text' && child.data) {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve text inside nested formatting marks

When an instruction combines formatting marks, as Tiptap can emit for bold-and-italic text such as <strong><em>Bewerten</em></strong>, this branch examines only direct text children and ignores the nested element, so the word disappears entirely from the generated DOCX. The same direct-child-only behavior exists for the other formatting branches; recurse through descendants while retaining the active formatting properties.

Useful? React with 👍 / 👎.

Comment on lines +399 to +403
if (node.type === 'text') {
if ('data' in node && node.data && node.data.trim()) {
children.push(
new TextRun({
text: node.data.replace(/\s+/g, ' '),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Retain standalone spaces between formatted runs

When adjacent formatted runs are separated by a whitespace-only text node, for example <strong>vor</strong> <em>nach</em>, the trim() condition discards that node and the exported DOCX renders vornach. This affects ordinary rich-text instructions whenever formatting starts or ends at a word boundary, so whitespace-only nodes between visible siblings need to contribute a normalized space.

Useful? React with 👍 / 👎.

Comment on lines +29 to +30
<mat-checkbox [checked]="selection.includes(unit.unitId)" [disabled]="unit.disabled || busy"
[attr.data-cy]="'workspace-select-unit-list-checkbox-' + unit.key" [attr.aria-label]="unit.key" (change)="toggle(unit)"></mat-checkbox>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Disable individual unit selection while loading

When the host sets loading while refreshing the unit list, the select-all control and export button are disabled but each row checkbox remains active, and toggle() also permits the change. A user can therefore emit selection changes against stale units; when the refreshed list arrives, ngOnChanges silently removes invalid IDs without emitting the corrected selection, leaving host state out of sync.

Useful? React with 👍 / 👎.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-09-29T06:47:14.801237Z 853c733 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

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.

1 participant