Day Seperation bug fixed

This commit is contained in:
Sewmina
2022-03-11 04:01:44 +05:30
parent 3cd1ffdc1c
commit 959cada3a7
4 changed files with 129 additions and 56 deletions

View File

@@ -230,7 +230,8 @@ class _ActivitiesState extends State<Activities> {
} }
Widget DateSeperator(date, prodActs, unprodActs) { Widget DateSeperator(date, prodActs, unprodActs) {
double prodPercentage = (prodActs / (prodActs + unprodActs)) * 100; // double prodPercentage = (prodActs / (prodActs + unprodActs)) * 100;
double prodPercentage = (prodActs / 1440) * 100;
return Padding( return Padding(
padding: const EdgeInsets.fromLTRB(0, 20, 10, 0), padding: const EdgeInsets.fromLTRB(0, 20, 10, 0),
child: Column( child: Column(
@@ -256,24 +257,26 @@ class _ActivitiesState extends State<Activities> {
children: [ children: [
Row( Row(
children: [ children: [
if(prodPercentage < 35)Text(Main.MinutesToTimeString(prodActs),),
Container( Container(
child: Align( child: Align(
child: FittedBox(fit: BoxFit.fitWidth,child: Text(Main.MinutesToTimeString(prodActs),)), child: (prodPercentage >= 35) ?Text(Main.MinutesToTimeString(prodActs),) : Container(),
alignment: Alignment.center, alignment: Alignment.center,
), ),
width: (prodPercentage) * 1.7, width: (prodPercentage) * 1,
height: 25, height: 20,
decoration: BoxDecoration(color: Colors.green, borderRadius: BorderRadius.horizontal(left: Radius.circular(10))), decoration: BoxDecoration(color: Colors.green, borderRadius: BorderRadius.horizontal(left: Radius.circular(10))),
), ),
Container( Container(
child: Align( child: Align(
child: Text(Main.MinutesToTimeString(unprodActs)), child: (prodPercentage < 35) ?Text(Main.MinutesToTimeString(unprodActs)) :Container(),
alignment: Alignment.center, alignment: Alignment.center,
), ),
width: (100 - prodPercentage) * 1.7, width: (100 - prodPercentage) * 1,
height: 25, height: 20,
decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.horizontal(right: Radius.circular(10))), decoration: BoxDecoration(color: Colors.red, borderRadius: BorderRadius.horizontal(right: Radius.circular(10))),
), ),
if(prodPercentage >= 35)Text(Main.MinutesToTimeString(unprodActs))
], ],
), ),
SizedBox( SizedBox(
@@ -357,7 +360,7 @@ class _ActivitiesState extends State<Activities> {
child: Column( child: Column(
children: [ children: [
Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
Row(children: [ Row(mainAxisSize: MainAxisSize.max,children: [
Text(name + " [$timeSpan]", style: TextStyle(fontSize: 17)), Text(name + " [$timeSpan]", style: TextStyle(fontSize: 17)),
if (containsMetadata) if (containsMetadata)
Icon( Icon(
@@ -365,11 +368,13 @@ class _ActivitiesState extends State<Activities> {
size: 20, size: 20,
), ),
if (containsMetadata) if (containsMetadata)
FittedBox( SizedBox(
child: Text( width: 150,
activity.metadata ?? '', child: Text(
), activity.metadata ?? '',
) ),
),
]), ]),
// Icon(Icons.analytics, color: color, size: 20,), // Icon(Icons.analytics, color: color, size: 20,),
@@ -403,6 +408,11 @@ class _ActivitiesState extends State<Activities> {
]), ]),
), ),
if(selecting)InkWell(child: Container(margin:EdgeInsets.all(10),child: Icon(Icons.edit)),onTap: (){ 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()); Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewActivity(sTime: activity.startTime,eTime: activity.endTime,metadata: activity.metadata,selectedTask: activity.taskType.name,))).then((value) => UpdateList());
},) },)
]); ]);

View File

@@ -347,7 +347,18 @@ Future<List<Activity>> GetActivities(bool forceOffline) async {
continue; continue;
} }
//print("TaskType:{$type}, Start Time:{$startTime}, endTime:{$endTime}, metadata:${metadata}"); //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; activities = _activities;
return activities; return activities;
@@ -507,6 +518,47 @@ class UserOperations {
} }
} }
static Future<void> 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<String, String> queryBody = <String, String>{
'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<String, Object> 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<String, Object> 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<void> deleteTask(String name, {bulk = false}) async { static Future<void> deleteTask(String name, {bulk = false}) async {
Map<String, String> queryBody = <String, String>{ Map<String, String> queryBody = <String, String>{
'id': username + name, 'id': username + name,

View File

@@ -148,13 +148,13 @@ class _MyHomePageState extends State<MyHomePage> {
init(context); init(context);
super.initState(); super.initState();
print("Initializing refresh stream on main dart"); print("Initializing refresh stream on main dart");
LoadStats();
connectivitySub=Connectivity().onConnectivityChanged.listen((result) { connectivitySub=Connectivity().onConnectivityChanged.listen((result) {
if (this.mounted) { if (this.mounted) {
setState(() {}); setState(() {});
} }
}); });
LoadStats();
// User.progressDialog=progressDialog; // User.progressDialog=progressDialog;
} }
var refreshSub; var refreshSub;
@@ -170,6 +170,8 @@ class _MyHomePageState extends State<MyHomePage> {
print("Closing progress dialog"); print("Closing progress dialog");
} }
}); });
await User.refreshUserData();
} }
@override @override
void dispose() { void dispose() {
@@ -177,10 +179,9 @@ class _MyHomePageState extends State<MyHomePage> {
super.dispose(); super.dispose();
connectivitySub?.cancel(); connectivitySub?.cancel();
} }
void LoadStats() async { void LoadStats() async {
// return; // return;
// await User.refreshUserData();
DateFormat dFormat = DateFormat("MM/dd"); DateFormat dFormat = DateFormat("MM/dd");
Map<Category, int> catTimeMap = <Category, int>{}; Map<Category, int> catTimeMap = <Category, int>{};
Map<Category, int> catBriefMap = <Category, int>{}; Map<Category, int> catBriefMap = <Category, int>{};
@@ -206,19 +207,9 @@ class _MyHomePageState extends State<MyHomePage> {
} }
firstDay = element.startTime; firstDay = element.startTime;
String thisDate = dFormat.format(element.startTime); String thisDate = dFormat.format(element.startTime);
String endDate = dFormat.format(element.endTime);
int thisMinutes = element.endTime.difference(element.startTime).inMinutes; 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)) { if (!days.contains(thisDate)) {
days.add(dFormat.format(element.startTime)); days.add(dFormat.format(element.startTime));
} }
@@ -250,25 +241,16 @@ class _MyHomePageState extends State<MyHomePage> {
} }
if (thisDate == curDay) { if (thisDate == curDay) {
if (element.taskType.cat == null) { if (element.taskType.cat == null) {
continue; continue;
} }
print("Null : ${thisMinutes}"); print("Null : ${thisMinutes}");
if (catTimeMap.containsKey(element.taskType.cat)) { if (catTimeMap.containsKey(element.taskType.cat)) {
catTimeMap[element.taskType.cat!] = (catTimeMap[element.taskType.cat]! + thisMinutes); catTimeMap[element.taskType.cat!] =
} else { (catTimeMap[element.taskType.cat]! + thisMinutes);
catTimeMap.putIfAbsent(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.startTime.isAfter(catsRange!.start) && element.startTime.isBefore(catsRange!.end)) || if ((element.startTime.isAfter(catsRange!.start) && element.startTime.isBefore(catsRange!.end)) ||
@@ -299,17 +281,18 @@ class _MyHomePageState extends State<MyHomePage> {
dailyData.add(CatMapData(key.name, value, barCol)); dailyData.add(CatMapData(key.name, value, barCol));
trackedTime += value; trackedTime += value;
}); });
int untrackedTime = 1440-trackedTime;
print("Tracked time : $trackedTime"); print("Tracked time : $trackedTime");
dailyData.sort((a, b) { dailyData.sort((a, b) {
return a.name.toLowerCase().compareTo(b.name.toLowerCase()); 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) { for (var element in days) {
// if(productivtyActs.containsKey(element) && unproductivtyActs.containsKey(element)){ // if(productivtyActs.containsKey(element) && unproductivtyActs.containsKey(element)){
int prodActs = (productivtyActs[element] ?? 0); int prodActs = (productivtyActs[element] ?? 0);
int unprodActs = (unproductivtyActs[element] ?? 0); int unprodActs = (unproductivtyActs[element] ?? 0);
double prod = (prodActs / (prodActs + unprodActs)) * 100; double prod = (prodActs / 1440) * 100;
productivityData.add(ProductivityMapData(element, prod)); productivityData.add(ProductivityMapData(element, prod));
// } // }
} }
@@ -331,6 +314,7 @@ class _MyHomePageState extends State<MyHomePage> {
catsData.sort((a, b) => a.time.compareTo(b.time)); catsData.sort((a, b) => a.time.compareTo(b.time));
}); });
} }
// loadingStats=false;
} }
void showOfflineSnack() async { void showOfflineSnack() async {
@@ -486,7 +470,7 @@ class _MyHomePageState extends State<MyHomePage> {
)), )),
), ),
Container( Container(
height: 370, height: 400,
padding: EdgeInsets.all(10), padding: EdgeInsets.all(10),
child: Card( child: Card(
elevation: 8, elevation: 8,
@@ -507,15 +491,16 @@ class _MyHomePageState extends State<MyHomePage> {
}), }),
]), ]),
Expanded( Expanded(
child: SfCircularChart(legend: Legend(isVisible: true), series: <CircularSeries>[ child: SfCircularChart(legend: Legend(isVisible: true,position: LegendPosition.bottom,overflowMode: LegendItemOverflowMode.wrap), series: <CircularSeries>[
// Render pie chart // Render pie chart
PieSeries<CatMapData, String>( PieSeries<CatMapData, String>(
dataSource: dailyData, dataSource: dailyData,
pointColorMapper: (CatMapData data, _) => data.color, pointColorMapper: (CatMapData data, _) => data.color,
xValueMapper: (CatMapData data, _) => data.name, xValueMapper: (CatMapData data, _) => data.name,
yValueMapper: (CatMapData data, _) => data.time, yValueMapper: (CatMapData data, _) => data.time,
dataLabelMapper: (CatMapData sales, _) => MinutesToTimeString(sales.time), dataLabelMapper: (CatMapData sales, _) => MinutesToTimeString(sales.time),
dataLabelSettings: DataLabelSettings(isVisible: true, useSeriesColor: true)) dataLabelSettings: DataLabelSettings(isVisible: true, useSeriesColor: true, overflowMode: OverflowMode.shift, showZeroValue: false))
])) ]))
], ],
) )

View File

@@ -25,6 +25,8 @@ class _NewActivity extends State<NewActivity> {
late DateTime init_eTime; late DateTime init_eTime;
late String init_selectedTask; late String init_selectedTask;
_NewActivity({DateTime? eTime, DateTime? sTime, String? metadata, String? selectedCat}){ _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_sTime=this.startTime = sTime ?? DateTime.now();
this.init_eTime=this.endTime = eTime ??DateTime.now().add(Duration(minutes: 30)); this.init_eTime=this.endTime = eTime ??DateTime.now().add(Duration(minutes: 30));
this.metadataController.text = metadata ?? ""; this.metadataController.text = metadata ?? "";
@@ -38,6 +40,9 @@ class _NewActivity extends State<NewActivity> {
TextEditingController metadataController = TextEditingController(); TextEditingController metadataController = TextEditingController();
late String selectedCat; late String selectedCat;
bool editing=false;
List<String> getActivities(){ List<String> getActivities(){
List<String> _cats = []; List<String> _cats = [];
print(User.taskTypes[0].name + " : " + selectedCat); print(User.taskTypes[0].name + " : " + selectedCat);
@@ -53,7 +58,7 @@ class _NewActivity extends State<NewActivity> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: AppBar(title: Text('New Activity')), appBar: AppBar(title: Text((editing) ? 'Edit Activity':'New Activity')),
body:Column( body:Column(
mainAxisSize: MainAxisSize.max, mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
@@ -283,10 +288,13 @@ class _NewActivity extends State<NewActivity> {
shape: StadiumBorder() shape: StadiumBorder()
), ),
onPressed: () { onPressed: () {
if(editing){
add_action(); edit_action();
}else {
add_action();
}
}, },
child: Text('Add Entry', child: Text((editing) ? 'Apply':'Add Activity',
style: TextStyle(fontSize: 20))))), style: TextStyle(fontSize: 20))))),
], ],
)), )),
@@ -331,6 +339,24 @@ class _NewActivity extends State<NewActivity> {
print("Failed adding new activity"); 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) { String _printDuration(Duration duration) {