import React, { useState, useCallback, useEffect } from 'react'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '../ui/table'; import { Input } from '../ui/input'; import { Button } from '../ui/button'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../ui/select'; import { Plus, Pencil } from 'lucide-react'; import { getTemplateList, getTemplate } from '../../lib/labelTemplateStorage'; import type { LabelTemplate } from '../../types/labelTemplate'; import { LabelTemplateEditor } from './LabelTemplateEditor'; export function LabelTemplatesView() { const [templates, setTemplates] = useState(() => getTemplateList()); const [viewMode, setViewMode] = useState<'list' | 'editor'>('list'); const [editingTemplateId, setEditingTemplateId] = useState(null); const [search, setSearch] = useState(''); const [locationFilter, setLocationFilter] = useState('all'); const refreshList = useCallback(() => { setTemplates(getTemplateList()); }, []); useEffect(() => { if (viewMode === 'list') refreshList(); }, [viewMode, refreshList]); const filtered = templates.filter((t) => { const matchSearch = !search || t.name.toLowerCase().includes(search.toLowerCase()); const matchLoc = locationFilter === 'all' || t.appliedLocation === locationFilter; return matchSearch && matchLoc; }); const handleNewTemplate = () => { setEditingTemplateId(null); setViewMode('editor'); }; const handleEditTemplate = (id: string) => { setEditingTemplateId(id); setViewMode('editor'); }; const handleCloseEditor = () => { setViewMode('list'); setEditingTemplateId(null); }; if (viewMode === 'editor') { const initialTemplate = editingTemplateId ? getTemplate(editingTemplateId) : null; return (
); } return (
{/* Controls: Search, Location, New Label Template — 单行 + 圆角 + 细边框 + 统一高度 40px,黄色按钮无边框、靠右 */}
setSearch(e.target.value)} />
{/* Warning Banner */}
***One or more templates have incomplete labels attached to them.
Go to Labels view to see which labels are missing fields.
{/* Table */}
Label Template Location Contents Size Actions {filtered.length === 0 ? ( No templates yet. Click "New Label Template" to create one. ) : ( filtered.map((t) => ( handleEditTemplate(t.id)} > {t.name} {t.appliedLocation} {t.elements.length} element(s) {t.width}×{t.height} {t.unit} e.stopPropagation()}> )) )}
); }