"use client" import { useState } from "react" import { useCompetition } from "@/contexts/competition-context" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Textarea } from "@/components/ui/textarea" import { Badge } from "@/components/ui/badge" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Alert, AlertDescription } from "@/components/ui/alert" import { Lightbulb, Plus, MoreHorizontal, Edit, Trash2, Eye, FileText, Users, Calendar, CheckCircle, AlertTriangle, Loader2, Target, AlertCircle, } from "lucide-react" import type { Proposal } from "@/types/competition" export function ProposalManagement() { const { proposals, addProposal, updateProposal, getProposalById, teams, getTeamById } = useCompetition() const [searchTerm, setSearchTerm] = useState("") const [selectedTeam, setSelectedTeam] = useState("all") const [selectedProposal, setSelectedProposal] = useState(null) const [showProposalDetail, setShowProposalDetail] = useState(false) const [showAddProposal, setShowAddProposal] = useState(false) const [showEditProposal, setShowEditProposal] = useState(false) const [showDeleteConfirm, setShowDeleteConfirm] = useState(false) const [isLoading, setIsLoading] = useState(false) const [success, setSuccess] = useState("") const [error, setError] = useState("") const [newProposal, setNewProposal] = useState({ title: "", description: "", problemStatement: "", solution: "", expectedImpact: "", teamId: "", attachments: [] as string[], }) const filteredProposals = proposals.filter((proposal) => { const team = getTeamById(proposal.teamId) const matchesSearch = proposal.title.toLowerCase().includes(searchTerm.toLowerCase()) || proposal.description.toLowerCase().includes(searchTerm.toLowerCase()) || team?.name.toLowerCase().includes(searchTerm.toLowerCase()) const matchesTeam = selectedTeam === "all" || proposal.teamId === selectedTeam return matchesSearch && matchesTeam }) const handleViewProposal = (proposal: Proposal) => { setSelectedProposal(proposal) setShowProposalDetail(true) } const handleEditProposal = (proposal: Proposal) => { setSelectedProposal(proposal) setNewProposal({ title: proposal.title, description: proposal.description, problemStatement: proposal.problemStatement, solution: proposal.solution, expectedImpact: proposal.expectedImpact, teamId: proposal.teamId, attachments: proposal.attachments || [], }) setShowEditProposal(true) } const handleDeleteProposal = (proposal: Proposal) => { setSelectedProposal(proposal) setShowDeleteConfirm(true) } const confirmDeleteProposal = () => { if (selectedProposal) { // In a real app, you would call a delete function here setShowDeleteConfirm(false) setSelectedProposal(null) setSuccess("提案刪除成功!") setTimeout(() => setSuccess(""), 3000) } } const handleAddProposal = async () => { setError("") if ( !newProposal.title || !newProposal.description || !newProposal.problemStatement || !newProposal.solution || !newProposal.expectedImpact || !newProposal.teamId ) { setError("請填寫所有必填欄位") return } setIsLoading(true) await new Promise((resolve) => setTimeout(resolve, 1000)) addProposal({ ...newProposal, submittedAt: new Date().toISOString(), }) setShowAddProposal(false) setNewProposal({ title: "", description: "", problemStatement: "", solution: "", expectedImpact: "", teamId: "", attachments: [], }) setSuccess("提案創建成功!") setIsLoading(false) setTimeout(() => setSuccess(""), 3000) } const handleUpdateProposal = async () => { if (!selectedProposal) return setError("") if ( !newProposal.title || !newProposal.description || !newProposal.problemStatement || !newProposal.solution || !newProposal.expectedImpact || !newProposal.teamId ) { setError("請填寫所有必填欄位") return } setIsLoading(true) await new Promise((resolve) => setTimeout(resolve, 1000)) updateProposal(selectedProposal.id, newProposal) setShowEditProposal(false) setSelectedProposal(null) setSuccess("提案更新成功!") setIsLoading(false) setTimeout(() => setSuccess(""), 3000) } return (
{/* Success/Error Messages */} {success && ( {success} )} {error && ( {error} )} {/* Header */}

提案管理

管理創新提案和解決方案

{/* Stats Cards */}

總提案數

{proposals.length}

參與團隊

{new Set(proposals.map((p) => p.teamId)).size}

本月提案

{ proposals.filter((p) => { const submittedDate = new Date(p.submittedAt) const now = new Date() return ( submittedDate.getMonth() === now.getMonth() && submittedDate.getFullYear() === now.getFullYear() ) }).length }

{/* Filters */}
setSearchTerm(e.target.value)} />
{/* Proposals Table */} 提案列表 ({filteredProposals.length}) 管理所有創新提案 提案標題 提案團隊 問題領域 提交日期 附件 操作 {filteredProposals.map((proposal) => { const team = getTeamById(proposal.teamId) const submittedDate = new Date(proposal.submittedAt) return (

{proposal.title}

{proposal.description}

{team?.name || "未知團隊"}

{team?.department}

{proposal.problemStatement}

{submittedDate.toLocaleDateString()}

{submittedDate.toLocaleTimeString()}

{proposal.attachments?.length || 0}
handleViewProposal(proposal)}> 查看詳情 handleEditProposal(proposal)}> 編輯提案 handleDeleteProposal(proposal)}> 刪除提案
) })}
{/* Add Proposal Dialog */} 新增提案 創建一個新的創新提案
setNewProposal({ ...newProposal, title: e.target.value })} placeholder="輸入提案標題" />