Improve entries page and latest changes panel, units on events and timeline
All checks were successful
Release / meta (push) Successful in 9s
Release / linux-build (push) Successful in 8m3s
Release / android-build (push) Successful in 19m21s
Release / release-master (push) Successful in 40s
Release / release-dev (push) Successful in 42s

This commit is contained in:
2025-12-23 17:41:21 +00:00
parent 29959f7580
commit 44d79e7c28
16 changed files with 1764 additions and 498 deletions

View File

@@ -36,6 +36,21 @@ class _LocoTimelinePageState extends State<LocoTimelinePage> {
WidgetsBinding.instance.addPostFrameCallback((_) => _load());
}
dynamic _normalizeFieldValue(_FieldEntry field) {
final name = field.field.name.toLowerCase();
final val = field.value;
if (name == 'max_speed') {
final numVal = val is num ? val.toDouble() : double.tryParse('$val');
if (numVal == null) return val;
final unit = (field.unit ?? 'kph').toLowerCase();
if (unit == 'mph') {
return numVal * 1.60934;
}
return numVal;
}
return val;
}
@override
void dispose() {
_disposeDrafts(_draftEvents);
@@ -57,7 +72,7 @@ class _LocoTimelinePageState extends State<LocoTimelinePage> {
String? _eventDateForEntry(LocoAttrVersion entry) {
final masked = entry.maskedValidFrom?.trim();
if (masked != null && masked.isNotEmpty) return masked;
final from = entry.validFrom ?? entry.txnFrom;
final from = entry.validFrom;
if (from == null) return null;
return DateFormat('yyyy-MM-dd').format(from);
}
@@ -115,7 +130,8 @@ class _LocoTimelinePageState extends State<LocoTimelinePage> {
draft.details = '';
draft.fields.add(
_FieldEntry(field: field)
..value = _valueForEntry(entry),
..value = _valueForEntry(entry)
..unit = _guessUnit(field, entry.valueLabel),
);
setState(() {
@@ -123,6 +139,16 @@ class _LocoTimelinePageState extends State<LocoTimelinePage> {
});
}
String? _guessUnit(EventField field, String valueLabel) {
final name = field.name.toLowerCase();
if (name == 'max_speed') {
final val = valueLabel.toLowerCase();
if (val.contains('mph')) return 'mph';
return 'kph';
}
return _defaultUnitForField(field);
}
Future<void> _deleteEntry(LocoAttrVersion entry) async {
if (_isDeleting) return;
final blockId = entry.versionId;
@@ -241,7 +267,7 @@ class _LocoTimelinePageState extends State<LocoTimelinePage> {
invalid.add('Field ${field.field.display} is empty');
break;
}
values[field.field.name] = val;
values[field.field.name] = _normalizeFieldValue(field);
}
if (invalid.isNotEmpty) continue;
if (values.isEmpty) {