feat: enhance job fetching logic and add auto-refresh after job addition
This commit is contained in:
parent
804f0eba7b
commit
0e575c393d
@ -3,6 +3,7 @@ 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
|
||||||
@ -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",
|
||||||
|
|||||||
@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user