diff --git a/lib/Data.dart b/lib/Data.dart index 69e5a83..c9518c8 100644 --- a/lib/Data.dart +++ b/lib/Data.dart @@ -37,6 +37,10 @@ class TaskType{ static String colName="name"; static String colCategory = "category_id"; static String colRelatedProject = "related_project"; + + static String getDisplayName(TaskType taskType){ + return (taskType.name + ((taskType.relatedProject != null) ? ' [${taskType.relatedProject!.name}]' : '')); + } } class Activity{ diff --git a/lib/DebugHelper.dart b/lib/DebugHelper.dart index 43d4dbd..997e38a 100644 --- a/lib/DebugHelper.dart +++ b/lib/DebugHelper.dart @@ -17,7 +17,7 @@ class Debug{ static void Log(Object? msg){ if(!enableErrorLoggin) {return;} - print('\x1B[0m$msg'); + print('\x1B[36m$msg\x1B[0m'); } } \ No newline at end of file diff --git a/lib/NewTodo.dart b/lib/NewTodo.dart index 1561e1c..177995b 100644 --- a/lib/NewTodo.dart +++ b/lib/NewTodo.dart @@ -6,6 +6,7 @@ import 'package:intl/intl.dart'; import 'package:tasktracker/NewTask.dart'; import 'package:tasktracker/NotificationsManager.dart'; import 'Data.dart'; +import 'DebugHelper.dart'; import 'Dialogs.dart'; import 'User.dart' as User; @@ -14,19 +15,21 @@ DateFormat dateTimeFormat = DateFormat("yyyy-MM-dd HH:mm"); DateFormat durationFormat = DateFormat("HH:mm:ss"); class NewTodo extends StatefulWidget { - NewTodo({Key? key, this.selectedTask, this.metadata, this.dueDate,this.notificationTime}) : super(key: key); + NewTodo({Key? key, this.selectedTask, this.metadata, this.dueDate,this.notificationTime, this.old_id}) : super(key: key); + late String? old_id; late String? metadata; late String? selectedTask; late DateTime? dueDate; late DateTime? notificationTime; @override - _NewActivity createState() => _NewActivity(selectedCat: selectedTask, metadata: metadata); + _NewActivity createState() => _NewActivity(selectedCat: selectedTask, metadata: metadata, DueDate: dueDate, notificationTime: notificationTime,oldId: old_id); } class _NewActivity extends State { late String init_selectedTask; - _NewActivity({String? metadata, String? selectedCat, DateTime? DueDate, this.notificationTime}) { - editing =selectedCat != null && DueDate !=null; + _NewActivity({String? metadata, String? selectedCat, DateTime? DueDate, this.notificationTime, this.oldId}) { + Debug.Log('selected cat : $selectedCat'); + editing =selectedCat != null && DueDate !=null && metadata !=null && oldId!=null; dueDate = DueDate ?? DateTime.now().add(Duration(days: 1)); this.metadataController.text = metadata ?? ""; if(this.metadataController.text.contains('[') && this.metadataController.text.contains(']') ){ @@ -36,7 +39,7 @@ class _NewActivity extends State { selectedStep='None'; } this.init_selectedTask = this.selectedCat = selectedCat ?? User.taskTypes[0].name; - print(" meta:$metadata, task: $selectedCat"); + Debug.Log(" meta:$metadata, task: $selectedCat, notification_time : ${notificationTime}"); } TextEditingController metadataController = TextEditingController(); @@ -45,6 +48,7 @@ class _NewActivity extends State { DateTime? notificationTime; bool editing = false; + String? oldId; Map taskTypes = {}; Map getActivities() { Map _cats = {}; @@ -57,7 +61,7 @@ class _NewActivity extends State { String name = element.name; if (_cats.keys.toString().contains(element.name)) { } else { - String displayName = (name + ((element.relatedProject != null) ? ' [${element.relatedProject!.name}]' : '')); + String displayName = TaskType.getDisplayName(element); _cats.putIfAbsent(displayName, () => element); } }); @@ -298,7 +302,13 @@ class _NewActivity extends State { } void edit_action() async { + if(metadataController.text.isEmpty){ + Dialogs.showAlertDialog(context, 'Invalid data', 'Please enter description to add new todo'); + return; + } + await User.UserOperations.editTodo(oldId!,selectedCat,((selectedStep!=null && selectedStep != 'None') ? '[$selectedStep]' : '')+ metadataController.text, dueDate, notificationTime); + Navigator.of(context).pop(); } } diff --git a/lib/NotificationsManager.dart b/lib/NotificationsManager.dart index d3da535..f19aa17 100644 --- a/lib/NotificationsManager.dart +++ b/lib/NotificationsManager.dart @@ -5,6 +5,7 @@ import 'package:intl/intl.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'Data.dart'; +import 'DebugHelper.dart'; import 'Dialogs.dart'; import 'User.dart' as User; @@ -25,6 +26,7 @@ class NotificationManager{ fltrNotification.initialize(initilizationsSettings, onSelectNotification: notificationSelected); await fltrNotification.cancel(0); + await fltrNotification.cancel(2); int notification_interval = await Settings.getNotificationInterval(); bool adaptive_notification = await Settings.getAdaptiveNotification(); @@ -68,6 +70,16 @@ class NotificationManager{ fltrNotification.cancel(1); } + User.todos.forEach((element) { + if(element.notificationTime!=null){ + if(element.notificationTime!.isAfter(DateTime.now())){ + fltrNotification.schedule(2, "Time for ${element.task!.name}", "${element.metadata}", element.notificationTime, generalNotificationDetails); + } + + + } + }); + if(adaptive_notification && adaptive_notification_availabel){ print("Smart!, Using adaptive huh?"); //Calculate you little thing! CALCULATE!' @@ -110,20 +122,20 @@ class NotificationManager{ } } } - print("Time Map : ${timeMap.length}"); - print(timeMap); + Debug.LogResponse("${timeMap.length}",src:'Time Map'); + Debug.LogResponse(timeMap); timeMap.forEach((key, value) { DateTime now = DateTime.now(); DateTime todayStart = DateTime(now.year,now.month,now.day,0,0,0); DateTime thisTime = todayStart.add(Duration(minutes: key)); if(value.length < (totalDays.clamp(0, 30) / 3).ceil()){ - print("${timeFormat.format(thisTime)} this happened only ${value.length} times, Ignoring..."); + Debug.Log("${timeFormat.format(thisTime)} this happened only ${value.length} times, Ignoring..."); }else { - print(timeFormat.format(thisTime)); + Debug.Log(timeFormat.format(thisTime)); if(thisTime.isBefore(DateTime.now())) { thisTime = thisTime.add(Duration(days: 1)); } - print("Scheduling at $thisTime"); + Debug.LogResponse("Scheduling at $thisTime"); fltrNotification.schedule(0, "Don't forget to add new activity", "Adaptive notifications suggests that you may have done by now to track.", thisTime, generalNotificationDetails); } @@ -131,18 +143,18 @@ class NotificationManager{ }else if(notification_interval>0) { var scheduledTime = DateTime.now().add(Duration(hours: notification_interval)); - fltrNotification.schedule(1, "What did you do in last $notification_interval hours?", "Click here to track your last activities...", + fltrNotification.schedule(0, "What did you do in last $notification_interval hours?", "Click here to track your last activities...", scheduledTime, generalNotificationDetails,); print("Sent notification schedule"); } await Future.delayed(Duration(seconds: 2)); try{ final List pendingNotificationRequests =await fltrNotification.pendingNotificationRequests(); - print("Notifications"); + Debug.LogResponse("Notifications"); pendingNotificationRequests.forEach((element) { - print("${element.id} : ${element.title} -> ${element.body} \n payload:${element.payload}"); + Debug.LogResponse("${element.id} : ${element.title} -> ${element.body} \n payload:${element.payload}"); });}catch(e){ - print("Error printing notifications \n $e"); + Debug.LogError("Error printing notifications \n $e"); } } diff --git a/lib/Todos.dart b/lib/Todos.dart index d6e31d8..3a31db1 100644 --- a/lib/Todos.dart +++ b/lib/Todos.dart @@ -9,6 +9,7 @@ import 'package:tasktracker/NewJournal.dart'; import 'package:tasktracker/NewTodo.dart'; import 'package:tasktracker/main.dart'; import 'Data.dart'; +import 'DebugHelper.dart'; import 'User.dart' as User; import 'Dialogs.dart'; @@ -366,9 +367,10 @@ class _TodosPageState extends State { if (selecting) InkWell( onTap: () { - // Navigator.of(context).push(MaterialPageRoute(builder: (context) => NewJournal(date: todo.day, title: todo.title, text: todo.description,))).then((val) { - // setState(() {}); - // }); + Debug.Log('notification : ${todo.notificationTime}'); + Navigator.of(context).push(MaterialPageRoute(builder: (context) =>NewTodo(selectedTask: TaskType.getDisplayName(todo.task!), metadata: todo.metadata, dueDate: todo.dueDate, notificationTime: todo.notificationTime, old_id: todo.id,))).then((val) { + setState(() {}); + }); selecting = false; setState(() {}); }, diff --git a/lib/User.dart b/lib/User.dart index 9466425..cb7b3c7 100644 --- a/lib/User.dart +++ b/lib/User.dart @@ -1595,6 +1595,53 @@ class UserOperations { await executeQueries(); } + static Future editTodo(String oldId, String taskType, String metadata, DateTime dueDate, DateTime? notificationTime) async { + + String taskId = username + taskType; + if(taskId.contains('[') && taskId.contains(']')){ + //has a project related + taskId = taskId.substring(0, taskId.indexOf('[') - 1); + } + + String id = taskId + metadata; + + Map queryBody = { + 'old_id' : oldId, + 'username': username, + 'task': taskId, + 'metadata': metadata, + 'due_date': DateFormat('yyyy-MM-dd').format(dueDate), + if(notificationTime!=null)'notification_time':DateFormat('yyyy-MM-dd HH:mm').format(notificationTime) + }; + if (cacheEnabled) { + //Add Query + Map query = {Queries.colLink: 'edit_todo', Queries.colData: jsonEncode(queryBody)}; + + Debug.LogResponse("adding new query ${query[Queries.colLink]} : ${jsonEncode(queryBody)}"); + + await cacheDb.insert('Queries', query); + String dueDateString = DateFormat('yyyy-MM-dd').format(dueDate); + //update Cache + // Map data = {'id': id, Todo.colCat: taskId, Todo.colMetadata: metadata, Todo.colDueDate: DateFormat('yyyy-MM-dd').format(dueDate), if(notificationTime!=null)Todo.colNotificationTime:DateFormat('yyyy-MM-dd HH:mm').format(notificationTime)}; + // await cacheDb.insert('Todos', data); + await cacheDb.rawUpdate("UPDATE Todos SET id='$id', ${Todo.colCat}='$taskId', ${Todo.colMetadata}='$metadata', ${Todo.colDueDate}='$dueDateString'${(notificationTime!=null) ? ", ${Todo.colNotificationTime}='${DateFormat('yyyy-MM-dd HH:mm').format(notificationTime)}'" : ''} WHERE id='$oldId'"); + await refreshUserData(forceOffline: true); + } else { + try { + http.Response queryResponse = (await http.post(Uri.parse('http://161.97.127.136/task_tracker/edit_todo.php'), body: queryBody)); + Debug.LogResponse("Query executed : Results{${queryResponse.body}"); + if (queryResponse.body.toLowerCase().contains("success")) { + //Success + } + } catch (e) { + Debug.LogError('NC: Error editing todo entry $e}'); + } + //executeQueries(); + } + //Add to server and refresh Cache + await executeQueries(); + } + static Future deleteTask(String name, {bulk = false}) async { Map queryBody = { diff --git a/lib/main.dart b/lib/main.dart index 959a223..259a1c1 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -740,7 +740,7 @@ class _MyHomePageState extends State { dataLabelMapper: (ProductivityMapData sales, _) => sales.productivity.toStringAsFixed(1) + "%", dataLabelSettings: DataLabelSettings(overflowMode: OverflowMode.hide, showZeroValue: false, isVisible: true), onPointTap: (ChartPointDetails point){ - Dialogs.showJournalLink(dFormat.parse(productivityData[productivityData.length-point.pointIndex!].day)); + Dialogs.showJournalLink(dFormat.parse(productivityData[productivityData.length-point.pointIndex!-1].day)); //showAlertDialog(context, productivityData[point.pointIndex!].day, "I'll show you detailed info about this day in future, When my master creates the feature"); }, pointColorMapper: (ProductivityMapData sales, _)=> (User.journalExists(dFormat.parse(sales.day)) ? Colors.lightGreenAccent : Colors.green)