Stacks on PR #25 (feat/printer-approval-20261105); review only the top commit.
What
Archive, not delete: nullable removed_at on printing_printer and printing_device (read-only Removed at on both tables, idempotent ADD COLUMN IF NOT EXISTS).
Remove printers (printingRemoveSelectedPrinters, printer record + multi-select, review step) and PrintingService.removePrinter(deviceId, printerId): sets removed_at, enabled=0, available=0; excluded from printersPage/printers, operator catalog, submissions, claims, device/printer selectors and the PRINTERS frame (pushed again on removal). enablePrinter on a removed printer returns 409. A re-shared queue returns exposed, not approved (logged).
Remove device (printingRemoveDevices, confirmation required): reuses the REVOKE control action, then PrintingService.removeDevice(deviceId) archives the device and its printers; an already revoked device is archived without a new command. Hidden from devices(), selectors, requireDevice. Cannot be restored.
Retention cleanup purges removed printers no job references (by printer_row_id or device+queue) and removed devices with no jobs and no printers, bounded by the batch size, logged.
Native inventory authorization also covers removed rows so a re-shared queue reactivates.
Deviation: QQQ has no table-level default filter, so the Printers / Print devices views document the Removed at is empty filter instead.
Stacks on PR #25 (`feat/printer-approval-20261105`); review only the top commit.
## What
Archive, not delete: nullable `removed_at` on `printing_printer` and `printing_device` (read-only **Removed at** on both tables, idempotent `ADD COLUMN IF NOT EXISTS`).
- **Remove printers** (`printingRemoveSelectedPrinters`, printer record + multi-select, review step) and `PrintingService.removePrinter(deviceId, printerId)`: sets `removed_at`, `enabled=0`, `available=0`; excluded from `printersPage`/`printers`, operator catalog, submissions, claims, device/printer selectors and the `PRINTERS` frame (pushed again on removal). `enablePrinter` on a removed printer returns 409. A re-shared queue returns exposed, not approved (logged).
- **Remove device** (`printingRemoveDevices`, confirmation required): reuses the REVOKE control action, then `PrintingService.removeDevice(deviceId)` archives the device and its printers; an already revoked device is archived without a new command. Hidden from `devices()`, selectors, `requireDevice`. Cannot be restored.
- Retention cleanup purges removed printers no job references (by `printer_row_id` or device+queue) and removed devices with no jobs and no printers, bounded by the batch size, logged.
- Native inventory authorization also covers removed rows so a re-shared queue reactivates.
Deviation: QQQ has no table-level default filter, so the Printers / Print devices views document the **Removed at is empty** filter instead.
## Validation
`.\mvnw.cmd -Pui-demo verify`: 199 tests run, 0 failures, 0 errors, 1 skipped (opt-in workload), 0 Checkstyle violations, BUILD SUCCESS. `check-source-headers.py`: 147 files verified.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Add nullable removed_at to printing_printer and printing_device (read-only
"Removed at" on both tables) through the existing idempotent migration.
Remove printers (printingRemoveSelectedPrinters, record and selection) and
PrintingService.removePrinter set removed_at, clear approval and exposure,
and drop the printer from the operator catalog, submissions, claims, the
device/printer selectors and the PRINTERS frame, which is pushed again. A
removed queue that the device shares again returns exposed but not
approved; approval changes on a removed printer are refused.
Remove device (printingRemoveDevices, confirmation required) revokes access
through the existing REVOKE control, then PrintingService.removeDevice
archives the device and all of its printers; an already revoked device is
archived without a new command. Removed devices leave the device list,
every device selector and all authenticated paths; job history stays.
Retention cleanup hard-deletes removed printers that no job references and
removed devices with no jobs and no printers, bounded by the batch size and
logged. Native inventory authorization still covers removed rows so a
re-shared queue can reactivate.
Tests cover hiding, re-sharing, device removal with history, purge bounds
and process metadata. Docs: README, UI walkthrough, storage and retention,
realtime, changelog (1.1.0).
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Signed-off-by: James Maes <james@kof22.com>
james.maes
merged commit a1ca7201e7 into feat/printer-approval-202611052026-11-05 22:22:24 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Stacks on PR #25 (
feat/printer-approval-20261105); review only the top commit.What
Archive, not delete: nullable
removed_atonprinting_printerandprinting_device(read-only Removed at on both tables, idempotentADD COLUMN IF NOT EXISTS).printingRemoveSelectedPrinters, printer record + multi-select, review step) andPrintingService.removePrinter(deviceId, printerId): setsremoved_at,enabled=0,available=0; excluded fromprintersPage/printers, operator catalog, submissions, claims, device/printer selectors and thePRINTERSframe (pushed again on removal).enablePrinteron a removed printer returns 409. A re-shared queue returns exposed, not approved (logged).printingRemoveDevices, confirmation required): reuses the REVOKE control action, thenPrintingService.removeDevice(deviceId)archives the device and its printers; an already revoked device is archived without a new command. Hidden fromdevices(), selectors,requireDevice. Cannot be restored.printer_row_idor device+queue) and removed devices with no jobs and no printers, bounded by the batch size, logged.Deviation: QQQ has no table-level default filter, so the Printers / Print devices views document the Removed at is empty filter instead.
Validation
.\mvnw.cmd -Pui-demo verify: 199 tests run, 0 failures, 0 errors, 1 skipped (opt-in workload), 0 Checkstyle violations, BUILD SUCCESS.check-source-headers.py: 147 files verified.🤖 Generated with Claude Code