marco.pms.mobileapp/lib/controller/service_project/add_service_project_job_controller.dart

97 lines
2.8 KiB
Dart

import 'package:flutter/material.dart';
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
final titleCtrl = TextEditingController();
final descCtrl = TextEditingController();
final tagCtrl = TextEditingController();
final FocusNode searchFocusNode = FocusNode();
final RxBool showEmployeePicker = true.obs;
// Observables
final startDate = Rx<DateTime?>(DateTime.now());
final dueDate = Rx<DateTime?>(DateTime.now().add(const Duration(days: 1)));
final enteredTags = <String>[].obs;
final employees = <EmployeeModel>[].obs;
final selectedAssignees = <EmployeeModel>[].obs;
final isSearchingEmployees = false.obs;
// Loading states
final isLoading = false.obs;
final isAllEmployeeLoading = false.obs;
final allEmployees = <EmployeeModel>[].obs;
final employeeSearchResults = <EmployeeModel>[].obs;
@override
void onInit() {
super.onInit();
}
@override
void onClose() {
titleCtrl.dispose();
descCtrl.dispose();
tagCtrl.dispose();
super.onClose();
}
/// Toggle employee selection
void toggleAssignee(EmployeeModel employee) {
if (selectedAssignees.contains(employee)) {
selectedAssignees.remove(employee);
} else {
selectedAssignees.add(employee);
}
}
/// Create Service Project Job API call
Future<void> createJob(String projectId) async {
if (titleCtrl.text.trim().isEmpty || descCtrl.text.trim().isEmpty) {
showAppSnackbar(
title: "Validation",
message: "Title and Description are required",
type: SnackbarType.warning,
);
return;
}
final assigneeIds = selectedAssignees.map((e) => e.id).toList();
final success = await ApiService.createServiceProjectJobApi(
title: titleCtrl.text.trim(),
description: descCtrl.text.trim(),
projectId: projectId,
assignees: assigneeIds.map((id) => {"id": id}).toList(),
startDate: startDate.value!,
dueDate: dueDate.value!,
tags: enteredTags.map((tag) => {"name": tag}).toList(),
);
if (success) {
// 🔥 Auto-refresh job list in ServiceProjectDetailsController
if (Get.isRegistered<ServiceProjectDetailsController>()) {
Get.find<ServiceProjectDetailsController>().refreshJobsAfterAdd();
}
Get.back();
showAppSnackbar(
title: "Success",
message: "Job created successfully",
type: SnackbarType.success,
);
} else {
showAppSnackbar(
title: "Error",
message: "Failed to create job",
type: SnackbarType.error,
);
}
}
}