Fix #44: Differenzierte Icons fuer alle Verarbeitungsstatus

Die beiden SKIPPED-Statuswerte teilten sich bisher Icon und Farbe.
Jeder Status erhaelt jetzt ein eigenes Unicode-Icon und passende Farbe:
SUCCESS gruen, FAILED_RETRYABLE orange, FAILED_PERMANENT rot,
SKIPPED_ALREADY_PROCESSED blau (Naechster-Track), SKIPPED_FINAL_FAILURE
grau (Durchgestrichener Kreis).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-27 16:11:32 +02:00
parent f204ad1f1e
commit 191d398604
5 changed files with 22 additions and 13 deletions
@@ -205,11 +205,11 @@ public record GuiBatchRunResultRow(
return RESET_PENDING_ICON; return RESET_PENDING_ICON;
} }
return switch (status) { return switch (status) {
case SUCCESS -> "\u2714"; // ✔ HEAVY CHECK MARK case SUCCESS -> "\u2714"; // ✔ HEAVY CHECK MARK
case FAILED_RETRYABLE -> "\u26A0"; // ⚠ WARNING SIGN case FAILED_RETRYABLE -> "\u26A0"; // ⚠ WARNING SIGN
case FAILED_PERMANENT -> "\u2718"; // ✘ HEAVY BALLOT X case FAILED_PERMANENT -> "\u2718"; // ✘ HEAVY BALLOT X
case SKIPPED_ALREADY_PROCESSED, case SKIPPED_ALREADY_PROCESSED -> "\u23ED"; // ⏭ NEXT TRACK BUTTON
SKIPPED_FINAL_FAILURE -> "\u25BA"; // ► BLACK RIGHT-POINTING POINTER case SKIPPED_FINAL_FAILURE -> "\u2298"; // ⊘ CIRCLED DIVISION SLASH
}; };
} }
@@ -1425,7 +1425,8 @@ public final class GuiBatchRunTab {
case SUCCESS -> "#2e7d32"; case SUCCESS -> "#2e7d32";
case FAILED_RETRYABLE -> "#e65100"; case FAILED_RETRYABLE -> "#e65100";
case FAILED_PERMANENT -> "#c62828"; case FAILED_PERMANENT -> "#c62828";
case SKIPPED_ALREADY_PROCESSED, SKIPPED_FINAL_FAILURE -> "#757575"; case SKIPPED_ALREADY_PROCESSED -> "#1565c0";
case SKIPPED_FINAL_FAILURE -> "#757575";
}; };
} }
@@ -290,7 +290,7 @@ class GuiBatchRunCoordinatorTest {
assertEquals("\u2714", row(DocumentCompletionStatus.SUCCESS).statusIcon()); assertEquals("\u2714", row(DocumentCompletionStatus.SUCCESS).statusIcon());
assertEquals("\u26A0", row(DocumentCompletionStatus.FAILED_RETRYABLE).statusIcon()); assertEquals("\u26A0", row(DocumentCompletionStatus.FAILED_RETRYABLE).statusIcon());
assertEquals("\u2718", row(DocumentCompletionStatus.FAILED_PERMANENT).statusIcon()); assertEquals("\u2718", row(DocumentCompletionStatus.FAILED_PERMANENT).statusIcon());
assertEquals("\u25BA", row(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED).statusIcon()); assertEquals("\u23ED", row(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED).statusIcon());
} }
@Test @Test
@@ -109,13 +109,21 @@ class GuiBatchRunResultRowTest {
} }
@Test @Test
void statusIcon_skippedAlreadyProcessed_isPointer() { void statusIcon_skippedAlreadyProcessed_isNextTrack() {
assertEquals("\u25BA", row(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED).statusIcon()); assertEquals("\u23ED", row(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED).statusIcon());
} }
@Test @Test
void statusIcon_skippedFinalFailure_isPointer() { void statusIcon_skippedFinalFailure_isCircledDivisionSlash() {
assertEquals("\u25BA", row(DocumentCompletionStatus.SKIPPED_FINAL_FAILURE).statusIcon()); assertEquals("\u2298", row(DocumentCompletionStatus.SKIPPED_FINAL_FAILURE).statusIcon());
}
@Test
void statusIcon_skippedValues_areDifferentFromEachOther() {
String alreadyProcessed = row(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED).statusIcon();
String finalFailure = row(DocumentCompletionStatus.SKIPPED_FINAL_FAILURE).statusIcon();
assertFalse(alreadyProcessed.equals(finalFailure),
"SKIPPED_ALREADY_PROCESSED und SKIPPED_FINAL_FAILURE müssen unterschiedliche Icons haben");
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
@@ -140,10 +140,10 @@ class GuiBatchRunTabSmokeTest {
tab().resultTable().getSelectionModel().select(1); tab().resultTable().getSelectionModel().select(1);
assertTrue(tab().detailArea().getText().contains(GuiBatchRunTab.NO_REASONING_TEXT)); assertTrue(tab().detailArea().getText().contains(GuiBatchRunTab.NO_REASONING_TEXT));
// SKIPPED row must carry the ► icon, not ✘. // SKIPPED_ALREADY_PROCESSED muss das Weiterspulen-Icon ⏭ tragen, nicht ✘.
GuiBatchRunResultRow skippedRow = tab().resultTable().getItems().get(2); GuiBatchRunResultRow skippedRow = tab().resultTable().getItems().get(2);
assertEquals(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED, skippedRow.status()); assertEquals(DocumentCompletionStatus.SKIPPED_ALREADY_PROCESSED, skippedRow.status());
assertEquals("\u25BA", skippedRow.statusIcon()); assertEquals("\u23ED", skippedRow.statusIcon());
}); });
} }