feat: enhance job fetching logic and add auto-refresh after job addition

This commit is contained in:
Vaibhav Surve 2025-11-19 11:28:39 +05:30
parent 804f0eba7b
commit 0e575c393d
2 changed files with 33 additions and 22 deletions

View File

@ -3,16 +3,17 @@ import 'package:get/get.dart';
import 'package:marco/helpers/services/api_service.dart'; import 'package:marco/helpers/services/api_service.dart';
import 'package:marco/model/employees/employee_model.dart'; import 'package:marco/model/employees/employee_model.dart';
import 'package:marco/helpers/widgets/my_snackbar.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 { class AddServiceProjectJobController extends GetxController {
// Form Controllers // Form Controllers
final titleCtrl = TextEditingController(); final titleCtrl = TextEditingController();
final descCtrl = TextEditingController(); final descCtrl = TextEditingController();
final tagCtrl = TextEditingController(); final tagCtrl = TextEditingController();
final FocusNode searchFocusNode = FocusNode(); final FocusNode searchFocusNode = FocusNode();
final RxBool showEmployeePicker = true.obs; final RxBool showEmployeePicker = true.obs;
// Observables // Observables
final startDate = Rx<DateTime?>(DateTime.now()); final startDate = Rx<DateTime?>(DateTime.now());
final dueDate = Rx<DateTime?>(DateTime.now().add(const Duration(days: 1))); final dueDate = Rx<DateTime?>(DateTime.now().add(const Duration(days: 1)));
final enteredTags = <String>[].obs; final enteredTags = <String>[].obs;
@ -21,7 +22,7 @@ class AddServiceProjectJobController extends GetxController {
final selectedAssignees = <EmployeeModel>[].obs; final selectedAssignees = <EmployeeModel>[].obs;
final isSearchingEmployees = false.obs; final isSearchingEmployees = false.obs;
// Loading states // Loading states
final isLoading = false.obs; final isLoading = false.obs;
final isAllEmployeeLoading = false.obs; final isAllEmployeeLoading = false.obs;
final allEmployees = <EmployeeModel>[].obs; final allEmployees = <EmployeeModel>[].obs;
@ -40,7 +41,6 @@ class AddServiceProjectJobController extends GetxController {
super.onClose(); super.onClose();
} }
/// Toggle employee selection /// Toggle employee selection
void toggleAssignee(EmployeeModel employee) { void toggleAssignee(EmployeeModel employee) {
if (selectedAssignees.contains(employee)) { if (selectedAssignees.contains(employee)) {
@ -74,6 +74,11 @@ class AddServiceProjectJobController extends GetxController {
); );
if (success) { if (success) {
// 🔥 Auto-refresh job list in ServiceProjectDetailsController
if (Get.isRegistered<ServiceProjectDetailsController>()) {
Get.find<ServiceProjectDetailsController>().refreshJobsAfterAdd();
}
Get.back(); Get.back();
showAppSnackbar( showAppSnackbar(
title: "Success", title: "Success",

View File

@ -32,7 +32,7 @@ class ServiceProjectDetailsController extends GetxController {
var pageNumber = 1; var pageNumber = 1;
final int pageSize = 20; final int pageSize = 20;
var hasMoreJobs = true.obs; var hasMoreJobs = true.obs;
// Inside ServiceProjectDetailsController
var isTagging = false.obs; var isTagging = false.obs;
var attendanceMessage = ''.obs; var attendanceMessage = ''.obs;
var attendanceLog = Rxn<JobAttendanceResponse>(); var attendanceLog = Rxn<JobAttendanceResponse>();
@ -44,7 +44,7 @@ class ServiceProjectDetailsController extends GetxController {
@override @override
void onInit() { void onInit() {
super.onInit(); super.onInit();
fetchProjectJobs(initialLoad: true); // fetch job list initially fetchProjectJobs(); // always load jobs even without projectId
} }
// -------------------- Project -------------------- // -------------------- Project --------------------
@ -53,7 +53,7 @@ class ServiceProjectDetailsController extends GetxController {
fetchProjectDetail(); fetchProjectDetail();
pageNumber = 1; pageNumber = 1;
hasMoreJobs.value = true; hasMoreJobs.value = true;
fetchProjectJobs(initialLoad: true); fetchProjectJobs(); // no initialLoad
} }
Future<void> fetchProjectTeams() async { Future<void> fetchProjectTeams() async {
@ -109,7 +109,6 @@ class ServiceProjectDetailsController extends GetxController {
} }
} }
// Add this method to your controller
Future<void> fetchJobAttendanceLog(String attendanceId) async { Future<void> fetchJobAttendanceLog(String attendanceId) async {
if (attendanceId.isEmpty) { if (attendanceId.isEmpty) {
attendanceMessage.value = "Invalid attendance ID"; attendanceMessage.value = "Invalid attendance ID";
@ -135,34 +134,31 @@ class ServiceProjectDetailsController extends GetxController {
} }
} }
// -------------------- Job List -------------------- // -------------------- Job List (modified to always load) --------------------
Future<void> fetchProjectJobs({bool initialLoad = false}) async { Future<void> fetchProjectJobs() async {
if (projectId.value.isEmpty && !initialLoad) { if (!hasMoreJobs.value) return;
jobErrorMessage.value = "Invalid project ID";
return;
}
if (!hasMoreJobs.value && !initialLoad) return;
isJobLoading.value = true; isJobLoading.value = true;
jobErrorMessage.value = ''; jobErrorMessage.value = '';
try { try {
final result = await ApiService.getServiceProjectJobListApi( final result = await ApiService.getServiceProjectJobListApi(
projectId: projectId.value, projectId: projectId.value, // allows empty projectId
pageNumber: pageNumber, pageNumber: pageNumber,
pageSize: pageSize, pageSize: pageSize,
isActive: true, isActive: true,
); );
if (result != null && result.data != null) { if (result != null && result.data != null) {
if (initialLoad) { final newJobs = result.data?.data ?? [];
jobList.value = result.data?.data ?? [];
if (pageNumber == 1) {
jobList.value = newJobs;
} else { } 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++; if (hasMoreJobs.value) pageNumber++;
} else { } else {
jobErrorMessage.value = result?.message ?? "Failed to fetch job list"; jobErrorMessage.value = result?.message ?? "Failed to fetch job list";
@ -180,9 +176,10 @@ class ServiceProjectDetailsController extends GetxController {
Future<void> refresh() async { Future<void> refresh() async {
pageNumber = 1; pageNumber = 1;
hasMoreJobs.value = true; hasMoreJobs.value = true;
await Future.wait([ await Future.wait([
fetchProjectDetail(), fetchProjectDetail(),
fetchProjectJobs(initialLoad: true), fetchProjectJobs(),
]); ]);
} }
@ -304,4 +301,13 @@ class ServiceProjectDetailsController extends GetxController {
isTagging.value = false; isTagging.value = false;
} }
} }
// ------------------------------------------------------------
// 🔥 AUTO REFRESH JOB LIST AFTER ADDING A JOB
// ------------------------------------------------------------
Future<void> refreshJobsAfterAdd() async {
pageNumber = 1;
hasMoreJobs.value = true;
await fetchProjectJobs();
}
} }