import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:tasktracker/Data.dart'; import 'package:tasktracker/NewProject.dart'; import 'Dialogs.dart'; import 'User.dart' as User; import 'main.dart'; class Projects extends StatefulWidget { const Projects({Key? key}) : super(key: key); @override State createState() => _ProjectsState(); } class _ProjectsState extends State { var refreshSub; @override void initState() { // TODO: implement initState super.initState(); refreshSub = User.refreshStream.stream.listen((event) { setState(() { }); }); } @override void dispose() { // TODO: implement dispose super.dispose(); refreshSub?.close(); } @override Widget build(BuildContext context) { return SafeArea(child: Scaffold( floatingActionButton: FloatingActionButton.extended( onPressed: () { Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewProject())).then((value) => {User.refreshUserData().then((va) => {})}); }, label: Text("New Project"), icon: Icon(Icons.add)), appBar: AppBar( title: Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.end, children: [ Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row(children: [Icon(Icons.work_outline_sharp, color: Theme.of(context).primaryColor), SizedBox(width: 10), Text('Projects')]), Row( children: [ (User.offline) ? Icon(Icons.signal_cellular_connected_no_internet_4_bar_outlined) : InkWell( onTap: () async{ await User.refreshUserData(); setState(() { //LoadStats(); }); }, child: Icon(Icons.refresh, size: 30), ) ], ) ], ), //Container(color: Colors.red,child: Text("Offline",style:TextStyle(fontSize: 5))), ], )), drawer: navDrawer(context, 7), body: Container( padding: EdgeInsets.all(10), child: Column( children: printProjects(), ), ), )); } List printProjects(){ List projectWidgets = []; for (var element in User.projects) { if(element.cat==null){print(element.name + " has no cat");continue;} projectWidgets.add(ProjectCard(element)); } return projectWidgets; } Widget ProjectCard(Project project){ Duration timeLeft = project.deadline.difference(DateTime.now()); return Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children:[ Expanded( child: Card( child:InkWell( onLongPress: (){ Dialogs.showProjectDetails(project); }, child: Padding( padding: const EdgeInsets.all(10.0), child: Column( children: [ Row( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text(project.name ,style: TextStyle(fontSize: 18)), Container( decoration: BoxDecoration( color: (project.cat!.productive) ?Colors.green : Colors.red, borderRadius: BorderRadius.circular(8) ), child:Padding( padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 2), child: Text(project.cat!.name), )) ], ), Divider(), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text("${project.steps.length} steps"), Container( decoration: BoxDecoration( color: Colors.redAccent, borderRadius: BorderRadius.circular(8) ), child:Padding( padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 2), // padding: const EdgeInsets.symmetric(horizontal: 5, vertical: 2), child: Text(durationToDays(timeLeft)), // child: Text("Deadline : " +DateFormat("yyyy-MM-dd").format(project.deadline)), )) ], ) ], ), ), ) ) ) ] ); } } String durationToDays(Duration duration){ String output =""; if(duration.inDays > 30){ output += (duration.inDays/30).floor().toString() + " months"; output += (duration.inDays%30==0) ? "" : " and " + (duration.inDays %30).toString() + " days"; }else{ output += (duration.inDays %30).toString() + " days"; } output += " left"; return output; }