import React, { memo, useState, useEffect } from 'react'; import { Space, ConfigProvider, Button, Row, Col, Card, Input, Segmented, Table, Pagination } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined, SearchOutlined, AppstoreOutlined, TableOutlined, } from '@ant-design/icons'; import { NotifAlert, NotifConfirmDialog } from '../../../../components/Global/ToastNotif'; import { useNavigate } from 'react-router-dom'; import { deleteStatus, getAllStatuss } from '../../../../api/master-status'; const ListStatus = memo(function ListStatus(props) { const [data, setData] = useState([]); const [loading, setLoading] = useState(true); const [viewMode, setViewMode] = useState('card'); const [trigerFilter, setTrigerFilter] = useState(false); const [searchValue, setSearchValue] = useState(''); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0 }); const navigate = useNavigate(); const fetchData = async (page = 1, pageSize = 10) => { setLoading(true); try { const params = new URLSearchParams(); params.append('page', page); params.append('limit', pageSize); if (searchValue) { params.append('search', searchValue); } const response = await getAllStatuss(params); setData(response.data || []); setPagination(prev => ({ ...prev, total: response.paging?.total || 0, current: page, pageSize: pageSize })); } catch (error) { console.error("Failed to fetch status data:", error); setData([]); } finally { setLoading(false); } }; useEffect(() => { const token = localStorage.getItem('token'); if (!token) { navigate('/signin'); return; } fetchData(pagination.current, pagination.pageSize); }, [props.actionMode, trigerFilter, navigate]); const doFilter = () => { setTrigerFilter(prev => !prev); }; const handleSearch = (value) => { setSearchValue(value); setPagination(prev => ({ ...prev, current: 1 })); // Reset to first page on search doFilter(); }; const handlePaginationChange = (page, pageSize) => { fetchData(page, pageSize); }; const showPreviewModal = (record) => { props.setSelectedData(record); props.setActionMode('preview'); }; const showEditModal = (record) => { props.setSelectedData(record); props.setActionMode('edit'); }; const showAddModal = () => { props.setSelectedData(null); props.setActionMode('add'); }; const showDeleteDialog = (record) => { NotifConfirmDialog({ icon: 'question', title: 'Konfirmasi Hapus', message: `Status "${record.status_name}" akan dihapus?`, onConfirm: () => handleDelete(record.status_id), }); }; const handleDelete = async (status_id) => { try { const response = await deleteStatus(status_id); if (response.statusCode === 200) { NotifAlert({ icon: 'success', title: 'Berhasil', message: 'Data Status berhasil dihapus.' }); doFilter(); } else { NotifAlert({ icon: 'error', title: 'Gagal', message: response?.message || 'Gagal Menghapus Data' }); } } catch (error) { NotifAlert({ icon: 'error', title: 'Error', message: error.message }); } }; const columns = [ { title: 'Number', dataIndex: 'status_number', key: 'status_number', width: '15%' }, { title: 'Name', dataIndex: 'status_name', key: 'status_name', width: '25%' }, { title: 'Description', dataIndex: 'status_description', key: 'status_description', width: '40%' }, { title: 'Aksi', key: 'aksi', align: 'center', width: '20%', render: (_, record) => ( } onClick={() => showPreviewModal(record)} /> } onClick={() => showEditModal(record)} /> } onClick={() => showDeleteDialog(record)} /> ), }, ]; const getCardStyle = (color) => { return { border: `2px solid ${color || '#d9d9d9'}`, height: '100%' }; }; const getTitleStyle = (color) => { return { backgroundColor: color || 'transparent', color: '#fff', padding: '2px 8px', borderRadius: '4px', display: 'inline-block' }; }; return ( } style={{ backgroundColor: '#23A55A', borderColor: '#23A55A' }} > Search } size="large" /> } onClick={showAddModal} size="large"> Tambah Data }, { value: 'table', icon: }]} value={viewMode} onChange={setViewMode} /> {viewMode === 'card' ? ( {data.map(item => ( {item.status_name}} style={getCardStyle(item.status_color)} actions={[ showPreviewModal(item)} />, showEditModal(item)} />, showDeleteDialog(item)} />, ]} > Number: {item.status_number} Description: {item.status_description} ))} ) : ( <> ({ ...item, key: item.status_id }))} pagination={false} loading={loading} /> > )} ); }); export default ListStatus;
Number: {item.status_number}
Description: {item.status_description}