| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- import 'package:flutter/material.dart';
- import 'package:flutter_riverpod/flutter_riverpod.dart';
- import 'package:gap/gap.dart';
- import 'package:google_fonts/google_fonts.dart';
- import 'package:linear_progress_bar/linear_progress_bar.dart';
- import 'package:tp5/core/utils.dart';
- import 'package:tp5/csv/data.dart';
- import 'package:tp5/roster/widgets/w_citypair.dart';
- import 'package:tp5/roster/widgets/w_hour.dart';
- import 'package:tp5/widgets/my_row.dart';
- class WFlt extends ConsumerWidget {
- const WFlt(
- {super.key,
- required this.acleg,
- this.hide = const [],
- this.highlight = false});
- final List<String> hide;
- final bool highlight;
- final Acleg acleg;
- String get fltstate {
- if (acleg.flt_status == "Arrived" || acleg.flt_status == "Landed") {
- return "ARR";
- } else if (acleg.flt_status == "Inflight" ||
- acleg.flt_status == "Taxiout") {
- return "DEP";
- } else if (acleg.flt_status == "Delayed") {
- return "DEL";
- } else if (acleg.flt_status == "Sched") {
- return "SCD";
- } else {
- return "UNK";
- }
- }
- aclegicon() {
- if (fltstate == "DEP") {
- return Icons.flight_takeoff_rounded;
- } else if (fltstate == "ARR") {
- return Icons.flight_land_rounded;
- } else if (fltstate == "DEL") {
- return Icons.timer;
- } else if (fltstate == "SCD") {
- return Icons.check_rounded;
- } else {
- return Icons.device_unknown;
- }
- }
- Color aclegcolor() {
- if (fltstate == "DEP") {
- return Colors.black;
- } else if (fltstate == "ARR") {
- return Colors.black;
- } else if (fltstate == "DEL") {
- return Colors.grey[900]!;
- } else if (fltstate == "SCD") {
- return Colors.grey[900]!;
- } else {
- return Colors.yellow[900]!;
- }
- }
- @override
- Widget build(BuildContext context, WidgetRef ref) {
- final now = ref.watch(clockProvider);
- return Card(
- color: aclegcolor(),
- // surfaceTintColor: (fltstate == "DEP") ? Colors.white : null,
- shape: RoundedRectangleBorder(
- borderRadius: BorderRadius.circular(5.0), // Rounded corners
- side: BorderSide(
- color: highlight ? Colors.yellow : Colors.transparent, // Border color
- width: 2.0, // Border width
- ),
- ),
- elevation: 8.0,
- //margin: const EdgeInsets.symmetric(horizontal: 5.0, vertical: 4.0),
- child: Column(
- children: [
- Padding(
- padding: const EdgeInsets.symmetric(horizontal: 2, vertical: 0),
- child: MyRow(children: [
- if (!hide.contains("leading")) _leading(),
- if (!hide.contains("timing")) _timing(),
- if (!hide.contains("flight")) _flight(),
- if (!hide.contains("actype")) _actype(),
- if (!hide.contains("booking")) _booking(),
- if (!hide.contains("delay")) _delay(),
- ]),
- ),
- if (fltstate == "DEP" && now.isBefore(acleg.jarr!))
- Row(children: [
- const Gap(60),
- Text(
- "departed\n${now.dateTime.difference(acleg.jdep!.dateTime).tohhmm} ago",
- style: const TextStyle(
- fontSize: 9, letterSpacing: 1, color: Colors.grey),
- ),
- const Gap(5),
- Expanded(
- child: LinearProgressBar(
- maxSteps: acleg.jarr!.dateTime
- .difference(acleg.jdep!.dateTime)
- .inMinutes,
- progressType: LinearProgressBar
- .progressTypeLinear, // Use Linear progress
- currentStep:
- now.dateTime.difference(acleg.jdep!.dateTime).inMinutes,
- progressColor: Colors.cyan,
- backgroundColor: Colors.grey[700],
- borderRadius: BorderRadius.circular(10), // NEW
- ),
- ),
- const Gap(5),
- Text(
- "arrives\nin ${acleg.jarr!.dateTime.difference(now.dateTime).tohhmm}",
- style: const TextStyle(
- fontSize: 9, letterSpacing: 1, color: Colors.grey),
- ),
- const Gap(5)
- ]),
- const Gap(2),
- ],
- ),
- );
- }
- _leading() => SizedBox(
- width: 50,
- child: Padding(
- padding: const EdgeInsets.all(4.0),
- child: Column(children: [
- Icon(aclegicon()),
- Text(
- acleg.flt_status,
- style: const TextStyle(fontSize: 9),
- )
- ]),
- ),
- );
- _flight() => SizedBox(
- width: 100,
- child: Column(crossAxisAlignment: CrossAxisAlignment.center, children: [
- WCitypair(
- iata1: acleg.DEP_AP_ACTUAL ?? "---",
- iata2: acleg.ARR_AP_SCHED ?? "---",
- size: 14,
- color:
- (acleg.ARR_AP_ACTUAL == acleg.ARR_AP_SCHED) ? null : Colors.red,
- ),
- MyRow(
- children: [
- Text(
- "${acleg.FN_CARRIER}${acleg.FN_NUMBER ?? "---"}${acleg.FN_SUFFIX ?? ""}",
- style: const TextStyle(color: Colors.white70, fontSize: 12)),
- const Gap(10),
- if (acleg.ARR_AP_ACTUAL != acleg.ARR_AP_SCHED &&
- acleg.DEP_AP_ACTUAL != acleg.ARR_AP_ACTUAL &&
- acleg.blocks[1] != null)
- Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- const Text("Diverted to",
- style: TextStyle(color: Colors.red, fontSize: 9)),
- Text(acleg.ARR_AP_ACTUAL ?? "---",
- style: const TextStyle(
- color: Colors.yellow,
- fontSize: 12,
- fontWeight: FontWeight.w600)),
- ],
- ),
- if (acleg.ARR_AP_ACTUAL != acleg.ARR_AP_SCHED &&
- acleg.DEP_AP_ACTUAL == acleg.ARR_AP_ACTUAL)
- Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Text(
- (acleg.blocks[1] != null)
- ? "Flight back to"
- : "Return to",
- style: const TextStyle(color: Colors.red, fontSize: 9)),
- Text(acleg.ARR_AP_ACTUAL ?? "---",
- style: const TextStyle(
- color: Colors.yellow,
- fontSize: 12,
- fontWeight: FontWeight.w600)),
- ],
- ),
- ],
- ),
- ]),
- );
- _actype() => SizedBox(
- width: 60,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(acleg.AC_REGISTRATION ?? "-----",
- style: TextStyle(
- color: Colors.yellow[800]!, fontWeight: FontWeight.w700)),
- Row(
- mainAxisAlignment: MainAxisAlignment.spaceBetween,
- children: [
- Text(acleg.AC_SUBTYPE ?? "---",
- style: const TextStyle(
- fontSize: 12,
- color: Colors.grey,
- fontWeight: FontWeight.w500)),
- Text(acleg.AC_OWNER ?? "---",
- style: TextStyle(
- fontSize: 12,
- color: Colors.grey[400]!,
- fontWeight: FontWeight.w500)),
- ],
- )
- ],
- ),
- );
- _booking() => SizedBox(
- width: 60,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.center,
- children: [
- Text(
- acleg.pax_booked ?? "---",
- style: GoogleFonts.robotoMono(
- fontSize: 11, fontWeight: FontWeight.w300),
- ),
- Text(
- acleg.AC_VERSION ?? "---",
- style: GoogleFonts.robotoMono(
- color: Colors.grey, fontSize: 9, fontWeight: FontWeight.w300),
- ),
- ],
- ),
- );
- _timing() => SizedBox(
- width: 80,
- child: Column(
- crossAxisAlignment: CrossAxisAlignment.start,
- children: [
- Text(
- acleg.jdep!.format(pattern: "dd MMM 'yy"),
- style: const TextStyle(fontSize: 11, color: Colors.grey),
- ),
- Row(
- children: [
- WHour(jiffy: acleg.jdep!, size: 13),
- const Gap(10),
- WHour(jiffy: acleg.jarr!, size: 13)
- ],
- ),
- if (acleg.jdep!.isAfter(acleg.jdepsched!.add(minutes: 15)))
- Row(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- Text(
- "Delay ",
- style: GoogleFonts.robotoMono(
- fontSize: 10,
- fontWeight: FontWeight.w400,
- color: Colors.red[600]),
- ),
- Padding(
- padding: const EdgeInsets.only(right: 8),
- child: Text(
- acleg.jdep!.dateTime
- .difference(acleg.jdepsched!.dateTime)
- .tohhmm,
- style: GoogleFonts.robotoMono(
- fontSize: 10,
- fontWeight: FontWeight.w400,
- color: Colors.red[200]),
- ),
- )
- ],
- ),
- if (acleg.slot != null && acleg.slot!.year > 2000)
- Row(
- mainAxisAlignment: MainAxisAlignment.end,
- children: [
- Text(
- "CTOT ",
- style: GoogleFonts.robotoMono(
- fontSize: 10,
- fontWeight: FontWeight.w600,
- color: Colors.amber),
- ),
- Padding(
- padding: const EdgeInsets.only(right: 8),
- child: Text(
- acleg.slot!.Hm,
- style: GoogleFonts.robotoMono(
- fontSize: 10,
- fontWeight: FontWeight.w400,
- color: Colors.amber),
- ),
- )
- ],
- ),
- ],
- ),
- );
- _delay() => SizedBox(
- width: 60,
- child: Column(
- children: [
- if (acleg.dla.isNotEmpty) ...[
- const Text("DLA",
- style: TextStyle(fontSize: 10, color: Colors.grey)),
- ...acleg.dla.map((e) => Text(
- "${e[0]} = ${e[1] is Duration ? ((e[1] as Duration).tohhmm) : ""}",
- style: const TextStyle(fontSize: 10),
- ))
- ]
- ],
- ));
- }
|