diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/BisqEasyServiceUtil.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/BisqEasyServiceUtil.java index 5d04d93a4c..5c431f67bb 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/BisqEasyServiceUtil.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/BisqEasyServiceUtil.java @@ -111,6 +111,10 @@ public static String createOfferBookMessageFromPeerPerspective(String messageOwn } public static String getFormattedPriceSpec(PriceSpec priceSpec) { + return getFormattedPriceSpec(priceSpec, false); + } + + public static String getFormattedPriceSpec(PriceSpec priceSpec, boolean abbreviated) { String priceInfo; if (priceSpec instanceof FixPriceSpec fixPriceSpec) { String price = PriceFormatter.formatWithCode(fixPriceSpec.getPriceQuote()); @@ -118,8 +122,13 @@ public static String getFormattedPriceSpec(PriceSpec priceSpec) { } else if (priceSpec instanceof FloatPriceSpec floatPriceSpec) { String percent = PercentageFormatter.formatToPercentWithSymbol(Math.abs(floatPriceSpec.getPercentage())); priceInfo = Res.get(floatPriceSpec.getPercentage() >= 0 - ? "bisqEasy.tradeWizard.review.chatMessage.floatPrice.above" - : "bisqEasy.tradeWizard.review.chatMessage.floatPrice.below", percent); + ? abbreviated + ? "bisqEasy.tradeWizard.review.chatMessage.floatPrice.plus" + : "bisqEasy.tradeWizard.review.chatMessage.floatPrice.above" + : abbreviated + ? "bisqEasy.tradeWizard.review.chatMessage.floatPrice.minus" + : "bisqEasy.tradeWizard.review.chatMessage.floatPrice.below" + , percent); } else { priceInfo = Res.get("bisqEasy.tradeWizard.review.chatMessage.marketPrice"); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsController.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsController.java index 42d3b18f78..8178155565 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsController.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsController.java @@ -17,158 +17,101 @@ package bisq.desktop.main.content.bisq_easy.open_trades.trade_details; +import bisq.account.payment_method.BitcoinPaymentRail; import bisq.bisq_easy.NavigationTarget; import bisq.chat.bisqeasy.open_trades.BisqEasyOpenTradeChannel; -import bisq.common.monetary.Coin; -import bisq.common.monetary.Fiat; -import bisq.common.monetary.Monetary; -import bisq.common.monetary.PriceQuote; -import bisq.common.network.AddressByTransportTypeMap; -import bisq.common.util.StringUtils; import bisq.contract.bisq_easy.BisqEasyContract; import bisq.desktop.ServiceProvider; import bisq.desktop.common.view.Controller; import bisq.desktop.common.view.InitWithDataController; import bisq.desktop.common.view.NavigationController; +import bisq.desktop.main.content.bisq_easy.BisqEasyServiceUtil; import bisq.desktop.overlay.OverlayController; import bisq.i18n.Res; -import bisq.network.identity.NetworkId; -import bisq.offer.Direction; import bisq.offer.price.spec.FixPriceSpec; -import bisq.offer.price.spec.FloatPriceSpec; -import bisq.offer.price.spec.MarketPriceSpec; -import bisq.offer.price.spec.PriceSpec; -import bisq.presentation.formatters.AmountFormatter; import bisq.presentation.formatters.DateFormatter; -import bisq.presentation.formatters.PercentageFormatter; import bisq.presentation.formatters.PriceFormatter; import bisq.trade.bisq_easy.BisqEasyTrade; import bisq.trade.bisq_easy.BisqEasyTradeFormatter; import bisq.trade.bisq_easy.BisqEasyTradeUtils; -import bisq.user.identity.UserIdentityService; import bisq.user.profile.UserProfile; -import com.google.common.base.Joiner; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import java.util.Optional; -import java.util.stream.Collectors; @Slf4j -public class TradeDetailsController extends NavigationController - implements InitWithDataController { - protected final UserIdentityService userIdentityService; +public class TradeDetailsController extends NavigationController implements InitWithDataController { @Getter - private final TradeDetailsView view; + @EqualsAndHashCode + @ToString + public static class InitData { + private final BisqEasyTrade bisqEasyTrade; + private final BisqEasyOpenTradeChannel channel; + + public InitData(BisqEasyTrade bisqEasyTrade, BisqEasyOpenTradeChannel channel) { + this.bisqEasyTrade = bisqEasyTrade; + this.channel = channel; + } + } @Getter private final TradeDetailsModel model; + @Getter + private final TradeDetailsView view; + private BisqEasyTrade trade; + private BisqEasyOpenTradeChannel channel; + BisqEasyContract contract; public TradeDetailsController(ServiceProvider serviceProvider) { super(NavigationTarget.BISQ_EASY_TRADE_DETAILS); - userIdentityService = serviceProvider.getUserService().getUserIdentityService(); model = new TradeDetailsModel(); view = new TradeDetailsView(model, this); } - private static String getPriceSpec(BisqEasyContract contract) { - PriceSpec priceSpec = contract.getAgreedPriceSpec(); - String priceSpecStr = ""; - switch (priceSpec) { - case MarketPriceSpec marketPriceSpec -> - priceSpecStr = Res.get("bisqEasy.openTrades.tradeDetails.marketPrice"); - case FloatPriceSpec floatPriceSpec -> { - String absPercent = PercentageFormatter.formatToPercentWithSymbol(Math.abs(floatPriceSpec.getPercentage())); - priceSpecStr = Res.get(floatPriceSpec.getPercentage() >= 0 - ? "bisqEasy.openTrades.tradeDetails.aboveMarketPrice" - : "bisqEasy.openTrades.tradeDetails.belowMarketPrice", absPercent); - } - case FixPriceSpec fixPriceSpec -> priceSpecStr = Res.get("bisqEasy.openTrades.tradeDetails.fixedPrice"); - case null, default -> { - // this should not happen unless a new PriceSpec is added - } - } - return priceSpecStr; - } - - private static String formatNetworkAddresses(AddressByTransportTypeMap addressMap) { - return Joiner.on(", ").join(addressMap.entrySet().stream() - .map(e -> e.getValue().getFullAddress()) - .collect(Collectors.toList())); - } - @Override public void initWithData(InitData initData) { - BisqEasyTrade trade = initData.bisqEasyTrade; - BisqEasyOpenTradeChannel channel = initData.channel; - model.getTradeId().set(trade.getId()); - model.getPeerUsername().set(channel.getPeer().getUserName()); - - String bitcoinPaymentAddress = trade.getBitcoinPaymentData().get(); - if (StringUtils.isNotEmpty(bitcoinPaymentAddress)) { - model.getBitcoinPaymentAddress().set(bitcoinPaymentAddress); - } else { - model.getBitcoinPaymentAddress().set(""); - } - - BisqEasyContract contract = trade.getContract(); - long date = contract.getTakeOfferDate(); - model.getOfferTakenDateTime().set(DateFormatter.formatDateTime(date)); - - long quoteSideAmount = contract.getQuoteSideAmount(); - Monetary quoteAmount = Fiat.from(quoteSideAmount, trade.getOffer().getMarket().getQuoteCurrencyCode()); - - NetworkId peerNetworkId = trade.getPeer().getNetworkId(); - String peerAddress = formatNetworkAddresses(peerNetworkId.getAddressByTransportTypeMap()); - model.getPeerNetworkAddress().set(peerAddress); - - String amountInFiat = AmountFormatter.formatAmount(quoteAmount); - model.getAmountInFiat().set(amountInFiat); - String currencyAbbreviation = quoteAmount.getCode(); - model.getCurrency().set(currencyAbbreviation); - - long baseSideAmount = contract.getBaseSideAmount(); - Coin amountInBTC = Coin.asBtcFromValue(baseSideAmount); - String baseAmountString = AmountFormatter.formatAmount(amountInBTC, false); - model.getAmountInBTC().set(baseAmountString); - - String btcPaymentMethod = contract.getBaseSidePaymentMethodSpec().getDisplayString(); - model.getBitcoinPaymentMethod().set(btcPaymentMethod); - String fiatPaymentMethod = contract.getQuoteSidePaymentMethodSpec().getDisplayString(); - model.getFiatPaymentMethod().set(fiatPaymentMethod); - - String paymentAccountData = trade.getPaymentAccountData().get(); - if (StringUtils.isNotEmpty(paymentAccountData)) { - model.getPaymentAccountData().set(paymentAccountData); - } else { - model.getPaymentAccountData().set(""); - } - - String myMakerTakerRole = BisqEasyTradeFormatter.getMakerTakerRole(trade); - model.getMyMakerTakerRole().set(myMakerTakerRole); - Direction direction = BisqEasyTradeFormatter.getDirectionObject(trade); - String buyerSellerRole = (direction == Direction.BUY) ? Res.get("bisqEasy.openTrades.tradeDetails.buyBtc") : Res.get("bisqEasy.openTrades.tradeDetails.sellBtc"); - model.getMySellBuyRole().set(buyerSellerRole); - - Optional mediator = channel.getMediator(); - if (mediator.isPresent()) { - model.getMediator().set(mediator.get().getUserName()); - } else { - model.getMediator().set(""); - } - - PriceQuote priceQuote = BisqEasyTradeUtils.getPriceQuote(trade); - String codes = priceQuote.getMarket().getMarketCodes(); - model.getPriceSpec().set(codes + " @ " + getPriceSpec(contract)); - String price = PriceFormatter.format(BisqEasyTradeUtils.getPriceQuote(trade)); - model.getTradePrice().set(price); + trade = initData.bisqEasyTrade; + channel = initData.channel; + contract = trade.getContract(); } @Override public void onActivate() { + model.setTradeDate(DateFormatter.formatDateTime(contract.getTakeOfferDate())); + model.setMe(String.format("%s (%s)", channel.getMyUserIdentity().getNickName(), BisqEasyTradeFormatter.getMakerTakerRole(trade).toLowerCase())); + model.setPeer(channel.getPeer().getUserName()); + model.setOfferType(trade.getOffer().getDirection().isBuy() + ? Res.get("bisqEasy.openTrades.tradeDetails.offerTypeAndMarket.buyOffer") + : Res.get("bisqEasy.openTrades.tradeDetails.offerTypeAndMarket.sellOffer")); + model.setMarket(Res.get("bisqEasy.openTrades.tradeDetails.offerTypeAndMarket.fiatMarket", + trade.getOffer().getMarket().getQuoteCurrencyCode())); + model.setFiatAmount(BisqEasyTradeFormatter.formatQuoteSideAmount(trade)); + model.setFiatCurrency(trade.getOffer().getMarket().getQuoteCurrencyCode()); + model.setBtcAmount(BisqEasyTradeFormatter.formatBaseSideAmount(trade)); + model.setPrice(PriceFormatter.format(BisqEasyTradeUtils.getPriceQuote(contract))); + model.setPriceCodes(trade.getOffer().getMarket().getMarketCodes()); + model.setPriceSpec(trade.getOffer().getPriceSpec() instanceof FixPriceSpec + ? "" + : String.format("(%s)", BisqEasyServiceUtil.getFormattedPriceSpec(trade.getOffer().getPriceSpec(), true))); + model.setPaymentMethod(contract.getQuoteSidePaymentMethodSpec().getShortDisplayString()); + model.setSettlementMethod(contract.getBaseSidePaymentMethodSpec().getShortDisplayString()); + model.setTradeId(trade.getId()); + model.setPeerNetworkAddress(channel.getPeer().getAddressByTransportDisplayString(50)); + model.setOnChainSettlement(contract.getBaseSidePaymentMethodSpec().getPaymentMethod().getPaymentRail() == BitcoinPaymentRail.MAIN_CHAIN); + model.setBtcPaymentAddress(trade.getBitcoinPaymentData().get() == null + ? Res.get("bisqEasy.openTrades.tradeDetails.dataNotYetProvided") + : trade.getBitcoinPaymentData().get()); + model.setBtcPaymentDataEmpty(trade.getBitcoinPaymentData().get() == null); + model.setPaymentAccountData(trade.getPaymentAccountData().get() == null + ? Res.get("bisqEasy.openTrades.tradeDetails.dataNotYetProvided") + : trade.getPaymentAccountData().get()); + model.setPaymentAccountDataEmpty(trade.getPaymentAccountData().get() == null); + model.setAssignedMediator(channel.getMediator().map(UserProfile::getUserName).orElse("")); + model.setHasMediatorBeenAssigned(channel.getMediator().isPresent()); } @Override @@ -183,17 +126,4 @@ protected Optional createController(NavigationTarget navig void onClose() { OverlayController.hide(); } - - @Getter - @EqualsAndHashCode - @ToString - public static class InitData { - private final BisqEasyTrade bisqEasyTrade; - private final BisqEasyOpenTradeChannel channel; - - public InitData(BisqEasyTrade bisqEasyTrade, BisqEasyOpenTradeChannel channel) { - this.bisqEasyTrade = bisqEasyTrade; - this.channel = channel; - } - } -} \ No newline at end of file +} diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsModel.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsModel.java index e28b17c88a..dd017eff0d 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsModel.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsModel.java @@ -19,29 +19,36 @@ import bisq.bisq_easy.NavigationTarget; import bisq.desktop.common.view.NavigationModel; -import javafx.beans.property.SimpleStringProperty; import lombok.Getter; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; @Slf4j @Getter +@Setter public class TradeDetailsModel extends NavigationModel { - private final SimpleStringProperty peerUsername = new SimpleStringProperty(); - private final SimpleStringProperty tradeId = new SimpleStringProperty(); - private final SimpleStringProperty amountInFiat = new SimpleStringProperty(); - private final SimpleStringProperty currency = new SimpleStringProperty(); - private final SimpleStringProperty bitcoinPaymentAddress = new SimpleStringProperty(); - private final SimpleStringProperty amountInBTC = new SimpleStringProperty(); - private final SimpleStringProperty tradePrice = new SimpleStringProperty(); - private final SimpleStringProperty priceSpec = new SimpleStringProperty(); - private final SimpleStringProperty mySellBuyRole = new SimpleStringProperty(); - private final SimpleStringProperty myMakerTakerRole = new SimpleStringProperty(); - private final SimpleStringProperty offerTakenDateTime = new SimpleStringProperty(); - private final SimpleStringProperty fiatPaymentMethod = new SimpleStringProperty(); - private final SimpleStringProperty bitcoinPaymentMethod = new SimpleStringProperty(); - private final SimpleStringProperty peerNetworkAddress = new SimpleStringProperty(); - private final SimpleStringProperty paymentAccountData = new SimpleStringProperty(); - private final SimpleStringProperty mediator = new SimpleStringProperty(); + private String tradeDate; + private String me; + private String peer; + private String offerType; + private String market; + private String fiatAmount; + private String fiatCurrency; + private String btcAmount; + private String price; + private String priceCodes; + private String priceSpec; + private String paymentMethod; + private String settlementMethod; + private String tradeId; + private String peerNetworkAddress; + private boolean isOnChainSettlement; + private String btcPaymentAddress; + private boolean isBtcPaymentDataEmpty; + private String paymentAccountData; + private boolean isPaymentAccountDataEmpty; + private String assignedMediator; + private boolean hasMediatorBeenAssigned; @Override public NavigationTarget getDefaultNavigationTarget() { diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsView.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsView.java index 786e4423ee..fa94183a2c 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsView.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/bisq_easy/open_trades/trade_details/TradeDetailsView.java @@ -17,265 +17,275 @@ package bisq.desktop.main.content.bisq_easy.open_trades.trade_details; -import bisq.desktop.common.utils.GridPaneUtil; +import bisq.desktop.common.utils.ClipboardUtil; import bisq.desktop.common.view.NavigationView; import bisq.desktop.components.containers.Spacer; import bisq.desktop.components.controls.BisqIconButton; -import bisq.desktop.components.controls.CopyOnClickLabel; -import bisq.desktop.components.controls.MaterialTextField; +import bisq.desktop.components.controls.BisqMenuItem; import bisq.desktop.overlay.OverlayModel; import bisq.i18n.Res; import javafx.geometry.Insets; import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.Label; -import javafx.scene.control.ScrollPane; -import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; import javafx.scene.layout.Region; import javafx.scene.layout.VBox; -import javafx.scene.text.Text; import lombok.extern.slf4j.Slf4j; +import java.util.Optional; + @Slf4j public class TradeDetailsView extends NavigationView { - - private final Label headline, processHeadline, processDescription, myRoleLabel, amountLabel, paymentMethodLabel; - private final Label tradePriceLabel, tradeIdLabel, peerUsernameLabel, dateLabel, mediatorLabel, peerNetworkAddressLabel; - private final CopyOnClickLabel tradeAmountFiat, tradeAmountBtc, tradeId; - private final Text makerTakerRole, buySellRole, btcPaymentMethod, currency, fiatPaymentMethod, btcLabel; - private final Text tradePriceAmount, priceSpec, peerUsername, tradeDate, mediator, peerNetworkAddress; private final Button closeButton; - MaterialTextField btcPaymentAddress, paymentAccountData; + private final Label tradeDateLabel, meLabel, peerLabel, offerTypeLabel, marketLabel, fiatAmountLabel, + fiatCurrencyLabel, btcAmountLabel, priceLabel, priceCodesLabel, priceSpecLabel, paymentMethodLabel, + settlementMethodLabel, tradeIdLabel, peerNetworkAddressLabel, btcPaymentAddressTitleLabel, btcPaymentAddressDetailsLabel, + paymentAccountDataLabel, assignedMediatorLabel; + private final HBox assignedMediatorBox; + private final BisqMenuItem tradersAndRoleCopyButton, tradeIdCopyButton, peerNetworkAddressCopyButton, + btcPaymentAddressCopyButton, paymentAccountDataCopyButton; public TradeDetailsView(TradeDetailsModel model, TradeDetailsController controller) { super(new VBox(), model, controller); - root.setPrefWidth(OverlayModel.WIDTH); - root.setPrefHeight(OverlayModel.HEIGHT); closeButton = BisqIconButton.createIconButton("close"); HBox closeButtonRow = new HBox(Spacer.fillHBox(), closeButton); - closeButtonRow.setPadding(new Insets(0, 10, 0, 10)); - closeButtonRow.getStyleClass().add("trade-details-close-button-row"); - closeButtonRow.setAlignment(Pos.CENTER_RIGHT); - root.getChildren().add(closeButtonRow); + closeButtonRow.setPadding(new Insets(15, 15, 0, 0)); - Region emptySpace = new Region(); - emptySpace.setMinHeight(30); - emptySpace.setMaxHeight(30); - headline = createLabel("trade-details-headline"); - VBox headlineBox = new VBox(5, emptySpace, headline); - headlineBox.setAlignment(Pos.CENTER); - Region line1 = getLine(); - headlineBox.getChildren().add(line1); - root.getChildren().add(headlineBox); + Label headline = new Label(Res.get("bisqEasy.openTrades.tradeDetails.headline")); + headline.getStyleClass().add("bisq-text-17"); - int numColumns = 3; - GridPane gridPane = new GridPane(); - gridPane.setHgap(10); - gridPane.setVgap(10); - gridPane.setAlignment(Pos.BOTTOM_LEFT); - GridPaneUtil.setGridPaneMultiColumnsConstraints(gridPane, numColumns); + Region line = getLine(); - int rowIndex = 0; - Insets topInset = new Insets(0, 0, -14, 0); - myRoleLabel = createLabel("trade-details-small-grey"); - GridPane.setMargin(myRoleLabel, topInset); - gridPane.add(myRoleLabel, 0, rowIndex); - amountLabel = createLabel("trade-details-small-grey"); - GridPane.setMargin(amountLabel, topInset); - gridPane.add(amountLabel, 1, rowIndex); - paymentMethodLabel = createLabel("trade-details-small-grey"); - GridPane.setMargin(paymentMethodLabel, topInset); - gridPane.add(paymentMethodLabel, 2, rowIndex); + // Trade date + tradeDateLabel = new Label(); + tradeDateLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + HBox tradeDateBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.tradeDate", + tradeDateLabel); - rowIndex++; - makerTakerRole = createText("trade-details-large-light"); - gridPane.add(makerTakerRole, 0, rowIndex); - tradeAmountFiat = createCopyOnClickLabel("trade-details-large-light"); - currency = createText("trade-details-medium-grey"); - HBox fiatText = new HBox(5, tradeAmountFiat, currency); - fiatText.setAlignment(Pos.BASELINE_LEFT); - gridPane.add(fiatText, 1, rowIndex); - fiatPaymentMethod = createText("trade-details-large-light"); - gridPane.add(fiatPaymentMethod, 2, rowIndex); + // Traders / Roles + Label mePrefixLabel = new Label(Res.get("bisqEasy.openTrades.tradeDetails.tradersAndRole.me")); + mePrefixLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + meLabel = new Label(); + meLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + Label offerTypeAndRoleSlashLabel = new Label("/"); + offerTypeAndRoleSlashLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + Label peerPrefixLabel = new Label(Res.get("bisqEasy.openTrades.tradeDetails.tradersAndRole.peer")); + peerPrefixLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + peerLabel = new Label(); + peerLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + HBox tradersAndRoleDetailsHBox = new HBox(5, mePrefixLabel, meLabel, offerTypeAndRoleSlashLabel, peerPrefixLabel, peerLabel); + tradersAndRoleDetailsHBox.setAlignment(Pos.BASELINE_LEFT); + tradersAndRoleCopyButton = new BisqMenuItem("copy-grey", "copy-white"); + tradersAndRoleCopyButton.setTooltip(Res.get("bisqEasy.openTrades.tradeDetails.tradersAndRole.copy")); + HBox tradersAndRoleBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.tradersAndRole", + tradersAndRoleDetailsHBox, Optional.of(tradersAndRoleCopyButton)); - rowIndex++; - buySellRole = createText("trade-details-large-light"); - gridPane.add(buySellRole, 0, rowIndex); - tradeAmountBtc = createCopyOnClickLabel("trade-details-large-light"); - btcLabel = createText("trade-details-medium-grey"); - HBox btcText = new HBox(5, tradeAmountBtc, btcLabel); - btcText.setAlignment(Pos.BASELINE_LEFT); - gridPane.add(btcText, 1, rowIndex); - btcPaymentMethod = createText("trade-details-large-light"); - gridPane.add(btcPaymentMethod, 2, rowIndex); + // Offer type and market + offerTypeLabel = new Label(); + offerTypeLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + Label offerAndMarketslashLabel = new Label("/"); + offerAndMarketslashLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + marketLabel = new Label(); + marketLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + HBox offerTypeAndMarketDetailsHBox = new HBox(5, offerTypeLabel, offerAndMarketslashLabel, marketLabel); + offerTypeAndMarketDetailsHBox.setAlignment(Pos.BASELINE_LEFT); + HBox offerTypeAndMarketBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.offerTypeAndMarket", + offerTypeAndMarketDetailsHBox); - rowIndex++; - Region emptyRow1 = new Region(); - GridPane.setColumnSpan(emptyRow1, numColumns); - emptyRow1.setPrefHeight(40); - gridPane.add(emptyRow1, 0, rowIndex); - rowIndex++; - Region line3 = getLine(); - GridPane.setColumnSpan(line3, numColumns); - gridPane.add(line3, 0, rowIndex); + // Amount and price + fiatAmountLabel = new Label(); + fiatAmountLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + fiatCurrencyLabel = new Label(); + fiatCurrencyLabel.getStyleClass().addAll("text-fill-white", "small-text"); - rowIndex++; - tradePriceLabel = createLabel("trade-details-medium-grey"); - tradePriceLabel.setAlignment(Pos.BOTTOM_LEFT); - gridPane.add(tradePriceLabel, 0, rowIndex); - tradePriceAmount = createText("trade-details-medium-light"); - priceSpec = createText("trade-details-medium-grey"); - HBox tradePriceBox = new HBox(5, tradePriceAmount, priceSpec); - tradePriceBox.setAlignment(Pos.BOTTOM_LEFT); - GridPane.setColumnSpan(tradePriceBox, 2); - gridPane.add(tradePriceBox, 1, rowIndex); - rowIndex++; - tradeIdLabel = createLabel("trade-details-medium-grey"); - gridPane.add(tradeIdLabel, 0, rowIndex); - tradeId = createCopyOnClickLabel("trade-details-medium-light"); - GridPane.setColumnSpan(tradeId, 2); - gridPane.add(tradeId, 1, rowIndex); - rowIndex++; - dateLabel = createLabel("trade-details-medium-grey"); - gridPane.add(dateLabel, 0, rowIndex); - tradeDate = createText("trade-details-medium-light"); - GridPane.setColumnSpan(tradeDate, 2); - gridPane.add(tradeDate, 1, rowIndex); - rowIndex++; - peerUsernameLabel = createLabel("trade-details-medium-grey"); - gridPane.add(peerUsernameLabel, 0, rowIndex); - peerUsername = createText("trade-details-medium-light"); - GridPane.setColumnSpan(peerUsername, 2); - gridPane.add(peerUsername, 1, rowIndex); - rowIndex++; - peerNetworkAddressLabel = createLabel("trade-details-medium-grey"); - gridPane.add(peerNetworkAddressLabel, 0, rowIndex); - peerNetworkAddress = createText("trade-details-medium-light"); - GridPane.setColumnSpan(peerNetworkAddress, 2); - gridPane.add(peerNetworkAddress, 1, rowIndex); - rowIndex++; - mediatorLabel = createLabel("trade-details-medium-grey"); - gridPane.add(mediatorLabel, 0, rowIndex); - mediator = createText("trade-details-medium-light"); - GridPane.setColumnSpan(mediator, 2); - gridPane.add(mediator, 1, rowIndex); + Label openParenthesisLabel = new Label("("); + openParenthesisLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + btcAmountLabel = new Label(); + btcAmountLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + btcAmountLabel.setPadding(new Insets(0, 5, 0, 0)); + Label btcLabel = new Label("BTC"); + btcLabel.getStyleClass().addAll("text-fill-grey-dimmed", "small-text"); + Label closingParenthesisLabel = new Label(")"); + closingParenthesisLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + HBox btcAmountHBoxbtcAmountHBox = new HBox(openParenthesisLabel, btcAmountLabel, btcLabel, closingParenthesisLabel); + btcAmountHBoxbtcAmountHBox.setAlignment(Pos.BASELINE_LEFT); + Label atLabel = new Label("@"); + atLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + priceLabel = new Label(); + priceLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + priceCodesLabel = new Label(); + priceCodesLabel.getStyleClass().addAll("text-fill-white", "small-text"); + priceSpecLabel = new Label(); + priceSpecLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + HBox amountAndPriceDetailsHBox = new HBox(5, fiatAmountLabel, fiatCurrencyLabel, btcAmountHBoxbtcAmountHBox, + atLabel, priceLabel, priceCodesLabel, priceSpecLabel); + amountAndPriceDetailsHBox.setAlignment(Pos.BASELINE_LEFT); + HBox amountAndPriceBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.amountAndPrice", amountAndPriceDetailsHBox); - // process information section - rowIndex++; - Region emptyRow2 = new Region(); - GridPane.setColumnSpan(emptyRow2, numColumns); - emptyRow2.setPrefHeight(40); - gridPane.add(emptyRow2, 0, rowIndex); - rowIndex++; - processHeadline = createLabel("trade-details-medium-light"); - GridPane.setColumnSpan(processHeadline, numColumns); - gridPane.add(processHeadline, 0, rowIndex); - rowIndex++; - processDescription = createLabel("trade-details-small-grey"); - processDescription.setPadding(new Insets(-10, 0, 0, 0)); - GridPane.setColumnSpan(processDescription, numColumns); - gridPane.add(processDescription, 0, rowIndex); - rowIndex++; - Region line2 = getLine(); - GridPane.setColumnSpan(line2, numColumns); - gridPane.add(line2, 0, rowIndex); - rowIndex++; - btcPaymentAddress = new MaterialTextField(Res.get("bisqEasy.openTrades.tradeDetails.btcPaymentAddress")); - btcPaymentAddress.setEditable(false); - btcPaymentAddress.showCopyIcon(); - GridPane.setColumnSpan(btcPaymentAddress, numColumns); - gridPane.add(btcPaymentAddress, 0, rowIndex); - rowIndex++; - paymentAccountData = new MaterialTextField(Res.get("bisqEasy.openTrades.tradeDetails.paymentAccountData")); - paymentAccountData.setEditable(false); - paymentAccountData.showCopyIcon(); - GridPane.setColumnSpan(paymentAccountData, numColumns); - gridPane.add(paymentAccountData, 0, rowIndex); + // Payment and settlement methods + paymentMethodLabel = new Label(); + paymentMethodLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + Label paymentMethodsSlashLabel = new Label("/"); + paymentMethodsSlashLabel.getStyleClass().addAll("text-fill-grey-dimmed", "normal-text"); + settlementMethodLabel = new Label(); + settlementMethodLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + HBox paymentMethodsDetailsHBox = new HBox(5, paymentMethodLabel, paymentMethodsSlashLabel, settlementMethodLabel); + paymentMethodsDetailsHBox.setAlignment(Pos.BASELINE_LEFT); + HBox paymentMethodsBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.paymentAndSettlementMethods", + paymentMethodsDetailsHBox); - gridPane.setPadding(new Insets(10, 40, 10, 20)); - ScrollPane scrollPane = new ScrollPane(gridPane); - scrollPane.setFitToWidth(true); - VBox container = new VBox(scrollPane); - container.setPadding(new Insets(10, 22, 10, 20)); - root.getChildren().addAll(container); - } + // Trade ID + tradeIdLabel = new Label(); + tradeIdLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + tradeIdCopyButton = new BisqMenuItem("copy-grey", "copy-white"); + tradeIdCopyButton.setTooltip(Res.get("bisqEasy.openTrades.tradeDetails.tradeId.copy")); + HBox tradeIdBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.tradeId", tradeIdLabel, + Optional.of(tradeIdCopyButton)); - @Override - protected void onViewAttached() { - headline.setText(Res.get("bisqEasy.openTrades.tradeDetails.headline")); - processHeadline.setText(Res.get("bisqEasy.openTrades.tradeDetails.processSection")); - myRoleLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.myRole")); - amountLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.amount")); - paymentMethodLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.paymentMethod")); - processDescription.setText(Res.get("bisqEasy.openTrades.tradeDetails.processDescription")); - btcLabel.setText("BTC"); - tradePriceLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.tradePrice")); - tradeIdLabel.setText(Res.get("bisqEasy.openTrades.table.tradeId")); - peerUsernameLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.peerUsername")); - peerNetworkAddressLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.peerNetworkAddress")); - dateLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.offerTakenDate")); - mediatorLabel.setText(Res.get("bisqEasy.openTrades.tradeDetails.selectedMediator")); + // Peer network address + peerNetworkAddressLabel = new Label(); + peerNetworkAddressLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + peerNetworkAddressCopyButton = new BisqMenuItem("copy-grey", "copy-white"); + peerNetworkAddressCopyButton.setTooltip(Res.get("bisqEasy.openTrades.tradeDetails.peerNetworkAddress.copy")); + HBox peerNetworkAddressBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.peerNetworkAddress", + peerNetworkAddressLabel, Optional.of(peerNetworkAddressCopyButton)); - buySellRole.textProperty().bind(model.getMySellBuyRole()); - makerTakerRole.textProperty().bind(model.getMyMakerTakerRole()); - tradeAmountFiat.textProperty().bind(model.getAmountInFiat()); - currency.textProperty().bind(model.getCurrency()); - tradeAmountBtc.textProperty().bind(model.getAmountInBTC()); - btcPaymentMethod.textProperty().bind(model.getBitcoinPaymentMethod()); - fiatPaymentMethod.textProperty().bind(model.getFiatPaymentMethod()); - btcPaymentAddress.textProperty().bind(model.getBitcoinPaymentAddress()); - paymentAccountData.textProperty().bind(model.getPaymentAccountData()); - tradePriceAmount.textProperty().bind(model.getTradePrice()); - priceSpec.textProperty().bind(model.getPriceSpec()); - tradeId.textProperty().bind(model.getTradeId()); - peerUsername.textProperty().bind(model.getPeerUsername()); - peerNetworkAddress.textProperty().bind(model.getPeerNetworkAddress()); - tradeDate.textProperty().bind(model.getOfferTakenDateTime()); - mediator.textProperty().bind(model.getMediator()); + // BTC payment address + btcPaymentAddressTitleLabel = new Label(); + btcPaymentAddressDetailsLabel = new Label(); + btcPaymentAddressCopyButton = new BisqMenuItem("copy-grey", "copy-white"); + HBox btcPaymentAddressBox = createAndGetTitleAndDetailsBox(btcPaymentAddressTitleLabel, + btcPaymentAddressDetailsLabel, Optional.of(btcPaymentAddressCopyButton)); - closeButton.setOnAction(e -> controller.onClose()); + // Payment account data + paymentAccountDataLabel = new Label(); + paymentAccountDataCopyButton = new BisqMenuItem("copy-grey", "copy-white"); + paymentAccountDataCopyButton.setTooltip(Res.get("bisqEasy.openTrades.tradeDetails.paymentAccountData.copy")); + HBox paymentAccountDataBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.paymentAccountData", + paymentAccountDataLabel, Optional.of(paymentAccountDataCopyButton)); + + // Assigned mediator + assignedMediatorLabel = new Label(); + assignedMediatorLabel.getStyleClass().addAll("text-fill-white", "normal-text"); + assignedMediatorBox = createAndGetTitleAndDetailsBox("bisqEasy.openTrades.tradeDetails.assignedMediator", assignedMediatorLabel); + + VBox content = new VBox(20, + headline, + line, + tradeDateBox, + tradersAndRoleBox, + offerTypeAndMarketBox, + amountAndPriceBox, + paymentMethodsBox, + tradeIdBox, + peerNetworkAddressBox, + btcPaymentAddressBox, + paymentAccountDataBox, + assignedMediatorBox); + content.setAlignment(Pos.CENTER); + + VBox.setMargin(headline, new Insets(-5, 0, -5, 0)); + VBox.setMargin(line, new Insets(0, 0, 0, 0)); + VBox.setMargin(content, new Insets(-40, 80, 0, 80)); + VBox.setVgrow(content, Priority.ALWAYS); + root.setAlignment(Pos.TOP_CENTER); + root.setPrefWidth(OverlayModel.WIDTH); + root.setPrefHeight(OverlayModel.HEIGHT); + root.getChildren().addAll(closeButtonRow, content); } - @Override - protected void onViewDetached() { - buySellRole.textProperty().unbind(); - makerTakerRole.textProperty().unbind(); - tradeAmountFiat.textProperty().unbind(); - currency.textProperty().unbind(); - tradeAmountBtc.textProperty().unbind(); - btcPaymentMethod.textProperty().unbind(); - fiatPaymentMethod.textProperty().unbind(); - btcPaymentAddress.textProperty().unbind(); - paymentAccountData.textProperty().unbind(); - tradePriceAmount.textProperty().unbind(); - priceSpec.textProperty().unbind(); - tradeId.textProperty().unbind(); - peerUsername.textProperty().unbind(); - peerNetworkAddress.textProperty().unbind(); - tradeDate.textProperty().unbind(); - mediator.textProperty().unbind(); + private HBox createAndGetTitleAndDetailsBox(String title, Node detailsNode) { + Label titleLabel = new Label(Res.get(title)); + return createAndGetTitleAndDetailsBox(titleLabel, detailsNode, Optional.empty()); + } - closeButton.setOnAction(null); + private HBox createAndGetTitleAndDetailsBox(String title, Node detailsNode, Optional button) { + Label titleLabel = new Label(Res.get(title)); + return createAndGetTitleAndDetailsBox(titleLabel, detailsNode, button); } - private Label createLabel(String style) { - Label label = new Label(); - label.getStyleClass().add(style); - return label; + private HBox createAndGetTitleAndDetailsBox(Label titleLabel, Node detailsNode, Optional button) { + double width = 180; + titleLabel.setMaxWidth(width); + titleLabel.setMinWidth(width); + titleLabel.setPrefWidth(width); + titleLabel.getStyleClass().addAll("text-fill-grey-dimmed", "medium-text"); + + HBox hBox = new HBox(titleLabel, detailsNode); + hBox.setAlignment(Pos.BASELINE_LEFT); + + if (button.isPresent()) { + button.get().useIconOnly(17); + HBox.setMargin(button.get(), new Insets(0, 0, 0, 40)); + hBox.getChildren().addAll(Spacer.fillHBox(), button.get()); + } + return hBox; } - private Text createText(String style) { - Text text = new Text(); - text.getStyleClass().add(style); - return text; + @Override + protected void onViewAttached() { + tradeDateLabel.setText(model.getTradeDate()); + meLabel.setText(model.getMe()); + peerLabel.setText(model.getPeer()); + offerTypeLabel.setText(model.getOfferType()); + marketLabel.setText(model.getMarket()); + fiatAmountLabel.setText(model.getFiatAmount()); + fiatCurrencyLabel.setText(model.getFiatCurrency()); + btcAmountLabel.setText(model.getBtcAmount()); + priceLabel.setText(model.getPrice()); + priceCodesLabel.setText(model.getPriceCodes()); + priceSpecLabel.setText(model.getPriceSpec()); + paymentMethodLabel.setText(model.getPaymentMethod()); + settlementMethodLabel.setText(model.getSettlementMethod()); + tradeIdLabel.setText(model.getTradeId()); + peerNetworkAddressLabel.setText(model.getPeerNetworkAddress()); + btcPaymentAddressTitleLabel.setText(model.isOnChainSettlement() + ? Res.get("bisqEasy.openTrades.tradeDetails.btcPaymentAddress") + : Res.get("bisqEasy.openTrades.tradeDetails.lightningInvoice")); + btcPaymentAddressDetailsLabel.setText(model.getBtcPaymentAddress()); + btcPaymentAddressCopyButton.setTooltip(model.isOnChainSettlement() + ? Res.get("bisqEasy.openTrades.tradeDetails.btcPaymentAddress.copy") + : Res.get("bisqEasy.openTrades.tradeDetails.lightningInvoice.copy")); + paymentAccountDataLabel.setText(model.getPaymentAccountData()); + assignedMediatorLabel.setText(model.getAssignedMediator()); + assignedMediatorBox.setVisible(model.isHasMediatorBeenAssigned()); + assignedMediatorBox.setManaged(model.isHasMediatorBeenAssigned()); + btcPaymentAddressCopyButton.setVisible(!model.isBtcPaymentDataEmpty()); + btcPaymentAddressCopyButton.setManaged(!model.isBtcPaymentDataEmpty()); + paymentAccountDataCopyButton.setVisible(!model.isPaymentAccountDataEmpty()); + paymentAccountDataCopyButton.setVisible(!model.isPaymentAccountDataEmpty()); + + btcPaymentAddressDetailsLabel.getStyleClass().clear(); + btcPaymentAddressDetailsLabel.getStyleClass().add(model.isBtcPaymentDataEmpty() + ? "text-fill-grey-dimmed" + : "text-fill-white"); + btcPaymentAddressDetailsLabel.getStyleClass().add("normal-text"); + paymentAccountDataLabel.getStyleClass().clear(); + paymentAccountDataLabel.getStyleClass().add(model.isPaymentAccountDataEmpty() + ? "text-fill-grey-dimmed" + : "text-fill-white"); + paymentAccountDataLabel.getStyleClass().add("normal-text"); + + closeButton.setOnAction(e -> controller.onClose()); + tradersAndRoleCopyButton.setOnAction(e -> ClipboardUtil.copyToClipboard(model.getPeer())); + tradeIdCopyButton.setOnAction(e -> ClipboardUtil.copyToClipboard(model.getTradeId())); + peerNetworkAddressCopyButton.setOnAction(e -> ClipboardUtil.copyToClipboard(model.getPeerNetworkAddress())); + btcPaymentAddressCopyButton.setOnAction(e -> ClipboardUtil.copyToClipboard(model.getBtcPaymentAddress())); + paymentAccountDataCopyButton.setOnAction(e -> ClipboardUtil.copyToClipboard(model.getPaymentAccountData())); } - private CopyOnClickLabel createCopyOnClickLabel(String style) { - CopyOnClickLabel text = new CopyOnClickLabel(""); - text.getStyleClass().add(style); - return text; + @Override + protected void onViewDetached() { + closeButton.setOnAction(null); + tradersAndRoleCopyButton.setOnAction(null); + tradeIdCopyButton.setOnAction(null); + peerNetworkAddressCopyButton.setOnAction(null); + btcPaymentAddressCopyButton.setOnAction(null); + paymentAccountDataCopyButton.setOnAction(null); } private Region getLine() { @@ -286,4 +296,4 @@ private Region getLine() { line.setPadding(new Insets(9, 0, 8, 0)); return line; } -} \ No newline at end of file +} diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/chat/message_container/sidebar/UserProfileSidebar.java b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/chat/message_container/sidebar/UserProfileSidebar.java index 60f567471d..b275abb3a0 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/chat/message_container/sidebar/UserProfileSidebar.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/main/content/chat/message_container/sidebar/UserProfileSidebar.java @@ -104,7 +104,7 @@ private static class Controller implements bisq.desktop.common.view.Controller { private final ReputationService reputationService; private final Runnable closeHandler; private final BannedUserService bannedUserService; - private UIScheduler livenessUpateScheduler; + private UIScheduler livenessUpdateScheduler; private Controller(ServiceProvider serviceProvider, UserProfile userProfile, @@ -143,11 +143,11 @@ public void onActivate() { .map(TimeFormatter::formatAgeInDays) .orElse(Res.get("data.na"))); - if (livenessUpateScheduler != null) { - livenessUpateScheduler.stop(); - livenessUpateScheduler = null; + if (livenessUpdateScheduler != null) { + livenessUpdateScheduler.stop(); + livenessUpdateScheduler = null; } - livenessUpateScheduler = UIScheduler.run(() -> { + livenessUpdateScheduler = UIScheduler.run(() -> { long publishDate = userProfile.getPublishDate(); if (publishDate == 0) { model.getLivenessState().set(Res.get("data.na")); @@ -171,9 +171,9 @@ public void onActivate() { @Override public void onDeactivate() { - if (livenessUpateScheduler != null) { - livenessUpateScheduler.stop(); - livenessUpateScheduler = null; + if (livenessUpdateScheduler != null) { + livenessUpdateScheduler.stop(); + livenessUpdateScheduler = null; } model.setCatHashImage(null); } diff --git a/apps/desktop/desktop/src/main/java/bisq/desktop/overlay/chat_rules/ChatRulesController.java b/apps/desktop/desktop/src/main/java/bisq/desktop/overlay/chat_rules/ChatRulesController.java index 5c4fa74f66..9c611e7e9d 100644 --- a/apps/desktop/desktop/src/main/java/bisq/desktop/overlay/chat_rules/ChatRulesController.java +++ b/apps/desktop/desktop/src/main/java/bisq/desktop/overlay/chat_rules/ChatRulesController.java @@ -23,9 +23,9 @@ import lombok.Getter; import lombok.extern.slf4j.Slf4j; +@Getter @Slf4j public class ChatRulesController implements Controller { - @Getter private final ChatRulesView view; public ChatRulesController(ServiceProvider serviceProvider) { diff --git a/apps/desktop/desktop/src/main/resources/css/bisq_easy.css b/apps/desktop/desktop/src/main/resources/css/bisq_easy.css index dc73cb766d..d66f34cc63 100644 --- a/apps/desktop/desktop/src/main/resources/css/bisq_easy.css +++ b/apps/desktop/desktop/src/main/resources/css/bisq_easy.css @@ -1254,6 +1254,7 @@ -fx-background-color: -bisq-dark-grey-20; } + /******************************************************************************* * * * Mediator view * @@ -1275,50 +1276,3 @@ -fx-border-radius: 0; -fx-border-insets: 0 0 -7.5 0; } - -/******************************************************************************* - * * - * Trade details * - * * - ******************************************************************************/ - -.trade-details-headline { - -fx-fill: -fx-light-text-color; - -fx-text-fill: -fx-light-text-color; - -fx-font-size: 2.3em; - -fx-font-family: "IBM Plex Sans Light"; -} - -.trade-details-medium-light { - -fx-fill: -fx-light-text-color; - -fx-text-fill: -fx-light-text-color; - -fx-font-size: 1.4em; - -fx-font-family: "IBM Plex Sans Light"; -} - -.trade-details-small-grey { - -fx-fill: -fx-mid-text-color; - -fx-text-fill: -fx-mid-text-color; - -fx-font-size: 0.9em; - -fx-font-family: "IBM Plex Sans Light"; -} - -.trade-details-large-light { - -fx-fill: -fx-light-text-color; - -fx-text-fill: -fx-light-text-color; - -fx-font-family: "IBM Plex Sans Light"; - -fx-font-size: 1.7em; -} - -.trade-details-medium-grey { - -fx-fill: -fx-mid-text-color; - -fx-text-fill: -fx-mid-text-color; - -fx-font-family: "IBM Plex Sans Light"; - -fx-font-size: 1.3em; -} - -.trade-details-close-button-row { - -fx-background-color: -bisq-dark-grey-20; - -fx-min-height: 50; - -fx-max-height: 50; -} diff --git a/i18n/src/main/resources/bisq_easy.properties b/i18n/src/main/resources/bisq_easy.properties index c60bfcf949..130a82f7e8 100644 --- a/i18n/src/main/resources/bisq_easy.properties +++ b/i18n/src/main/resources/bisq_easy.properties @@ -324,7 +324,9 @@ bisqEasy.tradeWizard.review.table.price=Price in {0} bisqEasy.tradeWizard.review.table.reputation=Reputation bisqEasy.tradeWizard.review.chatMessage.fixPrice={0} bisqEasy.tradeWizard.review.chatMessage.floatPrice.above={0} above market price +bisqEasy.tradeWizard.review.chatMessage.floatPrice.plus=+{0} bisqEasy.tradeWizard.review.chatMessage.floatPrice.below={0} below market price +bisqEasy.tradeWizard.review.chatMessage.floatPrice.minus=-{0} bisqEasy.tradeWizard.review.chatMessage.marketPrice=Market price bisqEasy.tradeWizard.review.chatMessage.price=Price: bisqEasy.tradeWizard.review.chatMessage.peerMessage.sell=Sell Bitcoin to {0}\n\ @@ -649,24 +651,29 @@ bisqEasy.openTrades.chat.peerLeft.subHeadline=If the trade is not completed on y bisqEasy.openTrades.tradeDetails.open=Open trade details bisqEasy.openTrades.tradeDetails.headline=Trade Details -bisqEasy.openTrades.tradeDetails.processSection=Process Information -bisqEasy.openTrades.tradeDetails.processDescription=This section contains information that will be filled out during the trade process. -bisqEasy.openTrades.tradeDetails.myRole=MY ROLE -bisqEasy.openTrades.tradeDetails.amount=AMOUNT -bisqEasy.openTrades.tradeDetails.paymentMethod=PAYMENT METHOD -bisqEasy.openTrades.tradeDetails.buyBtc=Buying BTC -bisqEasy.openTrades.tradeDetails.sellBtc=Selling BTC -bisqEasy.openTrades.tradeDetails.tradePrice=Trade price -bisqEasy.openTrades.tradeDetails.marketPrice=market price -bisqEasy.openTrades.tradeDetails.fixedPrice=fixed price -bisqEasy.openTrades.tradeDetails.aboveMarketPrice={0} above market price -bisqEasy.openTrades.tradeDetails.belowMarketPrice={0} below market price +bisqEasy.openTrades.tradeDetails.tradeDate=Trade date +bisqEasy.openTrades.tradeDetails.tradersAndRole=Traders / Role +bisqEasy.openTrades.tradeDetails.tradersAndRole.me=Me: +bisqEasy.openTrades.tradeDetails.tradersAndRole.peer=Peer: +bisqEasy.openTrades.tradeDetails.tradersAndRole.copy=Copy peer username +bisqEasy.openTrades.tradeDetails.offerTypeAndMarket=Offer type / Market +bisqEasy.openTrades.tradeDetails.offerTypeAndMarket.buyOffer=Buy offer +bisqEasy.openTrades.tradeDetails.offerTypeAndMarket.sellOffer=Sell offer +bisqEasy.openTrades.tradeDetails.offerTypeAndMarket.fiatMarket={0} market +bisqEasy.openTrades.tradeDetails.amountAndPrice=Amount @ Price +bisqEasy.openTrades.tradeDetails.paymentAndSettlementMethods=Payment methods +bisqEasy.openTrades.tradeDetails.tradeId=Trade ID +bisqEasy.openTrades.tradeDetails.tradeId.copy=Copy trade ID +bisqEasy.openTrades.tradeDetails.peerNetworkAddress=Peer network address +bisqEasy.openTrades.tradeDetails.peerNetworkAddress.copy=Copy peer network address bisqEasy.openTrades.tradeDetails.btcPaymentAddress=BTC payment address +bisqEasy.openTrades.tradeDetails.lightningInvoice=Lighting invoice +bisqEasy.openTrades.tradeDetails.btcPaymentAddress.copy=Copy BTC payment address +bisqEasy.openTrades.tradeDetails.lightningInvoice.copy=Copy lighting invoice bisqEasy.openTrades.tradeDetails.paymentAccountData=Payment account data -bisqEasy.openTrades.tradeDetails.peerUsername=Peer username -bisqEasy.openTrades.tradeDetails.offerTakenDate=Trade date -bisqEasy.openTrades.tradeDetails.peerNetworkAddress=Peer network address -bisqEasy.openTrades.tradeDetails.selectedMediator=Selected mediator +bisqEasy.openTrades.tradeDetails.paymentAccountData.copy=Copy payment account data +bisqEasy.openTrades.tradeDetails.assignedMediator=Assigned mediator +bisqEasy.openTrades.tradeDetails.dataNotYetProvided=Data not yet provided ######################################################