---
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 podgladuTask 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
Podglad zamowienia
Ladowanie...
```
**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 `