--- phase: 94-order-preview-popup plan: 01 type: execute wave: 1 depends_on: [] files_modified: - src/Modules/Orders/OrdersController.php - routes/web.php - resources/views/orders/list.php - resources/views/orders/partials/preview-modal.php - resources/scss/app.scss - resources/scss/components/_order-preview-modal.scss - resources/lang/pl.php autonomous: true delegation: off --- ## Goal Dodanie przycisku "Podglad" na liscie zamowien, ktory otwiera popup (modal) ze szczegolami zamowienia. Uzytkownik moze szybko podejrzec dane i skopiowac je do schowka bez wchodzenia w szczegoly. ## Purpose Oszczednosc czasu — sprzedawca nie musi wchodzic na strone szczegolowy zamowienia, zeby skopiowac adres, numer zamowienia, dane kupujacego itp. Jeden klik otwiera podglad z ikonami kopiowania. ## Output - Endpoint AJAX: `GET /api/orders/{id}/preview` zwracajacy HTML fragmentu podgladu - Partial: `resources/views/orders/partials/preview-modal.php` — modal overlay - Przycisk oka w kolumnie `order_ref` kazdego wiersza na liscie - Ikony kopiowania przy kluczowych polach (adres dostawy, kupujacy, nr zamowienia) ## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md ## Source Files @src/Modules/Orders/OrdersController.php @src/Modules/Orders/OrdersRepository.php @resources/views/orders/list.php @resources/views/orders/show.php @resources/views/components/table-list.php @resources/views/orders/partials/email-send-modal.php @routes/web.php @resources/scss/app.scss @resources/lang/pl.php ## AC-1: Przycisk podgladu widoczny na liscie zamowien ```gherkin Given lista zamowien /orders/list jest wyswietlona When uzytkownik widzi wiersz zamowienia Then w kolumnie numeru zamowienia (order_ref) widoczna jest ikona oka (podglad) And ikona ma tooltip "Podglad" ``` ## AC-2: Klikniecie ikony otwiera popup z danymi zamowienia ```gherkin Given lista zamowien jest wyswietlona When uzytkownik klika ikone podgladu przy zamowieniu Then otwiera sie modal overlay z danymi zamowienia zaladowanymi przez AJAX And modal zawiera: dane kupujacego, adres dostawy, produkty, podsumowanie kwot, nr zamowienia And podczas ladowania widoczny jest wskaznik ladowania (spinner/tekst) ``` ## AC-3: Kopiowanie danych do schowka ```gherkin Given popup podgladu zamowienia jest otwarty When uzytkownik klika ikone kopiowania przy polu (np. adres dostawy, imie kupujacego, nr zamowienia) Then tresc pola jest kopiowana do schowka And pojawia sie krotkie potwierdzenie (np. zmiana ikony na checkmark na 1.5s) ``` ## AC-4: Zamykanie popupu ```gherkin Given popup podgladu jest otwarty When uzytkownik klika przycisk X lub tlo (backdrop) lub naciska Escape Then popup sie zamyka ``` ## AC-5: Link do pelnych szczegolow z popupu ```gherkin Given popup podgladu jest otwarty When uzytkownik klika "Pelne szczegoly" w stopce popupu Then zostaje przekierowany na /orders/{id} ``` Task 1: Endpoint AJAX preview + routing src/Modules/Orders/OrdersController.php, routes/web.php 1. W `OrdersController` dodac metode `preview(Request $request): Response`: - Pobierac `id` z request - Wywolac `$this->orders->findDetails($orderId)` (istniejaca metoda) - Jezeli null -> Response::json(['error' => 'Not found'], 404) - Przygotowac dane do widoku: order, items, addresses (customer/delivery/invoice), payments summary - Wyrenderowac partial `orders/partials/preview-content` (sam content, bez modala — modal jest w liscie) - Zwrocic Response::html($html) (fragment HTML, nie pelna strona) 2. W `routes/web.php` dodac route: ```php $router->get('/api/orders/{id}/preview', [$ordersController, 'preview'], [$authMiddleware]); ``` Dodac PO linii z `/api/orders/search`. Metoda `preview()` renderuje partial BEZ layoutu (nie przekazywac layoutu do template->render). Uzyc `$this->template->renderPartial('orders/partials/preview-content', $data)` lub render bez layoutu. Sprawdzic jak dziala renderPartial w Template — jezeli nie istnieje, uzyc `render()` z trzecim parametrem null/pustym. Avoid: NIE zwracac JSON — zwracamy gotowy HTML fragment do wstawienia w modal GET /api/orders/{id}/preview zwraca HTML fragment z danymi zamowienia (nie pelna strone) AC-2 (backend) satisfied — endpoint zwraca HTML podgladu Task 2: Modal partial + przycisk w liscie + JS fetch + kopiowanie resources/views/orders/partials/preview-modal.php, resources/views/orders/list.php, src/Modules/Orders/OrdersController.php **preview-modal.php** — kontener modala (pusty, wypelniany AJAXem): ```php ``` **preview-content partial** (renderowane przez endpoint, wstawiane do #order-preview-body): Nowy plik `resources/views/orders/partials/preview-content.php`: - Sekcja: Kupujacy (imie, email, telefon) — z ikonami kopiowania (data-copy-value) - Sekcja: Nr zamowienia (internal_order_number, external_order_id) — z ikonami kopiowania - Sekcja: Adres dostawy (pelny adres sformatowany w jednej linii) — z ikona kopiowania calego adresu - Sekcja: Produkty — lista (nazwa, qty, cena) — kompaktowa tabela - Sekcja: Podsumowanie (total, oplacono, waluta, typ platnosci) Kazde pole z kopiowaniem: `WARTOSC` Zamiast emoji uzyc SVG inline lub znaku Unicode — np. ikona clipboard (ten sam pattern co Phase 92 buyer name copy). **list.php** — dodac: 1. Na koncu pliku (przed zamykajacym tagiem) dolaczyc partial: `` 2. Dolaczyc skrypt JS (inline lub osobny plik) obslugi: **JS w list.php** (inline `