2 Commits

Author SHA1 Message Date
davide e4d856c4b1 feat(ui): add bug report button in Help overlay and GitHub issue template
Adds a "Report a bug" button in Help → Info that opens the GitHub
new-issue page directly in the system browser (via TopLevel.Launcher,
cross-platform on desktop and Android).

Adds .github/ISSUE_TEMPLATE/bug_report.yml — a structured issue form
that collects version, platform, network, repro steps, expected vs
actual behavior, and logs before submission.
2026-06-24 15:29:53 +02:00
davide 61b3d5e25b 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.
2026-06-24 15:25:35 +02:00
5 changed files with 135 additions and 24 deletions
+91
View File
@@ -0,0 +1,91 @@
name: Bug Report
description: Report a problem with Palladium Wallet
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
Thanks for taking the time to report a bug.
Please fill in every section — incomplete reports are hard to reproduce and may be closed.
- type: input
id: version
attributes:
label: Wallet version
description: Shown in Help → Info (e.g. `1.0.0`).
placeholder: "1.0.0"
validations:
required: true
- type: dropdown
id: platform
attributes:
label: Platform
options:
- Windows
- Linux
- Android
validations:
required: true
- type: dropdown
id: network
attributes:
label: Network
options:
- Mainnet
- Testnet
- Regtest
validations:
required: true
- type: textarea
id: description
attributes:
label: What happened?
description: Describe the bug clearly and concisely. What did you see? What did you expect?
placeholder: "When I click … the wallet shows … instead of …"
validations:
required: true
- type: textarea
id: steps
attributes:
label: Steps to reproduce
description: Numbered steps that reliably trigger the bug.
placeholder: |
1. Open the wallet
2. Go to …
3. Click …
4. Observe …
validations:
required: true
- type: textarea
id: expected
attributes:
label: Expected behavior
description: What should have happened instead?
validations:
required: true
- type: textarea
id: logs
attributes:
label: Logs / error messages
description: |
Paste any error dialogs, crash messages, or relevant log output.
Leave blank if none.
render: text
validations:
required: false
- type: checkboxes
id: checklist
attributes:
label: Before submitting
options:
- label: I searched existing issues and this is not a duplicate
required: true
- label: I reproduced this on the latest available version
required: false
+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://github.com/davide3011/PalladiumWallet/issues/new?assignees=&labels=bug&template=bug_report.yml"));
}
// 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)
{ {