From 959cada3a760987125aa42b17745d2aa6ac3184a Mon Sep 17 00:00:00 2001 From: Sewmina Date: Fri, 11 Mar 2022 04:01:44 +0530 Subject: [PATCH] Day Seperation bug fixed --- lib/Activities.dart | 36 ++++++++++++++++---------- lib/User.dart | 54 ++++++++++++++++++++++++++++++++++++++- lib/main.dart | 61 +++++++++++++++++--------------------------- lib/newActivity.dart | 34 +++++++++++++++++++++--- 4 files changed, 129 insertions(+), 56 deletions(-) diff --git a/lib/Activities.dart b/lib/Activities.dart index 4acf340..21b8d6d 100644 --- a/lib/Activities.dart +++ b/lib/Activities.dart @@ -230,7 +230,8 @@ class _ActivitiesState extends State { } Widget DateSeperator(date, prodActs, unprodActs) { - double prodPercentage = (prodActs / (prodActs + unprodActs)) * 100; + // double prodPercentage = (prodActs / (prodActs + unprodActs)) * 100; + double prodPercentage = (prodActs / 1440) * 100; return Padding( padding: const EdgeInsets.fromLTRB(0, 20, 10, 0), child: Column( @@ -256,24 +257,26 @@ class _ActivitiesState extends State { children: [ Row( children: [ + if(prodPercentage < 35)Text(Main.MinutesToTimeString(prodActs),), Container( child: Align( - child: FittedBox(fit: BoxFit.fitWidth,child: Text(Main.MinutesToTimeString(prodActs),)), + child: (prodPercentage >= 35) ?Text(Main.MinutesToTimeString(prodActs),) : Container(), alignment: Alignment.center, ), - width: (prodPercentage) * 1.7, - height: 25, + width: (prodPercentage) * 1, + height: 20, decoration: BoxDecoration(color: Colors.green, borderRadius: BorderRadius.horizontal(left: Radius.circular(10))), ), Container( child: Align( - child: Text(Main.MinutesToTimeString(unprodActs)), + child: (prodPercentage < 35) ?Text(Main.MinutesToTimeString(unprodActs)) :Container(), alignment: Alignment.center, ), - width: (100 - prodPercentage) * 1.7, - height: 25, + width: (100 - prodPercentage) * 1, + height: 20, decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.horizontal(right: Radius.circular(10))), ), + if(prodPercentage >= 35)Text(Main.MinutesToTimeString(unprodActs)) ], ), SizedBox( @@ -357,7 +360,7 @@ class _ActivitiesState extends State { child: Column( children: [ Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Row(children: [ + Row(mainAxisSize: MainAxisSize.max,children: [ Text(name + " [$timeSpan]", style: TextStyle(fontSize: 17)), if (containsMetadata) Icon( @@ -365,11 +368,13 @@ class _ActivitiesState extends State { size: 20, ), if (containsMetadata) - FittedBox( - child: Text( - activity.metadata ?? '', - ), - ) + SizedBox( + width: 150, + child: Text( + activity.metadata ?? '', + ), + ), + ]), // Icon(Icons.analytics, color: color, size: 20,), @@ -403,6 +408,11 @@ class _ActivitiesState extends State { ]), ), if(selecting)InkWell(child: Container(margin:EdgeInsets.all(10),child: Icon(Icons.edit)),onTap: (){ + selecting=false; + selectedActivities=[]; + setState(() { + + }); Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewActivity(sTime: activity.startTime,eTime: activity.endTime,metadata: activity.metadata,selectedTask: activity.taskType.name,))).then((value) => UpdateList()); },) ]); diff --git a/lib/User.dart b/lib/User.dart index 3012b35..eb69884 100644 --- a/lib/User.dart +++ b/lib/User.dart @@ -347,7 +347,18 @@ Future> GetActivities(bool forceOffline) async { continue; } //print("TaskType:{$type}, Start Time:{$startTime}, endTime:{$endTime}, metadata:${metadata}"); - _activities.add(Activity(taskType, DateTime.parse(startTime), DateTime.parse(endTime), metadata: metadata)); + DateTime sTime = DateTime.parse(startTime); + DateTime eTime = DateTime.parse(endTime); + + if(eTime.day!=sTime.day){ + DateTime midnight = DateTime(eTime.year,eTime.month,eTime.day,0,0,0); + + _activities.add(Activity(taskType, midnight, eTime, metadata: metadata)); + _activities.add(Activity(taskType, sTime, midnight, metadata: metadata)); + }else{ + _activities.add(Activity(taskType, DateTime.parse(startTime), DateTime.parse(endTime), metadata: metadata)); + } + } activities = _activities; return activities; @@ -507,6 +518,47 @@ class UserOperations { } } + static Future editActivity(DateTime init_sTime, DateTime init_eTime,String type, DateTime sTime, DateTime eTime, {String metadata = 'null', bool bulk = false, Function(int)? onOverlap}) async { + //Check for timeoverlapse + activities = await GetActivities(true); + int? overlapCount = Sqflite.firstIntValue(await cacheDb.rawQuery( + "SELECT COUNT(*) FROM Activities WHERE (((${Activity.colStartTime} < datetime('$sTime')) AND ((${Activity.colEndTime} > datetime('$eTime')) OR (${Activity.colEndTime} < datetime('$eTime') AND ${Activity.colEndTime} > datetime('$sTime')))) OR (${Activity.colStartTime} > datetime('$sTime') AND ${Activity.colStartTime} < datetime('$eTime')) OR (${Activity.colStartTime}=datetime('$sTime') AND ${Activity.colEndTime}=datetime('$eTime'))) AND ${Activity.colStartTime}!=datetime('${init_sTime}') AND ${Activity.colEndTime} != datetime('${init_eTime}')")); + + print("ActivityOverlaps: $overlapCount"); + if (overlapCount! > 0) { + onOverlap!(overlapCount); + return; + } + Map queryBody = { + 'username': username, + 'device_id': await Settings.UUID(), + 'type': username + type, + 'init_sTime': dFormat.format(init_sTime), + 'init_eTime':dFormat.format(init_eTime), + 'sTime': dFormat.format(sTime), + 'eTime': dFormat.format(eTime), + 'metadata': metadata + }; + + if (metadata.length > 0) {} + //Add Query + Map query = {Queries.colLink: 'edit_activity', Queries.colData: jsonEncode(queryBody)}; + + print("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); + + await cacheDb.insert('Queries', query); + + //update Cache + // Map data = {Activity.colType: username + type, Activity.colStartTime: dFormat.format(sTime), Activity.colEndTime: dFormat.format(eTime), Activity.colMetadata: metadata}; + // String updateActQuery = "UPDATE Activities SET ${Activity.colType}="; + // await cacheDb.insert('Activities', data); + await refreshUserData(); + if (!bulk) { + //Add to server and refresh Cache + await executeQueries(); + } + } + static Future deleteTask(String name, {bulk = false}) async { Map queryBody = { 'id': username + name, diff --git a/lib/main.dart b/lib/main.dart index dcc3b24..2cccfa1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -148,13 +148,13 @@ class _MyHomePageState extends State { init(context); super.initState(); print("Initializing refresh stream on main dart"); - LoadStats(); + connectivitySub=Connectivity().onConnectivityChanged.listen((result) { if (this.mounted) { setState(() {}); } }); - + LoadStats(); // User.progressDialog=progressDialog; } var refreshSub; @@ -170,6 +170,8 @@ class _MyHomePageState extends State { print("Closing progress dialog"); } }); + await User.refreshUserData(); + } @override void dispose() { @@ -177,10 +179,9 @@ class _MyHomePageState extends State { super.dispose(); connectivitySub?.cancel(); } - void LoadStats() async { // return; - + // await User.refreshUserData(); DateFormat dFormat = DateFormat("MM/dd"); Map catTimeMap = {}; Map catBriefMap = {}; @@ -206,19 +207,9 @@ class _MyHomePageState extends State { } firstDay = element.startTime; String thisDate = dFormat.format(element.startTime); - String endDate = dFormat.format(element.endTime); int thisMinutes = element.endTime.difference(element.startTime).inMinutes; - int nextMinutes = 0; - if(element.startTime.day != element.endTime.day){ - print("welp, ${element.startTime} - ${element.endTime}"); - DateTime nextDayBaseline = DateTime(element.endTime.year, element.endTime.month, - element.endTime.day,0,0,0); - nextMinutes = element.endTime.difference(nextDayBaseline).inMinutes; - thisMinutes -= nextMinutes; - print("Today : $thisMinutes, Next day : $nextMinutes"); - } if (!days.contains(thisDate)) { days.add(dFormat.format(element.startTime)); } @@ -250,25 +241,16 @@ class _MyHomePageState extends State { } if (thisDate == curDay) { - if (element.taskType.cat == null) { - continue; - } - print("Null : ${thisMinutes}"); - if (catTimeMap.containsKey(element.taskType.cat)) { - catTimeMap[element.taskType.cat!] = (catTimeMap[element.taskType.cat]! + thisMinutes); - } else { - catTimeMap.putIfAbsent(element.taskType.cat!, () => thisMinutes); - } - }else if(thisDate==endDate){ - if (element.taskType.cat == null) { - continue; - } - print("Null : ${nextMinutes}"); - if (catTimeMap.containsKey(element.taskType.cat)) { - catTimeMap[element.taskType.cat!] = (catTimeMap[element.taskType.cat]! + nextMinutes); - } else { - catTimeMap.putIfAbsent(element.taskType.cat!, () => nextMinutes); - } + if (element.taskType.cat == null) { + continue; + } + print("Null : ${thisMinutes}"); + if (catTimeMap.containsKey(element.taskType.cat)) { + catTimeMap[element.taskType.cat!] = + (catTimeMap[element.taskType.cat]! + thisMinutes); + } else { + catTimeMap.putIfAbsent(element.taskType.cat!, () => thisMinutes); + } } if ((element.startTime.isAfter(catsRange!.start) && element.startTime.isBefore(catsRange!.end)) || @@ -299,17 +281,18 @@ class _MyHomePageState extends State { dailyData.add(CatMapData(key.name, value, barCol)); trackedTime += value; }); + int untrackedTime = 1440-trackedTime; print("Tracked time : $trackedTime"); dailyData.sort((a, b) { return a.name.toLowerCase().compareTo(b.name.toLowerCase()); }); - dailyData.add(CatMapData("Untracked",1440-trackedTime, Colors.black)); + if(untrackedTime> 0){dailyData.add(CatMapData("Untracked",1440-trackedTime, Colors.black));}else{} for (var element in days) { // if(productivtyActs.containsKey(element) && unproductivtyActs.containsKey(element)){ int prodActs = (productivtyActs[element] ?? 0); int unprodActs = (unproductivtyActs[element] ?? 0); - double prod = (prodActs / (prodActs + unprodActs)) * 100; + double prod = (prodActs / 1440) * 100; productivityData.add(ProductivityMapData(element, prod)); // } } @@ -331,6 +314,7 @@ class _MyHomePageState extends State { catsData.sort((a, b) => a.time.compareTo(b.time)); }); } + // loadingStats=false; } void showOfflineSnack() async { @@ -486,7 +470,7 @@ class _MyHomePageState extends State { )), ), Container( - height: 370, + height: 400, padding: EdgeInsets.all(10), child: Card( elevation: 8, @@ -507,15 +491,16 @@ class _MyHomePageState extends State { }), ]), Expanded( - child: SfCircularChart(legend: Legend(isVisible: true), series: [ + child: SfCircularChart(legend: Legend(isVisible: true,position: LegendPosition.bottom,overflowMode: LegendItemOverflowMode.wrap), series: [ // Render pie chart PieSeries( + dataSource: dailyData, pointColorMapper: (CatMapData data, _) => data.color, xValueMapper: (CatMapData data, _) => data.name, yValueMapper: (CatMapData data, _) => data.time, dataLabelMapper: (CatMapData sales, _) => MinutesToTimeString(sales.time), - dataLabelSettings: DataLabelSettings(isVisible: true, useSeriesColor: true)) + dataLabelSettings: DataLabelSettings(isVisible: true, useSeriesColor: true, overflowMode: OverflowMode.shift, showZeroValue: false)) ])) ], ) diff --git a/lib/newActivity.dart b/lib/newActivity.dart index 7773602..5d45f9a 100644 --- a/lib/newActivity.dart +++ b/lib/newActivity.dart @@ -25,6 +25,8 @@ class _NewActivity extends State { late DateTime init_eTime; late String init_selectedTask; _NewActivity({DateTime? eTime, DateTime? sTime, String? metadata, String? selectedCat}){ + editing = sTime != null && eTime!=null && selectedCat!=null; + this.init_sTime=this.startTime = sTime ?? DateTime.now(); this.init_eTime=this.endTime = eTime ??DateTime.now().add(Duration(minutes: 30)); this.metadataController.text = metadata ?? ""; @@ -38,6 +40,9 @@ class _NewActivity extends State { TextEditingController metadataController = TextEditingController(); late String selectedCat; + + bool editing=false; + List getActivities(){ List _cats = []; print(User.taskTypes[0].name + " : " + selectedCat); @@ -53,7 +58,7 @@ class _NewActivity extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: AppBar(title: Text('New Activity')), + appBar: AppBar(title: Text((editing) ? 'Edit Activity':'New Activity')), body:Column( mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -283,10 +288,13 @@ class _NewActivity extends State { shape: StadiumBorder() ), onPressed: () { - - add_action(); + if(editing){ + edit_action(); + }else { + add_action(); + } }, - child: Text('Add Entry', + child: Text((editing) ? 'Apply':'Add Activity', style: TextStyle(fontSize: 20))))), ], )), @@ -331,6 +339,24 @@ class _NewActivity extends State { print("Failed adding new activity"); } } + + void edit_action() async{ + print('adding Task Type : $selectedCat at $startTime - $endTime'); + bool failed=false; + await User.UserOperations.editActivity(init_sTime,init_eTime,selectedCat,startTime, endTime,metadata:metadataController.text, onOverlap: (overlapCount){ + showAlertDialog(context, 'Error editing activity', 'Cannot add activity between ${dateFormat.format(startTime)} - ${dateFormat.format(endTime)}, $overlapCount activities are already added within this time range'); + failed=true; + }); + + if(!failed) { + print("popping : ${navigatorKey.currentWidget?.toStringShort() ?? "n/a"}"); + Navigator.of(navigatorKey.currentContext!).popUntil((route){ + return route.isFirst; + }); + }else{ + print("Failed editing new activity"); + } + } } String _printDuration(Duration duration) {