diff --git a/lib/controller/service_project/add_service_project_job_controller.dart b/lib/controller/service_project/add_service_project_job_controller.dart index caa9a6f..e53fcd6 100644 --- a/lib/controller/service_project/add_service_project_job_controller.dart +++ b/lib/controller/service_project/add_service_project_job_controller.dart @@ -3,16 +3,17 @@ import 'package:get/get.dart'; import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/model/employees/employee_model.dart'; import 'package:marco/helpers/widgets/my_snackbar.dart'; +import 'package:marco/controller/service_project/service_project_details_screen_controller.dart'; class AddServiceProjectJobController extends GetxController { - // Form Controllers +// Form Controllers final titleCtrl = TextEditingController(); final descCtrl = TextEditingController(); final tagCtrl = TextEditingController(); final FocusNode searchFocusNode = FocusNode(); final RxBool showEmployeePicker = true.obs; - // Observables +// Observables final startDate = Rx(DateTime.now()); final dueDate = Rx(DateTime.now().add(const Duration(days: 1))); final enteredTags = [].obs; @@ -21,7 +22,7 @@ class AddServiceProjectJobController extends GetxController { final selectedAssignees = [].obs; final isSearchingEmployees = false.obs; - // Loading states +// Loading states final isLoading = false.obs; final isAllEmployeeLoading = false.obs; final allEmployees = [].obs; @@ -40,7 +41,6 @@ class AddServiceProjectJobController extends GetxController { super.onClose(); } - /// Toggle employee selection void toggleAssignee(EmployeeModel employee) { if (selectedAssignees.contains(employee)) { @@ -74,6 +74,11 @@ class AddServiceProjectJobController extends GetxController { ); if (success) { + // 🔥 Auto-refresh job list in ServiceProjectDetailsController + if (Get.isRegistered()) { + Get.find().refreshJobsAfterAdd(); + } + Get.back(); showAppSnackbar( title: "Success", diff --git a/lib/controller/service_project/service_project_details_screen_controller.dart b/lib/controller/service_project/service_project_details_screen_controller.dart index c6b81bc..41f0954 100644 --- a/lib/controller/service_project/service_project_details_screen_controller.dart +++ b/lib/controller/service_project/service_project_details_screen_controller.dart @@ -32,7 +32,7 @@ class ServiceProjectDetailsController extends GetxController { var pageNumber = 1; final int pageSize = 20; var hasMoreJobs = true.obs; -// Inside ServiceProjectDetailsController + var isTagging = false.obs; var attendanceMessage = ''.obs; var attendanceLog = Rxn(); @@ -44,7 +44,7 @@ class ServiceProjectDetailsController extends GetxController { @override void onInit() { super.onInit(); - fetchProjectJobs(initialLoad: true); // fetch job list initially + fetchProjectJobs(); // always load jobs even without projectId } // -------------------- Project -------------------- @@ -53,7 +53,7 @@ class ServiceProjectDetailsController extends GetxController { fetchProjectDetail(); pageNumber = 1; hasMoreJobs.value = true; - fetchProjectJobs(initialLoad: true); + fetchProjectJobs(); // no initialLoad } Future fetchProjectTeams() async { @@ -109,7 +109,6 @@ class ServiceProjectDetailsController extends GetxController { } } -// Add this method to your controller Future fetchJobAttendanceLog(String attendanceId) async { if (attendanceId.isEmpty) { attendanceMessage.value = "Invalid attendance ID"; @@ -135,34 +134,31 @@ class ServiceProjectDetailsController extends GetxController { } } - // -------------------- Job List -------------------- - Future fetchProjectJobs({bool initialLoad = false}) async { - if (projectId.value.isEmpty && !initialLoad) { - jobErrorMessage.value = "Invalid project ID"; - return; - } - - if (!hasMoreJobs.value && !initialLoad) return; + // -------------------- Job List (modified to always load) -------------------- + Future fetchProjectJobs() async { + if (!hasMoreJobs.value) return; isJobLoading.value = true; jobErrorMessage.value = ''; try { final result = await ApiService.getServiceProjectJobListApi( - projectId: projectId.value, + projectId: projectId.value, // allows empty projectId pageNumber: pageNumber, pageSize: pageSize, isActive: true, ); if (result != null && result.data != null) { - if (initialLoad) { - jobList.value = result.data?.data ?? []; + final newJobs = result.data?.data ?? []; + + if (pageNumber == 1) { + jobList.value = newJobs; } else { - jobList.addAll(result.data?.data ?? []); + jobList.addAll(newJobs); } - hasMoreJobs.value = (result.data?.data?.length ?? 0) == pageSize; + hasMoreJobs.value = newJobs.length == pageSize; if (hasMoreJobs.value) pageNumber++; } else { jobErrorMessage.value = result?.message ?? "Failed to fetch job list"; @@ -180,9 +176,10 @@ class ServiceProjectDetailsController extends GetxController { Future refresh() async { pageNumber = 1; hasMoreJobs.value = true; + await Future.wait([ fetchProjectDetail(), - fetchProjectJobs(initialLoad: true), + fetchProjectJobs(), ]); } @@ -304,4 +301,13 @@ class ServiceProjectDetailsController extends GetxController { isTagging.value = false; } } + + // ------------------------------------------------------------ + // 🔥 AUTO REFRESH JOB LIST AFTER ADDING A JOB + // ------------------------------------------------------------ + Future refreshJobsAfterAdd() async { + pageNumber = 1; + hasMoreJobs.value = true; + await fetchProjectJobs(); + } }