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) => (
),
},
{
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 */}
{/* 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;