Post work PR #701

This commit is contained in:
maziggy
2026-04-24 10:28:51 +02:00
parent 91a3d391ff
commit e8f252d2b8
24 changed files with 362 additions and 8917 deletions
@@ -198,4 +198,35 @@ describe('VirtualPrinterCard - tailscale toggle', () => {
expect(multiVirtualPrinterApi.update).toHaveBeenCalledWith(1, { tailscale_disabled: true });
});
});
it('reverts toggle and shows a specific toast when backend rejects enable (tailscale_not_available)', async () => {
const user = userEvent.setup();
const printer = createMockPrinter({ tailscale_disabled: true });
vi.mocked(multiVirtualPrinterApi.update).mockRejectedValueOnce(
new Error('tailscale_not_available')
);
render(<VirtualPrinterCard printer={printer} models={models} />);
await waitFor(() => {
expect(screen.getByText('Tailscale integration')).toBeInTheDocument();
});
const title = screen.getByText('Tailscale integration');
const section = title.closest('.flex.items-center.justify-between');
const toggleButton = section!.querySelector('button') as HTMLButtonElement;
// Disabled state → dark-grey background on the track.
expect(toggleButton.className).toContain('bg-bambu-dark-tertiary');
await user.click(toggleButton);
await waitFor(() => {
expect(multiVirtualPrinterApi.update).toHaveBeenCalledWith(1, { tailscale_disabled: false });
});
// After the 409 revert, the toggle goes back to the dark-grey (disabled) state.
await waitFor(() => {
expect(toggleButton.className).toContain('bg-bambu-dark-tertiary');
});
});
});
+10 -3
View File
@@ -43,7 +43,7 @@ export function VirtualPrinterCard({ printer, models }: VirtualPrinterCardProps)
const [localRemoteInterfaceIp, setLocalRemoteInterfaceIp] = useState(printer.remote_interface_ip || '');
const [localModel, setLocalModel] = useState(printer.model || '');
const [localAutoDispatch, setLocalAutoDispatch] = useState(printer.auto_dispatch ?? true);
const [localTailscaleDisabled, setLocalTailscaleDisabled] = useState(printer.tailscale_disabled ?? false);
const [localTailscaleDisabled, setLocalTailscaleDisabled] = useState(printer.tailscale_disabled ?? true);
const [showAccessCode, setShowAccessCode] = useState(false);
const [pendingAction, setPendingAction] = useState<string | null>(null);
const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);
@@ -59,7 +59,7 @@ export function VirtualPrinterCard({ printer, models }: VirtualPrinterCardProps)
setLocalRemoteInterfaceIp(printer.remote_interface_ip || '');
setLocalModel(printer.model || '');
setLocalAutoDispatch(printer.auto_dispatch ?? true);
setLocalTailscaleDisabled(printer.tailscale_disabled ?? false);
setLocalTailscaleDisabled(printer.tailscale_disabled ?? true);
}
}, [printer, pendingAction]);
@@ -84,11 +84,18 @@ export function VirtualPrinterCard({ printer, models }: VirtualPrinterCardProps)
setPendingAction(null);
},
onError: (error: Error) => {
showToast(error.message || t('virtualPrinter.toast.failedToUpdate'), 'error');
// Specific: the backend rejected "enable Tailscale" because the binary isn't installed.
// Surface a clear reason instead of the raw error code.
if (error.message === 'tailscale_not_available') {
showToast(t('virtualPrinter.toast.tailscaleNotAvailable'), 'error');
} else {
showToast(error.message || t('virtualPrinter.toast.failedToUpdate'), 'error');
}
setLocalEnabled(printer.enabled);
setLocalMode((printer.mode === 'queue' ? 'review' : printer.mode) as LocalMode);
setLocalTargetPrinterId(printer.target_printer_id);
setLocalBindIp(printer.bind_ip || '');
setLocalTailscaleDisabled(printer.tailscale_disabled ?? true);
setPendingAction(null);
},
});
+1
View File
@@ -3984,6 +3984,7 @@ export default {
toast: {
updated: 'Virtuelle Druckereinstellungen aktualisiert',
failedToUpdate: 'Einstellungen konnten nicht aktualisiert werden',
tailscaleNotAvailable: 'Tailscale ist auf diesem Host nicht installiert. Installiere Tailscale zuerst und versuche es dann erneut.',
accessCodeRequired: 'Bitte zuerst einen Zugangscode setzen',
targetPrinterRequired: 'Bitte zuerst einen Zieldrucker auswählen',
bindIpRequired: 'Bitte zuerst eine Bind-IP setzen',
+1
View File
@@ -3992,6 +3992,7 @@ export default {
toast: {
updated: 'Virtual printer settings updated',
failedToUpdate: 'Failed to update settings',
tailscaleNotAvailable: 'Tailscale is not installed on this host. Install Tailscale first, then try again.',
accessCodeRequired: 'Please set an access code first',
targetPrinterRequired: 'Please select a target printer first',
bindIpRequired: 'Please set a bind IP first',
+1
View File
@@ -3907,6 +3907,7 @@ export default {
toast: {
updated: 'Réglages virtuels mis à jour',
failedToUpdate: 'Échec mise à jour',
tailscaleNotAvailable: 'Tailscale n\'est pas installé sur cet hôte. Installez Tailscale puis réessayez.',
accessCodeRequired: 'Code d\'accès requis',
targetPrinterRequired: 'Imprimante cible requise',
bindIpRequired: 'Veuillez d\'abord définir une adresse IP',
+1
View File
@@ -3906,6 +3906,7 @@ export default {
toast: {
updated: 'Impostazioni stampante virtuale aggiornate',
failedToUpdate: 'Aggiornamento impostazioni fallito',
tailscaleNotAvailable: 'Tailscale non è installato su questo host. Installa prima Tailscale, poi riprova.',
accessCodeRequired: 'Imposta prima un codice accesso',
targetPrinterRequired: 'Seleziona prima una stampante target',
bindIpRequired: 'Impostare prima un indirizzo IP',
+1
View File
@@ -3945,6 +3945,7 @@ export default {
toast: {
updated: '仮想プリンター設定を更新しました',
failedToUpdate: '設定の更新に失敗しました',
tailscaleNotAvailable: 'このホストにTailscaleがインストールされていません。先にTailscaleをインストールしてから再試行してください。',
accessCodeRequired: '先にアクセスコードを設定してください',
targetPrinterRequired: '先にターゲットプリンターを選択してください',
bindIpRequired: '先にバインドIPを設定してください',
+1
View File
@@ -3920,6 +3920,7 @@ export default {
toast: {
updated: 'Configurações da impressora virtual atualizadas',
failedToUpdate: 'Falha ao atualizar as configurações',
tailscaleNotAvailable: 'Tailscale não está instalado neste host. Instale o Tailscale primeiro e tente novamente.',
accessCodeRequired: 'Defina um código de acesso primeiro',
targetPrinterRequired: 'Selecione uma impressora alvo primeiro',
bindIpRequired: 'Defina um IP de ligação primeiro',
+1
View File
@@ -3972,6 +3972,7 @@ export default {
toast: {
updated: '虚拟打印机设置已更新',
failedToUpdate: '更新设置失败',
tailscaleNotAvailable: '此主机上未安装 Tailscale。请先安装 Tailscale,然后重试。',
accessCodeRequired: '请先设置访问码',
targetPrinterRequired: '请先选择目标打印机',
bindIpRequired: '请先设置绑定 IP',
+1
View File
@@ -3972,6 +3972,7 @@ export default {
toast: {
updated: '虛擬印表機設定已更新',
failedToUpdate: '更新設定失敗',
tailscaleNotAvailable: '此主機上未安裝 Tailscale。請先安裝 Tailscale,然後重試。',
accessCodeRequired: '請先設定存取碼',
targetPrinterRequired: '請先選擇目標印表機',
bindIpRequired: '請先設定繫結 IP',