import React, { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useActivitiesByGroups, useActivitiesMaster, useGroups, useWorkCategoriesMaster, } from "../../../hooks/masterHook/useMaster"; import { useManageTask, useProjectAssignedOrganizations, useProjectAssignedServices } from "../../../hooks/useProjects"; import showToast from "../../../services/toastService"; import Label from "../../common/Label"; import { useSelectedProject } from "../../../slices/apiDataManager"; const taskSchema = z.object({ buildingID: z.string().min(1, "Building is required"), floorId: z.string().min(1, "Floor is required"), workAreaId: z.string().min(1, "Work Area is required"), serviceId: z.string().min(1, "Service is required"), activityGroupId: z.string().min(1, "Activity Group is required"), activityID: z.string().min(1, "Activity is required"), workCategoryId: z.string().min(1, "Work Category is required"), plannedWork: z.number().min(1, "Planned Work must be greater than 0"), completedWork: z.number().min(0, "Completed Work must be 0 or more"), comment: z.string(), }); const defaultModel = { id: null, buildingID: "", floorId: "", workAreaId: "", serviceId: "", activityGroupId: "", activityID: "", workCategoryId: "", plannedWork: 0, completedWork: 0, comment: "", }; const TaskModel = ({ project, onSubmit, onClose }) => { // const { activities, loading: activityLoading } = useActivitiesMaster(); const { categories, categoryLoading } = useWorkCategoriesMaster(); const projectId = useSelectedProject(); const { data: assignedServices, isLoading: servicesLoading } = useProjectAssignedServices(projectId); const { data: assignedOrganizations, isLoading: orgLoading } = useProjectAssignedOrganizations(projectId); const [selectedService, setSelectedService] = useState(""); const [selectedGroup, setSelectedGroup] = useState(""); const { data: groupsResponse, isLoading: groupsLoading } = useGroups(selectedService); const groups = groupsResponse?.data ?? []; const { data: activitiesResponse, isLoading: activitiesLoading } = useActivitiesByGroups(selectedGroup); const activities = activitiesResponse?.data ?? []; // Fetch Assigned Organizations (Activity Groups) const [selectedOrg, setSelectedOrg] = useState(""); const handleServiceChange = (e) => { const value = e.target.value; setSelectedService(value); setSelectedGroup(""); setValue("activityGroupId", ""); setValue("activityID", ""); }; const handleGroupChange = (e) => { const value = e.target.value; setSelectedGroup(value); setValue("activityGroupId", value); setValue("activityID", ""); }; const { register, handleSubmit, watch, setValue, reset, formState: { errors }, } = useForm({ resolver: zodResolver(taskSchema), defaultValues: defaultModel, }); const [isSubmitting, setIsSubmitting] = useState(false); const [activityData, setActivityData] = useState([]); const [categoryData, setCategoryData] = useState([]); const watchBuildingId = watch("buildingID"); const watchFloorId = watch("floorId"); const watchWorkAreaId = watch("workAreaId"); const watchActivityId = watch("activityID"); const watchCategoryId = watch("workCategoryId"); const selectedBuilding = project?.find((b) => b.id === watchBuildingId); const selectedFloor = selectedBuilding?.floors?.find( (f) => f.id === watchFloorId ); const selectedWorkArea = selectedFloor?.workAreas?.find( (w) => w.id === watchWorkAreaId ); const selectedActivity = activityData?.find((a) => a.id === watchActivityId); const selectedCategory = categoryData?.find((c) => c.id === watchCategoryId); const { mutate: CreateTask, isPending } = useManageTask({ onSuccessCallback: (response) => { showToast(response?.message, "success"); setValue("activityID",""), setValue("plannedWork",0), setValue("completedWork",0) setValue("comment","") }, }); useEffect(() => { reset(defaultModel); }, []); useEffect(() => { if (Array.isArray(activities) && activities.length > 0) { setActivityData(activities); } }, [activities]); useEffect(() => { if (Array.isArray(categories) && categories.length > 0) { const sorted = [...categories].sort((a, b) => (a?.name || "").localeCompare(b?.name || "") ); setCategoryData(sorted); setValue("workCategoryId", sorted?.[0]?.id?.toString() ?? ""); } }, [categories]); const onSubmitForm = async (data) => { const payload = [data]; CreateTask({ payload: payload, buildingId: data.buildingID, floorId: data.floorId, workAreaId: data.workAreaId, PreviousPlannedWork: 0, previousCompletedWork: 0 }); }; return (
Manage Task
{errors.buildingID && (

{errors.buildingID.message}

)}
{selectedBuilding && (
{errors.floorId && (

{errors.floorId.message}

)}
)} {/* Work Area Selection */} {selectedFloor && (
{errors.workAreaId && (

{errors.workAreaId.message}

)}
)} {/* Services Selection */} {selectedWorkArea && (
)} {/* Activity Group (Organization) Selection */} {selectedService && (
{errors.activityGroupId &&

{errors.activityGroupId.message}

}
)} {/* Activity Selection */} {selectedGroup && (
{errors.activityID &&

{errors.activityID.message}

}
)} {watchActivityId && (
{errors.workCategoryId && (

{errors.workCategoryId.message}

)}
)} {selectedActivity && selectedCategory && ( <>
{errors.plannedWork && (

{errors.plannedWork.message}

)}
{errors.completedWork && (

{errors.completedWork.message}

)}
)} {selectedActivity && selectedCategory && (