- Added TaskListModel for managing daily tasks with JSON parsing. - Introduced WorkStatusResponseModel and WorkStatus for handling work status data. - Created MenuResponse and MenuItem models for dynamic menu management. - Updated routes to reflect correct naming conventions for task planning screens. - Enhanced DashboardScreen to include dynamic menu functionality and improved task statistics display. - Developed DailyProgressReportScreen for displaying daily progress reports with filtering options. - Implemented DailyTaskPlanningScreen for planning daily tasks with detailed views and actions. - Refactored left navigation bar to align with updated task planning routes.
		
			
				
	
	
		
			153 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
			
		
		
	
	
			153 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Dart
		
	
	
	
	
	
| import 'package:get/get.dart';
 | |
| import 'package:marco/helpers/services/app_logger.dart';
 | |
| import 'package:marco/helpers/services/api_service.dart';
 | |
| import 'package:marco/helpers/widgets/my_form_validator.dart';
 | |
| import 'package:marco/helpers/widgets/my_snackbar.dart';
 | |
| import 'package:marco/model/dailyTaskPlanning/master_work_category_model.dart';
 | |
| 
 | |
| class AddTaskController extends GetxController {
 | |
|   RxMap<String, RxBool> uploadingStates = <String, RxBool>{}.obs;
 | |
|   MyFormValidator basicValidator = MyFormValidator();
 | |
|   RxnString selectedCategoryId = RxnString();
 | |
|   RxnString selectedCategoryName = RxnString();
 | |
|   var categoryIdNameMap = <String, String>{}.obs;
 | |
| 
 | |
|   List<Map<String, dynamic>> roles = [];
 | |
|   RxnString selectedRoleId = RxnString();
 | |
|   RxBool isLoadingWorkMasterCategories = false.obs;
 | |
|   RxList<WorkCategoryModel> workMasterCategories = <WorkCategoryModel>[].obs;
 | |
| 
 | |
|   RxBool isLoading = false.obs;
 | |
| 
 | |
|   @override
 | |
|   void onInit() {
 | |
|     super.onInit();
 | |
|     fetchWorkMasterCategories();
 | |
|   }
 | |
| 
 | |
|   String? formFieldValidator(String? value, {required String fieldType}) {
 | |
|     if (value == null || value.trim().isEmpty) {
 | |
|       return 'This field is required';
 | |
|     }
 | |
|     if (fieldType == "target" && int.tryParse(value.trim()) == null) {
 | |
|       return 'Please enter a valid number';
 | |
|     }
 | |
|     if (fieldType == "description" && value.trim().length < 5) {
 | |
|       return 'Description must be at least 5 characters';
 | |
|     }
 | |
|     return null;
 | |
|   }
 | |
| 
 | |
|   Future<bool> assignDailyTask({
 | |
|     required String workItemId,
 | |
|     required int plannedTask,
 | |
|     required String description,
 | |
|     required List<String> taskTeam,
 | |
|     DateTime? assignmentDate,
 | |
|   }) async {
 | |
|     logSafe("Starting task assignment...", level: LogLevel.info);
 | |
| 
 | |
|     final response = await ApiService.assignDailyTask(
 | |
|       workItemId: workItemId,
 | |
|       plannedTask: plannedTask,
 | |
|       description: description,
 | |
|       taskTeam: taskTeam,
 | |
|       assignmentDate: assignmentDate,
 | |
|     );
 | |
| 
 | |
|     if (response == true) {
 | |
|       logSafe("Task assigned successfully.", level: LogLevel.info);
 | |
|       showAppSnackbar(
 | |
|         title: "Success",
 | |
|         message: "Task assigned successfully!",
 | |
|         type: SnackbarType.success,
 | |
|       );
 | |
|       return true;
 | |
|     } else {
 | |
|       logSafe("Failed to assign task.", level: LogLevel.error);
 | |
|       showAppSnackbar(
 | |
|         title: "Error",
 | |
|         message: "Failed to assign task.",
 | |
|         type: SnackbarType.error,
 | |
|       );
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Future<bool> createTask({
 | |
|     required String parentTaskId,
 | |
|     required String workAreaId,
 | |
|     required String activityId,
 | |
|     required int plannedTask,
 | |
|     required String comment,
 | |
|     required String categoryId,
 | |
|     DateTime? assignmentDate,
 | |
|   }) async {
 | |
|     logSafe("Creating new task...", level: LogLevel.info);
 | |
| 
 | |
|     final response = await ApiService.createTask(
 | |
|       parentTaskId: parentTaskId,
 | |
|       plannedTask: plannedTask,
 | |
|       comment: comment,
 | |
|       workAreaId: workAreaId,
 | |
|       activityId: activityId,
 | |
|       assignmentDate: assignmentDate,
 | |
|       categoryId: categoryId,
 | |
|     );
 | |
| 
 | |
|     if (response == true) {
 | |
|       logSafe("Task created successfully.", level: LogLevel.info);
 | |
|       showAppSnackbar(
 | |
|         title: "Success",
 | |
|         message: "Task created successfully!",
 | |
|         type: SnackbarType.success,
 | |
|       );
 | |
|       return true;
 | |
|     } else {
 | |
|       logSafe("Failed to create task.", level: LogLevel.error);
 | |
|       showAppSnackbar(
 | |
|         title: "Error",
 | |
|         message: "Failed to create task.",
 | |
|         type: SnackbarType.error,
 | |
|       );
 | |
|       return false;
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   Future<void> fetchWorkMasterCategories() async {
 | |
|     isLoadingWorkMasterCategories.value = true;
 | |
| 
 | |
|     try {
 | |
|       final response = await ApiService.getMasterWorkCategories();
 | |
|       if (response != null) {
 | |
|         final dataList = response['data'] ?? [];
 | |
| 
 | |
|         final parsedList = List<WorkCategoryModel>.from(
 | |
|           dataList.map((e) => WorkCategoryModel.fromJson(e)),
 | |
|         );
 | |
| 
 | |
|         workMasterCategories.assignAll(parsedList);
 | |
|         final mapped = {for (var item in parsedList) item.id: item.name};
 | |
|         categoryIdNameMap.assignAll(mapped);
 | |
| 
 | |
|         logSafe("Work categories fetched: ${dataList.length}", level: LogLevel.info);
 | |
|       } else {
 | |
|         logSafe("No work categories found or API call failed.", level: LogLevel.warning);
 | |
|       }
 | |
|     } catch (e, st) {
 | |
|       logSafe("Error parsing work categories", level: LogLevel.error, error: e, stackTrace: st);
 | |
|       workMasterCategories.clear();
 | |
|       categoryIdNameMap.clear();
 | |
|     }
 | |
| 
 | |
|     isLoadingWorkMasterCategories.value = false;
 | |
|     update();
 | |
|   }
 | |
| 
 | |
|   void selectCategory(String id) {
 | |
|     selectedCategoryId.value = id;
 | |
|     selectedCategoryName.value = categoryIdNameMap[id];
 | |
|     logSafe("Category selected", level: LogLevel.debug,  );
 | |
|   }
 | |
| }
 |