import { useCallback, useEffect, useRef, useState } from 'react'; import { Dialog, DialogBody, DialogContent, DialogDescription, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { useManagePositionContext } from '../hooks'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { apiConfig } from '@/config/api.config'; import { Alert, KeenIcon, useDataGrid } from '@/components'; import { toast } from 'sonner'; import { useCallApi } from '@/hooks'; import { Checkbox } from '@/components/ui/checkbox'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { doSaveLogActivity } from '@/actions/GlobalActions'; const API_URL = apiConfig.service_dashboard; interface MenuItem { id: string; name: string; children?: MenuItem[]; } const MenuItemComponent: React.FC<{ menu: MenuItem; selectMenus: string[]; handleCheckboxChange: (id: string) => void; }> = ({ menu, selectMenus, handleCheckboxChange }) => { const { id, name, children = [] } = menu; return (
handleCheckboxChange(id)} />
{children.length > 0 && (
{children.map((child) => ( ))}
)}
); }; const EditDialog = () => { const parentRef = useRef(null); const { showEditDialog, handleEditDialog, menus, selectedPosition } = useManagePositionContext(); const { reload } = useDataGrid(); const { PutData } = useCallApi(); const [isSubmitting, setIsSubmitting] = useState(false); const [alert, setAlert] = useState({ show: false, message: '' }); const [selectMenus, setSelectMenus] = useState([]); const [formField, setFormField] = useState({ name: '', status: '', status_balance: '' }); const [errors, setErrors] = useState>({}); const validateForm = () => { const requiredFields = [ { key: 'name', label: 'Position Name' }, { key: 'status_balance', label: 'Status Balance' } ]; const newErrors: Record = {}; let isValid = true; requiredFields.forEach(({ key, label }) => { if ( formField[key as keyof typeof formField] === '' || formField[key as keyof typeof formField] === null || formField[key as keyof typeof formField] === undefined ) { newErrors[key] = `${label} is required`; toast.error(`${label} is required`); isValid = false; } }); setErrors(newErrors); return isValid; }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); if (!validateForm()) { setIsSubmitting(false); return; } doEditPosition(e); }; /* actions */ const handleCheckboxChange = useCallback((key: string) => { setSelectMenus((prev) => prev.includes(key) ? prev.filter((item) => item !== key) : [...prev, key] ); }, []); const doEditPosition = useCallback( async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); if (!selectedPosition) { toast.success('Please Select Position'); return; } try { const response = await PutData(`${API_URL}/user_role/update/${selectedPosition.id}`, { name: formField.name, roles: selectMenus, status: formField.status, status_balance: formField.status_balance }); if (response?.status) { setAlert((prev) => ({ ...prev, show: false, message: '' })); handleEditDialog(false, null); toast.success('Success Update Position'); reload(); const createActivity = { module: 'Manage Position', description: `Edit Position => ${selectedPosition.name}`, action: 'U' }; doSaveLogActivity(createActivity); } else { setAlert((prev) => ({ ...prev, show: true, message: response?.message })); } } catch (error) { toast.error('Something went wrong, please try again.'); } finally { setIsSubmitting(false); } }, [formField, selectMenus, selectedPosition] ); useEffect(() => { if (selectedPosition) { setFormField((prev) => ({ ...prev, name: selectedPosition.name, status: selectedPosition.status, status_balance: selectedPosition.status_balance })); setSelectMenus(selectedPosition.roles); } }, [selectedPosition]); return ( handleEditDialog(open, null)}>

Positions - Edit

handleEditDialog(false, null)} >
{/* {alert.show && (

{alert.message}

)} */}
setFormField((prev) => ({ ...prev, name: target.value })) } /> {errors.name && {errors.name}}
{menus.map((menu) => (
))}

); }; export { EditDialog };