--- 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 `