import React, { memo, useState, useEffect } from 'react'; import { Space, Tag, ConfigProvider, Button, Row, Col, Card, Input, Modal } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, EyeOutlined, SearchOutlined, CheckOutlined, CloseOutlined, ClockCircleOutlined, } from '@ant-design/icons'; import { NotifAlert, NotifOk, NotifConfirmDialog } from '../../../components/Global/ToastNotif'; import { useNavigate } from 'react-router-dom'; import { deleteUser, getAllUser, approveUser, rejectUser } from '../../../api/user'; import TableList from '../../../components/Global/TableList'; import Swal from 'sweetalert2'; // Helper function to capitalize first letter const capitalizeFirstLetter = (str) => { if (!str) return ''; return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); }; // Helper function to get role tag color based on role_level or role_name const getRoleColor = (role_name, role_level) => { // Priority 1: Based on role_level if (role_level) { switch (role_level) { case 1: return 'purple'; // Highest level case 2: return 'blue'; case 3: return 'cyan'; case 4: return 'green'; default: return 'default'; } } // Priority 2: Based on role_name (fallback for backward compatibility) const roleLower = role_name?.toLowerCase() || ''; if (roleLower.includes('admin')) return 'purple'; if (roleLower.includes('operator')) return 'blue'; if (roleLower.includes('engineer')) return 'cyan'; if (roleLower.includes('guest')) return 'default'; return 'default'; }; const columns = (showPreviewModal, showEditModal, showDeleteDialog, showApprovalModal) => [ { title: 'No', key: 'no', width: '5%', align: 'center', render: (_, __, index) => index + 1, }, { title: 'ID', dataIndex: 'user_id', key: 'user_id', width: '5%', hidden: 'true', }, { title: 'Username', dataIndex: 'user_name', key: 'user_name', width: '12%', }, { title: 'Nama Lengkap', dataIndex: 'user_fullname', key: 'user_fullname', width: '15%', }, { title: 'Nomor WA', dataIndex: 'user_phone', key: 'user_phone', width: '12%', }, { title: 'Level', dataIndex: 'role_level', key: 'role_level', width: '8%', align: 'center', render: (role_level) => role_level || '-', }, { title: 'Nama Role', dataIndex: 'role_name', key: 'role_name', width: '12%', render: (_, { role_name, role_level }) => { if (!role_name) return Belum Ada Role; const color = getRoleColor(role_name, role_level); const displayName = capitalizeFirstLetter(role_name); return ( {displayName} ); }, }, { title: 'Status Approval', dataIndex: 'is_approve', key: 'is_approve', width: '15%', align: 'center', render: (_, record) => { // is_approve: 0 = Rejected, 1 = Pending, 2 = Approved if (record.is_approve === 1 || record.is_approve === '1') { // Pending - show single Pending button return ( ); } else if (record.is_approve === 0 || record.is_approve === '0') { // Rejected return ( Rejected ); } else if ( record.is_approve === 2 || record.is_approve === '2' || record.is_approve === true ) { // Approved return ( Approved ); } // Default fallback (for false/null which means pending in old system) return ( Pending ); }, }, { title: 'Status Active', dataIndex: 'is_active', key: 'is_active', width: '10%', align: 'center', render: (_, record) => { // Only show active status if user is approved if ( record.is_approve === 2 || record.is_approve === '2' || record.is_approve === true ) { if (record.is_active === true || record.is_active === 1) { return ( Active ); } return ( Inactive ); } return -; }, }, { title: 'Aksi', key: 'aksi', align: 'center', width: '12%', render: (_, record) => ( } size="large" /> {/* Approval Modal */} Reject User , , ]} width={400} >

User: {selectedUser?.user_fullname}

Apakah Anda ingin approve atau reject user ini?

); }); export default ListUser;