import React from 'react'; import { useSelector } from 'react-redux'; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Label } from '@/components/ui/label'; import { Input } from '@/components/ui/input'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Checkbox } from '@/components/ui/checkbox'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; import { RootState } from '@/store'; interface RegionDialogProps { isOpen: boolean; onOpenChange: (open: boolean) => void; editingRegionId: string | null; regionName: string; setRegionName: (name: string) => void; regionDescription: string; setRegionDescription: (desc: string) => void; selectedRegionZone: string; setSelectedRegionZone: (id: string) => void; regionalManagerId: string; setRegionalManagerId: (id: string) => void; selectedRegionStates: string[]; // District IDs selected setSelectedRegionStates: (districts: string[]) => void; onSave: () => void; userAssignedData: any[]; } export const RegionDialog: React.FC = ({ isOpen, onOpenChange, editingRegionId, regionName, setRegionName, regionDescription, setRegionDescription, selectedRegionZone, setSelectedRegionZone, regionalManagerId, setRegionalManagerId, selectedRegionStates, setSelectedRegionStates, onSave, userAssignedData }) => { const { zones, allStates, allDistricts, regionalOffices } = useSelector((state: RootState) => state.master); // Internal: which states are checked (for filtering districts) const [selectedStateIds, setSelectedStateIds] = React.useState([]); // --- Build conflict map: districtId -> region name (for districts in OTHER regions) --- const assignedToOtherRegion = React.useMemo(() => { const map: Record = {}; (regionalOffices || []).forEach((r: any) => { if (r.id !== editingRegionId) { (r.districts || []).forEach((d: any) => { map[d.id] = r.name; }); } }); return map; }, [regionalOffices, editingRegionId]); // --- States visible for the selected zone (only states that have at least 1 district in this zone OR unassigned) --- const statesForZone = React.useMemo(() => { if (!selectedRegionZone) return allStates; const stateIdsWithZoneDistricts = new Set( allDistricts .filter(d => d.zoneId === selectedRegionZone || !d.zoneId || selectedRegionStates.includes(d.id) ) .map(d => d.stateId) .filter(Boolean) ); return allStates.filter((s: any) => s.zoneId === selectedRegionZone || stateIdsWithZoneDistricts.has(s.id) || !s.zoneId ); }, [allStates, allDistricts, selectedRegionZone, selectedRegionStates]); // --- Districts shown = only those in selected states + (in this zone or unassigned) --- const availableDistricts = React.useMemo(() => { if (selectedStateIds.length === 0) return []; return allDistricts.filter(d => selectedStateIds.includes(d.stateId as string) && (!d.zoneId || d.zoneId === selectedRegionZone || d.regionId === editingRegionId) ); }, [allDistricts, selectedStateIds, selectedRegionZone, editingRegionId]); // --- Group districts by state for rendering --- const districtsByState = React.useMemo(() => { const map: Record = {}; availableDistricts.forEach(d => { const state = allStates.find((s: any) => s.id === d.stateId); const stateName = state?.name || (d.stateId as string); if (!map[d.stateId as string]) map[d.stateId as string] = { stateName, districts: [] }; map[d.stateId as string].districts.push(d); }); return Object.values(map); }, [availableDistricts, allStates]); // --- Prefill selected states and manager when dialog opens in EDIT mode --- React.useEffect(() => { if (!isOpen) { setSelectedStateIds([]); return; } // Derive states from already-selected districts if (selectedRegionStates.length > 0) { const derived = Array.from(new Set( allDistricts .filter(d => selectedRegionStates.includes(d.id)) .map(d => d.stateId) .filter(Boolean) )) as string[]; setSelectedStateIds(derived); } }, [isOpen]); // Reduced dependencies to avoid re-triggering during active selection // --- When zone changes, reset state & district selections --- const handleZoneChange = (zoneId: string) => { setSelectedRegionZone(zoneId); setSelectedStateIds([]); setSelectedRegionStates([]); }; // --- Toggle state checkbox --- const handleStateToggle = (stateId: string, checked: boolean) => { if (checked) { setSelectedStateIds(prev => [...prev, stateId]); } else { setSelectedStateIds(prev => prev.filter(id => id !== stateId)); // Remove districts of this state from selection const districtIdsInState = allDistricts.filter(d => d.stateId === stateId).map(d => d.id); setSelectedRegionStates(selectedRegionStates.filter(id => !districtIdsInState.includes(id))); } }; return ( {editingRegionId ? 'Edit' : 'Add'} Regional Office Configure regional office details and coverage area
{/* Region Name */}
setRegionName(e.target.value)} />
{/* Zone */}
{/* Regional Manager — all users dropdown */}
{/* Description */}