diff --git a/core/src/main/resources/i18n/displayStrings.properties b/core/src/main/resources/i18n/displayStrings.properties index 3189950d63..9d5e9d78a8 100644 --- a/core/src/main/resources/i18n/displayStrings.properties +++ b/core/src/main/resources/i18n/displayStrings.properties @@ -804,6 +804,7 @@ support.tab.support=Support tickets support.tab.ArbitratorsSupportTickets=Arbitrator's support tickets support.tab.TradersSupportTickets=Trader's support tickets support.filter=Filter list +support.filter.prompt=Enter trade ID, date, onion address or account data support.noTickets=There are no open tickets support.sendingMessage=Sending Message... support.receiverNotOnline=Receiver is not online. Message is saved to his mailbox. diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.fxml b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.fxml index 110db01091..6300400bdd 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.fxml +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.fxml @@ -18,8 +18,12 @@ --> + + + + - + + + + + + diff --git a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java index 6cb20342d3..0778f8177c 100644 --- a/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java +++ b/desktop/src/main/java/bisq/desktop/main/portfolio/closedtrades/ClosedTradesView.java @@ -22,6 +22,7 @@ import bisq.desktop.common.view.FxmlView; import bisq.desktop.components.AutoTooltipButton; import bisq.desktop.components.AutoTooltipLabel; import bisq.desktop.components.HyperlinkWithIcon; +import bisq.desktop.components.InputTextField; import bisq.desktop.components.PeerInfoIcon; import bisq.desktop.main.overlays.windows.OfferDetailsWindow; import bisq.desktop.main.overlays.windows.TradeDetailsWindow; @@ -33,6 +34,7 @@ import bisq.core.locale.Res; import bisq.core.monetary.Price; import bisq.core.monetary.Volume; import bisq.core.offer.OpenOffer; +import bisq.core.trade.Contract; import bisq.core.trade.Tradable; import bisq.core.trade.Trade; import bisq.core.user.Preferences; @@ -57,13 +59,18 @@ import javafx.scene.control.TableCell; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.Tooltip; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; import javafx.geometry.Insets; import javafx.beans.property.ReadOnlyObjectWrapper; +import javafx.beans.value.ChangeListener; import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; import javafx.collections.transformation.SortedList; import javafx.util.Callback; @@ -73,19 +80,31 @@ import java.util.Comparator; @FxmlView public class ClosedTradesView extends ActivatableViewAndModel { private final boolean useDevPrivilegeKeys; + @FXML TableView tableView; @FXML TableColumn priceColumn, amountColumn, volumeColumn, marketColumn, directionColumn, dateColumn, tradeIdColumn, stateColumn, avatarColumn; @FXML + HBox footerBox; + @FXML + AutoTooltipLabel filterLabel; + @FXML + InputTextField filterTextField; + @FXML + Pane spacer; + @FXML AutoTooltipButton exportButton; + private final OfferDetailsWindow offerDetailsWindow; private Preferences preferences; private final BSFormatter formatter; private final TradeDetailsWindow tradeDetailsWindow; private final PrivateNotificationManager privateNotificationManager; private SortedList sortedList; + private FilteredList filteredList; + private ChangeListener filterTextFieldListener; @Inject public ClosedTradesView(ClosedTradesViewModel model, @@ -175,13 +194,24 @@ public class ClosedTradesView extends ActivatableViewAndModel applyFilteredListPredicate(filterTextField.getText()); + footerBox.setSpacing(5); + HBox.setHgrow(spacer, Priority.ALWAYS); exportButton.updateText(Res.get("shared.exportCSV")); + HBox.setMargin(exportButton, new Insets(0, 10, 0, 0)); } @Override protected void activate() { - sortedList = new SortedList<>(model.getList()); + filteredList = new FilteredList<>(model.getList()); + + sortedList = new SortedList<>(filteredList); sortedList.comparatorProperty().bind(tableView.comparatorProperty()); + tableView.setItems(sortedList); exportButton.setOnAction(event -> { @@ -208,14 +238,52 @@ public class ClosedTradesView extends ActivatableViewAndModel { + if (filterString.isEmpty()) + return true; + + Offer offer = item.getTradable().getOffer(); + boolean matchesId = offer.getId().contains(filterString); + boolean matchesOfferDate = formatter.formatDate(offer.getDate()).contains(filterString); + boolean isMakerOnion = offer.getMakerNodeAddress().getFullAddress().contains(filterString); + + if (item.getTradable() instanceof Trade) { + boolean isBuyerOnion = false; + boolean isSellerOnion = false; + boolean matchesBuyersPaymentAccountData = false; + boolean matchesSellersPaymentAccountData = false; + + Trade trade = (Trade) item.getTradable(); + boolean matchesTradeDate = formatter.formatDate(trade.getTakeOfferDate()).contains(filterString); + Contract contract = trade.getContract(); + if (contract != null) { + isBuyerOnion = contract.getBuyerNodeAddress().getFullAddress().contains(filterString); + isSellerOnion = contract.getSellerNodeAddress().getFullAddress().contains(filterString); + matchesBuyersPaymentAccountData = contract.getBuyerPaymentAccountPayload().getPaymentDetails().contains(filterString); + matchesSellersPaymentAccountData = contract.getSellerPaymentAccountPayload().getPaymentDetails().contains(filterString); + } + return matchesId || matchesOfferDate || isMakerOnion || + matchesTradeDate || isBuyerOnion || isSellerOnion || + matchesBuyersPaymentAccountData || matchesSellersPaymentAccountData; + } else { + return matchesId || matchesOfferDate || isMakerOnion; + } + }); + } private void setTradeIdColumnCellFactory() { tradeIdColumn.getStyleClass().add("first-column");