diff --git a/src/components/Project/Infrastructure/BuildingModel.jsx b/src/components/Project/Infrastructure/BuildingModel.jsx index 34c4b24d..0017b156 100644 --- a/src/components/Project/Infrastructure/BuildingModel.jsx +++ b/src/components/Project/Infrastructure/BuildingModel.jsx @@ -47,7 +47,7 @@ const BuildingModel = ({ project, onClose, editingBuilding = null }) => { "success" ); reset({ Id: "0", name: "", description: "" }); - onClose?.(); + // onClose?.(); }, }); diff --git a/src/components/Project/Infrastructure/FloorModel.jsx b/src/components/Project/Infrastructure/FloorModel.jsx index 9c688be7..f380b5bd 100644 --- a/src/components/Project/Infrastructure/FloorModel.jsx +++ b/src/components/Project/Infrastructure/FloorModel.jsx @@ -14,7 +14,6 @@ const floorSchema = z.object({ id: z.string().optional(), floorName: z.string().min(1, "Floor Name is required"), }); - const defaultValues = { id: "0", floorName: "", @@ -49,7 +48,7 @@ const FloorModel = ({ project, onClose, onSubmit }) => { "success" ); reset({ Id: "0", name: "", description: "" }); - onClose?.(); + // onClose?.(); }, }); @@ -121,7 +120,7 @@ const FloorModel = ({ project, onClose, onSubmit }) => { ))} {errors.buildingId && ( -

{errors.buildingId.message}

+

{errors.buildingId.message}

)} @@ -157,7 +156,7 @@ const FloorModel = ({ project, onClose, onSubmit }) => { placeholder="Floor Name" /> {errors.floorName && ( -

{errors.floorName.message}

+

{errors.floorName.message}

)} diff --git a/src/components/Project/Infrastructure/TaskModel.jsx b/src/components/Project/Infrastructure/TaskModel.jsx index bf5f3c22..ba062c59 100644 --- a/src/components/Project/Infrastructure/TaskModel.jsx +++ b/src/components/Project/Infrastructure/TaskModel.jsx @@ -1,11 +1,12 @@ -import React, { useState, useEffect } from "react"; +import React, { useEffect, useState } from "react"; import { useForm } from "react-hook-form"; -import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; +import { zodResolver } from "@hookform/resolvers/zod"; import { useActivitiesMaster, useWorkCategoriesMaster, } from "../../../hooks/masterHook/useMaster"; +import { useManageTask } from "../../../hooks/useProjects"; const taskSchema = z.object({ buildingID: z.string().min(1, "Building is required"), @@ -14,432 +15,263 @@ const taskSchema = z.object({ 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 greater than 0" ), - comment:z.string(), + completedWork: z.number().min(0, "Completed Work must be 0 or more"), + comment: z.string(), }); const defaultModel = { id: null, - buildingID: "", // Changed from "0" - floorId: "", // Changed from "0" - workAreaId: "", // Changed from "0" - activityID: "", // Changed from null - workCategoryId: "", // Kept as empty + buildingID: "", + floorId: "", + workAreaId: "", + activityID: "", + workCategoryId: "", plannedWork: 0, completedWork: 0, - comment: "" + comment: "", }; +const TaskModel = ({ project, onSubmit, onClose }) => { + const { activities, loading: activityLoading } = useActivitiesMaster(); + const { categories, categoryLoading } = useWorkCategoriesMaster(); -const TaskModel = ({ - project, - onSubmit, - clearTrigger, - onClearComplete, - onClose, -}) => { - const [formData, setFormData] = useState(defaultModel); - const [selectedBuilding, setSelectedBuilding] = useState(null); - const [selectedFloor, setSelectedFloor] = useState(null); - const [selectedWorkArea, setSelectedWorkArea] = useState(null); - const [selectedActivity, setSelectedActivity] = useState(null); - const [selectedCategory, setSelectedCategory] = useState(null); - const [isSubmitting, setIsSubmitting] = useState(false); - const [activityData, setActivityData] = useState([]); - const [categoryData, setCategoryData] = useState([]); - const { activities, loading, error } = useActivitiesMaster(); - const { categories, categoryLoading, categoryError } = - useWorkCategoriesMaster(); const { register, handleSubmit, - formState: { errors }, - reset, + 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: () => onClose?.(), + }); useEffect(() => { - resetForm(); + reset(defaultModel); }, []); - const handleBuildingChange = (e) => { - const { value } = e.target; - const building = project.buildings.find((b) => b.id === String(value)); - setSelectedBuilding(building); - setSelectedFloor(null); - setSelectedWorkArea(null); - setSelectedActivity(null); - reset({ - ...defaultModel, - buildingID: value, - }); - }; - - const handleFloorChange = (e) => { - const { value } = e.target; - const floor = selectedBuilding.floors.find((b) => b.id === String(value)); - setSelectedFloor(floor); - setSelectedWorkArea(null); - setSelectedActivity(null); - reset((prev) => ({ - ...prev, - floorId: value, - workAreaId: "", - activityID: "", - workCategoryId: categoryData?.[0]?.id?.toString() ?? "", - })); - }; - - const handleWorkAreaChange = (e) => { - const { value } = e.target; - const workArea = selectedFloor.workAreas.find( - (b) => b.id === String(value) - ); - setSelectedWorkArea(workArea); - reset((prev) => ({ - ...prev, - workAreaId: String(value), - })); - }; - - const handleActivityChange = (e) => { - const { value } = e.target; - const activity = activityData.find((b) => b.id === String(value)); - setSelectedActivity(activity); - reset((prev) => ({ - ...prev, - activityID: String(value), - })); - }; - - const handleCategoryChange = (e) => { - const { value } = e.target; - const category = categoryData.find((b) => b.id === String(value)); - setSelectedCategory(category); - reset((prev) => ({ - ...prev, - workCategoryId: String(value), - })); - }; - - const onSubmitForm = async (data) => { - - setIsSubmitting(true); - await onSubmit(data); - setValue("plannedWork", 0); - setValue("completedWork", 0); - setValue("activityID", 0); - setValue("workCategoryId", categoryData?.[0]?.id?.toString() ?? ""); - setIsSubmitting(false); - }; - - const resetForm = () => { - setFormData(defaultModel); - setSelectedBuilding(null); - setSelectedFloor(null); - setSelectedWorkArea(null); - setSelectedActivity(null); - setSelectedCategory(categoryData?.[0]?.id?.toString() ?? ""); - reset(defaultModel); - }; - useEffect(() => { - if (!loading && Array.isArray(activities) && activities.length > 0) { + if (Array.isArray(activities) && activities.length > 0) { setActivityData(activities); } - }, [activities, loading]); + }, [activities]); useEffect(() => { - if ( - !categoryLoading && - Array.isArray(categories) && - categories.length > 0 - ) { - const newCategories = categories?.slice()?.sort((a, b) => { - const nameA = a?.name || ""; - const nameB = b?.name || ""; - return nameA?.localeCompare(nameB); - }); - setCategoryData(newCategories); - setSelectedCategory(newCategories[0]) + 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, categoryLoading]); + }, [categories]); + + const onSubmitForm = async (data) => { + const payload = [data]; + CreateTask(payload); + }; return ( -
-
-
-
-