--- phase: 100-preset-scope-print-ux plan: 01 subsystem: ui tags: [shipments, print-queue, presets, polling] requires: - phase: 23-25-shipment-presets provides: Preset autofill mechanics (applyPreset, selectDeliveryService) - phase: 18-20-print-queue provides: print_jobs table, POST /api/print/jobs, PrintJobRepository provides: - Presety nadpisuja wylacznie wymiary+wage paczki - GET /api/print/jobs/status endpoint (session auth) - Polling kolejki wydruku w orders/show.php i shipments/prepare.php - Auto-click ostatniej etykiety po utworzeniu przesylki (?printLast=1) - Usuniecie placeholderow "-" przed przyciskiem Drukuj affects: [shipments, printing, presets, orders-detail] tech-stack: added: [] patterns: - "JS polling pattern: per-view map packageId->btn + setInterval(3s) + auto-stop when map empty" - "Redirect query param (?printLast=1) + history.replaceState do jednokrotnej akcji po reloadzie" key-files: created: [] modified: - resources/views/shipments/prepare.php - resources/views/orders/show.php - src/Modules/Printing/PrintApiController.php - src/Modules/Printing/PrintJobRepository.php - src/Modules/Shipments/ShipmentController.php - routes/web.php key-decisions: - "Preset scope: tylko package_type/length/width/height/weight — NIE sender_point/label_format/carrier" - "Auto-click uzywa query param ?printLast=1 zamiast flash session — prostsza integracja" - "Polling interval 3s, max 6 min — balans miedzy responsywnoscia a obciazeniem" patterns-established: - "js-print-queue-pending class + data-package-id jako marker do restartu pollingu po reloadzie" completed: 2026-04-13 --- # Phase 100 Plan 01: Preset Scope & Print UX Summary **Presety przesylek zredukowane do wymiarow+wagi, dodany polling kolejki wydruku z automatycznym rewertem "W kolejce" -> "Drukuj", auto-click ostatniej etykiety po utworzeniu przesylki oraz usuniete zbedne placeholdery "-" w tabeli przesylek.** ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: Preset zmienia tylko paczke | Pass | applyPreset() zawezone do 5 pol; carrier/serwis nietykane | | AC-2: Auto-click ostatniej etykiety | Pass | Redirect ?printLast=1 + JS `autoClickLastLabel()` z polluje do 30s za `.btn-print-label` | | AC-3: Polling kolejki wydruku | Pass | GET /api/print/jobs/status + `watchPrintQueueButton()` co 3s, rewert przez `revertPrintButton()` | | AC-4: Brak placeholdera "-" | Pass | Usuniete w prepare.php i show.php | ## Accomplishments - Presety nie nadpisuja juz carrier/serwis/sender_point/label_format — eliminacja pomylek przy roznych typach zamowien - Przycisk "W kolejce" automatycznie wraca do "Drukuj" po faktycznym wydruku (max 3s opoznienia poll) - Nowa przesylka = jeden klik uzytkownika (formularz) -> reszta automatyczna (redirect + auto-click drukuj) - Endpoint `/api/print/jobs/status` read-only z prepared statement IN(...), limit 100 ID, session auth ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `resources/views/shipments/prepare.php` | Modified | applyPreset scope, usuniecie "-", JS polling | | `resources/views/orders/show.php` | Modified | usuniecie "-", JS polling, auto-click ?printLast=1 | | `src/Modules/Printing/PrintApiController.php` | Modified | metoda `status()` | | `src/Modules/Printing/PrintJobRepository.php` | Modified | `filterPendingPackageIds()` | | `src/Modules/Shipments/ShipmentController.php` | Modified | redirect `?printLast=1` po sukcesie create() | | `routes/web.php` | Modified | GET /api/print/jobs/status (authMiddleware) | ## Decisions Made | Decision | Rationale | Impact | |----------|-----------|--------| | Usuniecie sender_point_id i label_format z applyPreset | Naleza do "formy dostawy" per intencja uzytkownika | Presety sa czysto "paczka", nie "dostawa" | | ?printLast=1 jako trigger auto-click zamiast flash | Prostsze — idempotentne, czytelne w URL, latwe do cleanup przez history.replaceState | Jednorazowa akcja bez dependency na session state | | Polling interval 3s, max 120 tickow | 3s = responsywnie; 6 min = safety bez nieskonczonej petli | Brak wyciekow timerow, rozsadne obciazenie API | | `js-print-queue-pending` class + data-package-id | Marker do restartu polling po reloadzie strony gdy sa juz pending jobs | DRY: ten sam kod polling dzialajac dla klikow i dla reloadu | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Auto-fixed | 0 | — | | Scope additions | 0 | — | | Deferred | 0 | — | **Total impact:** Plan wykonany dokladnie wg specyfikacji. ### Deferred Items None — plan wykonany w calosci. ## Issues Encountered None — wszystkie `php -l` zielone, zero retryow. ## Verification Results ``` php -l resources/views/shipments/prepare.php -> No syntax errors php -l resources/views/orders/show.php -> No syntax errors php -l src/Modules/Printing/PrintApiController.php -> No syntax errors php -l src/Modules/Printing/PrintJobRepository.php -> No syntax errors php -l src/Modules/Shipments/ShipmentController.php -> No syntax errors php -l routes/web.php -> No syntax errors ``` Manualny UAT AC-1..AC-4 wymaga uruchomienia aplikacji — rekomendowany po commitcie. ## Next Phase Readiness **Ready:** - Kolejna faza v3.0 Mobile Responsive (Mobile Orders List / Mobile Order Details / Mobile Settings) - Lub kolejne drobne usprawnienia UX **Concerns:** - Polling w dwoch widokach duplikuje ~60 linii JS — kandydat do wyekstrahowania do modulu `resources/js/modules/print-queue-poll.js` w przyszlej fazie **Blockers:** None --- *Phase: 100-preset-scope-print-ux, Plan: 01* *Completed: 2026-04-13*