This commit is contained in:
seb
2026-11-01 00:30:39 +01:00
parent fcaf3d5821
commit b7046d3bc6

View File

@@ -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) => (
<MenuItem key={p.id} value={p.id}>
{p.desc ? `${p.desc} (${p.address})` : p.address}
{getPrinterLabel(p)}
</MenuItem>
))}
</TextInput>