diff --git a/src/components/settings/PrinterAgentSettingsPanel.jsx b/src/components/settings/PrinterAgentSettingsPanel.jsx index ec97dbe..c5cfbfb 100644 --- a/src/components/settings/PrinterAgentSettingsPanel.jsx +++ b/src/components/settings/PrinterAgentSettingsPanel.jsx @@ -5,19 +5,18 @@ import Chip from '@mui/material/Chip'; import Divider from '@mui/material/Divider'; import IconButton from '@mui/material/IconButton'; import TextField from '@mui/material/TextField'; -import Tooltip from '@mui/material/Tooltip'; import Typography from '@mui/material/Typography'; import AddIcon from '@mui/icons-material/Add'; import ArrowDownwardIcon from '@mui/icons-material/ArrowDownward'; import ArrowUpwardIcon from '@mui/icons-material/ArrowUpward'; import CheckIcon from '@mui/icons-material/Check'; import CloseIcon from '@mui/icons-material/Close'; -import ContentCopyIcon from '@mui/icons-material/ContentCopy'; import DeleteOutlinedIcon from '@mui/icons-material/DeleteOutlined'; import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; import LocalPrintshopOutlinedIcon from '@mui/icons-material/LocalPrintshopOutlined'; import CheckCircleOutlinedIcon from '@mui/icons-material/CheckCircleOutlined'; import HourglassEmptyIcon from '@mui/icons-material/HourglassEmpty'; +import QRCode from 'qrcode'; import { enqueueSnackbar } from 'notistack'; import BackendError from '../BackendError'; import companyAutomat from '../../automats/companyAutomat'; @@ -41,6 +40,80 @@ function formatDateTime(val) { } } +class AgentQrCode extends PureComponent { + constructor(props) { + super(props); + this.state = { dataUrl: null }; + } + + componentDidMount() { + this.generateQr(); + } + + componentDidUpdate(prevProps) { + if (prevProps.value !== this.props.value || prevProps.size !== this.props.size) { + this.generateQr(); + } + } + + async generateQr() { + const { value, size = 110 } = this.props; + if (!value) { + this.setState({ dataUrl: null }); + return; + } + try { + const dataUrl = await QRCode.toDataURL(value, { + width: size, + margin: 1, + color: { + dark: '#000000', + light: '#ffffff', + }, + errorCorrectionLevel: 'M', + }); + this.setState({ dataUrl }); + } catch (err) { + console.error('Failed to generate QR code:', err); + } + } + + render() { + const { size = 110 } = this.props; + const { dataUrl } = this.state; + if (!dataUrl) { + return ( + + ); + } + return ( + + ); + } +} + export default class PrinterAgentSettingsPanel extends PureComponent { constructor(props) { super(props); @@ -76,7 +149,7 @@ export default class PrinterAgentSettingsPanel extends PureComponent { error: state.printeragentsError ? backendErrorFrom(state.printeragentsError) : null, })); if (companyAutomat.state.printeragentsStatus === 'idle') { - void companyAutomat.actions.loadPrinterAgents().catch(() => {}); + void companyAutomat.actions.loadPrinterAgents().catch(() => { }); } } @@ -385,16 +458,14 @@ export default class PrinterAgentSettingsPanel extends PureComponent { {agent.name} - - this.handleStartRename(agent)} - disabled={isPatching || isDeleting} - sx={{ p: 0.5, color: 'text.secondary' }} - > - - - + this.handleStartRename(agent)} + disabled={isPatching || isDeleting} + sx={{ p: 0.5, color: 'text.secondary' }} + > + + )} @@ -433,48 +504,74 @@ export default class PrinterAgentSettingsPanel extends PureComponent { - {/* Body: Pairing details or PIN info */} + {/* Body: Pairing details with QR code or Paired status info */} {!isPaired ? ( - - - Kopplungs-PIN: - - - } - label={agent.pairingpin || '—'} - onClick={() => { - if (agent.pairingpin) { - navigator.clipboard?.writeText(agent.pairingpin); - enqueueSnackbar('PIN in Zwischenablage kopiert.', { variant: 'info' }); - } - }} - clickable - color="warning" - variant="filled" + (() => { + const domain = typeof window !== 'undefined' ? window.location.host : ''; + const qrPayload = JSON.stringify({ + domain, + pin: String(agent.pairingpin || ''), + }); + return ( + - - - Geben Sie diesen PIN auf dem Drucker-Agent-Gerät ein. - - + > + + + + + + + + Kopplungs-PIN: + + + + + + + Domain: + + + + + + ); + })() ) : ( {agent.clientserial ? ( @@ -513,35 +610,32 @@ export default class PrinterAgentSettingsPanel extends PureComponent { )} - {/* Sort Order Controls */} - + {/* Row with Sort Order Controls */} + Reihenfolge: - - - void this.handleMoveAgent(agent, 'up')} - sx={{ p: 0.25 }} - > - - - - - - - void this.handleMoveAgent(agent, 'down')} - sx={{ p: 0.25 }} - > - - - - + + void this.handleMoveAgent(agent, 'up')} + sx={{ p: 0.25 }} + > + + + + + + void this.handleMoveAgent(agent, 'down')} + sx={{ p: 0.25 }} + > + + +