import { useState, useEffect } from 'react'; import { TrendingUp, Plus, Search, Edit, Trash2, CheckCircle, XCircle, X } from 'lucide-react'; import { ToastContainer, useToast } from '../../UI/Toast'; import Table, { Column } from '../../UI/Table'; import ActionButtons from '../../UI/ActionButtons'; import ButtonUI from '../../UI/ButtonUI'; import Pagination from '../../UI/Pagination'; import ToggleSwitch from '../../UI/ToggleSwitch'; import CustomInput from '../../UI/CustomInput'; interface SkillLevel { id: string; name: string; description: string; status: 'Active' | 'Inactive'; createdAt: string; updatedAt?: string; } // Create/Edit Modal Component - Manages its own state interface ModalProps { isOpen: boolean; onClose: () => void; onSave: (data: { name: string; description: string }) => void; title: string; initialData?: { name: string; description: string } | null; } const Modal = ({ isOpen, onClose, onSave, title, initialData }: ModalProps) => { const [formData, setFormData] = useState({ name: initialData?.name || '', description: initialData?.description || '', }); // Update form when initialData changes useEffect(() => { if (initialData) { setFormData({ name: initialData.name || '', description: initialData.description || '', }); } }, [initialData]); // Reset form when modal opens useEffect(() => { if (isOpen && !initialData) { setFormData({ name: '', description: '', }); } }, [isOpen, initialData]); if (!isOpen) return null; const handleInputChange = (field: string, value: any) => { setFormData((prev) => ({ ...prev, [field]: value })); }; const handleSubmit = () => { if (!formData.name) { // Toast will be shown from parent return; } onSave(formData); }; return ( <>

{title}

handleInputChange('name', value)} placeholder="Enter skill level name" required icon={} /> handleInputChange('description', value)} placeholder="Enter description" rows={3} />
Cancel {initialData ? 'Update' : 'Create'}
); }; const SkillLevel = () => { const toast = useToast(); const [searchTerm, setSearchTerm] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [showEntries, setShowEntries] = useState(10); const [showCreateModal, setShowCreateModal] = useState(false); const [showEditModal, setShowEditModal] = useState(false); const [selectedLevel, setSelectedLevel] = useState(null); const [showDeleteModal, setShowDeleteModal] = useState(false); const [levelToDelete, setLevelToDelete] = useState(null); const [isDeleting, setIsDeleting] = useState(false); // Mock data for skill levels const [skillLevels, setSkillLevels] = useState([ { id: '1', name: 'Beginner', description: 'Entry level - Basic understanding of concepts', status: 'Active', createdAt: '2024-01-15', }, { id: '2', name: 'Intermediate', description: 'Mid level - Good understanding with practical experience', status: 'Active', createdAt: '2024-02-10', }, { id: '3', name: 'Advanced', description: 'Senior level - Deep understanding and extensive experience', status: 'Active', createdAt: '2024-03-05', }, { id: '4', name: 'Expert', description: 'Specialist level - Mastery of concepts and industry recognition', status: 'Active', createdAt: '2024-04-20', }, { id: '5', name: 'Master', description: 'Highest level - Thought leader and industry influencer', status: 'Inactive', createdAt: '2024-05-15', }, ]); const handleAddLevel = () => { setSelectedLevel(null); setShowCreateModal(true); }; const handleEditLevel = (level: SkillLevel) => { setSelectedLevel(level); setShowEditModal(true); }; const handleDeleteLevel = (level: SkillLevel) => { setLevelToDelete(level); setShowDeleteModal(true); }; const handleConfirmDelete = () => { if (!levelToDelete) return; setIsDeleting(true); setTimeout(() => { setSkillLevels(skillLevels.filter((l) => l.id !== levelToDelete.id)); setShowDeleteModal(false); setLevelToDelete(null); setIsDeleting(false); toast.success(`Skill level "${levelToDelete.name}" deleted successfully!`); }, 1000); }; const handleSaveLevel = (formData: { name: string; description: string }) => { if (!formData.name) { toast.error('Please fill in all required fields'); return; } if (selectedLevel) { // Edit existing setSkillLevels( skillLevels.map((l) => l.id === selectedLevel.id ? { ...l, name: formData.name, description: formData.description, updatedAt: new Date().toISOString().split('T')[0], } : l, ), ); toast.success('Skill level updated successfully!'); setShowEditModal(false); setSelectedLevel(null); } else { // Add new const newLevel: SkillLevel = { id: String(skillLevels.length + 1), name: formData.name, description: formData.description, status: 'Active', createdAt: new Date().toISOString().split('T')[0], }; setSkillLevels([...skillLevels, newLevel]); toast.success('Skill level created successfully!'); setShowCreateModal(false); } }; const handleToggleStatus = (id: string) => { setSkillLevels(skillLevels.map((l) => (l.id === id ? { ...l, status: l.status === 'Active' ? 'Inactive' : 'Active' } : l))); const level = skillLevels.find((l) => l.id === id); toast.info(`Skill level "${level?.name}" status changed to ${level?.status === 'Active' ? 'Inactive' : 'Active'}`); }; // Filter skill levels const filteredLevels = skillLevels.filter((level) => { const searchLower = searchTerm.toLowerCase(); return level.name.toLowerCase().includes(searchLower) || level.description.toLowerCase().includes(searchLower); }); // Pagination const totalPages = Math.ceil(filteredLevels.length / showEntries); const startIndex = (currentPage - 1) * showEntries; const currentLevels = filteredLevels.slice(startIndex, startIndex + showEntries); // Define columns const columns: Column[] = [ { key: 'sno', header: 'S.No', align: 'center', accessor: (_row: SkillLevel, index: number) => { const page = currentPage || 1; const entries = showEntries || 10; const calculatedIndex = (page - 1) * entries + (index || 0) + 1; return {calculatedIndex}; }, }, { key: 'name', header: 'SKILL LEVEL', accessor: (row: SkillLevel) => (
{row.name}
), }, { key: 'description', header: 'DESCRIPTION', accessor: (row: SkillLevel) =>
{row.description || '—'}
, }, { key: 'status', header: 'STATUS', align: 'center', accessor: (row: SkillLevel) => handleToggleStatus(row.id)} activeColor="bg-green-600" inactiveColor="bg-gray-300" />, }, { key: 'actions', header: 'ACTION', align: 'center', accessor: (row: SkillLevel) => ( handleEditLevel(row)} onDelete={() => handleDeleteLevel(row)} showView={false} editTooltip="Edit Skill Level" deleteTooltip="Delete Skill Level" size="sm" /> ), }, ]; return ( <>
{/* Header */}

Skill Levels

Manage skill levels for HRM

} onClick={handleAddLevel}> Add Skill Level
{/* Stats Cards */}

Total Levels

{skillLevels.length}

Active

{skillLevels.filter((l) => l.status === 'Active').length}

Inactive

{skillLevels.filter((l) => l.status === 'Inactive').length}

{/* Filters */}
Show
setSearchTerm(e.target.value)} className="w-full pl-9 pr-4 py-2 border border-gray-200 rounded-lg text-sm focus:outline-none focus:border-primary focus:ring-2 focus:ring-primary/20" />
{/* Table */} {/* Pagination */} {filteredLevels.length > 0 && ( )} {/* Create Modal */} { setShowCreateModal(false); setSelectedLevel(null); }} onSave={handleSaveLevel} title="Add Skill Level" initialData={null} /> {/* Edit Modal */} { setShowEditModal(false); setSelectedLevel(null); }} onSave={handleSaveLevel} title="Edit Skill Level" initialData={ selectedLevel ? { name: selectedLevel.name, description: selectedLevel.description, } : null } /> {/* Delete Confirmation Modal */} {showDeleteModal && (

Delete Skill Level

Are you sure you want to delete "{levelToDelete?.name}"? This action cannot be undone.

{ setShowDeleteModal(false); setLevelToDelete(null); }} > Cancel {isDeleting ? 'Deleting...' : 'Delete'}
)} ); }; export default SkillLevel;