219 lines
6.5 KiB
Dart
219 lines
6.5 KiB
Dart
import 'dart:convert';
|
|
import 'package:flutter/material.dart' hide Colors, Divider, VerticalDivider;
|
|
import 'package:go_router/go_router.dart';
|
|
import 'package:proto_portal/scraper.dart';
|
|
import 'package:shadcn_flutter/shadcn_flutter.dart';
|
|
|
|
class ServiceCard extends StatelessWidget {
|
|
final String type;
|
|
final String time;
|
|
final String diagram;
|
|
final String customer;
|
|
final String destination;
|
|
final String operator;
|
|
final String vrm;
|
|
final GtiService? service;
|
|
final GtiStation? station;
|
|
final bool showActions;
|
|
|
|
// Constructor for individual fields
|
|
ServiceCard({
|
|
required this.type,
|
|
required this.time,
|
|
required this.diagram,
|
|
required this.customer,
|
|
required this.destination,
|
|
required this.operator,
|
|
required this.vrm,
|
|
this.service,
|
|
this.station,
|
|
this.showActions = false,
|
|
});
|
|
|
|
// Constructor that takes a GtiService
|
|
ServiceCard.fromService({
|
|
required GtiService service,
|
|
GtiStation? station,
|
|
bool showActions = false,
|
|
}) : this.service = service,
|
|
this.station = station,
|
|
this.showActions = showActions,
|
|
type = service.type,
|
|
time = service.time,
|
|
diagram = service.coach,
|
|
customer = service.customer,
|
|
destination = service.destination,
|
|
operator = service.operator,
|
|
vrm = service.vrm;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// Convert type code to full word
|
|
String typeLabel = type;
|
|
if (type == 'D') {
|
|
typeLabel = 'Departure';
|
|
} else if (type == 'A') {
|
|
typeLabel = 'Arrival';
|
|
}
|
|
|
|
return OutlinedContainer(
|
|
width: double.infinity,
|
|
boxShadow: [
|
|
BoxShadow(
|
|
color: Colors.black.withOpacity(0.2),
|
|
blurRadius: 10,
|
|
spreadRadius: 2)
|
|
],
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
IntrinsicHeight(
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(24.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
children: [
|
|
Text(typeLabel,
|
|
style: TextStyle(fontSize: 22))
|
|
.textLarge,
|
|
],
|
|
),
|
|
),
|
|
),
|
|
VerticalDivider(),
|
|
SizedBox(
|
|
width: 94,
|
|
child: _keyvalueRow(
|
|
key: "Time",
|
|
value: time,
|
|
),
|
|
),
|
|
VerticalDivider(),
|
|
SizedBox(
|
|
width: 130,
|
|
child: _keyvalueRow(
|
|
key: "Diagram",
|
|
value: diagram,
|
|
),
|
|
),
|
|
],
|
|
),
|
|
),
|
|
Divider(),
|
|
|
|
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 10),
|
|
child: _keyvalueRow(
|
|
key: "Customer",
|
|
value: customer,
|
|
),
|
|
),
|
|
Divider(),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 10),
|
|
child: _keyvalueRow(
|
|
key: "Destination",
|
|
value: destination,
|
|
),
|
|
),
|
|
Divider(),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 10),
|
|
child: IntrinsicHeight(
|
|
child: Row(
|
|
children: [
|
|
Expanded(
|
|
child: _keyvalueRow(
|
|
key: "Operator",
|
|
value: operator,
|
|
),
|
|
),
|
|
VerticalDivider(),
|
|
SizedBox(
|
|
width: 120,
|
|
child: _keyvalueRow(
|
|
key: "VRM",
|
|
value: vrm.isNotEmpty ? vrm : "N/A",
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
),
|
|
|
|
if (showActions) ...[
|
|
Divider(),
|
|
Padding(
|
|
padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
ButtonGroup(
|
|
children: [
|
|
Expanded(
|
|
child: OutlineButton(
|
|
onPressed: service != null && station != null
|
|
? () {
|
|
// Encode service as base64
|
|
final serviceJson = jsonEncode(service!.toJson());
|
|
final serviceBase64 = base64Encode(utf8.encode(serviceJson));
|
|
|
|
final stationJson = jsonEncode({
|
|
'label': station!.label,
|
|
'crs': station!.crs,
|
|
});
|
|
final stationBase64 = base64Encode(utf8.encode(stationJson));
|
|
|
|
GoRouter.of(context).push(
|
|
Uri(
|
|
path: '/audit',
|
|
queryParameters: {
|
|
'service': serviceBase64,
|
|
'station': stationBase64,
|
|
},
|
|
).toString(),
|
|
);
|
|
}
|
|
: null,
|
|
child: Text("Audit"),
|
|
),
|
|
),
|
|
Expanded(
|
|
child: PrimaryButton(
|
|
onPressed: () {},
|
|
child: Text("Depart"),
|
|
),
|
|
)
|
|
],
|
|
)
|
|
],
|
|
),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
);
|
|
}
|
|
|
|
Widget _keyvalueRow({
|
|
required String key,
|
|
required String value,
|
|
}) {
|
|
return Padding(
|
|
padding: const EdgeInsets.all(12.0),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(key).h4,
|
|
|
|
Text(value).small
|
|
],
|
|
),
|
|
);
|
|
}
|
|
} |