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 }}
+ >
+
+
+