Day Seperation bug fixed
This commit is contained in:
@@ -230,7 +230,8 @@ class _ActivitiesState extends State<Activities> {
|
||||
}
|
||||
|
||||
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<Activities> {
|
||||
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<Activities> {
|
||||
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<Activities> {
|
||||
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<Activities> {
|
||||
]),
|
||||
),
|
||||
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());
|
||||
},)
|
||||
]);
|
||||
|
||||
@@ -347,7 +347,18 @@ Future<List<Activity>> 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<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 {
|
||||
Map<String, String> queryBody = <String, String>{
|
||||
'id': username + name,
|
||||
|
||||
@@ -148,13 +148,13 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
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<MyHomePage> {
|
||||
print("Closing progress dialog");
|
||||
}
|
||||
});
|
||||
await User.refreshUserData();
|
||||
|
||||
}
|
||||
@override
|
||||
void dispose() {
|
||||
@@ -177,10 +179,9 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
super.dispose();
|
||||
connectivitySub?.cancel();
|
||||
}
|
||||
|
||||
void LoadStats() async {
|
||||
// return;
|
||||
|
||||
// await User.refreshUserData();
|
||||
DateFormat dFormat = DateFormat("MM/dd");
|
||||
Map<Category, int> catTimeMap = <Category, int>{};
|
||||
Map<Category, int> catBriefMap = <Category, int>{};
|
||||
@@ -206,19 +207,9 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
}
|
||||
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<MyHomePage> {
|
||||
}
|
||||
|
||||
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<MyHomePage> {
|
||||
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<MyHomePage> {
|
||||
catsData.sort((a, b) => a.time.compareTo(b.time));
|
||||
});
|
||||
}
|
||||
// loadingStats=false;
|
||||
}
|
||||
|
||||
void showOfflineSnack() async {
|
||||
@@ -486,7 +470,7 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
)),
|
||||
),
|
||||
Container(
|
||||
height: 370,
|
||||
height: 400,
|
||||
padding: EdgeInsets.all(10),
|
||||
child: Card(
|
||||
elevation: 8,
|
||||
@@ -507,15 +491,16 @@ class _MyHomePageState extends State<MyHomePage> {
|
||||
}),
|
||||
]),
|
||||
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
|
||||
PieSeries<CatMapData, String>(
|
||||
|
||||
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))
|
||||
]))
|
||||
],
|
||||
)
|
||||
|
||||
@@ -25,6 +25,8 @@ class _NewActivity extends State<NewActivity> {
|
||||
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<NewActivity> {
|
||||
TextEditingController metadataController = TextEditingController();
|
||||
late String selectedCat;
|
||||
|
||||
|
||||
bool editing=false;
|
||||
|
||||
List<String> getActivities(){
|
||||
List<String> _cats = [];
|
||||
print(User.taskTypes[0].name + " : " + selectedCat);
|
||||
@@ -53,7 +58,7 @@ class _NewActivity extends State<NewActivity> {
|
||||
@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<NewActivity> {
|
||||
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<NewActivity> {
|
||||
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) {
|
||||
|
||||
Reference in New Issue
Block a user