Add virtual printer model selection

Features:
  - Configurable printer model for virtual printer emulation
  - Supports X1 series (X1C, X1, X1E), P series (P1S, P1P, P2S),
    A1 series (A1, A1 Mini), and H2 series (H2D, H2C, H2S)
  - Dropdown in Settings > Virtual Printer to select model
  - Model affects SSDP discovery and slicer compatibility
  - Model change restarts virtual printer services automatically

  Backend:
  - Added VIRTUAL_PRINTER_MODELS mapping in manager.py
  - Added virtual_printer_model setting in database
  - New GET /api/v1/settings/virtual-printer/models endpoint
  - Updated PUT /api/v1/settings/virtual-printer to accept model

  Frontend:
  - Added model dropdown to VirtualPrinterSettings component
  - Status display shows selected model name
  - Model change disabled while virtual printer is running

  Tests:
  - Added 3 unit tests for model configuration
  - Updated frontend test mocks for getModels API
This commit is contained in:
maziggy
2026-01-04 09:39:06 +01:00
parent 8639f39028
commit 81c8dd7d0c
13 changed files with 304 additions and 78 deletions
+11
View File
@@ -2450,6 +2450,7 @@ export interface VirtualPrinterStatus {
name: string;
serial: string;
model: string;
model_name: string;
pending_files: number;
}
@@ -2457,9 +2458,15 @@ export interface VirtualPrinterSettings {
enabled: boolean;
access_code_set: boolean;
mode: 'immediate' | 'queue';
model: string;
status: VirtualPrinterStatus;
}
export interface VirtualPrinterModels {
models: Record<string, string>; // SSDP code -> display name
default: string;
}
export interface PendingUpload {
id: number;
filename: string;
@@ -2476,15 +2483,19 @@ export interface PendingUpload {
export const virtualPrinterApi = {
getSettings: () => request<VirtualPrinterSettings>('/settings/virtual-printer'),
getModels: () => request<VirtualPrinterModels>('/settings/virtual-printer/models'),
updateSettings: (data: {
enabled?: boolean;
access_code?: string;
mode?: 'immediate' | 'queue';
model?: string;
}) => {
const params = new URLSearchParams();
if (data.enabled !== undefined) params.set('enabled', String(data.enabled));
if (data.access_code !== undefined) params.set('access_code', data.access_code);
if (data.mode !== undefined) params.set('mode', data.mode);
if (data.model !== undefined) params.set('model', data.model);
return request<VirtualPrinterSettings>(`/settings/virtual-printer?${params.toString()}`, {
method: 'PUT',