import React, { useState } from "react"; import { cn } from "@/lib/utils"; import { ArrowRight, CheckCircle, Circle, Clock, Filter, MoreHorizontal, Plus, RefreshCw, Search, Triangle } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Card, CardContent, CardHeader, CardTitle, } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import Layout from "@/components/layout/layout"; import { getUserById, getProjectById, mockIssues } from "@/lib/data"; import { Issue, IssuePriority, IssueStatus, IssueType } from "@/types"; import { Dropdown, DropdownOption } from "@/components/ui/dropdown"; const Backlog = () => { const [searchQuery, setSearchQuery] = useState(""); const [projectFilter, setProjectFilter] = useState("all"); const [statusFilter, setStatusFilter] = useState("all"); const [typeFilter, setTypeFilter] = useState("all"); const [priorityFilter, setPriorityFilter] = useState("all"); const filteredIssues = mockIssues.filter((issue) => { const matchesSearch = issue.title.toLowerCase().includes(searchQuery.toLowerCase()) || issue.description.toLowerCase().includes(searchQuery.toLowerCase()); const matchesProject = projectFilter === "all" || issue.projectId === projectFilter; const matchesStatus = statusFilter === "all" || issue.status === statusFilter; const matchesType = typeFilter === "all" || issue.type === typeFilter; const matchesPriority = priorityFilter === "all" || issue.priority === priorityFilter; return matchesSearch && matchesProject && matchesStatus && matchesType && matchesPriority; }); const projects = [...new Set(mockIssues.map(issue => issue.projectId))].map( projectId => getProjectById(projectId) ).filter(Boolean); const statusOptions: IssueStatus[] = ["New", "In Progress", "In Review", "Done"]; const typeOptions: IssueType[] = ["Bug", "Feature", "Task", "Improvement"]; const priorityOptions: IssuePriority[] = ["Low", "Medium", "High", "Critical"]; return (

Backlog

View and manage all issues and features in your product backlog

setSearchQuery(e.target.value)} />
({ label: project.name, value: project.id })) ]} value={projectFilter} onValueChange={(value) => setProjectFilter(value)} placeholder="Filter by Project" className="w-full" /> ({ label: status, value: status })) ]} value={statusFilter} onValueChange={(value) => setStatusFilter(value as IssueStatus | "all")} placeholder="Filter by Status" className="w-full" /> ({ label: type, value: type })) ]} value={typeFilter} onValueChange={(value) => setTypeFilter(value as IssueType | "all")} placeholder="Filter by Type" className="w-full" /> ({ label: priority, value: priority })) ]} value={priorityFilter} onValueChange={(value) => setPriorityFilter(value as IssuePriority | "all")} placeholder="Filter by Priority" className="w-full" />
{filteredIssues.length === 0 ? (

No issues found

Try adjusting your search or filter criteria

) : (
Backlog Items ({filteredIssues.length})
{filteredIssues.map((issue) => ( ))}
Title Project Type Priority Status Assignee Actions
)}
); }; interface IssueRowProps { issue: Issue; } const IssueRow = ({ issue }: IssueRowProps) => { const project = getProjectById(issue.projectId); const assignee = issue.assigneeId ? getUserById(issue.assigneeId) : undefined; // Type icon const getTypeIcon = (type: IssueType) => { switch (type) { case "Bug": return ; case "Feature": return ; case "Task": return ; case "Improvement": return ; default: return null; } }; // Priority badge const getPriorityBadge = (priority: IssuePriority) => { switch (priority) { case "Critical": return ( Critical ); case "High": return ( High ); case "Medium": return ( Medium ); case "Low": return ( Low ); default: return null; } }; // Status badge const getStatusBadge = (status: IssueStatus) => { switch (status) { case "New": return (
New
); case "In Progress": return (
In Progress
); case "In Review": return (
In Review
); case "Done": return (
Done
); default: return null; } }; return (
{getTypeIcon(issue.type)} {issue.title}
{project?.name}
{issue.type} {getPriorityBadge(issue.priority)} {getStatusBadge(issue.status)} {assignee ? (
{assignee.name.slice(0, 2).toUpperCase()} {assignee.name}
) : ( Unassigned )} View Details Edit Issue Assign to Me Delete Issue ); }; export default Backlog;