Compare commits
3 Commits
80c315866f
...
v0.2.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a6aee8a15 | |||
| 411e82807b | |||
| 2b4d2623fc |
@@ -19,6 +19,7 @@ jobs:
|
|||||||
- mileograph
|
- mileograph
|
||||||
outputs:
|
outputs:
|
||||||
base_version: ${{ steps.meta.outputs.base }}
|
base_version: ${{ steps.meta.outputs.base }}
|
||||||
|
release_tag: ${{ steps.meta.outputs.release_tag }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@@ -29,6 +30,7 @@ jobs:
|
|||||||
RAW_VERSION=$(awk '/^version:/{print $2}' pubspec.yaml)
|
RAW_VERSION=$(awk '/^version:/{print $2}' pubspec.yaml)
|
||||||
BASE_VERSION=${RAW_VERSION%%+*}
|
BASE_VERSION=${RAW_VERSION%%+*}
|
||||||
echo "base=${BASE_VERSION}" >> "$GITHUB_OUTPUT"
|
echo "base=${BASE_VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
echo "release_tag=v${BASE_VERSION}" >> "$GITHUB_OUTPUT"
|
||||||
|
|
||||||
android-build:
|
android-build:
|
||||||
runs-on:
|
runs-on:
|
||||||
@@ -308,7 +310,7 @@ jobs:
|
|||||||
id: bundle
|
id: bundle
|
||||||
run: |
|
run: |
|
||||||
BASE="${{ needs.meta.outputs.base_version }}"
|
BASE="${{ needs.meta.outputs.base_version }}"
|
||||||
TAG="v${BASE}"
|
TAG="${{ needs.meta.outputs.release_tag }}"
|
||||||
|
|
||||||
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
echo "tag=${TAG}" >> "$GITHUB_OUTPUT"
|
||||||
echo "apk=artifacts/mileograph-${BASE}.apk" >> "$GITHUB_OUTPUT"
|
echo "apk=artifacts/mileograph-${BASE}.apk" >> "$GITHUB_OUTPUT"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -423,57 +423,68 @@ class _TractionPageState extends State<TractionPage> {
|
|||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 12),
|
const SizedBox(height: 12),
|
||||||
if (data.isTractionLoading && traction.isEmpty)
|
Stack(
|
||||||
const Center(
|
children: [
|
||||||
child: Padding(
|
if (data.isTractionLoading && traction.isEmpty)
|
||||||
padding: EdgeInsets.symmetric(vertical: 24.0),
|
const Padding(
|
||||||
child: CircularProgressIndicator(),
|
padding: EdgeInsets.symmetric(vertical: 32.0),
|
||||||
),
|
child: Center(child: CircularProgressIndicator()),
|
||||||
)
|
)
|
||||||
else if (traction.isEmpty)
|
else if (traction.isEmpty)
|
||||||
Card(
|
Card(
|
||||||
child: Padding(
|
child: Padding(
|
||||||
padding: const EdgeInsets.all(16.0),
|
padding: const EdgeInsets.all(16.0),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
'No traction found',
|
'No traction found',
|
||||||
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
style: Theme.of(context).textTheme.titleMedium?.copyWith(
|
||||||
fontWeight: FontWeight.w700,
|
fontWeight: FontWeight.w700,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
const SizedBox(height: 8),
|
const SizedBox(height: 8),
|
||||||
const Text('Try relaxing the filters or sync again.'),
|
const Text('Try relaxing the filters or sync again.'),
|
||||||
],
|
],
|
||||||
),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
else
|
|
||||||
Column(
|
|
||||||
children: [
|
|
||||||
...traction.map((loco) => _buildTractionCard(context, loco)),
|
|
||||||
if (data.tractionHasMore || data.isTractionLoading)
|
|
||||||
Padding(
|
|
||||||
padding: const EdgeInsets.only(top: 8.0),
|
|
||||||
child: OutlinedButton.icon(
|
|
||||||
onPressed: data.isTractionLoading
|
|
||||||
? null
|
|
||||||
: () => _refreshTraction(append: true),
|
|
||||||
icon: data.isTractionLoading
|
|
||||||
? const SizedBox(
|
|
||||||
height: 14,
|
|
||||||
width: 14,
|
|
||||||
child: CircularProgressIndicator(strokeWidth: 2),
|
|
||||||
)
|
|
||||||
: const Icon(Icons.expand_more),
|
|
||||||
label: Text(
|
|
||||||
data.isTractionLoading ? 'Loading...' : 'Load more',
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
)
|
||||||
),
|
else
|
||||||
|
Column(
|
||||||
|
children: [
|
||||||
|
...traction.map((loco) => _buildTractionCard(context, loco)),
|
||||||
|
if (data.tractionHasMore || data.isTractionLoading)
|
||||||
|
Padding(
|
||||||
|
padding: const EdgeInsets.only(top: 8.0),
|
||||||
|
child: OutlinedButton.icon(
|
||||||
|
onPressed: data.isTractionLoading
|
||||||
|
? null
|
||||||
|
: () => _refreshTraction(append: true),
|
||||||
|
icon: data.isTractionLoading
|
||||||
|
? const SizedBox(
|
||||||
|
height: 14,
|
||||||
|
width: 14,
|
||||||
|
child: CircularProgressIndicator(strokeWidth: 2),
|
||||||
|
)
|
||||||
|
: const Icon(Icons.expand_more),
|
||||||
|
label: Text(
|
||||||
|
data.isTractionLoading ? 'Loading...' : 'Load more',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
if (data.isTractionLoading)
|
||||||
|
Positioned.fill(
|
||||||
|
child: IgnorePointer(
|
||||||
|
child: Container(
|
||||||
|
color: Theme.of(context).colorScheme.surface.withOpacity(0.6),
|
||||||
|
child: const Center(child: CircularProgressIndicator()),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -97,10 +97,7 @@ class ApiService {
|
|||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res.statusCode == 401 &&
|
if (res.statusCode == 401 && _onUnauthorized != null) {
|
||||||
body is Map<String, dynamic> &&
|
|
||||||
body['detail'] == 'Not authenticated' &&
|
|
||||||
_onUnauthorized != null) {
|
|
||||||
await _onUnauthorized!();
|
await _onUnauthorized!();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:flutter/scheduler.dart';
|
import 'package:flutter/scheduler.dart';
|
||||||
@@ -441,6 +442,30 @@ class DataService extends ChangeNotifier {
|
|||||||
return _locoClasses;
|
return _locoClasses;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<void> createLocoEvent({
|
||||||
|
required int locoId,
|
||||||
|
required String eventDate,
|
||||||
|
required Map<String, dynamic> values,
|
||||||
|
required String details,
|
||||||
|
String eventType = 'other',
|
||||||
|
}) async {
|
||||||
|
try {
|
||||||
|
await api.put(
|
||||||
|
'/event/new',
|
||||||
|
{
|
||||||
|
'loco_id': locoId,
|
||||||
|
'loco_event_type': eventType,
|
||||||
|
'loco_event_date': eventDate,
|
||||||
|
'loco_event_value': jsonEncode(values),
|
||||||
|
'loco_event_details': details,
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} catch (e) {
|
||||||
|
debugPrint('Failed to create loco event: $e');
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void clear() {
|
void clear() {
|
||||||
_homepageStats = null;
|
_homepageStats = null;
|
||||||
_legs = [];
|
_legs = [];
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
|||||||
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
# https://developer.apple.com/library/archive/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html
|
||||||
# In Windows, build-name is used as the major, minor, and patch parts
|
# In Windows, build-name is used as the major, minor, and patch parts
|
||||||
# of the product and file versions while build-number is used as the build suffix.
|
# of the product and file versions while build-number is used as the build suffix.
|
||||||
version: 0.1.6+1
|
version: 0.2.0+1
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ^3.8.1
|
sdk: ^3.8.1
|
||||||
|
|||||||
Reference in New Issue
Block a user