improved logic
This commit is contained in:
parent
0fa5a85d79
commit
6cd9fbe57b
@ -27,6 +27,7 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
RxMap<String, RxBool> buildingLoadingStates = <String, RxBool>{}.obs;
|
RxMap<String, RxBool> buildingLoadingStates = <String, RxBool>{}.obs;
|
||||||
final Set<String> buildingsWithDetails = <String>{};
|
final Set<String> buildingsWithDetails = <String>{};
|
||||||
|
|
||||||
|
RxMap<String, RxDouble> todaysAssignedMap = <String, RxDouble>{}.obs;
|
||||||
@override
|
@override
|
||||||
void onInit() {
|
void onInit() {
|
||||||
super.onInit();
|
super.onInit();
|
||||||
@ -72,6 +73,8 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
required int plannedTask,
|
required int plannedTask,
|
||||||
required String description,
|
required String description,
|
||||||
required List<String> taskTeam,
|
required List<String> taskTeam,
|
||||||
|
required String buildingId,
|
||||||
|
required String projectId,
|
||||||
DateTime? assignmentDate,
|
DateTime? assignmentDate,
|
||||||
String? organizationId,
|
String? organizationId,
|
||||||
String? serviceId,
|
String? serviceId,
|
||||||
@ -93,6 +96,9 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
|
|
||||||
if (response == true) {
|
if (response == true) {
|
||||||
logSafe("Task assigned successfully", level: LogLevel.info);
|
logSafe("Task assigned successfully", level: LogLevel.info);
|
||||||
|
await fetchBuildingInfra(buildingId, projectId, serviceId);
|
||||||
|
Get.back();
|
||||||
|
|
||||||
showAppSnackbar(
|
showAppSnackbar(
|
||||||
title: "Success",
|
title: "Success",
|
||||||
message: "Task assigned successfully!",
|
message: "Task assigned successfully!",
|
||||||
@ -164,23 +170,19 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
level: LogLevel.error, error: e, stackTrace: stack);
|
level: LogLevel.error, error: e, stackTrace: stack);
|
||||||
} finally {
|
} finally {
|
||||||
isFetchingTasks.value = false;
|
isFetchingTasks.value = false;
|
||||||
update();
|
update(); // dailyTasks is non-reactive
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fetch full infra for a single building (floors, workAreas, workItems).
|
/// Fetch full infra for a single building (lazy)
|
||||||
/// Called lazily when user expands a building in the UI.
|
|
||||||
Future<void> fetchBuildingInfra(
|
Future<void> fetchBuildingInfra(
|
||||||
String buildingId, String projectId, String? serviceId) async {
|
String buildingId, String projectId, String? serviceId) async {
|
||||||
if (buildingId.isEmpty) return;
|
if (buildingId.isEmpty) return;
|
||||||
|
|
||||||
// mark loading
|
|
||||||
buildingLoadingStates.putIfAbsent(buildingId, () => true.obs);
|
buildingLoadingStates.putIfAbsent(buildingId, () => true.obs);
|
||||||
buildingLoadingStates[buildingId]!.value = true;
|
buildingLoadingStates[buildingId]!.value = true; // Rx change is enough
|
||||||
update();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Re-use getInfraDetails and find the building entry for the requested buildingId
|
|
||||||
final infraResponse =
|
final infraResponse =
|
||||||
await ApiService.getInfraDetails(projectId, serviceId: serviceId);
|
await ApiService.getInfraDetails(projectId, serviceId: serviceId);
|
||||||
final infraData = infraResponse?['data'] as List<dynamic>? ?? [];
|
final infraData = infraResponse?['data'] as List<dynamic>? ?? [];
|
||||||
@ -196,7 +198,6 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build floors & workAreas for this building
|
|
||||||
final building = Building(
|
final building = Building(
|
||||||
id: buildingJson['id'],
|
id: buildingJson['id'],
|
||||||
name: buildingJson['buildingName'],
|
name: buildingJson['buildingName'],
|
||||||
@ -211,7 +212,7 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
return WorkArea(
|
return WorkArea(
|
||||||
id: areaJson['id'],
|
id: areaJson['id'],
|
||||||
areaName: areaJson['areaName'],
|
areaName: areaJson['areaName'],
|
||||||
workItems: [], // will populate later
|
workItems: [],
|
||||||
);
|
);
|
||||||
}).toList(),
|
}).toList(),
|
||||||
);
|
);
|
||||||
@ -220,7 +221,6 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
completedWork: (buildingJson['completedWork'] as num?)?.toDouble() ?? 0,
|
completedWork: (buildingJson['completedWork'] as num?)?.toDouble() ?? 0,
|
||||||
);
|
);
|
||||||
|
|
||||||
// For each workArea, fetch its work items and populate
|
|
||||||
await Future.wait(
|
await Future.wait(
|
||||||
building.floors.expand((f) => f.workAreas).map((area) async {
|
building.floors.expand((f) => f.workAreas).map((area) async {
|
||||||
try {
|
try {
|
||||||
@ -255,7 +255,6 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
// Merge/replace the building into dailyTasks
|
|
||||||
bool merged = false;
|
bool merged = false;
|
||||||
for (var t in dailyTasks) {
|
for (var t in dailyTasks) {
|
||||||
final idx = t.buildings
|
final idx = t.buildings
|
||||||
@ -267,7 +266,6 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!merged) {
|
if (!merged) {
|
||||||
// If not present, add a new TaskPlanningDetailsModel wrapper (fallback)
|
|
||||||
dailyTasks.add(TaskPlanningDetailsModel(
|
dailyTasks.add(TaskPlanningDetailsModel(
|
||||||
id: building.id,
|
id: building.id,
|
||||||
name: building.name,
|
name: building.name,
|
||||||
@ -280,7 +278,6 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark as loaded
|
|
||||||
buildingsWithDetails.add(buildingId.toString());
|
buildingsWithDetails.add(buildingId.toString());
|
||||||
} catch (e, stack) {
|
} catch (e, stack) {
|
||||||
logSafe("Error fetching infra for building $buildingId",
|
logSafe("Error fetching infra for building $buildingId",
|
||||||
@ -288,7 +285,7 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
} finally {
|
} finally {
|
||||||
buildingLoadingStates.putIfAbsent(buildingId, () => false.obs);
|
buildingLoadingStates.putIfAbsent(buildingId, () => false.obs);
|
||||||
buildingLoadingStates[buildingId]!.value = false;
|
buildingLoadingStates[buildingId]!.value = false;
|
||||||
update();
|
update(); // dailyTasks mutated
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -361,7 +358,7 @@ class DailyTaskPlanningController extends GetxController {
|
|||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
isFetchingEmployees.value = false;
|
isFetchingEmployees.value = false;
|
||||||
update();
|
// no update(): RxLists/RxBools notify observers
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2075,7 +2075,6 @@ class ApiService {
|
|||||||
final parsed = _parseAndDecryptResponse(response,
|
final parsed = _parseAndDecryptResponse(response,
|
||||||
label: "Assign Daily Task", returnFullResponse: true);
|
label: "Assign Daily Task", returnFullResponse: true);
|
||||||
if (parsed != null && parsed['success'] == true) {
|
if (parsed != null && parsed['success'] == true) {
|
||||||
Get.back(); // Retaining Get.back() as per original logic
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@ -82,10 +82,6 @@ class _AssignTaskBottomSheetState extends State<AssignTaskBottomSheet> {
|
|||||||
serviceId: selectedService?.id,
|
serviceId: selectedService?.id,
|
||||||
organizationId: selectedOrganization?.id,
|
organizationId: selectedOrganization?.id,
|
||||||
);
|
);
|
||||||
await controller.fetchTaskData(
|
|
||||||
selectedProjectId,
|
|
||||||
serviceId: selectedService?.id,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@ -421,8 +417,10 @@ class _AssignTaskBottomSheetState extends State<AssignTaskBottomSheet> {
|
|||||||
workItemId: widget.workItemId,
|
workItemId: widget.workItemId,
|
||||||
plannedTask: target.toInt(),
|
plannedTask: target.toInt(),
|
||||||
description: description,
|
description: description,
|
||||||
taskTeam: selectedTeam.map((e) => e.id).toList(), // pass IDs
|
taskTeam: selectedTeam.map((e) => e.id).toList(),
|
||||||
assignmentDate: widget.assignmentDate,
|
assignmentDate: widget.assignmentDate,
|
||||||
|
buildingId: widget.buildingName,
|
||||||
|
projectId: selectedProjectId!,
|
||||||
organizationId: selectedOrganization?.id,
|
organizationId: selectedOrganization?.id,
|
||||||
serviceId: selectedService?.id,
|
serviceId: selectedService?.id,
|
||||||
);
|
);
|
||||||
|
|||||||
@ -492,18 +492,7 @@ class _DailyTaskPlanningScreenState extends State<DailyTaskPlanningScreen>
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
final projectId =
|
|
||||||
widget.projectId;
|
|
||||||
if (projectId.isNotEmpty) {
|
|
||||||
await dailyTaskPlanningController
|
|
||||||
.fetchTaskData(
|
|
||||||
projectId,
|
|
||||||
serviceId:
|
|
||||||
serviceController
|
|
||||||
.selectedService
|
|
||||||
?.id,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user