import React, { useCallback, useState } from 'react'; import { LabelsList } from './LabelsList'; import { LabelCategoriesView } from './LabelCategoriesView'; import { LabelTypesView } from './LabelTypesView'; import { LabelTemplatesView } from './LabelTemplatesView'; import { MultipleOptionsView } from './MultipleOptionsView'; type Tab = 'Labels' | 'Label Categories' | 'Label Types' | 'Label Templates' | 'Multiple Option Sets'; interface LabelsViewProps { currentView?: string; onViewChange?: (view: string) => void; /** 标签模板新增/编辑时 true,用于布局层隐藏侧栏与顶栏 */ onLabelTemplateEditorLayoutOverlay?: (fullscreen: boolean) => void; } export function LabelsView({ currentView = 'Labels', onViewChange, onLabelTemplateEditorLayoutOverlay, }: LabelsViewProps) { const [templateEditorHidesTabs, setTemplateEditorHidesTabs] = useState(false); const handleTemplateEditorOverlay = useCallback( (fullscreen: boolean) => { setTemplateEditorHidesTabs(fullscreen); onLabelTemplateEditorLayoutOverlay?.(fullscreen); }, [onLabelTemplateEditorLayoutOverlay], ); const tabs: Tab[] = [ 'Labels', 'Label Categories', 'Label Types', 'Label Templates', 'Multiple Option Sets' ]; const handleTabClick = (tab: Tab) => { if (onViewChange) { onViewChange(tab); } }; return (
{/* Tabs:模板编辑器全屏编辑时隐藏 */} {!templateEditorHidesTabs && (
{tabs.map((tab) => (
handleTabClick(tab)} style={ currentView === tab ? { borderBottomWidth: 2, borderBottomStyle: 'solid', borderBottomColor: '#2563eb' } : undefined } className={`px-4 py-2.5 text-sm font-medium whitespace-nowrap cursor-pointer transition-colors -mb-px ${ currentView === tab ? 'text-blue-600' : 'border-b-2 border-b-transparent text-gray-600 hover:text-gray-800' }`} > {tab}
))}
)} {/* min-h-0 未进预编译 CSS,用内联保证模板编辑区能拿到剩余高度 */}
{currentView === 'Labels' && (
)} {currentView === 'Label Categories' && (
)} {currentView === 'Label Types' && (
)} {currentView === "Label Templates" && (
)} {currentView === 'Multiple Option Sets' && (
)} {!['Labels', 'Label Categories', 'Label Types', 'Label Templates', 'Multiple Option Sets'].includes(currentView) && (
{currentView} content coming soon...
)}
); }