import React, { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { useActivitiesMaster, useWorkCategoriesMaster, } from "../../../hooks/masterHook/useMaster"; 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"), 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"), }); const defaultModel = { id: null, buildingID: "0", floorId: "0", workAreaId: "0", activityID: null, workCategoryId: "", plannedWork: 0, completedWork: 0, }; 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, setValue, } = useForm({ resolver: zodResolver(taskSchema), defaultValues: defaultModel, }); useEffect(() => { resetForm(); }, []); 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: 0, 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) => { console.log(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); // not "0" setSelectedFloor(null); setSelectedWorkArea(null); setSelectedActivity(null); setSelectedCategory(categoryData?.[0]?.id?.toString() ?? ""); reset(defaultModel); }; useEffect(() => { if (!loading && Array.isArray(activities) && activities.length > 0) { setActivityData(activities); } }, [activities, loading]); 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]) } }, [categories, categoryLoading]); return (
); }; export default TaskModel;