import { useState } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Search, ExternalLink, Plus, Edit2, Trash2, Folder, LayoutGrid, List, Star, Settings } from 'lucide-react'; import { navigationGroups, navigationLinks } from '@/mocks/data'; interface NavLink { id: string; name: string; url: string; icon?: string; description?: string; groupId: string; isFavorite?: boolean; tags?: string[]; } interface NavGroup { id: string; name: string; icon?: string; description?: string; linkCount?: number; } export function NavigationPage() { const [searchQuery, setSearchQuery] = useState(''); const [viewMode, setViewMode] = useState<'grid' | 'list'>('grid'); const [selectedGroup, setSelectedGroup] = useState('all'); const [showFavoritesOnly, setShowFavoritesOnly] = useState(false); const groups = navigationGroups; const links = navigationLinks; const filteredLinks = links.filter(link => { const matchesSearch = link.name.toLowerCase().includes(searchQuery.toLowerCase()) || link.description?.toLowerCase().includes(searchQuery.toLowerCase()) || link.tags?.some(tag => tag.toLowerCase().includes(searchQuery.toLowerCase())); const matchesGroup = selectedGroup === 'all' || link.groupId === selectedGroup; const matchesFavorite = !showFavoritesOnly || link.isFavorite; return matchesSearch && matchesGroup && matchesFavorite; }); const groupedLinks = groups.map(group => ({ ...group, links: filteredLinks.filter(link => link.groupId === group.id) })).filter(group => group.links.length > 0); const stats = { totalLinks: links.length, totalGroups: groups.length, favorites: links.filter(l => l.isFavorite).length, }; return (
{/* Header */}

站内导航

管理内部系统和常用链接

{/* Stats */}

链接总数

{stats.totalLinks}

分组数

{stats.totalGroups}

收藏

{stats.favorites}

{/* Filters */}
setSearchQuery(e.target.value)} className="pl-10 bg-slate-800 border-slate-700 text-slate-100" />
{/* Navigation Content */}
{selectedGroup === 'all' && !searchQuery && !showFavoritesOnly ? ( // Grouped view groupedLinks.map(group => (

{group.name}

{group.links.length}
{viewMode === 'grid' ? (
{group.links.map(link => ( ))}
) : (
{group.links.map(link => ( ))}
)}
)) ) : ( // Flat view viewMode === 'grid' ? (
{filteredLinks.map(link => ( ))}
) : (
{filteredLinks.map(link => ( ))}
) )}
); } function NavLinkCard({ link }: { link: NavLink }) { return (
{link.name.slice(0, 2)}

{link.name}

{link.description}

{link.tags?.map(tag => ( {tag} ))}
); } function NavLinkRow({ link }: { link: NavLink }) { return (
{link.name.slice(0, 2)}

{link.name}

{link.description}

{link.tags?.map(tag => ( {tag} ))}
); }