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 (
);
};
export { EditDialog };