"use client" import { useState } from "react" import { mockCandidates, mockRequisitions, mockUsers, pipelineStages } from "@/lib/mock-data" import type { Candidate, PipelineStage } from "@/lib/types" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Search, Filter, Plus, MoreVertical, Mail, Phone, Calendar, Star, ChevronRight, FileText, MessageSquare, Clock, CheckCircle2, XCircle, ArrowRight, GripVertical, User, Briefcase, MapPin, DollarSign, ThumbsUp, ThumbsDown, Eye, Download, Send, Video, Linkedin } from "lucide-react" import { cn } from "@/lib/utils" export function RecruitmentPipelinePage() { const [candidates, setCandidates] = useState(mockCandidates) const [selectedRequisition, setSelectedRequisition] = useState("all") const [searchQuery, setSearchQuery] = useState("") const [selectedCandidate, setSelectedCandidate] = useState(null) const [isDetailOpen, setIsDetailOpen] = useState(false) const [isAddCandidateOpen, setIsAddCandidateOpen] = useState(false) const [draggedCandidate, setDraggedCandidate] = useState(null) const [viewMode, setViewMode] = useState<"kanban" | "list">("kanban") const activeRequisitions = mockRequisitions.filter(r => r.status === "approved" || r.status === "published") const filteredCandidates = candidates.filter(candidate => { const matchesRequisition = selectedRequisition === "all" || candidate.requisitionId === selectedRequisition const matchesSearch = candidate.name.toLowerCase().includes(searchQuery.toLowerCase()) || candidate.email.toLowerCase().includes(searchQuery.toLowerCase()) || candidate.currentPosition?.toLowerCase().includes(searchQuery.toLowerCase()) return matchesRequisition && matchesSearch }) const getCandidatesByStage = (stageId: string) => { return filteredCandidates.filter(c => c.currentStage === stageId) } const handleDragStart = (candidate: Candidate) => { setDraggedCandidate(candidate) } const handleDragOver = (e: React.DragEvent) => { e.preventDefault() } const handleDrop = (stageId: string) => { if (draggedCandidate) { setCandidates(prev => prev.map(c => c.id === draggedCandidate.id ? { ...c, currentStage: stageId as PipelineStage } : c )) setDraggedCandidate(null) } } const getStageColor = (stageId: string) => { const colors: Record = { applied: "border-slate-300", screening: "border-[var(--color-chart-1)]", interview_rrhh: "border-[var(--color-chart-2)]", interview_technical: "border-[var(--color-chart-3)]", interview_manager: "border-[var(--color-chart-4)]", offer: "border-[var(--color-status-recruiting)]", hired: "border-[var(--color-status-closed)]", rejected: "border-[var(--color-status-cancelled)]" } return colors[stageId] || "border-muted-foreground" } const getRatingStars = (rating: number) => { return Array.from({ length: 5 }, (_, i) => ( )) } const getSourceBadge = (source: string) => { const sourceConfig: Record = { linkedin: { label: "LinkedIn", className: "bg-[var(--color-chart-2)] text-white" }, referral: { label: "Referido", className: "bg-accent text-accent-foreground" }, job_board: { label: "Portal Empleo", className: "bg-primary text-primary-foreground" }, website: { label: "Web", className: "bg-secondary text-secondary-foreground" }, agency: { label: "Agencia", className: "bg-[var(--color-chart-1)] text-white" } } const config = sourceConfig[source] || { label: source, className: "bg-muted text-muted-foreground" } return {config.label} } const openCandidateDetail = (candidate: Candidate) => { setSelectedCandidate(candidate) setIsDetailOpen(true) } const getRequisitionTitle = (requisitionId: string) => { const requisition = mockRequisitions.find(r => r.id === requisitionId) return requisition?.position || "Sin asignar" } return (
{/* Header */}

Pipeline de Reclutamiento

Gestiona candidatos y su progreso en el proceso de seleccion

Agregar Nuevo Candidato Ingresa la informacion del candidato para agregarlo al pipeline