| 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),                ))          ]        ],      ));}
 |