import type { LabelElement } from "../types/labelTemplate"; import { canonicalElementType, isTemplateSectionPersistedType, resolvedTypeAddForPersist, } from "../types/labelTemplate"; function normalizeLabelPanelTypeAdd(el: LabelElement): string { return resolvedTypeAddForPersist(el).trim().toLowerCase().replace(/\s+/g, " "); } /** Label 面板 **Label Name**(typeAdd 如 label_Label Name) */ export function isTemplateLabelNameElement(el: LabelElement): boolean { if (isTemplateSectionPersistedType(el)) return false; return normalizeLabelPanelTypeAdd(el) === "label_label name"; } /** Label 面板 **Label Type**(typeAdd 如 label_Label Type) */ export function isTemplateLabelTypeElement(el: LabelElement): boolean { if (isTemplateSectionPersistedType(el)) return false; return normalizeLabelPanelTypeAdd(el) === "label_label type"; } /** Template 面板中的条形码 / 二维码(typeAdd 如 template_Barcode、template_QR Code) */ export function isTemplateSectionBarcodeOrQrElement(el: LabelElement): boolean { if (!isTemplateSectionPersistedType(el)) return false; const t = canonicalElementType(el.type); return t === "BARCODE" || t === "QRCODE"; } /** Label 面板中的条形码 / 二维码(typeAdd 如 label_Barcode、label_QR Code),允许手填 */ export function isLabelSectionBarcodeOrQrElement(el: LabelElement): boolean { if (isTemplateSectionPersistedType(el)) return false; const t = canonicalElementType(el.type); if (t !== "BARCODE" && t !== "QRCODE") return false; const typeAdd = resolvedTypeAddForPersist(el).trim().toLowerCase(); return typeAdd.startsWith("label_"); } /** 将产品 codeValue 写入 elementId → 字符串,供 templateProductDefaults / 预览合并 */ export function buildTemplateBarcodeQrDefaultsFromCodeValue( elements: LabelElement[], codeValue: string | null | undefined, ): Record { const cv = String(codeValue ?? "").trim(); if (!cv) return {}; const out: Record = {}; for (const el of elements) { if (!isTemplateSectionBarcodeOrQrElement(el)) continue; out[el.id] = cv; } return out; } /** 将 Label Name 输入 / 标签类型名写入 elementId → 字符串,供 templateProductDefaults / 预览合并 */ export function buildTemplateLabelBindingDefaults( elements: LabelElement[], bindings: { labelName?: string | null; labelTypeName?: string | null }, ): Record { const labelName = String(bindings.labelName ?? "").trim(); const labelTypeName = String(bindings.labelTypeName ?? "").trim(); const out: Record = {}; for (const el of elements) { if (labelName && isTemplateLabelNameElement(el)) out[el.id] = labelName; if (labelTypeName && isTemplateLabelTypeElement(el)) out[el.id] = labelTypeName; } return out; } /** 合并 codeValue 到元素 config.data(用于画布预览) */ export function applyProductCodeValueToLabelElements( elements: LabelElement[], codeValue: string | null | undefined, ): LabelElement[] { const cv = String(codeValue ?? "").trim(); if (!cv) return elements; return elements.map((el) => { if (!isTemplateSectionBarcodeOrQrElement(el)) return el; const cfg = { ...(el.config as Record) }; cfg.data = cv; return { ...el, config: cfg }; }); }