From 4fa4c152a5d1f40773f27b402103a44dcf4459b3 Mon Sep 17 00:00:00 2001 From: Marcus van Elst Date: Tue, 28 Apr 2026 06:56:00 +0200 Subject: [PATCH] =?UTF-8?q?Fix=20#24:=20Provider-Bereich=20kompakter=20?= =?UTF-8?q?=E2=80=93=20VBox-Spacing=20auf=202px,=20unteres=20Padding=20auf?= =?UTF-8?q?=204px?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fix_builddetail.py | 101 ++++++++++++++++++ fix_tests.py | 31 ++++++ .../gui/GuiConfigurationEditorWorkspace.java | 6 +- 3 files changed, 135 insertions(+), 3 deletions(-) create mode 100644 fix_builddetail.py create mode 100644 fix_tests.py diff --git a/fix_builddetail.py b/fix_builddetail.py new file mode 100644 index 0000000..e1462b5 --- /dev/null +++ b/fix_builddetail.py @@ -0,0 +1,101 @@ +with open(r'D:\Dev\Projects\pdf-umbenenner-parent\pdf-umbenenner-adapter-in-gui\src\main\java\de\gecheckt\pdf\umbenenner\adapter\in\gui\batchrun\GuiBatchRunTab.java', 'rb') as f: + content = f.read() + +normalized = content.replace(b'\r\n', b'\n') + +old = ( + b' private static String buildDetailText(GuiBatchRunResultRow row) {\n' + b' StringBuilder builder = new StringBuilder();\n' + b' builder.append("Originaldateiname: ").append(row.originalFileName()).append(\'\\n\');\n' + b' if (row.resetPending()) {\n' + b' builder.append(\'\\n\').append(GuiBatchRunResultRow.RESET_PENDING_LABEL);\n' + b' return builder.toString();\n' + b' }\n' + b' row.effectiveFileName()\n' + b' .ifPresent(name -> builder.append("Neuer Dateiname: ").append(name).append(\'\\n\'));\n' + b' row.resolvedDate()\n' + b' .ifPresent(date -> builder.append("Datum: ")\n' + b' .append(DateTimeFormatter.ISO_LOCAL_DATE.format(date)).append(\'\\n\'));\n' + b' builder.append(\'\\n\');\n' + b' row.aiReasoning().ifPresentOrElse(\n' + b' reasoning -> builder.append(reasoning),\n' + b' () -> {\n' + b' row.aiFailureMessage().ifPresent(msg ->\n' + b' builder.append("\\u26A0 Fehler: ")\n' + b' .append(AiFailureMessageTranslator.translate(msg))\n' + b' .append("\\n\\n"));\n' + b' builder.append(NO_REASONING_TEXT);\n' + b' });\n' + b' return builder.toString();\n' + b' }' +) + +new = ( + b' private static final DateTimeFormatter DETAIL_DATE_FORMAT =\n' + b' DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm", Locale.GERMANY);\n' + b'\n' + b' private static String buildDetailText(GuiBatchRunResultRow row) {\n' + b' StringBuilder builder = new StringBuilder();\n' + b' builder.append("Originaldateiname: ").append(row.originalFileName()).append(\'\\n\');\n' + b' if (row.resetPending()) {\n' + b' builder.append(\'\\n\').append(GuiBatchRunResultRow.RESET_PENDING_LABEL);\n' + b' return builder.toString();\n' + b' }\n' + b' if (row.status() == DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED) {\n' + b' builder.append(\'\\n\');\n' + b' row.historicalContext().ifPresentOrElse(ctx -> {\n' + b' ctx.lastSuccessInstant().ifPresentOrElse(\n' + b' instant -> builder.append("Bereits erfolgreich verarbeitet am ")\n' + b' .append(DETAIL_DATE_FORMAT.format(\n' + b' instant.atZone(ZoneId.systemDefault())))\n' + b' .append(\'.\'),\n' + b' () -> builder.append("Bereits erfolgreich verarbeitet."));\n' + b' ctx.lastTargetFileName().ifPresent(name ->\n' + b' builder.append(\'\\n\').append("Zieldatei: ").append(name).append(\'.\'));\n' + b' }, () -> builder.append("Bereits erfolgreich verarbeitet."));\n' + b' return builder.toString();\n' + b' }\n' + b' if (row.status() == DocumentCompletionStatus.SKIPPED_FINAL_FAILURE) {\n' + b' builder.append(\'\\n\');\n' + b' row.historicalContext().ifPresentOrElse(ctx ->\n' + b' ctx.lastFailureInstant().ifPresentOrElse(\n' + b' instant -> builder.append("Endg\\u00fcltig fehlgeschlagen am ")\n' + b' .append(DETAIL_DATE_FORMAT.format(\n' + b' instant.atZone(ZoneId.systemDefault())))\n' + b' .append(". Erneute Verarbeitung nur nach Reset m\\u00f6glich."),\n' + b' () -> builder.append(\n' + b' "Endg\\u00fcltig fehlgeschlagen. Erneute Verarbeitung nur nach Reset m\\u00f6glich.")),\n' + b' () -> builder.append(\n' + b' "Endg\\u00fcltig fehlgeschlagen. Erneute Verarbeitung nur nach Reset m\\u00f6glich."));\n' + b' return builder.toString();\n' + b' }\n' + b' row.effectiveFileName()\n' + b' .ifPresent(name -> builder.append("Neuer Dateiname: ").append(name).append(\'\\n\'));\n' + b' row.resolvedDate()\n' + b' .ifPresent(date -> builder.append("Datum: ")\n' + b' .append(DateTimeFormatter.ISO_LOCAL_DATE.format(date)).append(\'\\n\'));\n' + b' builder.append(\'\\n\');\n' + b' row.aiReasoning().ifPresentOrElse(\n' + b' reasoning -> builder.append(reasoning),\n' + b' () -> {\n' + b' row.aiFailureMessage().ifPresent(msg ->\n' + b' builder.append("\\u26A0 Fehler: ")\n' + b' .append(AiFailureMessageTranslator.translate(msg))\n' + b' .append("\\n\\n"));\n' + b' builder.append(NO_REASONING_TEXT);\n' + b' });\n' + b' return builder.toString();\n' + b' }' +) + +if old in normalized: + result = normalized.replace(old, new) + result = result.replace(b'\n', b'\r\n') + with open(r'D:\Dev\Projects\pdf-umbenenner-parent\pdf-umbenenner-adapter-in-gui\src\main\java\de\gecheckt\pdf\umbenenner\adapter\in\gui\batchrun\GuiBatchRunTab.java', 'wb') as f: + f.write(result) + print('SUCCESS') +else: + print('NOT FOUND') + for i, line in enumerate(old.split(b'\n')): + if line and line not in normalized: + print(f'Missing line {i}: {repr(line)}') diff --git a/fix_tests.py b/fix_tests.py new file mode 100644 index 0000000..1d2cb08 --- /dev/null +++ b/fix_tests.py @@ -0,0 +1,31 @@ +base = r'D:\Dev\Projects\pdf-umbenenner-parent' + +files_to_fix = [ + rf'{base}\pdf-umbenenner-application\src\test\java\de\gecheckt\pdf\umbenenner\application\usecase\BatchRunProgressObservationTest.java', + rf'{base}\pdf-umbenenner-adapter-in-gui\src\test\java\de\gecheckt\pdf\umbenenner\adapter\in\gui\batchrun\GuiBatchRunCoordinatorTest.java', + rf'{base}\pdf-umbenenner-adapter-in-gui\src\test\java\de\gecheckt\pdf\umbenenner\adapter\in\gui\batchrun\GuiBatchRunTabSmokeTest.java', + rf'{base}\pdf-umbenenner-adapter-in-gui\src\test\java\de\gecheckt\pdf\umbenenner\adapter\in\gui\batchrun\GuiBatchRunTabSelectionSmokeTest.java', +] + +for path in files_to_fix: + with open(path, 'rb') as f: + content = f.read() + normalized = content.replace(b'\r\n', b'\n') + + # Replace SKIPPED that is NOT already followed by _ALREADY or _FINAL + import re + new_content = re.sub( + b'DocumentCompletionStatus\\.SKIPPED(?!_)', + b'DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED', + normalized + ) + # Also fix the string "row:SKIPPED:" in coordinator test + new_content = new_content.replace(b'"row:SKIPPED:', b'"row:SKIPPED_ALREADY_PROCESSED:') + + if new_content != normalized: + result = new_content.replace(b'\n', b'\r\n') + with open(path, 'wb') as f: + f.write(result) + print(f'FIXED: {path.split(chr(92))[-1]}') + else: + print(f'NO CHANGE: {path.split(chr(92))[-1]}') diff --git a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java index becaa60..04cbab5 100644 --- a/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java +++ b/pdf-umbenenner-adapter-in-gui/src/main/java/de/gecheckt/pdf/umbenenner/adapter/in/gui/GuiConfigurationEditorWorkspace.java @@ -1646,10 +1646,10 @@ public final class GuiConfigurationEditorWorkspace { private VBox createProviderBlock(String displayName, AiProviderFamily family) { String ns = "ai.provider." + family.getIdentifier() + "."; - // Abstände entsprechen dem Pfade-Bereich: VBox-Spacing 4, Padding 8px - VBox block = new VBox(4); + // Kompaktere Provider-Box: VBox-Spacing 2 für engere Feldabstände, unteres Padding 4px + VBox block = new VBox(2); block.setStyle( - "-fx-padding: 8px; -fx-border-color: #c8c8c8; -fx-border-radius: 6px;" + "-fx-padding: 8px 8px 4px 8px; -fx-border-color: #c8c8c8; -fx-border-radius: 6px;" + " -fx-background-radius: 6px; -fx-background-color: #f9f9f9;"); Label title = new Label(displayName);