---
phase: 44-inline-status-change
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- src/Modules/Orders/OrdersController.php
- resources/views/orders/list.php
- resources/scss/modules/_orders.scss
- resources/js/modules/inline-status-change.js
- public/assets/css/modules/orders.css
- public/assets/js/modules/inline-status-change.js
autonomous: true
---
## Goal
Dodać szybką zmianę statusu zamówienia bezpośrednio z listy zamówień — kliknięcie w badge statusu otwiera dropdown z dostępnymi statusami, wybór zmienia status przez AJAX bez przeładowania strony.
## Purpose
Operator nie musi wchodzić w szczegóły zamówienia aby zmienić status — oszczędność czasu przy obsłudze wielu zamówień.
## Output
- Zmodyfikowany kontroler z obsługą AJAX w `updateStatus()`
- Dropdown statusów w kolumnie statusu na liście zamówień
- JS moduł do inline zmiany statusu
- Style SCSS dla dropdowna
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
## Source Files
@src/Modules/Orders/OrdersController.php — metody: index(), updateStatus(), toTableRow(), statusBadge(), buildAllStatusOptions(), statusColorMap()
@resources/views/orders/list.php — widok listy zamówień
@resources/views/components/table-list.php — komponent tabeli (kolumna status_badges jest raw HTML)
@routes/web.php — POST /orders/{id}/status endpoint (linia 337)
## Required Skills (from SPECIAL-FLOWS.md)
| Skill | Priority | When to Invoke | Loaded? |
|-------|----------|----------------|---------|
| sonar-scanner | required | Po APPLY, przed UNIFY | ○ |
**BLOCKING:** Required skills MUST be loaded before APPLY proceeds.
## Skill Invocation Checklist
- [ ] sonar-scanner loaded (run command or confirm)
## AC-1: Dropdown statusów pojawia się po kliknięciu badge
```gherkin
Given lista zamówień wyświetla zamówienia z badge'ami statusów
When operator kliknie w badge statusu zamówienia
Then pojawia się dropdown z listą wszystkich dostępnych statusów pogrupowanych wg grup statusowych
And aktualny status jest wyróżniony w dropdown
And kliknięcie poza dropdown zamyka go
```
## AC-2: Zmiana statusu przez AJAX
```gherkin
Given dropdown statusów jest otwarty przy zamówieniu
When operator wybierze nowy status z listy
Then wysyłany jest request AJAX POST /orders/{id}/status z new_status i _token
And badge statusu zamienia się na nowy (z prawidłowym kolorem i etykietą)
And dropdown zamyka się automatycznie
And nie następuje przeładowanie strony
```
## AC-3: Obsługa błędów AJAX
```gherkin
Given operator wybiera nowy status z dropdown
When request AJAX zwróci błąd (CSRF expired, order not found, server error)
Then wyświetla się komunikat błędu przez OrderProAlerts
And badge wraca do poprzedniego stanu
And dropdown zamyka się
```
Task 1: Rozszerzenie updateStatus() o tryb AJAX + przekazanie danych statusów do widoku listy
src/Modules/Orders/OrdersController.php
1. W metodzie `updateStatus()` — wykryj request AJAX przez nagłówek `X-Requested-With: XMLHttpRequest`:
- Jeśli AJAX: zwróć `Response::json(...)` z kluczami: `success`, `status_code`, `status_label`, `status_color` (kolor hex z grupy)
- Jeśli nie-AJAX: zachowaj obecne zachowanie (redirect)
- Przy błędach AJAX: zwróć JSON z `success: false` i `error` message
2. W metodzie `index()` — przekaż `allStatuses` (z `buildAllStatusOptions()`) i `statusColorMap` do widoku, aby JS miał dane do budowy dropdown
3. W metodzie `toTableRow()` — dodaj do HTML badge `data-order-id` i `data-current-status` atrybuty, aby JS mógł zidentyfikować zamówienie i aktualny status
Unikaj: Zmiany zachowania dla nie-AJAX requestów; dodawania nowych zależności
- `curl -X POST /orders/1/status -H "X-Requested-With: XMLHttpRequest" -d "new_status=shipped&_token=..." ` zwraca JSON
- Standardowy POST nadal zwraca redirect
AC-2 i AC-3 satisfied: endpoint zwraca JSON dla AJAX, zachowuje redirect dla form submit
Task 2: Dropdown UI + JavaScript moduł inline zmiany statusu + style SCSS
resources/views/orders/list.php, resources/scss/modules/_orders.scss, resources/js/modules/inline-status-change.js, public/assets/js/modules/inline-status-change.js, public/assets/css/modules/orders.css
1. W `resources/views/orders/list.php`:
- Dodaj `