From b7046d3bc65e2d46d80636405810d97b258a692e Mon Sep 17 00:00:00 2001 From: seb Date: Sun, 1 Nov 2026 00:30:39 +0100 Subject: [PATCH] u --- .../article/tabs/ArticleLabelTab.jsx | 90 ++++++++++++++++--- 1 file changed, 80 insertions(+), 10 deletions(-) diff --git a/src/components/article/tabs/ArticleLabelTab.jsx b/src/components/article/tabs/ArticleLabelTab.jsx index ad5a9cd..93cf592 100644 --- a/src/components/article/tabs/ArticleLabelTab.jsx +++ b/src/components/article/tabs/ArticleLabelTab.jsx @@ -12,45 +12,115 @@ import CheckCircleIcon from '@mui/icons-material/CheckCircle'; import { enqueueSnackbar } from 'notistack'; import { labeltemplate, printer, article } from '../../../api'; +import { companyAutomat } from '../../../automats'; import { notifyError } from '../../../utils/notify'; import BackendError from '../../BackendError'; +function filterZplPrinters(agentprinters, fallbackPrinters = []) { + const filteredAgent = (Array.isArray(agentprinters) ? agentprinters : []).filter( + (p) => p.enabled !== false && (!p.type || p.type.toLowerCase() === 'zpl'), + ); + if (filteredAgent.length > 0) return filteredAgent; + + return (Array.isArray(fallbackPrinters) ? fallbackPrinters : []).filter( + (p) => !p.type || p.type.toLowerCase() === 'zpl', + ); +} + +function getPrinterLabel(p) { + let label; + if (p.model && p.serial) { + label = `${p.model} (${p.serial})`; + } else if (p.model) { + label = p.model; + } else if (p.serial) { + label = `Drucker (${p.serial})`; + } else if (p.desc && p.address) { + label = `${p.desc} (${p.address})`; + } else if (p.address) { + label = p.address; + } else if (p.desc) { + label = p.desc; + } else { + label = `Drucker #${p.id}`; + } + + if (p.online === false) { + return `${label} (offline)`; + } + return label; +} + export default class ArticleLabelTab extends PureComponent { constructor(props) { super(props); + const initialPrinters = filterZplPrinters(companyAutomat.state.agentprinters); this.state = { templates: null, - printers: null, + printers: initialPrinters, selectedTemplateId: '', - selectedPrinterId: '', + selectedPrinterId: initialPrinters.length > 0 ? initialPrinters[0].id : '', quantity: 1, loading: true, error: null, }; + this.legacyPrinters = []; } componentDidMount() { + this.unsub = companyAutomat.subscribe(this, (state) => { + const zplPrinters = filterZplPrinters(state.agentprinters, this.legacyPrinters); + this.setState((prev) => ({ + printers: zplPrinters, + selectedPrinterId: + prev.selectedPrinterId && zplPrinters.some((p) => p.id === prev.selectedPrinterId) + ? prev.selectedPrinterId + : (zplPrinters[0]?.id ?? ''), + })); + }); this.loadData(); } + componentWillUnmount() { + this.unsub?.(); + } + async loadData() { this.setState({ loading: true, error: null }); try { - const [resTemplates, resPrinters] = await Promise.all([ + const [resTemplates] = await Promise.all([ labeltemplate.list(), - printer.list(), + companyAutomat.actions.loadAgentPrinters().catch(() => companyAutomat.state.agentprinters), ]); const templates = resTemplates.labeltemplates || []; - const zplPrinters = (resPrinters.printers || []).filter((p) => p.type === 'zpl'); + let zplPrinters = filterZplPrinters(companyAutomat.state.agentprinters); - this.setState({ + if (zplPrinters.length === 0) { + try { + const resPrinters = await printer.list(); + this.legacyPrinters = (resPrinters.printers || []).filter((p) => p.type === 'zpl'); + zplPrinters = filterZplPrinters(companyAutomat.state.agentprinters, this.legacyPrinters); + } catch { + // ignore legacy fallback error + } + } + + this.setState((prev) => ({ templates, printers: zplPrinters, - selectedTemplateId: templates.length > 0 ? templates[0].id : '', - selectedPrinterId: zplPrinters.length > 0 ? zplPrinters[0].id : '', + selectedTemplateId: + templates.length > 0 + ? prev.selectedTemplateId && templates.some((t) => t.id === prev.selectedTemplateId) + ? prev.selectedTemplateId + : templates[0].id + : '', + selectedPrinterId: + prev.selectedPrinterId && zplPrinters.some((p) => p.id === prev.selectedPrinterId) + ? prev.selectedPrinterId + : (zplPrinters[0]?.id ?? ''), loading: false, - }); + })); } catch (error) { this.setState({ error, loading: false }); } @@ -219,7 +289,7 @@ export default class ArticleLabelTab extends PureComponent { > {printers.map((p) => ( - {p.desc ? `${p.desc} (${p.address})` : p.address} + {getPrinterLabel(p)} ))}