implemented pr feedback #2

This commit is contained in:
behrinml
2026-08-05 21:25:46 +02:00
parent 43bf854bd5
commit 9a397f46e9
30 changed files with 1035 additions and 259 deletions
@@ -6,7 +6,7 @@
*/
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
import { renderHook, waitFor, act } from '@testing-library/react';
import { renderHook, waitFor, act, screen } from '@testing-library/react';
import React from 'react';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { ToastProvider } from '../../contexts/ToastContext';
@@ -23,6 +23,10 @@ vi.mock('react-i18next', () => ({
const { printer, slots } = options as { printer: string; slots: string };
return `Missing assignments for ${printer}: ${slots}`;
}
if (key === 'printers.toast.killSwitchTriggered' && options) {
const { printer, filename } = options as { printer: string; filename: string };
return `Billing kill switch stopped ${filename} on ${printer}`;
}
return key;
},
i18n: {},
@@ -490,6 +494,28 @@ describe('useWebSocket hook', () => {
vi.unstubAllGlobals();
});
it('shows an error toast when the billing kill switch stops a print', async () => {
const { useWebSocket } = await import('../../hooks/useWebSocket');
renderHook(() => useWebSocket(), {
wrapper: createWrapper(queryClient),
});
const ws = await waitForWs();
act(() => {
ws.open();
ws.simulateMessage({
type: 'kill_switch_triggered',
printer_id: 7,
printer_name: 'Printer B',
filename: 'foreign_job.3mf',
});
});
const toast = screen.getByText('Billing kill switch stopped foreign_job.3mf on Printer B');
expect(toast.parentElement).toHaveClass('bg-red-500/10');
});
it('handles spool_assignment_verified messages (success and failure) without error', async () => {
const { useWebSocket } = await import('../../hooks/useWebSocket');
+8
View File
@@ -17,6 +17,7 @@ interface WebSocketMessage {
printer_id?: number;
data?: Record<string, unknown>;
printer_name?: string;
filename?: string;
missing_slots?: Array<{ slot?: string }>;
// Spool-assignment read-back verification (#2582).
slot?: string;
@@ -338,6 +339,13 @@ export function useWebSocket() {
debouncedInvalidate('archiveStats');
break;
case 'kill_switch_triggered': {
const printer = message.printer_name || `Printer ${message.printer_id ?? '?'}`;
const filename = message.filename || t('common.unknown');
showToast(t('printers.toast.killSwitchTriggered', { printer, filename }), 'error');
break;
}
case 'archive_created':
debouncedInvalidate('archives');
debouncedInvalidate('archiveStats');
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: 'Drucker gelöscht',
missingSpoolAssignment: 'Druck gestartet auf {{printer}}. Fehlende Spulenzuordnung für: {{slots}}',
killSwitchTriggered: 'Der Billing-Kill-Switch hat einen nicht autorisierten Druck auf {{printer}} gestoppt: {{filename}}',
assignmentVerified: 'Filament in Slot {{slot}} geladen ({{printer}})',
assignmentVerifiedNoKprofile: 'Slot {{slot}} auf {{printer}} geladen, aber das Fluss-Kalibrierungsprofil (K-Profil) wurde nicht übernommen',
assignmentNotConfirmed: 'Zuordnung für Slot {{slot}} auf {{printer}} konnte nicht bestätigt werden – bitte den AMS-Slot prüfen',
+1
View File
@@ -450,6 +450,7 @@ export default {
toast: {
printerDeleted: 'Printer deleted',
missingSpoolAssignment: 'Print started on {{printer}}. Missing spool assignment for: {{slots}}',
killSwitchTriggered: 'The billing kill switch stopped an unauthorized print on {{printer}}: {{filename}}',
assignmentVerified: 'Filament loaded on slot {{slot}} ({{printer}})',
assignmentVerifiedNoKprofile: 'Slot {{slot}} on {{printer}} loaded, but the flow calibration (K-profile) was not applied',
assignmentNotConfirmed: 'Could not confirm the assignment for slot {{slot}} on {{printer}} — check the AMS slot',
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: 'Impresora eliminada',
missingSpoolAssignment: 'Impresión iniciada en {{printer}}. Falta la asignación de bobina para: {{slots}}',
killSwitchTriggered: 'El interruptor de seguridad de facturación detuvo una impresión no autorizada en {{printer}}: {{filename}}',
assignmentVerified: 'Filamento cargado en la ranura {{slot}} ({{printer}})',
assignmentVerifiedNoKprofile: 'Ranura {{slot}} en {{printer}} cargada, pero no se aplicó el perfil de calibración de flujo (perfil K)',
assignmentNotConfirmed: 'No se pudo confirmar la asignación de la ranura {{slot}} en {{printer}}: revisa la ranura AMS',
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: 'Imprimante supprimée',
missingSpoolAssignment: 'Impression démarrée sur {{printer}}. Attribution de bobine manquante pour : {{slots}}',
killSwitchTriggered: 'Le coupe-circuit de facturation a arrêté une impression non autorisée sur {{printer}} : {{filename}}',
assignmentVerified: 'Filament chargé dans l\'emplacement {{slot}} ({{printer}})',
assignmentVerifiedNoKprofile: 'Emplacement {{slot}} sur {{printer}} chargé, mais le profil de calibration de débit (profil K) n\'a pas été appliqué',
assignmentNotConfirmed: 'Impossible de confirmer l\'attribution de l\'emplacement {{slot}} sur {{printer}} — vérifiez l\'emplacement AMS',
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: 'Stampante eliminata',
missingSpoolAssignment: 'Stampa avviata su {{printer}}. Mancano assegnazioni bobina per: {{slots}}',
killSwitchTriggered: 'L’interruttore di sicurezza della fatturazione ha arrestato una stampa non autorizzata su {{printer}}: {{filename}}',
assignmentVerified: 'Filamento caricato nello slot {{slot}} ({{printer}})',
assignmentVerifiedNoKprofile: 'Slot {{slot}} su {{printer}} caricato, ma il profilo di calibrazione del flusso (profilo K) non è stato applicato',
assignmentNotConfirmed: 'Impossibile confermare l\'assegnazione dello slot {{slot}} su {{printer}} — controlla lo slot AMS',
+1
View File
@@ -446,6 +446,7 @@ export default {
toast: {
printerDeleted: 'プリンターを削除しました',
missingSpoolAssignment: '{{printer}}で印刷を開始しました。以下のスプール割り当てがありません: {{slots}}',
killSwitchTriggered: '課金キルスイッチが{{printer}}で未承認の印刷を停止しました:{{filename}}',
assignmentVerified: 'スロット{{slot}}にフィラメントを読み込みました({{printer}})',
assignmentVerifiedNoKprofile: '{{printer}}のスロット{{slot}}を読み込みましたが、フロー校正プロファイル(Kプロファイル)は適用されませんでした',
assignmentNotConfirmed: '{{printer}}のスロット{{slot}}の割り当てを確認できませんでした。AMSスロットを確認してください',
+1
View File
@@ -421,6 +421,7 @@ export default {
toast: {
printerDeleted: '프린터가 삭제되었습니다',
missingSpoolAssignment: '{{printer}}에서 인쇄가 시작되었습니다. 슬롯 할당 누락: {{slots}}',
killSwitchTriggered: '결제 킬 스위치가 {{printer}}에서 승인되지 않은 인쇄를 중지했습니다: {{filename}}',
assignmentVerified: '슬롯 {{slot}}에 필라멘트가 로드되었습니다 ({{printer}})',
assignmentVerifiedNoKprofile: '{{printer}}의 슬롯 {{slot}}이(가) 로드되었지만 유량 보정 프로파일(K 프로파일)이 적용되지 않았습니다',
assignmentNotConfirmed: '{{printer}}의 슬롯 {{slot}} 할당을 확인할 수 없습니다. AMS 슬롯을 확인하세요',
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: 'Impressora excluída',
missingSpoolAssignment: 'Impressão iniciada em {{printer}}. Atribuição de bobina ausente para: {{slots}}',
killSwitchTriggered: 'O bloqueio de segurança de cobrança interrompeu uma impressão não autorizada em {{printer}}: {{filename}}',
assignmentVerified: 'Filamento carregado no compartimento {{slot}} ({{printer}})',
assignmentVerifiedNoKprofile: 'Compartimento {{slot}} em {{printer}} carregado, mas o perfil de calibração de fluxo (perfil K) não foi aplicado',
assignmentNotConfirmed: 'Não foi possível confirmar a atribuição do compartimento {{slot}} em {{printer}} — verifique o compartimento AMS',
+1
View File
@@ -426,6 +426,7 @@ export default {
toast: {
printerDeleted: "Принтер удалён",
missingSpoolAssignment: "На принтере {{printer}} началась печать. Не назначены катушки для слотов: {{slots}}",
killSwitchTriggered: 'Аварийный выключатель биллинга остановил несанкционированную печать на {{printer}}: {{filename}}',
assignmentVerified: "Филамент загружен в слот {{slot}} ({{printer}})",
assignmentVerifiedNoKprofile: "Слот {{slot}} на {{printer}} загружен, но профиль калибровки потока (K-профиль) не применён",
assignmentNotConfirmed: "Не удалось подтвердить назначение слота {{slot}} на {{printer}} — проверьте слот AMS",
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: 'Yazıcı silindi',
missingSpoolAssignment: '{{printer}} üzerinde baskı başladı. Şunlar için eksik makara ataması: {{slots}}',
killSwitchTriggered: 'Faturalandırma durdurma anahtarı {{printer}} üzerindeki yetkisiz baskıyı durdurdu: {{filename}}',
assignmentVerified: '{{slot}} yuvasına filament yüklendi ({{printer}})',
assignmentVerifiedNoKprofile: '{{printer}} üzerindeki {{slot}} yuvası yüklendi, ancak akış kalibrasyonu profili (K profili) uygulanmadı',
assignmentNotConfirmed: '{{printer}} üzerindeki {{slot}} yuvası ataması doğrulanamadı — AMS yuvasını kontrol edin',
+1
View File
@@ -450,6 +450,7 @@ export default {
toast: {
printerDeleted: "Принтер видалено",
missingSpoolAssignment: "Друк на {{printer}} розпочато. Для слотів {{slots}} не призначено котушки.",
killSwitchTriggered: 'Аварійний вимикач білінгу зупинив несанкціонований друк на {{printer}}: {{filename}}',
assignmentVerified: "Філамент завантажено в слот AMS {{slot}} принтера {{printer}}",
assignmentVerifiedNoKprofile: "Слот AMS {{slot}} на {{printer}} завантажено, але калібрування потоку (K-профіль) не застосовано",
assignmentNotConfirmed: "Не вдалося підтвердити призначення для слота {{slot}} на {{printer}} — перевірте слот AMS",
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: '打印机已删除',
missingSpoolAssignment: '已在{{printer}}上开始打印。以下料槽未分配耗材: {{slots}}',
killSwitchTriggered: '计费终止开关已停止 {{printer}} 上的未授权打印:{{filename}}',
assignmentVerified: '耗材已加载到料槽{{slot}}({{printer}})',
assignmentVerifiedNoKprofile: '{{printer}}的料槽{{slot}}已加载,但流量校准配置(K配置)未应用',
assignmentNotConfirmed: '无法确认{{printer}}上料槽{{slot}}的分配,请检查AMS料槽',
+1
View File
@@ -447,6 +447,7 @@ export default {
toast: {
printerDeleted: '印表機已刪除',
missingSpoolAssignment: '已在{{printer}}上開始列印。以下料槽未分配耗材: {{slots}}',
killSwitchTriggered: '計費終止開關已停止 {{printer}} 上的未授權列印:{{filename}}',
assignmentVerified: '耗材已載入料槽{{slot}}({{printer}})',
assignmentVerifiedNoKprofile: '{{printer}}的料槽{{slot}}已載入,但流量校準設定檔(K設定檔)未套用',
assignmentNotConfirmed: '無法確認{{printer}}上料槽{{slot}}的分配,請檢查AMS料槽',