dashboard#1

This commit is contained in:
2025-11-20 17:45:29 +05:30
parent f0d5233afc
commit c1df43e9b6
3 changed files with 115 additions and 150 deletions

View File

@@ -97,8 +97,8 @@ class _AccountStatementScreen extends State<AccountStatementScreen> {
return; return;
} }
final now = DateTime.now(); final now = DateTime.now();
final maxToDate = fromDate!.add(const Duration(days: 31)).isBefore(now) final maxToDate = fromDate!.add(const Duration(days: 183)).isBefore(now)
? fromDate!.add(const Duration(days: 31)) ? fromDate!.add(const Duration(days: 183))
: now; : now;
final picked = await showDatePicker( final picked = await showDatePicker(
context: context, context: context,

View File

@@ -474,9 +474,12 @@ class _DashboardScreenState extends State<DashboardScreen>
// Quick Links // Quick Links
GridView.count( GridView.count(
crossAxisCount: 4, crossAxisCount: 2, // Changed to 2 for two cards in a row
shrinkWrap: true, shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
crossAxisSpacing: 10,
mainAxisSpacing: 10,
childAspectRatio: 1.2, // Adjusted for better fit with 2 cards
children: [ children: [
_buildQuickLink( _buildQuickLink(
Symbols.id_card, Symbols.id_card,
@@ -582,66 +585,6 @@ class _DashboardScreenState extends State<DashboardScreen>
], ],
), ),
const SizedBox(height: 5), const SizedBox(height: 5),
// Recent Transactions
Text(
AppLocalizations.of(context).recentTransactions,
style: const TextStyle(fontSize: 17),
),
const SizedBox(height: 16),
if (_txLoading)
..._buildTransactionShimmer()
else if (_transactions.isNotEmpty)
..._transactions.map(
(tx) => ListTile(
leading: Icon(
tx.type == 'CR'
? Symbols.call_received
: Symbols.call_made,
color: tx.type == 'CR'
? const Color(0xFF10BB10)
: theme.colorScheme.error,
),
title: Text(
tx.date ?? '',
style: const TextStyle(fontSize: 15),
),
subtitle: Text(
tx.name != null
? (tx.name!.length > 22
? tx.name!.substring(0, 22)
: tx.name!)
: '',
style: const TextStyle(fontSize: 12),
),
trailing: Text(
"${tx.amount}",
style: const TextStyle(fontSize: 17),
),
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) =>
TransactionDetailsScreen(transaction: tx),
),
);
},
),
)
else
Padding(
padding: const EdgeInsets.symmetric(vertical: 24.0),
child: Center(
child: Text(
AppLocalizations.of(context).noTransactions,
style: TextStyle(
fontSize: 16,
color: Theme.of(context).colorScheme.outline,
),
),
),
),
], ],
), ),
), ),
@@ -689,28 +632,39 @@ class _DashboardScreenState extends State<DashboardScreen>
bool disable = false, bool disable = false,
}) { }) {
final theme = Theme.of(context); final theme = Theme.of(context);
return InkWell( return Card(
onTap: disable ? null : onTap, elevation: 4,
child: Column( shape: RoundedRectangleBorder(
mainAxisSize: MainAxisSize.min, borderRadius: BorderRadius.circular(12.0),
children: [ ),
Icon( child: InkWell(
icon, onTap: disable ? null : onTap,
size: 30, borderRadius: BorderRadius.circular(12.0),
color: disable child: Column(
? theme.colorScheme.onSurface.withOpacity(0.3) mainAxisAlignment: MainAxisAlignment.center,
: theme.colorScheme.primary, children: [
grade: 200, Icon(
weight: 700, icon,
), size: 40,
const SizedBox(height: 4), color: disable
Text( ? theme.disabledColor
label, : theme.colorScheme.primary,
textAlign: TextAlign.center, ),
style: const TextStyle(fontSize: 13), const SizedBox(height: 8),
), Text(
], label,
textAlign: TextAlign.center,
style: theme.textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
color: disable
? theme.disabledColor
: theme.colorScheme.onSurface,
),
),
],
),
), ),
); );
} }
} }

View File

@@ -27,58 +27,54 @@ class _ServiceScreen extends State<ServiceScreen> {
), ),
body: Stack( body: Stack(
children: [ children: [
ListView( Padding(
children: [ padding: const EdgeInsets.symmetric(vertical: 16.0),
// ServiceManagementTile( child: Column(
// icon: Symbols.add, crossAxisAlignment: CrossAxisAlignment.stretch,
// label: AppLocalizations.of(context).accountOpeningDeposit, children: [
// onTap: () {}, Expanded(
// disabled: true, child: ServiceManagementTile(
// ), icon: Symbols.captive_portal,
// const Divider(height: 1), label: AppLocalizations.of(context).quickLinks,
// ServiceManagementTile( onTap: () {
// icon: Symbols.add, Navigator.of(context).push(
// label: AppLocalizations.of(context).accountOpeningLoan, MaterialPageRoute(
// onTap: () {}, builder: (context) => const QuickLinksScreen()),
// disabled: true, );
// ), },
// const Divider(height: 1), disabled: false,
ServiceManagementTile( ),
icon: Symbols.captive_portal, ),
label: AppLocalizations.of(context).quickLinks, const SizedBox(height: 16),
onTap: () { Expanded(
Navigator.of(context).push( child: ServiceManagementTile(
MaterialPageRoute( icon: Symbols.question_mark,
builder: (context) => const QuickLinksScreen()), label: AppLocalizations.of(context).faq,
); onTap: () {
}, Navigator.of(context).push(
disabled: false, MaterialPageRoute(builder: (context) => const FaqsScreen()),
), );
Divider(height: 1, color: Theme.of(context).dividerColor), },
ServiceManagementTile( disabled: false,
icon: Symbols.question_mark, ),
label: AppLocalizations.of(context).faq, ),
onTap: () { const SizedBox(height: 16),
Navigator.of(context).push( Expanded(
MaterialPageRoute(builder: (context) => const FaqsScreen()), child: ServiceManagementTile(
); icon: Symbols.location_pin,
}, label: "ATM Locator",
disabled: false, onTap: () {
), Navigator.push(
Divider(height: 1, color: Theme.of(context).dividerColor), context,
ServiceManagementTile( MaterialPageRoute(
icon: Symbols.location_pin, builder: (context) => const ATMLocatorScreen()));
label: "ATM Locator", },
onTap: () { disabled: false,
Navigator.push( ),
context, ),
MaterialPageRoute( // No Spacer() needed here as Expanded children will fill space
builder: (context) => const ATMLocatorScreen())); ],
}, ),
disabled: false,
),
Divider(height: 1, color: Theme.of(context).dividerColor),
],
), ),
IgnorePointer( IgnorePointer(
child: Center( child: Center(
@@ -117,23 +113,38 @@ class ServiceManagementTile extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final theme = Theme.of(context); final theme = Theme.of(context);
return ListTile( return Card(
leading: Icon( margin: const EdgeInsets.symmetric(horizontal: 16.0, vertical: 8.0),
icon, shape: RoundedRectangleBorder(
color: disabled ? theme.disabledColor : null, borderRadius: BorderRadius.circular(12.0),
), ),
title: Text( elevation: 4, // Add some elevation for better visual separation
label, child: InkWell(
style: TextStyle( onTap: disabled ? null : onTap, // Disable InkWell if the tile is disabled
color: disabled ? theme.disabledColor : null, borderRadius: BorderRadius.circular(12.0),
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 24.0, horizontal: 16.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(
icon,
size: 48, // Make icon larger
color: disabled ? theme.disabledColor : theme.colorScheme.primary,
),
const SizedBox(height: 12),
Text(
label,
textAlign: TextAlign.center,
style: theme.textTheme.titleLarge?.copyWith(
fontWeight: FontWeight.bold,
color: disabled ? theme.disabledColor : theme.colorScheme.onSurface,
),
),
],
),
), ),
), ),
trailing: Icon(
Symbols.arrow_right,
size: 20,
color: disabled ? theme.disabledColor : null,
),
onTap: disabled ? null : onTap,
); );
} }
} }