add filter by network for legs, add full export for traction
All checks were successful
Release / meta (push) Successful in 1m45s
Release / linux-build (push) Successful in 1m48s
Release / web-build (push) Successful in 1m56s
Release / android-build (push) Successful in 7m33s
Release / release-dev (push) Successful in 30s
Release / release-master (push) Successful in 5s

This commit is contained in:
2026-01-26 15:57:34 +00:00
parent 8340501f37
commit 94adf06726
9 changed files with 419 additions and 217 deletions

View File

@@ -1,5 +1,6 @@
import 'package:flutter/material.dart';
import 'package:mileograph_flutter/components/legs/leg_card.dart';
import 'package:mileograph_flutter/components/widgets/multi_select_filter.dart';
import 'package:mileograph_flutter/objects/objects.dart';
import 'package:mileograph_flutter/services/data_service.dart';
import 'package:mileograph_flutter/services/distance_unit_service.dart';
@@ -19,6 +20,9 @@ class _LegsPageState extends State<LegsPage> {
bool _initialised = false;
bool _unallocatedOnly = false;
bool _showMoreFilters = false;
bool _loadingNetworks = false;
List<String> _availableNetworks = [];
List<String> _selectedNetworks = [];
@override
void didChangeDependencies() {
@@ -26,9 +30,21 @@ class _LegsPageState extends State<LegsPage> {
if (!_initialised) {
_initialised = true;
_refreshLegs();
_loadNetworks();
}
}
Future<void> _loadNetworks() async {
setState(() => _loadingNetworks = true);
final data = context.read<DataService>();
await data.fetchStationNetworks();
if (!mounted) return;
setState(() {
_availableNetworks = data.stationNetworks;
_loadingNetworks = false;
});
}
Future<void> _refreshLegs() async {
final data = context.read<DataService>();
await data.fetchLegs(
@@ -36,6 +52,7 @@ class _LegsPageState extends State<LegsPage> {
dateRangeStart: _formatDate(_startDate),
dateRangeEnd: _formatDate(_endDate),
unallocatedOnly: _unallocatedOnly,
networkFilter: _selectedNetworks,
);
}
@@ -48,6 +65,7 @@ class _LegsPageState extends State<LegsPage> {
offset: data.legs.length,
append: true,
unallocatedOnly: _unallocatedOnly,
networkFilter: _selectedNetworks,
);
}
@@ -90,6 +108,7 @@ class _LegsPageState extends State<LegsPage> {
_sortDirection = 0;
_unallocatedOnly = false;
_showMoreFilters = false;
_selectedNetworks = [];
});
_refreshLegs();
}
@@ -209,6 +228,16 @@ class _LegsPageState extends State<LegsPage> {
spacing: 12,
runSpacing: 12,
children: [
MultiSelectFilter(
label: 'Networks',
options: _availableNetworks,
selected: _selectedNetworks,
onChanged: (vals) async {
setState(() => _selectedNetworks = vals);
await _refreshLegs();
},
onRefresh: _loadingNetworks ? null : _loadNetworks,
),
FilterChip(
avatar: const Icon(Icons.flash_off),
label: const Text('Unallocated only'),
@@ -218,6 +247,15 @@ class _LegsPageState extends State<LegsPage> {
await _refreshLegs();
},
),
if (_loadingNetworks)
const Padding(
padding: EdgeInsets.only(left: 8.0),
child: SizedBox(
height: 20,
width: 20,
child: CircularProgressIndicator(strokeWidth: 2),
),
),
],
),
),