2 Commits

Author SHA1 Message Date
davide bcc74a4704 feat(ui): add bug report button in Help and Gitea issue template
Adds a "Report a bug" / "Segnala un bug" button (6 languages) in
Help → Info that opens the repository issue tracker in the system
browser via TopLevel.Launcher (cross-platform: desktop + Android).

Adds .gitea/ISSUE_TEMPLATE/bug_report.md — Gitea-compatible markdown
template with pre-filled sections for version, platform, network,
repro steps, expected behavior, and logs.
2026-06-24 15:38:01 +02:00
davide 068d85e0e2 feat(ui): show full tx inputs/outputs in detail overlay without truncation
Input rows switch to a two-line layout (full prev-txid:index on the first
line, address + amount on the second) so nothing is cut by a fixed 160px
column. Output address column gets TextWrapping instead of TextTrimming.
Overlay grows to MaxWidth=660/MaxHeight=800 for better desktop use; the
same XAML wraps naturally on narrow mobile screens.
Removes the Shorten() helper that was masking input references.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-24 15:37:43 +02:00
5 changed files with 85 additions and 24 deletions
+41
View File
@@ -0,0 +1,41 @@
---
name: Bug Report
about: Report a problem with Palladium Wallet
title: "[BUG] "
labels: bug
---
## Wallet version
<!-- Shown in Help → Info, e.g. 1.0.0 -->
## Platform
<!-- Windows / Linux / Android -->
## Network
<!-- Mainnet / Testnet / Regtest -->
## What happened?
<!-- Describe the bug clearly. What did you see? What did you expect? -->
## Steps to reproduce
1.
2.
3.
## Expected behavior
<!-- What should have happened instead? -->
## Logs / error messages
<!-- Paste any error dialogs, crash messages, or stack traces. Leave blank if none. -->
```
```
## Checklist
- [ ] I searched existing issues and this is not a duplicate
- [ ] I reproduced this on the latest available version
+1
View File
@@ -62,6 +62,7 @@ public sealed class Loc
"SPV-Wallet für die Kryptowährung Palladium (PLM)."], "SPV-Wallet für die Kryptowährung Palladium (PLM)."],
["help.tab.info"] = ["Info", "Info", "Info", "Info", "Info", "Info"], ["help.tab.info"] = ["Info", "Info", "Info", "Info", "Info", "Info"],
["help.tab.donate"] = ["Dona", "Donate", "Donar", "Faire un don", "Doar", "Spenden"], ["help.tab.donate"] = ["Dona", "Donate", "Donar", "Faire un don", "Doar", "Spenden"],
["help.bug.report"] = ["Segnala un bug", "Report a bug", "Informar un error", "Signaler un bug", "Reportar um bug", "Fehler melden"],
["donate.desc"] = [ ["donate.desc"] = [
"Se questo wallet ti è utile, considera una piccola donazione allo sviluppatore.", "Se questo wallet ti è utile, considera una piccola donazione allo sviluppatore.",
"If you find this wallet useful, consider a small donation to the developer.", "If you find this wallet useful, consider a small donation to the developer.",
@@ -63,7 +63,7 @@ public sealed class TransactionDetailsViewModel
LockTimeText = d.LockTime.ToString(); LockTimeText = d.LockTime.ToString();
RbfText = loc[d.RbfSignaled ? "tx.yes" : "tx.no"]; RbfText = loc[d.RbfSignaled ? "tx.yes" : "tx.no"];
Inputs = new ObservableCollection<TxIoRow>(d.Inputs.Select((i, n) => new TxIoRow( Inputs = new ObservableCollection<TxIoRow>(d.Inputs.Select((i, n) => new TxIoRow(
i.IsCoinbase ? loc["tx.coinbase"] : $"{Shorten(i.PrevTxid)}:{i.PrevIndex}", i.IsCoinbase ? loc["tx.coinbase"] : $"{i.PrevTxid}:{i.PrevIndex}",
i.IsCoinbase ? loc["tx.coinbase.newcoins"] : i.Address ?? "—", i.IsCoinbase ? loc["tx.coinbase.newcoins"] : i.Address ?? "—",
i.AmountSats is { } a ? CoinAmount.FormatIn(a, unit) : "—", i.AmountSats is { } a ? CoinAmount.FormatIn(a, unit) : "—",
i.IsMine))); i.IsMine)));
@@ -108,7 +108,4 @@ public sealed class TransactionDetailsViewModel
} }
private string Abs(long sats) => CoinAmount.FormatIn(Math.Abs(sats), _unit); private string Abs(long sats) => CoinAmount.FormatIn(Math.Abs(sats), _unit);
private static string Shorten(string txid) =>
txid.Length > 16 ? $"{txid[..8]}…{txid[^4..]}" : txid;
} }
+33 -20
View File
@@ -1014,7 +1014,7 @@
IsVisible="{Binding IsTxDetailsOpen}"> IsVisible="{Binding IsTxDetailsOpen}">
<Border Background="{DynamicResource OverlayCardBrush}" <Border Background="{DynamicResource OverlayCardBrush}"
BorderBrush="{DynamicResource BorderSubtleBrush}" BorderThickness="1" CornerRadius="8" BorderBrush="{DynamicResource BorderSubtleBrush}" BorderThickness="1" CornerRadius="8"
MaxWidth="540" MaxHeight="600" Margin="16" Padding="0" MaxWidth="660" MaxHeight="800" Margin="16" Padding="0"
HorizontalAlignment="Center" VerticalAlignment="Center"> HorizontalAlignment="Center" VerticalAlignment="Center">
<Panel Margin="24"> <Panel Margin="24">
@@ -1135,38 +1135,48 @@
</Border> </Border>
<TextBlock Classes="section" Text="{Binding Loc[tx.inputs]}"/> <TextBlock Classes="section" Text="{Binding Loc[tx.inputs]}"/>
<Border Classes="card" Padding="14,6"> <Border Classes="card" Padding="14,4">
<ItemsControl ItemsSource="{Binding Inputs}"> <ItemsControl ItemsSource="{Binding Inputs}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:TxIoRow"> <DataTemplate x:DataType="vm:TxIoRow">
<Grid ColumnDefinitions="160,*,Auto" Margin="0,4"> <!-- Two-line layout: txid ref on first line, address+amount on second -->
<TextBlock Grid.Column="0" Text="{Binding Position}" <StackPanel Margin="0,6,0,4">
FontFamily="monospace" FontSize="11" Foreground="{DynamicResource TextMutedBrush}" <SelectableTextBlock Text="{Binding Position}"
TextTrimming="CharacterEllipsis" Margin="0,0,8,0"/> FontFamily="monospace" FontSize="10"
<TextBlock Grid.Column="1" Text="{Binding Address}" Foreground="{DynamicResource TextMutedBrush}"
FontFamily="monospace" FontSize="11" TextTrimming="CharacterEllipsis" TextWrapping="Wrap"/>
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/> <Grid ColumnDefinitions="*,Auto" Margin="0,2,0,0">
<TextBlock Grid.Column="2" Text="{Binding Amount}" <SelectableTextBlock Grid.Column="0" Text="{Binding Address}"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11" Margin="8,0,0,0"/> FontFamily="monospace" FontSize="11"
</Grid> TextWrapping="Wrap" VerticalAlignment="Top"
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/>
<SelectableTextBlock Grid.Column="1" Text="{Binding Amount}"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11"
VerticalAlignment="Top" Margin="12,0,0,0"/>
</Grid>
</StackPanel>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
</Border> </Border>
<TextBlock Classes="section" Text="{Binding Loc[tx.outputs]}"/> <TextBlock Classes="section" Text="{Binding Loc[tx.outputs]}"/>
<Border Classes="card" Padding="14,6"> <Border Classes="card" Padding="14,4">
<ItemsControl ItemsSource="{Binding Outputs}"> <ItemsControl ItemsSource="{Binding Outputs}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:TxIoRow"> <DataTemplate x:DataType="vm:TxIoRow">
<Grid ColumnDefinitions="44,*,Auto" Margin="0,4"> <Grid ColumnDefinitions="44,*,Auto" Margin="0,6">
<TextBlock Grid.Column="0" Text="{Binding Position}" <TextBlock Grid.Column="0" Text="{Binding Position}"
FontFamily="monospace" FontSize="11" Foreground="{DynamicResource TextMutedBrush}"/> FontFamily="monospace" FontSize="11"
<TextBlock Grid.Column="1" Text="{Binding Address}" Foreground="{DynamicResource TextMutedBrush}"
FontFamily="monospace" FontSize="11" TextTrimming="CharacterEllipsis" VerticalAlignment="Top"/>
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/> <SelectableTextBlock Grid.Column="1" Text="{Binding Address}"
<TextBlock Grid.Column="2" Text="{Binding Amount}" FontFamily="monospace" FontSize="11"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11" Margin="8,0,0,0"/> TextWrapping="Wrap" VerticalAlignment="Top"
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/>
<SelectableTextBlock Grid.Column="2" Text="{Binding Amount}"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11"
VerticalAlignment="Top" Margin="12,0,0,0"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
@@ -1545,6 +1555,9 @@
Foreground="{DynamicResource TextSecondaryBrush}"/> Foreground="{DynamicResource TextSecondaryBrush}"/>
</StackPanel> </StackPanel>
<TextBlock Text="{Binding Loc[help.info]}" TextWrapping="Wrap"/> <TextBlock Text="{Binding Loc[help.info]}" TextWrapping="Wrap"/>
<Button Content="{Binding Loc[help.bug.report]}"
Click="OnOpenBugReportClick"
HorizontalAlignment="Left"/>
<Border BorderBrush="{DynamicResource BorderSubtleBrush}" <Border BorderBrush="{DynamicResource BorderSubtleBrush}"
BorderThickness="0,1,0,0" Margin="0,4,0,0"/> BorderThickness="0,1,0,0" Margin="0,4,0,0"/>
<StackPanel Spacing="4"> <StackPanel Spacing="4">
+9
View File
@@ -1,3 +1,4 @@
using System;
using System.Linq; using System.Linq;
using Avalonia; using Avalonia;
using Avalonia.Controls; using Avalonia.Controls;
@@ -128,6 +129,14 @@ public partial class MainView : UserControl
vm.IsHelpOpen = false; vm.IsHelpOpen = false;
} }
private async void OnOpenBugReportClick(object? sender, RoutedEventArgs e)
{
var launcher = TopLevel.GetTopLevel(this)?.Launcher;
if (launcher is not null)
await launcher.LaunchUriAsync(new Uri(
"https://santantonio.sytes.net/davide/PalladiumWallet/issues/new"));
}
// Esc (desktop) or Back (Android) closes the topmost open overlay. // Esc (desktop) or Back (Android) closes the topmost open overlay.
protected override void OnKeyDown(KeyEventArgs e) protected override void OnKeyDown(KeyEventArgs e)
{ {