import { AdminPanelConfig, TabConfig } from "@/types/admin-panel"; import { cn } from "@/lib/utils"; import { SiteHeader } from "../site-header"; import { Button } from "@/components/ui/button"; import { AlertCircle, CheckCircle, Loader2 } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsList, TabsTrigger, TabsContent } from "@/components/ui/tabs"; import { useAdminPanel } from "@/hooks/use-admin-panel"; import { AdminSection } from "@/components/admin/admin-section"; import { Form } from "@/components/ui/form"; import { useState } from "react"; import { ScrollArea } from "@/components/ui/scroll-area"; interface AdminPanelProps { config: AdminPanelConfig; initialValues?: Record; onSubmit?: (values: Record) => Promise; className?: string; // Permission checker function hasPermission?: (permission: string) => boolean; } export function AdminPanel({ config, initialValues, onSubmit, className, hasPermission = () => true }: AdminPanelProps) { const { state, actions, helpers, form } = useAdminPanel({ config, initialValues, onSubmit }); const visibleTabs = config.tabs.filter(tab => !tab.permissions || tab.permissions.some(p => hasPermission(p)) ); const [activeTab, setActiveTab] = useState(() => { // Find first accessible tab const firstAccessibleTab = config.tabs.find(tab => !tab.disabled && (!tab.permissions || tab.permissions.some(p => hasPermission(p))) ); return firstAccessibleTab?.id || config.tabs[0]?.id || ""; }); const renderHeaderActions = () => { const actions = config.header.actions || []; return actions .filter(action => !action.permissions || action.permissions.some(p => hasPermission(p))) .map(action => ( )); }; // Render breadcrumbs const renderBreadcrumbs = () => { if (!config.header.breadcrumbs) return null; return ({ label: crumb.label, href: crumb.href || "" }))} /> }; // Render status indicators const renderStatusIndicators = () => { const indicators = []; // Loading indicator if (state.loading) { indicators.push( 加载中 ); } // Saving indicator if (state.saving) { indicators.push( 保存中 ); } // Dirty state indicator if (helpers.isDirty() && !state.saving) { indicators.push( 有未保存的更改 ); } // Valid state indicator if (!helpers.isDirty() && helpers.isValid()) { indicators.push( 已保存 ); } // Validation errors indicator if (Object.keys(state.errors).length > 0) { indicators.push( {Object.keys(state.errors).length} 个错误 ); } return indicators; }; const gridColsMap: Record = { 1: "grid-cols-1", 2: "grid-cols-2", 3: "grid-cols-3", 4: "grid-cols-4", 5: "grid-cols-5", 6: "grid-cols-6", }; const gridColsClass = gridColsMap[Math.min(visibleTabs.length, 6)] || "grid-cols-6"; const getVisibleSections = (tab: TabConfig) => { return tab.sections.filter(section => !section.permissions || section.permissions.some(p => hasPermission(p)) ); }; return (
{renderBreadcrumbs()}

{config.header.title}

{config.header.description && (

{config.header.description}

)}
{/* Status indicators */} {renderStatusIndicators()} {/* Header actions */} {renderHeaderActions()} {/* Save button */} {onSubmit && ( )}
{/* Tab Navigation */} {visibleTabs.map((tab) => ( {tab.icon} {tab.title} {tab.badge && ( {tab.badge} )} ))} {visibleTabs.map((tab) => ( {getVisibleSections(tab).map((section) => ( { }} // Could implement field-level validation form={form} /> ))} ))}
); }