add android bundle release
All checks were successful
Release / meta (push) Successful in 10s
Release / linux-build (push) Successful in 6m32s
Release / web-build (push) Successful in 5m50s
Release / android-build (push) Successful in 20m43s
Release / release-master (push) Successful in 26s
Release / release-dev (push) Successful in 28s
All checks were successful
Release / meta (push) Successful in 10s
Release / linux-build (push) Successful in 6m32s
Release / web-build (push) Successful in 5m50s
Release / android-build (push) Successful in 20m43s
Release / release-master (push) Successful in 26s
Release / release-dev (push) Successful in 28s
This commit is contained in:
@@ -66,6 +66,29 @@ DateTime _asDateTime(dynamic value, [DateTime? fallback]) {
|
||||
return parsed ?? (fallback ?? DateTime.fromMillisecondsSinceEpoch(0));
|
||||
}
|
||||
|
||||
DateTime? _asNullableDateTime(dynamic value) {
|
||||
if (value == null) return null;
|
||||
if (value is DateTime) return value;
|
||||
return DateTime.tryParse(value.toString());
|
||||
}
|
||||
|
||||
int compareTripsByDateDesc(
|
||||
DateTime? aDate,
|
||||
DateTime? bDate,
|
||||
int aId,
|
||||
int bId,
|
||||
) {
|
||||
if (aDate != null && bDate != null) {
|
||||
final cmp = bDate.compareTo(aDate);
|
||||
if (cmp != 0) return cmp;
|
||||
} else if (aDate != null) {
|
||||
return -1;
|
||||
} else if (bDate != null) {
|
||||
return 1;
|
||||
}
|
||||
return bId.compareTo(aId);
|
||||
}
|
||||
|
||||
class DestinationObject {
|
||||
const DestinationObject(
|
||||
this.label,
|
||||
@@ -443,7 +466,7 @@ class LocoSummary extends Loco {
|
||||
);
|
||||
|
||||
factory LocoSummary.fromJson(Map<String, dynamic> json) => LocoSummary(
|
||||
locoId: json['loco_id'] ?? json['id'] ?? 0,
|
||||
locoId: _asInt(json['loco_id'] ?? json['id']),
|
||||
locoType: json['type'] ?? json['loco_type'] ?? '',
|
||||
locoNumber: json['number'] ?? json['loco_number'] ?? '',
|
||||
locoName: json['name'] ?? json['loco_name'] ?? "",
|
||||
@@ -722,9 +745,12 @@ class TripSummary {
|
||||
final double tripMileage;
|
||||
final int legCount;
|
||||
final List<TripLocoStat> locoStats;
|
||||
final DateTime? startDate;
|
||||
final DateTime? endDate;
|
||||
|
||||
int get locoHadCount => locoStats.length;
|
||||
int get winnersCount => locoStats.where((e) => e.won).length;
|
||||
DateTime? get primaryDate => endDate ?? startDate;
|
||||
|
||||
TripSummary({
|
||||
required this.tripId,
|
||||
@@ -732,20 +758,72 @@ class TripSummary {
|
||||
required this.tripMileage,
|
||||
this.legCount = 0,
|
||||
List<TripLocoStat>? locoStats,
|
||||
this.startDate,
|
||||
this.endDate,
|
||||
}) : locoStats = locoStats ?? const [];
|
||||
|
||||
factory TripSummary.fromJson(Map<String, dynamic> json) => TripSummary(
|
||||
tripId: _asInt(json['trip_id']),
|
||||
tripName: _asString(json['trip_name']),
|
||||
tripMileage: _asDouble(json['trip_mileage']),
|
||||
legCount: _asInt(
|
||||
json['leg_count'],
|
||||
(json['trip_legs'] as List?)?.length ?? 0,
|
||||
),
|
||||
locoStats: TripLocoStat.listFromJson(
|
||||
json['stats'] ?? json['trip_locos'] ?? json['locos'],
|
||||
),
|
||||
);
|
||||
static int compareByDateDesc(TripSummary a, TripSummary b) =>
|
||||
compareTripsByDateDesc(a.primaryDate, b.primaryDate, a.tripId, b.tripId);
|
||||
|
||||
factory TripSummary.fromJson(Map<String, dynamic> json) {
|
||||
DateTime? startDate;
|
||||
DateTime? endDate;
|
||||
|
||||
DateTime? parseDate(dynamic value) => _asNullableDateTime(value);
|
||||
|
||||
for (final key in [
|
||||
'trip_begin_time',
|
||||
'trip_start',
|
||||
'trip_start_time',
|
||||
'trip_date',
|
||||
'start_date',
|
||||
'date',
|
||||
]) {
|
||||
startDate ??= parseDate(json[key]);
|
||||
}
|
||||
|
||||
for (final key in [
|
||||
'trip_end_time',
|
||||
'trip_finish_time',
|
||||
'trip_end',
|
||||
'end_date',
|
||||
]) {
|
||||
endDate ??= parseDate(json[key]);
|
||||
}
|
||||
|
||||
if (json['trip_legs'] is List) {
|
||||
for (final leg in json['trip_legs'] as List) {
|
||||
DateTime? begin;
|
||||
if (leg is TripLeg) {
|
||||
begin = leg.beginTime;
|
||||
} else if (leg is Map) {
|
||||
begin = parseDate(leg['leg_begin_time']);
|
||||
}
|
||||
if (begin == null) continue;
|
||||
if (startDate == null || begin.isBefore(startDate)) {
|
||||
startDate = begin;
|
||||
}
|
||||
if (endDate == null || begin.isAfter(endDate)) {
|
||||
endDate = begin;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TripSummary(
|
||||
tripId: _asInt(json['trip_id']),
|
||||
tripName: _asString(json['trip_name']),
|
||||
tripMileage: _asDouble(json['trip_mileage']),
|
||||
legCount: _asInt(
|
||||
json['leg_count'],
|
||||
(json['trip_legs'] as List?)?.length ?? 0,
|
||||
),
|
||||
locoStats: TripLocoStat.listFromJson(
|
||||
json['stats'] ?? json['trip_locos'] ?? json['locos'],
|
||||
),
|
||||
startDate: startDate,
|
||||
endDate: endDate,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class Leg {
|
||||
@@ -941,6 +1019,34 @@ class TripDetail {
|
||||
|
||||
int get locoHadCount => locoStats.length;
|
||||
int get winnersCount => locoStats.where((e) => e.won).length;
|
||||
DateTime? get startDate {
|
||||
DateTime? earliest;
|
||||
for (final leg in legs) {
|
||||
final begin = leg.beginTime;
|
||||
if (begin == null) continue;
|
||||
if (earliest == null || begin.isBefore(earliest)) {
|
||||
earliest = begin;
|
||||
}
|
||||
}
|
||||
return earliest;
|
||||
}
|
||||
|
||||
DateTime? get endDate {
|
||||
DateTime? latest;
|
||||
for (final leg in legs) {
|
||||
final begin = leg.beginTime;
|
||||
if (begin == null) continue;
|
||||
if (latest == null || begin.isAfter(latest)) {
|
||||
latest = begin;
|
||||
}
|
||||
}
|
||||
return latest;
|
||||
}
|
||||
|
||||
DateTime? get primaryDate => endDate ?? startDate;
|
||||
|
||||
static int compareByDateDesc(TripDetail a, TripDetail b) =>
|
||||
compareTripsByDateDesc(a.primaryDate, b.primaryDate, a.id, b.id);
|
||||
|
||||
TripDetail({
|
||||
required this.id,
|
||||
|
||||
Reference in New Issue
Block a user