diff --git a/src/pages/role/IndexRole.jsx b/src/pages/role/IndexRole.jsx index 91d9735..218a79e 100644 --- a/src/pages/role/IndexRole.jsx +++ b/src/pages/role/IndexRole.jsx @@ -1,29 +1,108 @@ -import React, { memo, useEffect } from 'react'; +import React, { memo, useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { useBreadcrumb } from '../../layout/LayoutBreadcrumb'; -import { Typography } from 'antd'; +import { Form, Typography } from 'antd'; +import ListRole from './component/ListRole'; +import DetailRole from './component/DetailRole'; + +import { NotifAlert } from '../../components/Global/ToastNotif'; const { Text } = Typography; const IndexRole = memo(function IndexRole() { const navigate = useNavigate(); const { setBreadcrumbItems } = useBreadcrumb(); + const [form] = Form.useForm(); + + const [actionMode, setActionMode] = useState('list'); + const [selectedData, setSelectedData] = useState(null); + const [isModalVisible, setIsModalVisible] = useState(false); + const [readOnly, setReadOnly] = useState(false); useEffect(() => { const token = localStorage.getItem('token'); if (token) { setBreadcrumbItems([ - { title: • Role } + { + title: ( + + • Role + + ), + }, ]); } else { navigate('/signin'); } - }, []); + }, [navigate, setBreadcrumbItems]); + + useEffect(() => { + if (actionMode === 'add' || actionMode === 'edit' || actionMode === 'preview') { + setIsModalVisible(true); + setReadOnly(actionMode === 'preview'); + + if (actionMode === 'add') { + form.resetFields(); + } else if (selectedData) { + form.setFieldsValue(selectedData); + } + } else { + setIsModalVisible(false); + form.resetFields(); + } + }, [actionMode, selectedData, form]); + + const handleCancel = () => { + setActionMode('list'); + setSelectedData(null); + form.resetFields(); + }; + + const handleOk = () => { + if (readOnly) { + handleCancel(); + return; + } + + form.validateFields() + .then((values) => { + if (actionMode === 'edit') { + NotifAlert({ + icon: 'success', + title: 'Berhasil', + message: `Data Role "${values.role_name}" berhasil diubah.`, + }); + } else if (actionMode === 'add') { + NotifAlert({ + icon: 'success', + title: 'Berhasil', + message: `Data Role "${values.role_name}" berhasil ditambahkan.`, + }); + } + handleCancel(); + }) + .catch((info) => { + console.log('Validate Failed:', info); + }); + }; return ( -
-

Role Page

-
+ + + + ); }); diff --git a/src/pages/role/component/DetailRole.jsx b/src/pages/role/component/DetailRole.jsx new file mode 100644 index 0000000..4195c2e --- /dev/null +++ b/src/pages/role/component/DetailRole.jsx @@ -0,0 +1,95 @@ +import React, { memo } from 'react'; +import { Modal, Form, Input, Select, Row, Col } from 'antd'; + +const { TextArea } = Input; +const { Option } = Select; + +const DetailRole = memo(function DetailRole({ visible, onCancel, onOk, form, editingKey, readOnly }) { + const getModalTitle = () => { + if (readOnly) return 'Detail Role'; + if (editingKey) return 'Edit Role'; + return 'Tambah Role'; + }; + + return ( + +
+ + + + + + + + + + + + + + + + + + + +