Somethings, idk what I made

This commit is contained in:
Sewmina
2022-04-21 15:56:23 +05:30
parent 1f35254b5b
commit fd9cef8687
5 changed files with 549 additions and 385 deletions

View File

@@ -1,6 +1,7 @@
import 'package:flutter/material.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:intl/intl.dart';
import 'package:syncfusion_flutter_charts/charts.dart';
import 'package:tasktracker/AvgDay.dart';
import 'package:tasktracker/main.dart';
@@ -16,9 +17,30 @@ class AnalyticsPage extends StatefulWidget {
}
class _AnalyticsPageState extends State<AnalyticsPage> {
@override
Widget build(BuildContext context) {
List<Activity> avgDayActs = AnalyticTools.getAverageDayActs(DateTimeRange(start: DateTime.now().subtract(Duration(days:7)),end: DateTime.now()));
List<CatMapData> avgDayData =[];
Map<Category, int> avgTime = <Category,int>{};
for (var act in avgDayActs) {
if(avgTime.containsKey(act.taskType.cat!)){
int _val = avgTime[act.taskType.cat!]!;
avgTime.update(act.taskType.cat!, (value) => _val + act.endTime.difference(act.startTime).inMinutes);
}else{
avgTime.putIfAbsent(act.taskType.cat!, () => act.endTime.difference(act.startTime).inMinutes);
}
}
int trackedTime = 0;
avgTime.forEach((key, value) {
avgDayData.add(CatMapData(key.name, value, HexColor.fromHex(key.color)));
trackedTime+= value;
});
avgDayData.add(CatMapData('Untracked', 1440-trackedTime, Colors.black));
// for (var value in avgActs) {
// Debug.LogResponse('${value.taskType.name} : ${DateFormat('HH:mm').format(value.startTime)} - ${DateFormat('HH:mm').format(value.endTime)}');
// }
@@ -51,7 +73,29 @@ class _AnalyticsPageState extends State<AnalyticsPage> {
],
),
Divider(),
Container(
height: 400,
padding: EdgeInsets.all(10),
child: Padding(
padding: EdgeInsets.all(8),
child: (!days.isEmpty)
? Column(
children: [
Expanded(
child: SfCircularChart(legend: Legend(isVisible: true,position: LegendPosition.bottom,overflowMode: LegendItemOverflowMode.wrap), series: <CircularSeries>[
// Render pie chart
PieSeries<CatMapData, String>(
dataSource: avgDayData,
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, overflowMode: OverflowMode.shift, showZeroValue: false))
]))
],
)
: Row(mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.center, children: [CircularProgressIndicator()]))),
],
),
@@ -66,9 +110,42 @@ class _AnalyticsPageState extends State<AnalyticsPage> {
class AnalyticTools{
static double dailyThreshold = 0.9;
static int activityGroupingThreshold = 4;
static Map<DateTime, double> getProductivities(DateTimeRange _range){
DateTimeRange range = DateTimeRange(start: DateTime(_range.start.year, _range.start.month,_range.start.day, 0,0,0), end: DateTime(_range.end.year, _range.end.month,_range.end.day, 23,59,59));
Map<DateTime, double> prodData = <DateTime, double>{};
Map<DateTime, int> prodActs = <DateTime, int>{};
Debug.Log("Calculating productivity between ${range.start} - ${range.end}");
//PASS 1: Split Activities into prod and unprod
for (var activity in User.activities) {
if(activity.startTime.isAfter(range.start) && activity.endTime.isBefore(range.end)){
//Eligible for anal
DateTime day = DateTime(activity.startTime.year, activity.startTime.month, activity.startTime.day);
if(activity.taskType!.cat!.productive){
if(prodActs.containsKey(day)){
int _prod = prodActs[day] ?? 0;
prodActs.update(day, (value) => _prod +activity.endTime.difference(activity.startTime).inMinutes);
}else{
prodActs.putIfAbsent(day, () => activity.endTime.difference(activity.startTime).inMinutes);
}
}
}
}
//PASS 2: Calculate productivity percentage and add them into a list
for(int i = 0; i <= range.end.difference(range.start).inDays; i++){
DateTime day = DateTime(range.start.add(Duration(days: i)).year,range.start.add(Duration(days: i)).month,range.start.add(Duration(days: i)).day);
double productivity = ((prodActs[day] ?? 0) / 1440) * 100;
Debug.LogTest('productivity @ $day = $productivity');
prodData.putIfAbsent(day, () => productivity);
}
return prodData;
}
static double dailyThreshold = 0.9;
static int activityGroupingThreshold = 5;
static List<Activity> getAverageDayActs(DateTimeRange range){
int totalDays = range.end.difference(range.start).inDays;