#81: Enum-Rohnamen durch deutsche Anzeigetexte ersetzen
displayTextFor(ProcessingStatus) in ProcessingStatusPresentation ergaenzt. Status-ComboBox als ComboBox<ProcessingStatus> mit StringConverter umgestellt; Versuche-Tabelle und Detail-Statuslabel zeigen nun Anzeigetext statt Enum-Namen. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+27
@@ -3,6 +3,7 @@ package de.gecheckt.pdf.umbenenner.adapter.in.gui.batchrun;
|
|||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
|
||||||
import de.gecheckt.pdf.umbenenner.application.port.in.DocumentCompletionStatus;
|
import de.gecheckt.pdf.umbenenner.application.port.in.DocumentCompletionStatus;
|
||||||
|
import de.gecheckt.pdf.umbenenner.domain.model.ProcessingStatus;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Zentrale Mapping-Klasse für die visuelle Darstellung von Verarbeitungsstatus in der GUI.
|
* Zentrale Mapping-Klasse für die visuelle Darstellung von Verarbeitungsstatus in der GUI.
|
||||||
@@ -250,6 +251,32 @@ public final class ProcessingStatusPresentation {
|
|||||||
summaryCategoryFor(status));
|
summaryCategoryFor(status));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
// Mapping für ProcessingStatus (alle acht Domain-Statuswerte)
|
||||||
|
// -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Liefert den deutschsprachigen Anzeigetext mit Icon für den angegebenen
|
||||||
|
* Domain-Verarbeitungsstatus. Kein Enum-Rohname darf für Endnutzer sichtbar sein.
|
||||||
|
*
|
||||||
|
* @param status der Domain-Verarbeitungsstatus; darf nicht {@code null} sein
|
||||||
|
* @return der Anzeigetext mit vorangestelltem Icon; nie leer
|
||||||
|
* @throws NullPointerException wenn {@code status} {@code null} ist
|
||||||
|
*/
|
||||||
|
public static String displayTextFor(ProcessingStatus status) {
|
||||||
|
Objects.requireNonNull(status, "status darf nicht null sein");
|
||||||
|
return switch (status) {
|
||||||
|
case SUCCESS -> "✓ Erfolgreich";
|
||||||
|
case FAILED_RETRYABLE -> "↻ Temporärer Fehler";
|
||||||
|
case FAILED_FINAL -> "× Dauerhaft fehlgeschlagen";
|
||||||
|
case SKIPPED_ALREADY_PROCESSED -> "≡ Bereits verarbeitet";
|
||||||
|
case SKIPPED_FINAL_FAILURE -> "⊘ Endgültig übersprungen";
|
||||||
|
case READY_FOR_AI -> "⟳ Wartet auf Verarbeitung";
|
||||||
|
case PROPOSAL_READY -> "◇ Vorschlag vorhanden";
|
||||||
|
case PROCESSING -> "▶ In Bearbeitung";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/** Nicht instanziierbar – reine Utility-Klasse. */
|
/** Nicht instanziierbar – reine Utility-Klasse. */
|
||||||
private ProcessingStatusPresentation() {
|
private ProcessingStatusPresentation() {
|
||||||
throw new UnsupportedOperationException("Nicht instanziierbar");
|
throw new UnsupportedOperationException("Nicht instanziierbar");
|
||||||
|
|||||||
+15
-11
@@ -15,6 +15,7 @@ import java.util.function.Supplier;
|
|||||||
import org.apache.logging.log4j.LogManager;
|
import org.apache.logging.log4j.LogManager;
|
||||||
import org.apache.logging.log4j.Logger;
|
import org.apache.logging.log4j.Logger;
|
||||||
|
|
||||||
|
import de.gecheckt.pdf.umbenenner.adapter.in.gui.batchrun.ProcessingStatusPresentation;
|
||||||
import de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecord;
|
import de.gecheckt.pdf.umbenenner.application.port.out.DocumentRecord;
|
||||||
import de.gecheckt.pdf.umbenenner.application.port.out.ProcessingAttempt;
|
import de.gecheckt.pdf.umbenenner.application.port.out.ProcessingAttempt;
|
||||||
import de.gecheckt.pdf.umbenenner.application.port.out.history.DocumentHistoryRow;
|
import de.gecheckt.pdf.umbenenner.application.port.out.history.DocumentHistoryRow;
|
||||||
@@ -24,6 +25,7 @@ import de.gecheckt.pdf.umbenenner.application.usecase.DefaultHistoryOverviewUseC
|
|||||||
import de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint;
|
import de.gecheckt.pdf.umbenenner.domain.model.DocumentFingerprint;
|
||||||
import de.gecheckt.pdf.umbenenner.domain.model.ProcessingStatus;
|
import de.gecheckt.pdf.umbenenner.domain.model.ProcessingStatus;
|
||||||
import javafx.application.Platform;
|
import javafx.application.Platform;
|
||||||
|
import javafx.util.StringConverter;
|
||||||
import javafx.beans.property.SimpleStringProperty;
|
import javafx.beans.property.SimpleStringProperty;
|
||||||
import javafx.collections.FXCollections;
|
import javafx.collections.FXCollections;
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
@@ -107,7 +109,7 @@ public final class GuiHistoryTab {
|
|||||||
private final Tab tab = new Tab(TAB_TITLE);
|
private final Tab tab = new Tab(TAB_TITLE);
|
||||||
|
|
||||||
private final TextField searchField = new TextField();
|
private final TextField searchField = new TextField();
|
||||||
private final ComboBox<String> statusFilterBox = new ComboBox<>();
|
private final ComboBox<ProcessingStatus> statusFilterBox = new ComboBox<>();
|
||||||
private final Button refreshButton = new Button("Aktualisieren");
|
private final Button refreshButton = new Button("Aktualisieren");
|
||||||
|
|
||||||
private final TableView<DocumentHistoryRow> overviewTable = new TableView<>();
|
private final TableView<DocumentHistoryRow> overviewTable = new TableView<>();
|
||||||
@@ -215,10 +217,14 @@ public final class GuiHistoryTab {
|
|||||||
Tooltip.install(searchField, new Tooltip(
|
Tooltip.install(searchField, new Tooltip(
|
||||||
"Freitextsuche über Quell- und Zieldateiname (Groß-/Kleinschreibung egal)."));
|
"Freitextsuche über Quell- und Zieldateiname (Groß-/Kleinschreibung egal)."));
|
||||||
|
|
||||||
statusFilterBox.getItems().add("Alle Status");
|
statusFilterBox.setConverter(new StringConverter<>() {
|
||||||
for (ProcessingStatus s : ProcessingStatus.values()) {
|
@Override public String toString(ProcessingStatus s) {
|
||||||
statusFilterBox.getItems().add(s.name());
|
return s == null ? "Alle Status" : ProcessingStatusPresentation.displayTextFor(s);
|
||||||
}
|
}
|
||||||
|
@Override public ProcessingStatus fromString(String text) { return null; }
|
||||||
|
});
|
||||||
|
statusFilterBox.getItems().add(null); // "Alle Status"
|
||||||
|
statusFilterBox.getItems().addAll(ProcessingStatus.values());
|
||||||
statusFilterBox.getSelectionModel().selectFirst();
|
statusFilterBox.getSelectionModel().selectFirst();
|
||||||
Tooltip.install(statusFilterBox, new Tooltip("Status-Filter: nur Einträge mit diesem Status anzeigen."));
|
Tooltip.install(statusFilterBox, new Tooltip("Status-Filter: nur Einträge mit diesem Status anzeigen."));
|
||||||
|
|
||||||
@@ -409,8 +415,8 @@ public final class GuiHistoryTab {
|
|||||||
TableColumn<ProcessingAttempt, String> statusCol = new TableColumn<>("Status");
|
TableColumn<ProcessingAttempt, String> statusCol = new TableColumn<>("Status");
|
||||||
statusCol.setCellValueFactory(c ->
|
statusCol.setCellValueFactory(c ->
|
||||||
new SimpleStringProperty(
|
new SimpleStringProperty(
|
||||||
statusIcon(c.getValue().status()) + " " + c.getValue().status().name()));
|
ProcessingStatusPresentation.displayTextFor(c.getValue().status())));
|
||||||
statusCol.setPrefWidth(140);
|
statusCol.setPrefWidth(160);
|
||||||
|
|
||||||
TableColumn<ProcessingAttempt, String> providerCol = new TableColumn<>("Provider");
|
TableColumn<ProcessingAttempt, String> providerCol = new TableColumn<>("Provider");
|
||||||
providerCol.setCellValueFactory(c ->
|
providerCol.setCellValueFactory(c ->
|
||||||
@@ -490,9 +496,8 @@ public final class GuiHistoryTab {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String searchText = searchField.getText();
|
String searchText = searchField.getText();
|
||||||
String selectedStatus = statusFilterBox.getSelectionModel().getSelectedItem();
|
ProcessingStatus selectedStatus = statusFilterBox.getSelectionModel().getSelectedItem();
|
||||||
String statusFilter = (selectedStatus == null || "Alle Status".equals(selectedStatus))
|
String statusFilter = selectedStatus == null ? null : selectedStatus.name();
|
||||||
? null : selectedStatus;
|
|
||||||
|
|
||||||
HistoryQuery query = new HistoryQuery(searchText, statusFilter, HistoryQuery.DEFAULT_LIMIT);
|
HistoryQuery query = new HistoryQuery(searchText, statusFilter, HistoryQuery.DEFAULT_LIMIT);
|
||||||
|
|
||||||
@@ -673,8 +678,7 @@ public final class GuiHistoryTab {
|
|||||||
detailSourceFileLabel.setText(record.lastKnownSourceFileName());
|
detailSourceFileLabel.setText(record.lastKnownSourceFileName());
|
||||||
detailSourcePathLabel.setText(record.lastKnownSourceLocator().value());
|
detailSourcePathLabel.setText(record.lastKnownSourceLocator().value());
|
||||||
detailSourcePathLabel.setTooltip(new Tooltip(record.lastKnownSourceLocator().value()));
|
detailSourcePathLabel.setTooltip(new Tooltip(record.lastKnownSourceLocator().value()));
|
||||||
String icon = statusIcon(record.overallStatus());
|
detailStatusLabel.setText(ProcessingStatusPresentation.displayTextFor(record.overallStatus()));
|
||||||
detailStatusLabel.setText(icon + " " + record.overallStatus().name());
|
|
||||||
detailStatusLabel.setStyle("-fx-text-fill: " + statusColor(record.overallStatus()) + ";");
|
detailStatusLabel.setStyle("-fx-text-fill: " + statusColor(record.overallStatus()) + ";");
|
||||||
detailStatusLabel.setTooltip(new Tooltip(statusTooltip(record.overallStatus())));
|
detailStatusLabel.setTooltip(new Tooltip(statusTooltip(record.overallStatus())));
|
||||||
detailCreatedLabel.setText(formatInstant(record.createdAt()));
|
detailCreatedLabel.setText(formatInstant(record.createdAt()));
|
||||||
|
|||||||
Reference in New Issue
Block a user