- Implement DailyTaskController for managing daily tasks and fetching projects. - Create TaskModel to represent task data structure. - Develop DailyTaskScreen for displaying tasks with filtering options. - Update routes to include Daily Task navigation. - Enhance DashboardScreen to link to Daily Task. - Add Daily Task option in the left navigation bar.
119 lines
3.0 KiB
Dart
119 lines
3.0 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:get/get.dart';
|
|
import 'package:logger/logger.dart';
|
|
import 'package:marco/helpers/services/api_service.dart';
|
|
import 'package:marco/model/project_model.dart';
|
|
import 'package:marco/model/daily_task_model.dart';
|
|
|
|
final Logger log = Logger();
|
|
|
|
class DailyTaskController extends GetxController {
|
|
List<ProjectModel> projects = [];
|
|
String? selectedProjectId;
|
|
|
|
DateTime? startDateTask;
|
|
DateTime? endDateTask;
|
|
|
|
List<TaskModel> dailyTasks = [];
|
|
|
|
RxBool isLoading = false.obs;
|
|
|
|
@override
|
|
void onInit() {
|
|
super.onInit();
|
|
_initializeDefaults();
|
|
}
|
|
|
|
void _initializeDefaults() {
|
|
_setDefaultDateRange();
|
|
fetchProjects();
|
|
}
|
|
|
|
void _setDefaultDateRange() {
|
|
final today = DateTime.now();
|
|
startDateTask = today.subtract(const Duration(days: 7));
|
|
endDateTask = today;
|
|
log.i("Default date range set: $startDateTask to $endDateTask");
|
|
}
|
|
|
|
Future<void> fetchProjects() async {
|
|
isLoading.value = true;
|
|
|
|
final response = await ApiService.getProjects();
|
|
isLoading.value = false;
|
|
|
|
if (response?.isEmpty ?? true) {
|
|
log.w("No project data found or API call failed.");
|
|
return;
|
|
}
|
|
|
|
projects = response!.map((json) => ProjectModel.fromJson(json)).toList();
|
|
selectedProjectId = projects.first.id.toString();
|
|
log.i("Projects fetched: ${projects.length} projects loaded.");
|
|
|
|
await fetchTaskData(selectedProjectId);
|
|
}
|
|
|
|
Future<void> fetchTaskData(String? projectId) async {
|
|
if (projectId == null) return;
|
|
|
|
isLoading.value = true;
|
|
final response = await ApiService.getDailyTasks(
|
|
projectId,
|
|
dateFrom: startDateTask,
|
|
dateTo: endDateTask,
|
|
);
|
|
isLoading.value = false;
|
|
|
|
if (response != null) {
|
|
Map<String, List<TaskModel>> groupedTasks = {};
|
|
|
|
for (var taskJson in response) {
|
|
TaskModel task = TaskModel.fromJson(taskJson);
|
|
String assignmentDateKey = task.assignmentDate;
|
|
|
|
if (groupedTasks.containsKey(assignmentDateKey)) {
|
|
groupedTasks[assignmentDateKey]?.add(task);
|
|
} else {
|
|
groupedTasks[assignmentDateKey] = [task];
|
|
}
|
|
}
|
|
dailyTasks = groupedTasks.entries
|
|
.map((entry) => entry.value)
|
|
.expand((taskList) => taskList)
|
|
.toList();
|
|
|
|
log.i("Daily tasks fetched and grouped: ${dailyTasks.length}");
|
|
|
|
update();
|
|
} else {
|
|
log.e("Failed to fetch daily tasks for project $projectId");
|
|
}
|
|
}
|
|
|
|
|
|
Future<void> selectDateRangeForTaskData(
|
|
BuildContext context,
|
|
DailyTaskController controller,
|
|
) async {
|
|
final picked = await showDateRangePicker(
|
|
context: context,
|
|
firstDate: DateTime(2022),
|
|
lastDate: DateTime.now(),
|
|
initialDateRange: DateTimeRange(
|
|
start: startDateTask ?? DateTime.now().subtract(const Duration(days: 7)),
|
|
end: endDateTask ?? DateTime.now(),
|
|
),
|
|
);
|
|
|
|
if (picked == null) return;
|
|
|
|
startDateTask = picked.start;
|
|
endDateTask = picked.end;
|
|
|
|
log.i("Date range selected: $startDateTask to $endDateTask");
|
|
|
|
await controller.fetchTaskData(controller.selectedProjectId);
|
|
}
|
|
}
|