u
This commit is contained in:
@@ -12,45 +12,115 @@ import CheckCircleIcon from '@mui/icons-material/CheckCircle';
|
|||||||
import { enqueueSnackbar } from 'notistack';
|
import { enqueueSnackbar } from 'notistack';
|
||||||
|
|
||||||
import { labeltemplate, printer, article } from '../../../api';
|
import { labeltemplate, printer, article } from '../../../api';
|
||||||
|
import { companyAutomat } from '../../../automats';
|
||||||
import { notifyError } from '../../../utils/notify';
|
import { notifyError } from '../../../utils/notify';
|
||||||
import BackendError from '../../BackendError';
|
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 {
|
export default class ArticleLabelTab extends PureComponent {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
|
const initialPrinters = filterZplPrinters(companyAutomat.state.agentprinters);
|
||||||
this.state = {
|
this.state = {
|
||||||
templates: null,
|
templates: null,
|
||||||
printers: null,
|
printers: initialPrinters,
|
||||||
selectedTemplateId: '',
|
selectedTemplateId: '',
|
||||||
selectedPrinterId: '',
|
selectedPrinterId: initialPrinters.length > 0 ? initialPrinters[0].id : '',
|
||||||
quantity: 1,
|
quantity: 1,
|
||||||
loading: true,
|
loading: true,
|
||||||
error: null,
|
error: null,
|
||||||
};
|
};
|
||||||
|
this.legacyPrinters = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
componentDidMount() {
|
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();
|
this.loadData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
componentWillUnmount() {
|
||||||
|
this.unsub?.();
|
||||||
|
}
|
||||||
|
|
||||||
async loadData() {
|
async loadData() {
|
||||||
this.setState({ loading: true, error: null });
|
this.setState({ loading: true, error: null });
|
||||||
try {
|
try {
|
||||||
const [resTemplates, resPrinters] = await Promise.all([
|
const [resTemplates] = await Promise.all([
|
||||||
labeltemplate.list(),
|
labeltemplate.list(),
|
||||||
printer.list(),
|
companyAutomat.actions.loadAgentPrinters().catch(() => companyAutomat.state.agentprinters),
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const templates = resTemplates.labeltemplates || [];
|
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,
|
templates,
|
||||||
printers: zplPrinters,
|
printers: zplPrinters,
|
||||||
selectedTemplateId: templates.length > 0 ? templates[0].id : '',
|
selectedTemplateId:
|
||||||
selectedPrinterId: zplPrinters.length > 0 ? zplPrinters[0].id : '',
|
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,
|
loading: false,
|
||||||
});
|
}));
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
this.setState({ error, loading: false });
|
this.setState({ error, loading: false });
|
||||||
}
|
}
|
||||||
@@ -219,7 +289,7 @@ export default class ArticleLabelTab extends PureComponent {
|
|||||||
>
|
>
|
||||||
{printers.map((p) => (
|
{printers.map((p) => (
|
||||||
<MenuItem key={p.id} value={p.id}>
|
<MenuItem key={p.id} value={p.id}>
|
||||||
{p.desc ? `${p.desc} (${p.address})` : p.address}
|
{getPrinterLabel(p)}
|
||||||
</MenuItem>
|
</MenuItem>
|
||||||
))}
|
))}
|
||||||
</TextInput>
|
</TextInput>
|
||||||
|
|||||||
Reference in New Issue
Block a user