Merge pull request 'SEND044' (#429) from SEND044 into main
All checks were successful
ci/woodpecker/push/frontend Pipeline was successful

Reviewed-on: #429
This commit was merged in pull request #429.
This commit is contained in:
2026-02-05 12:53:54 +00:00
10 changed files with 38 additions and 44 deletions

View File

@@ -1 +0,0 @@
enum RecipientFilter { all, ready, registered, notRegistered }

View File

@@ -104,6 +104,11 @@ RouteBase payoutShellRoute() => ShellRoute(
wallet, wallet,
returnTo: PayoutDestination.dashboard, returnTo: PayoutDestination.dashboard,
), ),
onWalletTap: (wallet) => _openWalletEdit(
context,
wallet,
returnTo: PayoutDestination.dashboard,
),
), ),
), ),
), ),
@@ -120,10 +125,8 @@ RouteBase payoutShellRoute() => ShellRoute(
returnTo: PayoutDestination.recipients, returnTo: PayoutDestination.recipients,
), ),
onAddRecipient: () => _openAddRecipient(context), onAddRecipient: () => _openAddRecipient(context),
onEditRecipient: (recipient) => _openAddRecipient( onEditRecipient: (recipient) =>
context, _openAddRecipient(context, recipient: recipient),
recipient: recipient,
),
onDeleteRecipient: (recipient) async { onDeleteRecipient: (recipient) async {
final confirmed = await showConfirmationDialog( final confirmed = await showConfirmationDialog(
context: context, context: context,
@@ -192,22 +195,13 @@ RouteBase payoutShellRoute() => ShellRoute(
GoRoute( GoRoute(
name: PayoutRoutes.reports, name: PayoutRoutes.reports,
path: PayoutRoutes.reportsPath, path: PayoutRoutes.reportsPath,
pageBuilder: (_, _) => const NoTransitionPage( pageBuilder: (_, _) =>
child: OperationHistoryPage(), const NoTransitionPage(child: OperationHistoryPage()),
),
), ),
GoRoute( GoRoute(
name: PayoutRoutes.methods, name: PayoutRoutes.methods,
path: PayoutRoutes.methodsPath, path: PayoutRoutes.methodsPath,
pageBuilder: (context, _) => NoTransitionPage( redirect: (_, state) => PayoutRoutes.dashboardPath,
child: PaymentConfigPage(
onWalletTap: (wallet) => _openWalletEdit(
context,
wallet,
returnTo: PayoutDestination.methods,
),
),
),
), ),
GoRoute( GoRoute(
name: PayoutRoutes.editWallet, name: PayoutRoutes.editWallet,

View File

@@ -422,7 +422,7 @@
"selectPaymentType": "Please select a payment method type", "selectPaymentType": "Please select a payment method type",
"paymentTypeCard": "Russian bank card", "paymentTypeCard": "Russian bank card",
"paymentTypeBankAccount": "Russian Bank Account", "paymentTypeBankAccount": "Russian bank account",
"paymentTypeIban": "IBAN", "paymentTypeIban": "IBAN",
"paymentTypeWallet": "Wallet", "paymentTypeWallet": "Wallet",
"paymentTypeCryptoWallet": "Crypto Wallet", "paymentTypeCryptoWallet": "Crypto Wallet",

View File

@@ -15,10 +15,12 @@ import 'package:pweb/generated/i18n/app_localizations.dart';
class BalanceWidget extends StatelessWidget { class BalanceWidget extends StatelessWidget {
final ValueChanged<Wallet> onTopUp; final ValueChanged<Wallet> onTopUp;
final ValueChanged<Wallet> onWalletTap;
const BalanceWidget({ const BalanceWidget({
super.key, super.key,
required this.onTopUp, required this.onTopUp,
required this.onWalletTap,
}); });
@override @override
@@ -74,6 +76,7 @@ class BalanceWidget extends StatelessWidget {
} }
}, },
onTopUp: onTopUp, onTopUp: onTopUp,
onWalletTap: onWalletTap,
); );
if (wallets.isEmpty && accounts.isEmpty) { if (wallets.isEmpty && accounts.isEmpty) {

View File

@@ -19,11 +19,13 @@ import 'package:pweb/generated/i18n/app_localizations.dart';
class WalletCard extends StatelessWidget { class WalletCard extends StatelessWidget {
final Wallet wallet; final Wallet wallet;
final VoidCallback onTopUp; final VoidCallback onTopUp;
final VoidCallback onTap;
const WalletCard({ const WalletCard({
super.key, super.key,
required this.wallet, required this.wallet,
required this.onTopUp, required this.onTopUp,
required this.onTap,
}); });
@override @override
@@ -40,6 +42,9 @@ class WalletCard extends StatelessWidget {
shape: RoundedRectangleBorder( shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(WalletCardConfig.borderRadius), borderRadius: BorderRadius.circular(WalletCardConfig.borderRadius),
), ),
child: InkWell(
borderRadius: BorderRadius.circular(WalletCardConfig.borderRadius),
onTap: onTap,
child: SizedBox.expand( child: SizedBox.expand(
child: Padding( child: Padding(
padding: WalletCardConfig.contentPadding, padding: WalletCardConfig.contentPadding,
@@ -70,7 +75,7 @@ class WalletCard extends StatelessWidget {
), ),
), ),
), ),
),
); );
} }
} }

View File

@@ -16,6 +16,7 @@ class BalanceCarousel extends StatefulWidget {
final int currentIndex; final int currentIndex;
final ValueChanged<int> onIndexChanged; final ValueChanged<int> onIndexChanged;
final ValueChanged<Wallet> onTopUp; final ValueChanged<Wallet> onTopUp;
final ValueChanged<Wallet> onWalletTap;
const BalanceCarousel({ const BalanceCarousel({
super.key, super.key,
@@ -23,6 +24,7 @@ class BalanceCarousel extends StatefulWidget {
required this.currentIndex, required this.currentIndex,
required this.onIndexChanged, required this.onIndexChanged,
required this.onTopUp, required this.onTopUp,
required this.onWalletTap,
}); });
@override @override
@@ -101,6 +103,7 @@ class _BalanceCarouselState extends State<BalanceCarousel> {
BalanceItemType.wallet => WalletCard( BalanceItemType.wallet => WalletCard(
wallet: item.wallet!, wallet: item.wallet!,
onTopUp: () => widget.onTopUp(item.wallet!), onTopUp: () => widget.onTopUp(item.wallet!),
onTap: () => widget.onWalletTap(item.wallet!),
), ),
BalanceItemType.ledger => LedgerAccountCard(account: item.account!), BalanceItemType.ledger => LedgerAccountCard(account: item.account!),
BalanceItemType.addAction => const AddBalanceCard(), BalanceItemType.addAction => const AddBalanceCard(),

View File

@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
abstract class WalletCardConfig { abstract class WalletCardConfig {
static const double cardHeight = 130.0; static const double cardHeight = 145.0;
static const double elevation = 4.0; static const double elevation = 4.0;
static const double borderRadius = 16.0; static const double borderRadius = 16.0;
static const double viewportFraction = 0.9; static const double viewportFraction = 0.9;

View File

@@ -27,12 +27,14 @@ class DashboardPage extends StatefulWidget {
final ValueChanged<Recipient> onRecipientSelected; final ValueChanged<Recipient> onRecipientSelected;
final void Function(PaymentType type) onGoToPaymentWithoutRecipient; final void Function(PaymentType type) onGoToPaymentWithoutRecipient;
final ValueChanged<Wallet> onTopUp; final ValueChanged<Wallet> onTopUp;
final ValueChanged<Wallet> onWalletTap;
const DashboardPage({ const DashboardPage({
super.key, super.key,
required this.onRecipientSelected, required this.onRecipientSelected,
required this.onGoToPaymentWithoutRecipient, required this.onGoToPaymentWithoutRecipient,
required this.onTopUp, required this.onTopUp,
required this.onWalletTap,
}); });
@override @override
@@ -88,6 +90,7 @@ class _DashboardPageState extends State<DashboardPage> {
create: (_) => CarouselIndexController(), create: (_) => CarouselIndexController(),
child: BalanceWidget( child: BalanceWidget(
onTopUp: widget.onTopUp, onTopUp: widget.onTopUp,
onWalletTap: widget.onWalletTap,
), ),
), ),
const SizedBox(height: AppSpacing.small), const SizedBox(height: AppSpacing.small),

View File

@@ -1,25 +1,11 @@
import 'package:pshared/models/recipient/filter.dart';
import 'package:pshared/models/recipient/recipient.dart'; import 'package:pshared/models/recipient/recipient.dart';
import 'package:pshared/models/recipient/status.dart';
List<Recipient> filterRecipients({ List<Recipient> filterRecipients({
required List<Recipient> recipients, required List<Recipient> recipients,
RecipientFilter filter = RecipientFilter.all,
String query = '', String query = '',
}) { }) {
var filtered = recipients.where((r) { final filtered = recipients;
switch (filter) {
case RecipientFilter.ready:
return r.status == RecipientStatus.ready;
case RecipientFilter.registered:
return r.status == RecipientStatus.registered;
case RecipientFilter.notRegistered:
return r.status == RecipientStatus.notRegistered;
case RecipientFilter.all:
return true;
}
}).toList();
final normalizedQuery = query.trim().toLowerCase(); final normalizedQuery = query.trim().toLowerCase();
if (normalizedQuery.isEmpty) return filtered; if (normalizedQuery.isEmpty) return filtered;

View File

@@ -28,7 +28,6 @@ class PayoutSidebar extends StatelessWidget {
final String? avatarUrl; final String? avatarUrl;
final List<PayoutDestination>? items; final List<PayoutDestination>? items;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final accountName = context.select<AccountProvider, String?>( final accountName = context.select<AccountProvider, String?>(
@@ -40,13 +39,15 @@ class PayoutSidebar extends StatelessWidget {
final resolvedUserName = userName ?? accountName; final resolvedUserName = userName ?? accountName;
final resolvedAvatarUrl = avatarUrl ?? accountAvatar; final resolvedAvatarUrl = avatarUrl ?? accountAvatar;
final menuItems = items ?? final menuItems =
items ??
<PayoutDestination>[ <PayoutDestination>[
PayoutDestination.dashboard, PayoutDestination.dashboard,
PayoutDestination.recipients, PayoutDestination.recipients,
PayoutDestination.invitations, PayoutDestination.invitations,
PayoutDestination.methods, // PayoutDestination.methods,
//PayoutDestination.reports, // PayoutDestination.reports,
// PayoutDestination.organizationSettings,
//TODO Add when ready //TODO Add when ready
]; ];
@@ -60,7 +61,7 @@ class PayoutSidebar extends StatelessWidget {
avatarUrl: resolvedAvatarUrl, avatarUrl: resolvedAvatarUrl,
userName: resolvedUserName, userName: resolvedUserName,
selected: selected, selected: selected,
onSelected: onSelected onSelected: onSelected,
), ),
const SizedBox(height: 8), const SizedBox(height: 8),
SideMenuColumn( SideMenuColumn(