Add virtual printer Queue mode and sidebar badge indicators

Virtual Printer Changes:
- Add new "Queue" mode that archives files and adds them to print queue
- Rename modes: "Immediate" → "Archive", "Queue for Review" → "Review"
- Three modes now: Archive (immediate), Review (pending), Queue (print queue)
- Queue mode creates unassigned queue items (printer_id=null)

Print Queue Changes:
- Make printer_id nullable in PrintQueueItem model/schema
- Add support for unassigned queue items (no printer assigned)
- Queue page shows "Unassigned" filter option
- Edit modal allows assigning printer to unassigned items
- Unassigned items highlighted in orange

Sidebar Badge Indicators:
- Queue icon shows yellow badge with pending queue item count
- Archive icon shows blue badge with pending upload count
- Badges auto-update every 5 seconds and on window focus

Other:
- Update backup/restore to handle nullable printer_id and ams_mapping
- Add database migration for nullable printer_id column
- Update VirtualPrinterSettings tests for new modes
- Update virtual printer API integration tests
- Remove speed controls documentation from wiki (not implemented)
This commit is contained in:
maziggy
2026-01-17 13:30:00 +01:00
parent 699d7b0c71
commit 6fd11ddc77
19 changed files with 452 additions and 149 deletions
+6 -6
View File
@@ -814,7 +814,7 @@ export interface DiscoveredTasmotaDevice {
// Print Queue types
export interface PrintQueueItem {
id: number;
printer_id: number;
printer_id: number | null; // null = unassigned
archive_id: number;
position: number;
scheduled_time: string | null;
@@ -834,7 +834,7 @@ export interface PrintQueueItem {
}
export interface PrintQueueItemCreate {
printer_id: number;
printer_id?: number | null; // null = unassigned
archive_id: number;
scheduled_time?: string | null;
require_previous_success?: boolean;
@@ -844,7 +844,7 @@ export interface PrintQueueItemCreate {
}
export interface PrintQueueItemUpdate {
printer_id?: number;
printer_id?: number | null; // null = unassign
position?: number;
scheduled_time?: string | null;
require_previous_success?: boolean;
@@ -2516,7 +2516,7 @@ export const discoveryApi = {
export interface VirtualPrinterStatus {
enabled: boolean;
running: boolean;
mode: 'immediate' | 'queue';
mode: 'immediate' | 'queue' | 'review' | 'print_queue'; // 'queue' is legacy, normalized to 'review'
name: string;
serial: string;
model: string;
@@ -2527,7 +2527,7 @@ export interface VirtualPrinterStatus {
export interface VirtualPrinterSettings {
enabled: boolean;
access_code_set: boolean;
mode: 'immediate' | 'queue';
mode: 'immediate' | 'queue' | 'review' | 'print_queue'; // 'queue' is legacy, normalized to 'review'
model: string;
status: VirtualPrinterStatus;
}
@@ -2558,7 +2558,7 @@ export const virtualPrinterApi = {
updateSettings: (data: {
enabled?: boolean;
access_code?: string;
mode?: 'immediate' | 'queue';
mode?: 'immediate' | 'review' | 'print_queue';
model?: string;
}) => {
const params = new URLSearchParams();