Layout changes, fix bugs in new entry page

This commit is contained in:
2025-12-22 17:23:21 +00:00
parent 63b545c7a3
commit 45d543498f
20 changed files with 779 additions and 192 deletions

View File

@@ -0,0 +1,107 @@
import 'package:flutter/material.dart';
import 'package:mileograph_flutter/services/data_service.dart';
import 'package:provider/provider.dart';
class LatestLocoChangesPanel extends StatefulWidget {
const LatestLocoChangesPanel({super.key});
@override
State<LatestLocoChangesPanel> createState() => _LatestLocoChangesPanelState();
}
class _LatestLocoChangesPanelState extends State<LatestLocoChangesPanel> {
late final ScrollController _controller;
@override
void initState() {
super.initState();
_controller = ScrollController();
}
@override
void dispose() {
_controller.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
final data = context.watch<DataService>();
final changes = data.latestLocoChanges;
final isLoading = data.isLatestLocoChangesLoading;
final textTheme = Theme.of(context).textTheme;
return Card(
clipBehavior: Clip.antiAlias,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'Latest loco changes',
style: textTheme.titleMedium?.copyWith(fontWeight: FontWeight.w700),
),
const SizedBox(height: 8),
if (isLoading && changes.isEmpty)
const Padding(
padding: EdgeInsets.all(12.0),
child: Center(child: CircularProgressIndicator()),
)
else if (changes.isEmpty)
Padding(
padding: const EdgeInsets.symmetric(vertical: 8.0),
child: Text(
'No recent loco changes yet.',
style: textTheme.bodyMedium,
),
)
else
SizedBox(
height: 260,
child: Scrollbar(
controller: _controller,
child: ListView.separated(
controller: _controller,
itemCount: changes.length,
separatorBuilder: (_, __) => const Divider(height: 1),
itemBuilder: (context, index) {
final change = changes[index];
return ListTile(
dense: true,
contentPadding: EdgeInsets.zero,
title: Text(
change.locoLabel,
style: textTheme.titleSmall?.copyWith(
fontWeight: FontWeight.w600,
),
),
subtitle: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('${change.changeLabel}: ${change.valueLabel}'),
Text(
change.approvedDateLabel,
style: textTheme.labelSmall?.copyWith(
color: textTheme.bodySmall?.color?.withValues(alpha: 0.7),
),
),
],
),
trailing: change.approvedBy.isEmpty
? null
: Text(
change.approvedBy,
style: textTheme.labelSmall,
),
);
},
),
),
),
],
),
),
);
}
}

View File

@@ -16,23 +16,24 @@ class LeaderboardPanel extends StatelessWidget {
child: Center(child: CircularProgressIndicator()),
);
}
return Padding(
padding: const EdgeInsets.all(10.0),
child: Card(
return Card(
clipBehavior: Clip.antiAlias,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
"Leaderboard",
style: TextStyle(
fontSize: 24,
fontSize: 18,
fontWeight: FontWeight.bold,
decoration: TextDecoration.underline,
),
),
const SizedBox(height: 8),
if (leaderboard.isEmpty)
const Padding(
padding: EdgeInsets.all(16.0),
padding: EdgeInsets.all(8.0),
child: Text('No leaderboard data yet'),
)
else
@@ -46,7 +47,7 @@ class LeaderboardPanel extends StatelessWidget {
margin: const EdgeInsets.symmetric(
horizontal: 0, vertical: 8),
child: Padding(
padding: const EdgeInsets.all(8),
padding: const EdgeInsets.symmetric(vertical: 6),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [

View File

@@ -17,23 +17,24 @@ class TopTractionPanel extends StatelessWidget {
child: Center(child: CircularProgressIndicator()),
);
}
return Padding(
padding: const EdgeInsets.all(10.0),
child: Card(
return Card(
clipBehavior: Clip.antiAlias,
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
"Top Traction",
style: TextStyle(
fontSize: 24,
fontSize: 18,
fontWeight: FontWeight.bold,
decoration: TextDecoration.underline,
),
),
const SizedBox(height: 8),
if (locos.isEmpty)
const Padding(
padding: EdgeInsets.all(16.0),
padding: EdgeInsets.all(8.0),
child: Text('No traction data yet'),
)
else
@@ -47,7 +48,7 @@ class TopTractionPanel extends StatelessWidget {
margin:
const EdgeInsets.symmetric(horizontal: 0, vertical: 8),
child: Padding(
padding: const EdgeInsets.all(8),
padding: const EdgeInsets.symmetric(vertical: 6),
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [