import React from 'react'; import { ScrollArea } from '../../ui/scroll-area'; import { Input } from '../../ui/input'; import { Button } from '../../ui/button'; import { Label } from '../../ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from '../../ui/select'; import { Switch } from '../../ui/switch'; import type { LabelTemplate, LabelElement, LabelType, Rotation, Border, } from '../../../types/labelTemplate'; interface PropertiesPanelProps { template: LabelTemplate; selectedElement: LabelElement | null; onTemplateChange: (patch: Partial) => void; onElementChange: (id: string, patch: Partial) => void; onDeleteElement?: (id: string) => void; } export function PropertiesPanel({ template, selectedElement, onTemplateChange, onElementChange, onDeleteElement, }: PropertiesPanelProps) { const panelStyle = { width: 288, minWidth: 288, maxWidth: 288 }; const panelClass = "shrink-0 border-l border-gray-200 bg-white flex flex-col h-full"; if (selectedElement) { return (
Properties (Element)
onElementChange(selectedElement.id, { x: Number(e.target.value) || 0, }) } className="h-8 text-sm" />
onElementChange(selectedElement.id, { y: Number(e.target.value) || 0, }) } className="h-8 text-sm" />
onElementChange(selectedElement.id, { width: Math.max(1, Number(e.target.value) || 0), }) } className="h-8 text-sm" />
onElementChange(selectedElement.id, { height: Math.max(1, Number(e.target.value) || 0), }) } className="h-8 text-sm" />
onElementChange(selectedElement.id, { config: { ...selectedElement.config, ...config } }) } /> {onDeleteElement && (
)}
); } return (
Properties (Template)
onTemplateChange({ name: e.target.value })} className="h-8 text-sm mt-1" />
{template.width} {template.unit}
{template.height} {template.unit}
onTemplateChange({ showRuler: v })} />
); } function ElementConfigFields({ element, onChange, }: { element: LabelElement; onChange: (config: Record) => void; }) { const cfg = element.config as Record; const update = (key: string, value: unknown) => onChange({ [key]: value }); switch (element.type) { case 'TEXT_STATIC': case 'TEXT_PRODUCT': case 'TEXT_PRICE': return ( <>
update('text', e.target.value)} className="h-8 text-sm mt-1" />
update('fontSize', Number(e.target.value) || 14)} className="h-8 text-sm mt-1" />
); case 'BARCODE': return ( <>
update('data', e.target.value)} className="h-8 text-sm mt-1" />
); case 'QRCODE': return (
update('data', e.target.value)} className="h-8 text-sm mt-1" />
); case 'WEIGHT': return (
update('value', Number(e.target.value) || 0)} className="h-8 text-sm mt-1" />
); default: return (
Config for {element.type} (edit in code if needed)
); } }