Files
orderPRO/.paul/phases/53-mobile-status-panel-toggle/53-01-PLAN.md
Jacek Pyziak 775ede52d3 feat(53-mobile-status-panel-toggle): zwijany panel statusow na mobile
Native details/summary toggle — panel zwiniety domyslnie na mobile,
rozwijany kliknieciem. Desktop: zawsze otwarty, bez zmian.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-29 23:32:07 +02:00

206 lines
6.8 KiB
Markdown

---
phase: 53-mobile-status-panel-toggle
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- resources/views/components/order-status-panel.php
- resources/scss/app.scss
- public/assets/css/app.css
autonomous: false
---
<objective>
## Goal
Na mobile (<=768px) panel statusow na stronie listy zamowien powinien byc domyslnie zwinity i rozwijany po kliknieciu w naglowek. Na desktop bez zmian.
## Purpose
Panel statusow zajmuje duzo miejsca na ekranie mobilnym, przesuwajac liste zamowien ponizej fold. Uzytkownik musi scrollowac, zeby zobaczyc zamowienia. Zwiniecie panelu daje natychmiastowy dostep do listy.
## Output
- Panel statusow zamkniety domyslnie na mobile
- Klikniecie w naglowek "Statusy" rozwija/zwija panel
- Strzalka wskazujaca stan (rozwiniety/zwiniety)
- Na desktop panel zawsze widoczny bez zmian
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/STATE.md
## Source Files
@resources/views/components/order-status-panel.php
@resources/scss/app.scss
</context>
<acceptance_criteria>
## AC-1: Panel zwiniety domyslnie na mobile
```gherkin
Given urzadzenie z szerokosc viewportu <= 768px
When strona /orders/list sie laduje
Then panel statusow jest zwiniety (widoczny tylko naglowek "Statusy")
And lista zamowien jest widoczna bez scrollowania
```
## AC-2: Rozwijanie i zwijanie panelu
```gherkin
Given panel statusow na mobile
When uzytkownik klika naglowek "Statusy"
Then panel rozwija sie pokazujac drzewko statusow
And strzalka obraca sie wskazujac stan otwarty
When uzytkownik klika ponownie
Then panel zwija sie do samego naglowka
```
## AC-3: Desktop bez zmian
```gherkin
Given urzadzenie z szerokosc viewportu > 768px
When strona /orders/list sie laduje
Then panel statusow jest zawsze widoczny (jak dotychczas)
And naglowek nie reaguje na klikniecie jako toggle
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Zamiana order-status-panel na details/summary</name>
<files>resources/views/components/order-status-panel.php</files>
<action>
Zamien strukture HTML panelu na natywny element `<details>`:
1. Zamien `<aside class="card order-statuses-side">` na `<details class="card order-statuses-side" id="js-status-panel">`
2. Zamien `<div class="order-statuses-side__title">` na `<summary class="order-statuses-side__title">`
- Dodaj SVG strzalke (chevron down, 14x14) na koncu summary: `<svg class="order-statuses-side__arrow" ...>`
- Zamknij `</summary>` zamiast `</div>`
3. Opakuj cala zawartosc grup statusow (petla foreach) w `<div class="order-statuses-side__body">`
4. Zamknij `</details>` zamiast `</aside>`
Struktura wynikowa:
```
<details class="card order-statuses-side" id="js-status-panel">
<summary class="order-statuses-side__title">
Statusy
<svg class="order-statuses-side__arrow" ...chevron-down.../>
</summary>
<div class="order-statuses-side__body">
...grupy statusow...
</div>
</details>
```
Dodaj na koncu pliku maly blok `<script>` (inline):
- Na mobile (matchMedia 768px) panel domyslnie zamkniety (brak atrybutu open)
- Na desktop: dodaj atrybut `open` i zablokuj zamykanie (preventDefault na summary click)
- Listener na matchMedia change: reset stanu przy resize
Unikaj: zewnetrznych plikow JS, jQuery
</action>
<verify>Otworz /orders/list — panel renderuje sie jako details/summary z poprawna struktura HTML</verify>
<done>AC-1, AC-2, AC-3 satisfied (struktura HTML)</done>
</task>
<task type="auto">
<name>Task 2: SCSS dla toggle panelu statusow</name>
<files>resources/scss/app.scss</files>
<action>
1. Dodaj style do istniejacego bloku `.order-statuses-side`:
`.order-statuses-side__title` (jako summary):
- cursor: pointer na mobile
- display: flex, align-items: center, justify-content: space-between
- list-style: none (usun domyslny marker details)
- &::-webkit-details-marker { display: none }
`.order-statuses-side__arrow`:
- width: 14px, height: 14px
- transition: transform 0.2s ease
- opacity: 0.5
- Ukryj na desktop (display: none)
- Pokaz na mobile (display: block w media query)
`details[open] .order-statuses-side__arrow`:
- transform: rotate(180deg)
`.order-statuses-side__body`:
- Brak dodatkowych stylow (flow domyslny)
2. W media query `@media (max-width: 768px)`:
Dodaj:
```scss
.order-statuses-side__arrow {
display: block;
}
```
Unikaj: zmian w istniejacych stylach desktop panelu
</action>
<verify>Na mobile strzalka widoczna, na desktop ukryta. Klikniecie toggle'uje panel.</verify>
<done>AC-1, AC-2, AC-3 satisfied (style)</done>
</task>
<task type="auto">
<name>Task 3: Build CSS</name>
<files>public/assets/css/app.css</files>
<action>
Skompiluj SCSS do CSS: npx sass resources/scss/app.scss public/assets/css/app.css --no-source-map
</action>
<verify>Nowe klasy (order-statuses-side__arrow, order-statuses-side__body) obecne w wynikowym CSS</verify>
<done>Plik CSS aktualny</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<what-built>Rozwijany/zwijany panel statusow na mobile</what-built>
<how-to-verify>
1. Otworz https://orderpro.projectpro.pl/orders/list (lub lokalnie)
2. Wlacz DevTools > Device Toolbar > 375px
3. Sprawdz: panel statusow zwiniety, widoczny tylko naglowek "Statusy" ze strzalka
4. Kliknij "Statusy" — panel rozwija sie, strzalka obraca sie
5. Kliknij ponownie — panel zwija sie
6. Przelacz na desktop (> 768px) — panel zawsze widoczny, bez strzalki
</how-to-verify>
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- resources/views/orders/list.php (widok glowny nie wymaga zmian)
- resources/views/layouts/app.php (menu mobilne juz gotowe)
- Logika PHP generowania statusPanel (kontroler/repozytorium)
- Inne komponenty uzytkujace order-status-panel (sprawdzic czy jest reuse)
## SCOPE LIMITS
- Tylko panel statusow na mobile — zadne inne elementy listy zamowien
- Nie zmieniaj wygladu poszczegolnych statusow (kolory, badge, hover)
- Nie dodawaj nowych zaleznosci JS
</boundaries>
<verification>
Before declaring plan complete:
- [ ] Panel zwiniety domyslnie na mobile
- [ ] Klik na naglowek rozwija/zwija panel
- [ ] Strzalka obraca sie przy toggle
- [ ] Desktop: panel zawsze widoczny, strzalka ukryta
- [ ] Brak bledow JS w konsoli
- [ ] Inne strony uzywajace panelu statusow dzialaja poprawnie
</verification>
<success_criteria>
- Wszystkie 3 acceptance criteria spelnione
- Panel nie zajmuje miejsca na mobile gdy zwiniety
- Plynna animacja strzalki (CSS transition)
- Zero regresji na desktop
</success_criteria>
<output>
After completion, create `.paul/phases/53-mobile-status-panel-toggle/53-01-SUMMARY.md`
</output>