import React, { useState } from "react"; import { PsProjectTask, TaskTypeEnum, TaskStatusEnum } from "../../../types/ps"; import { FaSearch, FaPlus, FaEdit, FaEye, FaUser, FaBullseye, FaTimesCircle, FaSave, FaCalendarAlt, FaFlag, FaProjectDiagram, FaUserCog, } from "react-icons/fa"; import { mockProjectTasks } from "../../../mocks/mockProjectTasks"; import { mockEmployees } from "../../../mocks/mockEmployees"; import { mockProjects } from "../../../mocks/mockProjects"; import { mockProjectPhases } from "../../../mocks/mockProjectPhases"; import Widget from "../../../components/common/Widget"; import { PriorityEnum } from "../../../types/common"; import { getTaskStatusColor, getTaskStatusIcon, getPriorityColor, getTaskTypeColor, } from "../../../utils/erp"; const ProjectTasks: React.FC = () => { const [searchTerm, setSearchTerm] = useState(""); const [statusFilter, setStatusFilter] = useState(""); const [selectedProjectFilter, setSelectedProjectFilter] = useState("All"); const [selectedTask, setSelectedTask] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [isCreateModalOpen, setIsCreateModalOpen] = useState(false); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [editingTask, setEditingTask] = useState(null); // Form state for creating/editing tasks const [formData, setFormData] = useState({ name: "", description: "", projectId: "", phaseId: "", taskType: TaskTypeEnum.Development, status: TaskStatusEnum.NotStarted, priority: PriorityEnum.Normal, assignedTo: "", assigneeEmail: "", startDate: "", endDate: "", estimatedHours: 0, progress: 0, }); const filteredTasks = mockProjectTasks.filter((task) => { const matchesSearch = task.name.toLowerCase().includes(searchTerm.toLowerCase()) || task.taskCode.toLowerCase().includes(searchTerm.toLowerCase()) || (task.description && task.description.toLowerCase().includes(searchTerm.toLowerCase())); const matchesStatus = statusFilter === "" || task.status === statusFilter; const matchesProject = selectedProjectFilter === "All" || task.projectId === selectedProjectFilter; return matchesSearch && matchesStatus && matchesProject; }); const openModal = (task: PsProjectTask) => { setSelectedTask(task); setIsModalOpen(true); }; const closeModal = () => { setSelectedTask(null); setIsModalOpen(false); }; const openCreateModal = () => { setFormData({ name: "", description: "", projectId: "", phaseId: "", taskType: TaskTypeEnum.Development, status: TaskStatusEnum.NotStarted, priority: PriorityEnum.Normal, assignedTo: "", assigneeEmail: "", startDate: "", endDate: "", estimatedHours: 0, progress: 0, }); setIsCreateModalOpen(true); }; const closeCreateModal = () => { setIsCreateModalOpen(false); }; const openEditModal = (task: PsProjectTask) => { setEditingTask(task); setFormData({ name: task.name, description: task.description || "", projectId: task.projectId || "", phaseId: task.phaseId || "", taskType: task.taskType, status: task.status, priority: task.priority, assignedTo: task.assignedTo || "", assigneeEmail: task.assignee?.email || "", startDate: task.startDate.toISOString().split("T")[0], endDate: task.endDate.toISOString().split("T")[0], estimatedHours: task.estimatedHours, progress: task.progress, }); setIsEditModalOpen(true); }; const closeEditModal = () => { setIsEditModalOpen(false); setEditingTask(null); }; const handleInputChange = ( e: React.ChangeEvent< HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement > ) => { const { name, value } = e.target; // Eğer atanan kişi seçimi yapılıyorsa, e-posta adresini otomatik doldur if (name === "assignedTo") { const selectedEmployee = mockEmployees.find((emp) => emp.id === value); setFormData((prev) => ({ ...prev, [name]: value, assigneeEmail: selectedEmployee?.email || "", })); } else { setFormData((prev) => ({ ...prev, [name]: value, })); } }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); // Here you would normally save to backend console.log("Saving task:", formData); alert(isEditModalOpen ? "Görev güncellendi!" : "Yeni görev oluşturuldu!"); if (isEditModalOpen) { closeEditModal(); } else { closeCreateModal(); } }; const generateTaskCode = () => { const taskCount = mockProjectTasks.length + 1; return `TSK-${taskCount.toString().padStart(3, "0")}`; }; return (

Görev Yönetimi

Proje görevlerinizi oluşturun, düzenleyin ve takip edin

{/* Summary Stats */}
t.status === TaskStatusEnum.InProgress ).length } color="yellow" icon="FaClock" /> t.status === TaskStatusEnum.Completed ).length } color="green" icon="FaCheckCircle" /> 0 ? `${Math.round( mockProjectTasks.reduce((sum, t) => sum + t.progress, 0) / mockProjectTasks.length )}%` : "0%" } color="red" icon="FaBullseye" />
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-10 px-3 py-1 text-sm border border-gray-300 rounded-md focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Task List */}
{filteredTasks.map((task, index) => ( ))}
Proje Aşama Görev Durum Öncelik Atanan İlerleme Bitiş Tarihi İşlemler
{(() => { const project = mockProjects.find( (p) => p.id === task.projectId ); return project?.name || `Proje ID: ${task.projectId}`; })()}
{(() => { const project = mockProjects.find( (p) => p.id === task.projectId ); return project?.code || task.projectId; })()}
{task.phase?.name || (() => { const phase = mockProjectPhases.find( (p) => p.id === task.phaseId ); return phase?.name || `Aşama ID: ${task.phaseId}`; })()}
{task.phase?.code || (() => { const phase = mockProjectPhases.find( (p) => p.id === task.phaseId ); return phase?.code || task.phaseId; })()}
{task.name}
{task.taskCode}
{getTaskStatusIcon(task.status)} {task.status} {task.priority}
{task.assignee?.fullName || "-"}
{task.progress}%
{task.endDate.toLocaleDateString("tr-TR")}
{filteredTasks.length === 0 && (

Görev bulunamadı

Arama kriterlerinizi değiştirmeyi deneyin veya yeni bir görev oluşturun.

)}
{/* Task Detail Modal */} {isModalOpen && selectedTask && (

{selectedTask.taskCode} - {selectedTask.name}

Görev detayları

{/* Sol Kolon - Temel Bilgiler */}

Görev Bilgileri

{(() => { const project = mockProjects.find( (p) => p.id === selectedTask.projectId ); return ( project?.name || `Proje ID: ${selectedTask.projectId}` ); })()}
{(() => { const project = mockProjects.find( (p) => p.id === selectedTask.projectId ); return project?.code || selectedTask.projectId; })()}
{selectedTask.phase?.name || (() => { const phase = mockProjectPhases.find( (p) => p.id === selectedTask.phaseId ); return ( phase?.name || `Aşama ID: ${selectedTask.phaseId}` ); })()}
{selectedTask.phase?.code || (() => { const phase = mockProjectPhases.find( (p) => p.id === selectedTask.phaseId ); return phase?.code || selectedTask.phaseId; })()}

{selectedTask.description || "Açıklama bulunmuyor."}

{selectedTask.taskType}
{getTaskStatusIcon(selectedTask.status)} {selectedTask.status}
{selectedTask.priority}
{selectedTask.assignee ? (

{selectedTask.assignee.fullName}

{selectedTask.assignee.email}

) : (

Atanmamış

)}
{/* Sağ Kolon - Tarih ve İlerleme */}

Tarih ve İlerleme

{selectedTask.startDate.toLocaleDateString("tr-TR")}

{selectedTask.actualStartDate?.toLocaleDateString( "tr-TR" ) || "Henüz başlanmadı"}

{selectedTask.endDate.toLocaleDateString("tr-TR")}

{selectedTask.actualEndDate?.toLocaleDateString( "tr-TR" ) || "Henüz tamamlanmadı"}

{selectedTask.estimatedHours} saat

{selectedTask.actualHours} saat

{selectedTask.progress > 20 && ( {selectedTask.progress}% )}
{selectedTask.progress <= 20 && ( {selectedTask.progress}% )}

{selectedTask.creationTime.toLocaleDateString( "tr-TR" )}

{selectedTask.lastModificationTime.toLocaleDateString( "tr-TR" )}

)} {/* Create/Edit Task Modal */} {(isCreateModalOpen || isEditModalOpen) && (
{/* Header */}
{isEditModalOpen ? ( ) : ( )}

{isEditModalOpen ? "Görev Düzenle" : "Yeni Görev Oluştur"}

{isEditModalOpen ? "Mevcut görev bilgilerini güncelleyin" : "Yeni bir görev tanımlayın"}

{/* Form */}
{/* Sol Kolon */}

Temel Bilgiler