mirror of
https://github.com/bisq-network/bisq.git
synced 2025-02-22 14:42:37 +01:00
Merge pull request #2752 from ManfredKarrer/add-filter-to-trade-history
Add filter to trade history
This commit is contained in:
commit
b1a8429066
3 changed files with 80 additions and 2 deletions
|
@ -804,6 +804,7 @@ support.tab.support=Support tickets
|
||||||
support.tab.ArbitratorsSupportTickets=Arbitrator's support tickets
|
support.tab.ArbitratorsSupportTickets=Arbitrator's support tickets
|
||||||
support.tab.TradersSupportTickets=Trader's support tickets
|
support.tab.TradersSupportTickets=Trader's support tickets
|
||||||
support.filter=Filter list
|
support.filter=Filter list
|
||||||
|
support.filter.prompt=Enter trade ID, date, onion address or account data
|
||||||
support.noTickets=There are no open tickets
|
support.noTickets=There are no open tickets
|
||||||
support.sendingMessage=Sending Message...
|
support.sendingMessage=Sending Message...
|
||||||
support.receiverNotOnline=Receiver is not online. Message is saved to his mailbox.
|
support.receiverNotOnline=Receiver is not online. Message is saved to his mailbox.
|
||||||
|
|
|
@ -18,8 +18,12 @@
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<?import bisq.desktop.components.AutoTooltipButton?>
|
<?import bisq.desktop.components.AutoTooltipButton?>
|
||||||
|
<?import bisq.desktop.components.AutoTooltipLabel?>
|
||||||
|
<?import bisq.desktop.components.InputTextField?>
|
||||||
<?import javafx.scene.control.TableColumn?>
|
<?import javafx.scene.control.TableColumn?>
|
||||||
<?import javafx.scene.control.TableView?>
|
<?import javafx.scene.control.TableView?>
|
||||||
|
<?import javafx.scene.layout.HBox?>
|
||||||
|
<?import javafx.scene.layout.Pane?>
|
||||||
<?import javafx.scene.layout.VBox?>
|
<?import javafx.scene.layout.VBox?>
|
||||||
<?import javafx.geometry.Insets?>
|
<?import javafx.geometry.Insets?>
|
||||||
<VBox fx:id="root" fx:controller="bisq.desktop.main.portfolio.closedtrades.ClosedTradesView"
|
<VBox fx:id="root" fx:controller="bisq.desktop.main.portfolio.closedtrades.ClosedTradesView"
|
||||||
|
@ -41,5 +45,10 @@
|
||||||
<TableColumn fx:id="avatarColumn" minWidth="40" maxWidth="40"/>
|
<TableColumn fx:id="avatarColumn" minWidth="40" maxWidth="40"/>
|
||||||
</columns>
|
</columns>
|
||||||
</TableView>
|
</TableView>
|
||||||
<AutoTooltipButton fx:id="exportButton"/>
|
<HBox fx:id="footerBox">
|
||||||
|
<AutoTooltipLabel fx:id="filterLabel"/>
|
||||||
|
<InputTextField fx:id="filterTextField" minWidth="300"/>
|
||||||
|
<Pane fx:id="spacer"/>
|
||||||
|
<AutoTooltipButton fx:id="exportButton"/>
|
||||||
|
</HBox>
|
||||||
</VBox>
|
</VBox>
|
||||||
|
|
|
@ -22,6 +22,7 @@ import bisq.desktop.common.view.FxmlView;
|
||||||
import bisq.desktop.components.AutoTooltipButton;
|
import bisq.desktop.components.AutoTooltipButton;
|
||||||
import bisq.desktop.components.AutoTooltipLabel;
|
import bisq.desktop.components.AutoTooltipLabel;
|
||||||
import bisq.desktop.components.HyperlinkWithIcon;
|
import bisq.desktop.components.HyperlinkWithIcon;
|
||||||
|
import bisq.desktop.components.InputTextField;
|
||||||
import bisq.desktop.components.PeerInfoIcon;
|
import bisq.desktop.components.PeerInfoIcon;
|
||||||
import bisq.desktop.main.overlays.windows.OfferDetailsWindow;
|
import bisq.desktop.main.overlays.windows.OfferDetailsWindow;
|
||||||
import bisq.desktop.main.overlays.windows.TradeDetailsWindow;
|
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.Price;
|
||||||
import bisq.core.monetary.Volume;
|
import bisq.core.monetary.Volume;
|
||||||
import bisq.core.offer.OpenOffer;
|
import bisq.core.offer.OpenOffer;
|
||||||
|
import bisq.core.trade.Contract;
|
||||||
import bisq.core.trade.Tradable;
|
import bisq.core.trade.Tradable;
|
||||||
import bisq.core.trade.Trade;
|
import bisq.core.trade.Trade;
|
||||||
import bisq.core.user.Preferences;
|
import bisq.core.user.Preferences;
|
||||||
|
@ -57,13 +59,18 @@ import javafx.scene.control.TableCell;
|
||||||
import javafx.scene.control.TableColumn;
|
import javafx.scene.control.TableColumn;
|
||||||
import javafx.scene.control.TableView;
|
import javafx.scene.control.TableView;
|
||||||
import javafx.scene.control.Tooltip;
|
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.scene.layout.VBox;
|
||||||
|
|
||||||
import javafx.geometry.Insets;
|
import javafx.geometry.Insets;
|
||||||
|
|
||||||
import javafx.beans.property.ReadOnlyObjectWrapper;
|
import javafx.beans.property.ReadOnlyObjectWrapper;
|
||||||
|
import javafx.beans.value.ChangeListener;
|
||||||
|
|
||||||
import javafx.collections.ObservableList;
|
import javafx.collections.ObservableList;
|
||||||
|
import javafx.collections.transformation.FilteredList;
|
||||||
import javafx.collections.transformation.SortedList;
|
import javafx.collections.transformation.SortedList;
|
||||||
|
|
||||||
import javafx.util.Callback;
|
import javafx.util.Callback;
|
||||||
|
@ -73,19 +80,31 @@ import java.util.Comparator;
|
||||||
@FxmlView
|
@FxmlView
|
||||||
public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTradesViewModel> {
|
public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTradesViewModel> {
|
||||||
private final boolean useDevPrivilegeKeys;
|
private final boolean useDevPrivilegeKeys;
|
||||||
|
|
||||||
@FXML
|
@FXML
|
||||||
TableView<ClosedTradableListItem> tableView;
|
TableView<ClosedTradableListItem> tableView;
|
||||||
@FXML
|
@FXML
|
||||||
TableColumn<ClosedTradableListItem, ClosedTradableListItem> priceColumn, amountColumn, volumeColumn,
|
TableColumn<ClosedTradableListItem, ClosedTradableListItem> priceColumn, amountColumn, volumeColumn,
|
||||||
marketColumn, directionColumn, dateColumn, tradeIdColumn, stateColumn, avatarColumn;
|
marketColumn, directionColumn, dateColumn, tradeIdColumn, stateColumn, avatarColumn;
|
||||||
@FXML
|
@FXML
|
||||||
|
HBox footerBox;
|
||||||
|
@FXML
|
||||||
|
AutoTooltipLabel filterLabel;
|
||||||
|
@FXML
|
||||||
|
InputTextField filterTextField;
|
||||||
|
@FXML
|
||||||
|
Pane spacer;
|
||||||
|
@FXML
|
||||||
AutoTooltipButton exportButton;
|
AutoTooltipButton exportButton;
|
||||||
|
|
||||||
private final OfferDetailsWindow offerDetailsWindow;
|
private final OfferDetailsWindow offerDetailsWindow;
|
||||||
private Preferences preferences;
|
private Preferences preferences;
|
||||||
private final BSFormatter formatter;
|
private final BSFormatter formatter;
|
||||||
private final TradeDetailsWindow tradeDetailsWindow;
|
private final TradeDetailsWindow tradeDetailsWindow;
|
||||||
private final PrivateNotificationManager privateNotificationManager;
|
private final PrivateNotificationManager privateNotificationManager;
|
||||||
private SortedList<ClosedTradableListItem> sortedList;
|
private SortedList<ClosedTradableListItem> sortedList;
|
||||||
|
private FilteredList<ClosedTradableListItem> filteredList;
|
||||||
|
private ChangeListener<String> filterTextFieldListener;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
public ClosedTradesView(ClosedTradesViewModel model,
|
public ClosedTradesView(ClosedTradesViewModel model,
|
||||||
|
@ -175,13 +194,24 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
|
||||||
|
|
||||||
dateColumn.setSortType(TableColumn.SortType.DESCENDING);
|
dateColumn.setSortType(TableColumn.SortType.DESCENDING);
|
||||||
tableView.getSortOrder().add(dateColumn);
|
tableView.getSortOrder().add(dateColumn);
|
||||||
|
|
||||||
|
filterLabel.setText(Res.getWithCol("support.filter"));
|
||||||
|
filterTextField.setPromptText(Res.get("support.filter.prompt"));
|
||||||
|
HBox.setMargin(filterLabel, new Insets(5, 0, 0, 10));
|
||||||
|
filterTextFieldListener = (observable, oldValue, newValue) -> applyFilteredListPredicate(filterTextField.getText());
|
||||||
|
footerBox.setSpacing(5);
|
||||||
|
HBox.setHgrow(spacer, Priority.ALWAYS);
|
||||||
exportButton.updateText(Res.get("shared.exportCSV"));
|
exportButton.updateText(Res.get("shared.exportCSV"));
|
||||||
|
HBox.setMargin(exportButton, new Insets(0, 10, 0, 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void activate() {
|
protected void activate() {
|
||||||
sortedList = new SortedList<>(model.getList());
|
filteredList = new FilteredList<>(model.getList());
|
||||||
|
|
||||||
|
sortedList = new SortedList<>(filteredList);
|
||||||
sortedList.comparatorProperty().bind(tableView.comparatorProperty());
|
sortedList.comparatorProperty().bind(tableView.comparatorProperty());
|
||||||
|
|
||||||
tableView.setItems(sortedList);
|
tableView.setItems(sortedList);
|
||||||
|
|
||||||
exportButton.setOnAction(event -> {
|
exportButton.setOnAction(event -> {
|
||||||
|
@ -208,14 +238,52 @@ public class ClosedTradesView extends ActivatableViewAndModel<VBox, ClosedTrades
|
||||||
GUIUtil.exportCSV("tradeHistory.csv", headerConverter, contentConverter,
|
GUIUtil.exportCSV("tradeHistory.csv", headerConverter, contentConverter,
|
||||||
new ClosedTradableListItem(null), sortedList, (Stage) root.getScene().getWindow());
|
new ClosedTradableListItem(null), sortedList, (Stage) root.getScene().getWindow());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
filterTextField.textProperty().addListener(filterTextFieldListener);
|
||||||
|
applyFilteredListPredicate(filterTextField.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void deactivate() {
|
protected void deactivate() {
|
||||||
sortedList.comparatorProperty().unbind();
|
sortedList.comparatorProperty().unbind();
|
||||||
exportButton.setOnAction(null);
|
exportButton.setOnAction(null);
|
||||||
|
|
||||||
|
filterTextField.textProperty().removeListener(filterTextFieldListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void applyFilteredListPredicate(String filterString) {
|
||||||
|
filteredList.setPredicate(item -> {
|
||||||
|
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() {
|
private void setTradeIdColumnCellFactory() {
|
||||||
tradeIdColumn.getStyleClass().add("first-column");
|
tradeIdColumn.getStyleClass().add("first-column");
|
||||||
|
|
Loading…
Add table
Reference in a new issue