import React, { useState } from "react"; import { FaPlus, FaSearch, FaFilter, FaUsers, FaUser, FaEdit, FaTrash, FaEye, FaPhone, FaEnvelope, FaAward, FaClock, } from "react-icons/fa"; import { TeamRoleEnum } from "../../../types/common"; import { mockMaintenanceTeams } from "../../../mocks/mockMaintenanceTeams"; import NewTeamModal from "./NewTeamModal"; import ViewTeamModal from "./ViewTeamModal"; import EditTeamModal from "./EditTeamModal"; import AssignWorkOrderModal from "./AssignWorkOrderModal"; import TeamStatusChangeModal from "./TeamStatusChangeModal"; import Widget from "../../../components/common/Widget"; import { Team } from "../../../types/common"; import { getTeamRoleColor, getTeamRoleIcon, getTeamRoleText, } from "../../../utils/erp"; const MaintenanceTeams: React.FC = () => { const [searchTerm, setSearchTerm] = useState(""); const [roleFilter, setRoleFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState< "active" | "inactive" | "all" >("all"); // Modal states const [showNewTeamModal, setShowNewTeamModal] = useState(false); const [showViewTeamModal, setShowViewTeamModal] = useState(false); const [showEditTeamModal, setShowEditTeamModal] = useState(false); const [showAssignWorkOrderModal, setShowAssignWorkOrderModal] = useState(false); const [showStatusChangeModal, setShowStatusChangeModal] = useState(false); // Selected data const [viewingTeam, setViewingTeam] = useState(null); const [editingTeam, setEditingTeam] = useState(null); const [selectedTeams, setSelectedTeams] = useState([]); // Mock data - replace with actual API calls const [teams, setTeams] = useState(mockMaintenanceTeams); const filteredTeams = teams.filter((team) => { const matchesSearch = team.code.toLowerCase().includes(searchTerm.toLowerCase()) || team.name.toLowerCase().includes(searchTerm.toLowerCase()) || team.members.some( (member) => member.employee?.firstName .toLowerCase() .includes(searchTerm.toLowerCase()) || member.employee?.lastName .toLowerCase() .includes(searchTerm.toLowerCase()) ); const matchesRole = roleFilter === "all" || team.members.some((member) => member.role === roleFilter); const matchesStatus = statusFilter === "all" || (statusFilter === "active" && team.isActive) || (statusFilter === "inactive" && !team.isActive); return matchesSearch && matchesRole && matchesStatus; }); const getTeamLeader = (team: Team) => { return team.members.find((member) => member.role === TeamRoleEnum.Lead); }; const getActiveMembers = (team: Team) => { return team.members.filter((member) => member.isActive); }; const handleAddTeam = () => { setEditingTeam(null); setShowNewTeamModal(true); }; const handleViewTeam = (team: Team) => { setViewingTeam(team); setShowViewTeamModal(true); }; const handleEditTeam = (team: Team) => { setEditingTeam(team); setShowEditTeamModal(true); }; const handleSelectTeam = (teamId: string) => { setSelectedTeams((prev) => prev.includes(teamId) ? prev.filter((id) => id !== teamId) : [...prev, teamId] ); }; const handleNewTeamSave = (newTeam: Partial) => { if (newTeam.id) { setTeams((prev) => [...prev, newTeam as Team]); } }; const handleEditTeamSave = (updatedTeam: Team) => { setTeams((prev) => prev.map((team) => (team.id === updatedTeam.id ? updatedTeam : team)) ); }; const handleAssignWorkOrders = ( assignments: { teamId: string; planIds: string[] }[] ) => { // Here you would typically make API calls to assign work orders console.log("Assigning work orders:", assignments); // Show success message or handle the actual assignment logic }; const handleStatusChange = ( teamIds: string[], newStatus: boolean, reason?: string ) => { setTeams((prev) => prev.map((team) => teamIds.includes(team.id) ? { ...team, isActive: newStatus, lastModificationTime: new Date() } : team ) ); setSelectedTeams([]); // Here you would typically log the status change with reason console.log("Status change:", { teamIds, newStatus, reason }); }; const selectedTeamObjects = teams.filter((team) => selectedTeams.includes(team.id) ); return (
{/* Header */}

Bakım Ekipleri

Bakım ekiplerini ve üyelerini yönetin

{/* Summary Cards */}
t.isActive).length} color="green" icon="FaCheckCircle" /> total + getActiveMembers(team).length, 0 )} color="orange" icon="FaUser" /> total + (team.specializations?.length || 0), 0 )} color="purple" icon="FaWrench" />
{/* Filters */}
setSearchTerm(e.target.value)} className="w-full pl-9 pr-4 py-1.5 text-sm border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" />
{/* Teams Grid */}
{filteredTeams.map((team) => { const leader = getTeamLeader(team); const activeMembers = getActiveMembers(team); return (
handleSelectTeam(team.id)} className="rounded border-gray-300 text-blue-600 focus:ring-blue-500 mt-0.5" />

{team.code}

{team.isActive ? "Aktif" : "Pasif"}

{team.name}

{team.description}

{/* Team Leader */} {leader && (
{leader.employee?.firstName}{" "} {leader.employee?.lastName}
{getTeamRoleIcon(leader.role)} {getTeamRoleText(leader.role)}

{leader.employee?.jobPosition?.code}

{leader.employee?.email && (
{leader.employee.email}
)} {leader.employee?.phone && (
{leader.employee.phone}
)}
)} {/* Team Members */}
Ekip Üyeleri ({activeMembers.length})
{activeMembers .filter((member) => member.role !== TeamRoleEnum.Lead) .slice(0, 3) .map((member) => (
{member.employee?.firstName}{" "} {member.employee?.lastName} {getTeamRoleIcon(member.role)} {getTeamRoleText(member.role)}

{member.employee?.jobPosition?.code}

))} {activeMembers.filter( (member) => member.role !== TeamRoleEnum.Lead ).length > 3 && (
+ {activeMembers.filter( (member) => member.role !== TeamRoleEnum.Lead ).length - 3}{" "} kişi daha...
)}
{/* Specializations */}
Uzmanlık Alanları
{team.specializations ?? [].slice(0, 6).map((specialization, index) => ( {specialization} ))} {(team.specializations?.length ?? 0) > 6 && ( +{(team.specializations?.length ?? 0) - 6} )}
Oluşturuldu:{" "} {team.creationTime.toLocaleDateString("tr-TR")}
Son Güncelleme:{" "} {team.lastModificationTime.toLocaleDateString("tr-TR")}
); })}
{filteredTeams.length === 0 && (

Ekip bulunamadı

Arama kriterlerinizi değiştirin veya yeni bir ekip oluşturun.

)} {/* Bulk Actions */} {selectedTeams.length > 0 && (
{selectedTeams.length} ekip seçildi
)} {/* Modals */} setShowNewTeamModal(false)} onSave={handleNewTeamSave} /> setShowViewTeamModal(false)} onEdit={handleEditTeam} team={viewingTeam} /> setShowEditTeamModal(false)} onSave={handleEditTeamSave} team={editingTeam} /> setShowAssignWorkOrderModal(false)} onSave={handleAssignWorkOrders} selectedTeams={selectedTeamObjects} /> setShowStatusChangeModal(false)} onSave={handleStatusChange} selectedTeams={selectedTeamObjects} />
); }; export default MaintenanceTeams;