Somethings, idk what I made
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user