Fix #24: Provider-Bereich kompakter – VBox-Spacing auf 2px, unteres Padding auf 4px

This commit is contained in:
2026-04-28 06:56:00 +02:00
parent ec23b2455a
commit 4fa4c152a5
3 changed files with 135 additions and 3 deletions
+101
View File
@@ -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)}')
+31
View File
@@ -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]}')
@@ -1646,10 +1646,10 @@ public final class GuiConfigurationEditorWorkspace {
private VBox createProviderBlock(String displayName, AiProviderFamily family) { private VBox createProviderBlock(String displayName, AiProviderFamily family) {
String ns = "ai.provider." + family.getIdentifier() + "."; String ns = "ai.provider." + family.getIdentifier() + ".";
// Abstände entsprechen dem Pfade-Bereich: VBox-Spacing 4, Padding 8px // Kompaktere Provider-Box: VBox-Spacing 2 für engere Feldabstände, unteres Padding 4px
VBox block = new VBox(4); VBox block = new VBox(2);
block.setStyle( 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;"); + " -fx-background-radius: 6px; -fx-background-color: #f9f9f9;");
Label title = new Label(displayName); Label title = new Label(displayName);