release apk
All checks were successful
Release / meta (push) Successful in 24s
Release / linux-build (push) Successful in 1m15s
Release / android-build (push) Successful in 48m22s
Release / release-dev (push) Successful in 6s
Release / release-master (push) Successful in 59s

This commit is contained in:
2025-12-14 10:05:01 +00:00
parent f0dfbd185b
commit eb01cf0e8e
4 changed files with 195 additions and 100 deletions

View File

@@ -83,11 +83,16 @@ class _NewEntryPageState extends State<NewEntryPage> {
Widget _buildTripSelector(BuildContext context) {
final trips = context.watch<DataService>().tripList;
final sorted = [...trips]..sort((a, b) => b.tripId.compareTo(a.tripId));
final tripIds = sorted.map((t) => t.tripId).toSet();
final selectedValue =
(_selectedTripId != null && tripIds.contains(_selectedTripId))
? _selectedTripId
: null;
return Row(
children: [
Expanded(
child: DropdownButtonFormField<int>(
value: _selectedTripId,
child: DropdownButtonFormField<int?>(
value: selectedValue,
decoration: const InputDecoration(
labelText: 'Trip',
border: OutlineInputBorder(),
@@ -96,7 +101,7 @@ class _NewEntryPageState extends State<NewEntryPage> {
const DropdownMenuItem(value: null, child: Text('No trip')),
...sorted.map(
(t) =>
DropdownMenuItem(value: t.tripId, child: Text(t.tripName)),
DropdownMenuItem<int?>(value: t.tripId, child: Text(t.tripName)),
),
],
onChanged: (val) {
@@ -350,9 +355,10 @@ class _NewEntryPageState extends State<NewEntryPage> {
_notesController.clear();
_mileageController.clear();
_networkController.clear();
final now = DateTime.now();
setState(() {
_selectedDate = DateTime.now();
_selectedTime = TimeOfDay.now();
_selectedDate = now;
_selectedTime = TimeOfDay.fromDateTime(now);
_useManualMileage = false;
_routeResult = null;
_tractionItems
@@ -600,18 +606,9 @@ class _NewEntryPageState extends State<NewEntryPage> {
_buildTractionList(),
]);
final mileagePanel = _section('Mileage', [
SwitchListTile(
title: const Text('Use manual mileage'),
subtitle: const Text('Turn on to enter mileage manually'),
value: _useManualMileage,
onChanged: (val) {
setState(() {
_useManualMileage = val;
});
_saveDraft();
},
),
final mileagePanel = _section(
'Mileage',
[
if (_useManualMileage)
TextFormField(
controller: _mileageController,
@@ -635,12 +632,21 @@ class _NewEntryPageState extends State<NewEntryPage> {
Align(
alignment: Alignment.centerLeft,
child: ElevatedButton.icon(
onPressed: _openCalculator,
icon: const Icon(Icons.calculate),
label: const Text('Open mileage calculator'),
),
onPressed: _openCalculator,
icon: const Icon(Icons.calculate),
label: const Text('Open mileage calculator'),
),
]);
),
],
trailing: FilterChip(
label: Text(_useManualMileage ? 'Manual' : 'Automatic'),
selected: _useManualMileage,
onSelected: (val) {
setState(() => _useManualMileage = val);
_saveDraft();
},
),
);
return SingleChildScrollView(
padding: const EdgeInsets.all(16),
@@ -666,6 +672,14 @@ class _NewEntryPageState extends State<NewEntryPage> {
],
),
const SizedBox(height: 12),
OutlinedButton.icon(
onPressed: _submitting
? null
: () => _resetFormState(clearDraft: true),
icon: const Icon(Icons.clear),
label: const Text('Clear form'),
),
const SizedBox(height: 8),
ElevatedButton.icon(
onPressed: _submitting ? null : _submit,
icon: _submitting
@@ -767,18 +781,24 @@ class _NewEntryPageState extends State<NewEntryPage> {
);
}
Widget _section(String title, List<Widget> children) {
Widget _section(String title, List<Widget> children, {Widget? trailing}) {
return Card(
child: Padding(
padding: const EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
title,
style: Theme.of(
context,
).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: Theme.of(
context,
).textTheme.titleMedium?.copyWith(fontWeight: FontWeight.bold),
),
if (trailing != null) trailing,
],
),
const SizedBox(height: 8),
...children.map(