import React, { useState } from 'react' import { FaBriefcase, FaPlus, FaEdit, FaTrash, FaUsers, FaDollarSign, FaBuilding, FaEye, FaTh, FaList, } from 'react-icons/fa' import { JobPositionDto, JobLevelEnum } from '../../../types/hr' import DataTable, { Column } from '../../../components/common/DataTable' import { mockJobPositions } from '../../../mocks/mockJobPositions' import JobPositionFormModal from './JobPositionFormModal' import JobPositionViewModal from './JobPositionViewModal' import { getJobLevelColor, getJobLevelText } from '../../../utils/erp' import { Container } from '@/components/shared' const JobPositions: React.FC = () => { const [positions, setPositions] = useState(mockJobPositions) const [searchTerm, setSearchTerm] = useState('') const [selectedLevel, setSelectedLevel] = useState('all') const [selectedDepartment, setSelectedDepartment] = useState('all') const [viewMode, setViewMode] = useState<'list' | 'card'>('list') // Modal states const [isFormModalOpen, setIsFormModalOpen] = useState(false) const [isViewModalOpen, setIsViewModalOpen] = useState(false) const [selectedPosition, setSelectedPosition] = useState(undefined) const [modalTitle, setModalTitle] = useState('') const handleAdd = () => { setSelectedPosition(undefined) setModalTitle('Yeni İş Pozisyonu') setIsFormModalOpen(true) } const handleEdit = (position: JobPositionDto) => { setSelectedPosition(position) setModalTitle('İş Pozisyonu Düzenle') setIsFormModalOpen(true) } const handleView = (position: JobPositionDto) => { setSelectedPosition(position) setIsViewModalOpen(true) } const handleDelete = (id: string) => { if (window.confirm('Bu pozisyonu silmek istediğinizden emin misiniz?')) { setPositions(positions.filter((p) => p.id !== id)) } } const handleSavePosition = (positionData: Partial) => { if (selectedPosition) { // Edit existing position const updatedPosition = { ...selectedPosition, ...positionData, lastModificationTime: new Date(), } setPositions(positions.map((p) => (p.id === selectedPosition.id ? updatedPosition : p))) } else { // Add new position const newPosition: JobPositionDto = { id: `jp-${Date.now()}`, ...positionData, employees: [], creationTime: new Date(), lastModificationTime: new Date(), } as JobPositionDto setPositions([...positions, newPosition]) } } const closeFormModal = () => { setIsFormModalOpen(false) setSelectedPosition(undefined) setModalTitle('') } const closeViewModal = () => { setIsViewModalOpen(false) setSelectedPosition(undefined) } const filteredPositions = positions.filter((position) => { if ( searchTerm && !position.name.toLowerCase().includes(searchTerm.toLowerCase()) && !position.code.toLowerCase().includes(searchTerm.toLowerCase()) ) { return false } if (selectedLevel !== 'all' && position.level !== selectedLevel) { return false } if (selectedDepartment !== 'all' && position.department?.id !== selectedDepartment) { return false } return true }) // Card component for individual position const PositionCard: React.FC<{ position: JobPositionDto }> = ({ position }) => (

{position.name}

{getJobLevelText(position.level)}

{position.code}

{position.description}

{position.isActive ? 'Aktif' : 'Pasif'}
{position.department?.name || 'Departman belirtilmemiş'}
{position.employees?.length || 0} personel
₺{position.minSalary.toLocaleString()} - ₺{position.maxSalary.toLocaleString()}

Gerekli Yetenekler

{position.requiredSkills?.slice(0, 4).map((skill, index) => ( {skill} ))} {position.requiredSkills?.length > 4 && ( +{position.requiredSkills.length - 4} daha )}
) const columns: Column[] = [ { key: 'code', header: 'Pozisyon Kodu', sortable: true, }, { key: 'title', header: 'Pozisyon Adı', sortable: true, render: (position: JobPositionDto) => (
{position.name}
{position.description}
), }, { key: 'department', header: 'Departman', render: (position: JobPositionDto) => (
{position.department?.name || '-'}
), }, { key: 'level', header: 'Seviye', render: (position: JobPositionDto) => ( {getJobLevelText(position.level)} ), }, { key: 'employeeCount', header: 'Personel Sayısı', render: (position: JobPositionDto) => (
{position.employees?.length || 0}
), }, { key: 'salary', header: 'Maaş Aralığı', render: (position: JobPositionDto) => (
₺{position.minSalary.toLocaleString()}
₺{position.maxSalary.toLocaleString()}
), }, { key: 'skills', header: 'Gerekli Yetenekler', render: (position: JobPositionDto) => (
{position.requiredSkills?.slice(0, 3).map((skill, index) => ( {skill} ))} {position.requiredSkills?.length > 3 && ( +{position.requiredSkills.length - 3} daha )}
), }, { key: 'status', header: 'Durum', render: (position: JobPositionDto) => ( {position.isActive ? 'Aktif' : 'Pasif'} ), }, { key: 'actions', header: 'İşlemler', render: (position: JobPositionDto) => (
), }, ] // Get unique departments for filter const departments = [...new Set(positions.map((p) => p.department).filter(Boolean))] return (
{/* Header */}

İş Pozisyonları

Şirket pozisyonları ve iş tanımları yönetimi

{/* View Toggle */}
{/* Stats Cards */}

Toplam Pozisyon

{positions.length}

Dolu Pozisyonlar

{positions.filter((p) => p.employees && p.employees.length > 0).length}

Boş Pozisyonlar

{positions.filter((p) => !p.employees || p.employees.length === 0).length}

Departman Sayısı

{departments.length}

{/* Filters */}
setSearchTerm(e.target.value)} className="w-full px-3 py-1.5 text-sm border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500" />
{/* Content - List or Card View */} {viewMode === 'list' ? (
) : (
{filteredPositions.map((position) => ( ))}
)} {/* Empty State */} {filteredPositions.length === 0 && (

Pozisyon bulunamadı

Arama kriterlerinizi değiştirmeyi deneyin.

)}
{/* Modals */}
) } export default JobPositions