NovySoft/novyNaplo

View on GitHub
lib/ui/screens/reports_tab.dart

Summary

Maintainability
Test Coverage
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:flutter/material.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:novynaplo/data/models/evals.dart';
import 'package:novynaplo/helpers/misc/capitalize.dart';
import 'package:novynaplo/helpers/ui/cardColor/markCard.dart';
import 'package:novynaplo/helpers/ui/textColor/markCard.dart';
import 'package:novynaplo/i18n/translationProvider.dart';
import 'package:novynaplo/ui/screens/reports_detail_tab.dart';
import 'package:novynaplo/ui/widgets/AnimatedLeadingTrailingCard.dart';
import 'package:novynaplo/ui/widgets/Drawer.dart';
import 'package:novynaplo/ui/screens/marks_tab.dart' as marks;
import 'package:novynaplo/ui/screens/statistics_tab.dart' as stats;
import 'package:novynaplo/global.dart' as globals;
import 'package:novynaplo/helpers/misc/removeHTMLtags.dart';
import 'package:novynaplo/helpers/ui/textColor/drawerText.dart';

Map<String, List<Evals>> reportMaps = {
  "FirstQuarter": [],
  "HalfYear": [],
  "ThirdQuarter": [],
  "EndOfYear": [],
};

class ReportsTab extends StatefulWidget {
  static String tag = 'reports';
  static String title = capitalize(getTranslatedString("reports"));

  @override
  _ReportsTabState createState() => _ReportsTabState();
}

class _ReportsTabState extends State<ReportsTab>
    with SingleTickerProviderStateMixin {
  TabController _tabController;
  List<Tab> tabs = [];

  @override
  void initState() {
    FirebaseCrashlytics.instance.log("Shown Reports");
    //*"TypeName": "I_ne_jegy_ertekeles",
    reportMaps["FirstQuarter"] = marks.allParsedByDate.where(
      (item) {
        return item.type.name == "I_ne_jegy_ertekeles";
      },
    ).toList();
    //*"TypeName": "felevi_jegy_ertekeles" || "II_ne_jegy_ertekeles",
    reportMaps["HalfYear"] = marks.allParsedByDate.where(
      (item) {
        return item.type.name == "felevi_jegy_ertekeles" ||
            item.type.name == "II_ne_jegy_ertekeles";
      },
    ).toList();
    //*"TypeName": "III_ne_jegy_ertekeles"
    reportMaps["ThirdQuarter"] = marks.allParsedByDate.where(
      (item) {
        return item.type.name == "III_ne_jegy_ertekeles";
      },
    ).toList();
    //*"TypeName": "evvegi_jegy_ertekeles" || "IV_ne_jegy_ertekeles"
    reportMaps["EndOfYear"] = marks.allParsedByDate.where(
      (item) {
        return item.type.name == "evvegi_jegy_ertekeles" ||
            item.type.name == "IV_ne_jegy_ertekeles";
      },
    ).toList();
    //*Sort the lists based on kretas sortIndex
    reportMaps["FirstQuarter"].sort(
      (a, b) => a.sortIndex.compareTo(b.sortIndex),
    );
    reportMaps["HalfYear"].sort(
      (a, b) => a.sortIndex.compareTo(b.sortIndex),
    );
    reportMaps["ThirdQuarter"].sort(
      (a, b) => a.sortIndex.compareTo(b.sortIndex),
    );
    reportMaps["EndOfYear"].sort(
      (a, b) => a.sortIndex.compareTo(b.sortIndex),
    );
    //*Only show existing reports
    if (reportMaps["FirstQuarter"].length != 0) {
      tabs.add(
        Tab(
          text: getTranslatedString("FirstQuarter"),
          icon: Icon(MdiIcons.clockTimeThree),
        ),
      );
    }
    if (reportMaps["HalfYear"].length != 0) {
      tabs.add(
        Tab(
          text: getTranslatedString("HalfYear"),
          icon: Icon(MdiIcons.clockTimeSix),
        ),
      );
    }
    if (reportMaps["ThirdQuarter"].length != 0) {
      tabs.add(
        Tab(
          text: getTranslatedString("ThirdQuarter"),
          icon: Icon(MdiIcons.clockTimeNine),
        ),
      );
    }
    if (reportMaps["EndOfYear"].length != 0) {
      tabs.add(
        Tab(
          text: getTranslatedString("EndOfYear"),
          icon: Icon(MdiIcons.clockTimeTwelve),
        ),
      );
    }
    if (tabs.length == 0) {
      tabs.add(
        Tab(
          text: capitalize(getTranslatedString("nothing")),
          icon: Icon(MdiIcons.emoticonSadOutline),
        ),
      );
    }
    _tabController = new TabController(vsync: this, length: tabs.length);
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    //TODO Add a contracted card to reports
    return Scaffold(
      drawerScrimColor:
          globals.darker ? Colors.black.withOpacity(0) : Colors.black54,
      drawer: CustomDrawer(ReportsTab.tag),
      appBar: AppBar(
        backgroundColor:
            globals.appBarColoredByUser ? globals.currentUser.color : null,
        foregroundColor: getDrawerForeground(),
        title: Text(ReportsTab.title),
        bottom: TabBar(
          controller: _tabController,
          tabs: tabs,
          labelColor: getTabForeground(),
        ),
      ),
      body: TabBarView(
        controller: _tabController,
        children: tabs.map((Tab tab) {
          if (tab.text == capitalize(getTranslatedString("nothing"))) {
            return noReports();
          } else {
            String tabName;
            if (tab.text == getTranslatedString("FirstQuarter")) {
              tabName = "FirstQuarter";
            } else if (tab.text == getTranslatedString("HalfYear")) {
              tabName = "HalfYear";
            } else if (tab.text == getTranslatedString("ThirdQuarter")) {
              tabName = "ThirdQuarter";
            } else if (tab.text == getTranslatedString("EndOfYear")) {
              tabName = "EndOfYear";
            }
            return ListView.builder(
              itemCount: reportMaps[tabName].length,
              padding: EdgeInsets.symmetric(vertical: 12),
              itemBuilder: (BuildContext context, int index) {
                if (reportMaps[tabName].length <= index) {
                  return SizedBox(
                    height: 100,
                  );
                }
                Color color = getMarkCardColor(
                  eval: reportMaps[tabName][index],
                  index: index,
                );
                int statListIndex = stats.allParsedSubjects.indexWhere(
                    (element) =>
                        element[0].subject.fullName.toLowerCase() ==
                        reportMaps[tabName][index]
                            .subject
                            .fullName
                            .toLowerCase());
                List<Evals> chartListPoints = [];
                if (statListIndex != -1) {
                  chartListPoints =
                      stats.allParsedSubjects[statListIndex].where((element) {
                    if (element.date
                            .compareTo(reportMaps[tabName][index].date) <=
                        0) {
                      return true;
                    } else {
                      return false;
                    }
                  }).toList();
                }
                String value = reportMaps[tabName][index].textValue;
                if (value.length > 10) {
                  switch (reportMaps[tabName][index].numberValue.round()) {
                    case 5:
                      value = "Jeles(5)";
                      break;
                    case 4:
                      value = "Jó(4)";
                      break;
                    case 3:
                      value = "Közepes(3)";
                      break;
                    case 2:
                      value = "Elégséges(2)";
                      break;
                    case 1:
                      value = "Elégtelen(1)";
                      break;
                    default:
                      value = removeHTMLtags(value).substring(0, 7) + "...";
                      break;
                  }
                }
                String trailingText = (reportMaps[tabName][index]
                                    .theme
                                    .toLowerCase() ==
                                "dicséret" ||
                            reportMaps[tabName][index].theme.toLowerCase() ==
                                "kitűnő"
                        ? "${getTranslatedString("praiseworthy")}\n"
                        : "") +
                    value;
                return AnimatedLeadingTrailingCard(
                  leading: Text(
                    capitalize(reportMaps[tabName][index].subject.fullName),
                    textDirection: TextDirection.ltr,
                    textAlign: TextAlign.left,
                    maxLines: 3,
                    overflow: TextOverflow.ellipsis,
                    style: TextStyle(
                      color: getMarkCardTextColor(
                        eval: reportMaps[tabName][index],
                      ),
                      fontSize: 21,
                      fontWeight: FontWeight.w500,
                    ),
                  ),
                  trailing: Text(
                    trailingText,
                    textAlign: TextAlign.center,
                    textDirection: TextDirection.ltr,
                    style: TextStyle(
                      color: getMarkCardTextColor(
                        eval: reportMaps[tabName][index],
                      ),
                      fontSize: 21,
                      fontWeight: FontWeight.w500,
                    ),
                  ),
                  color: color,
                  onPressed: ReportsDetailTab(
                    title:
                        "${getTranslatedString(tabName).toLowerCase()} ${reportMaps[tabName][index].subject.fullName}",
                    eval: reportMaps[tabName][index],
                    color: color,
                    inputList: chartListPoints,
                    hideMarker:
                        !(tabName == "EndOfYear" || tabName == "ThirdQuarter"),
                  ),
                );
              },
            );
          }
        }).toList(),
      ),
    );
  }
}

Widget noReports() {
  return Center(
    child: Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Icon(
          MdiIcons.emoticonSadOutline,
          size: 50,
        ),
        Text(
          "${getTranslatedString("noReport")}!",
          textAlign: TextAlign.center,
        )
      ],
    ),
  );
}