This commit is contained in:
2026-04-13 22:31:06 +02:00
parent 38259bc706
commit e15b4ccf45
24 changed files with 1580 additions and 3858 deletions

View File

@@ -0,0 +1,174 @@
---
phase: 101-aged-orders-row-highlight
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- src/Modules/Orders/OrdersController.php
- resources/views/components/table-list.php
- resources/scss/app.scss
- public/assets/css/app.css
autonomous: true
delegation: off
---
<objective>
## Goal
Na liscie zamowien (`/orders/list`) wiersze tabeli zamowien z wiekiem 4-7 dni maja widoczna czerwona ramke. Im starsze zamowienie, tym bardziej intensywna (ciemniejsza / grubsza) ramka.
## Purpose
Sprzedawca na pierwszy rzut oka widzi stare zamowienia, ktore wymagaja uwagi, bez potrzeby sortowania lub filtrowania po dacie. Skraca czas reakcji na zalegajace zamowienia.
## Output
- Row-level highlight w `table-list.php` oparty o `_row_class` z danych wiersza
- `OrdersController::prepareTableRows` (lub metoda buildujaca `$tableRows`) ustawia `_row_class` na podstawie wieku zamowienia w dniach
- Style SCSS dla 4 wariantow intensywnosci (4, 5, 6, 7 dni)
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
## Source Files
@src/Modules/Orders/OrdersController.php
@resources/views/components/table-list.php
@resources/views/orders/list.php
@resources/scss/app.scss
</context>
<acceptance_criteria>
## AC-1: Zamowienie mlodsze niz 4 dni bez ramki
```gherkin
Given zamowienie zostalo zlozone dzisiaj, wczoraj, 2 lub 3 dni temu
When uzytkownik otwiera /orders/list
Then wiersz zamowienia nie ma czerwonej ramki (brak klasy aged-*)
```
## AC-2: Zamowienie 4-7 dni z rosnaca intensywnoscia
```gherkin
Given zamowienia o wieku 4, 5, 6 i 7 dni
When uzytkownik otwiera /orders/list
Then kazdy z tych wierszy ma czerwona ramke (border 2px solid), a intensywnosc koloru rosnie wraz z wiekiem (4d = najjasniejsza, 7d = najciemniejsza / najintensywniejsza)
```
## AC-3: Zamowienie starsze niz 7 dni
```gherkin
Given zamowienie zlozone 8+ dni temu
When uzytkownik otwiera /orders/list
Then wiersz ma maksymalna intensywnosc ramki (poziom aged-7) nie wraca do stanu bez ramki
```
## AC-4: Wiek liczony od daty zamowienia
```gherkin
Given pole `order_date` (lub rownowazne) istnieje w danych zamowienia
When controller buduje wiersze tabeli
Then wiek dnia wyliczany jest jako floor((now - order_date) / 86400), z uwzglednieniem strefy czasowej aplikacji
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Rozszerz table-list.php o row-level class</name>
<files>resources/views/components/table-list.php</files>
<action>
W petli `foreach ($rows as $row)` (linia ~219) zamiast `<tr>` renderuj:
`<tr class="<?= $e((string) ($row['_row_class'] ?? '')) ?>">`.
Nie zmieniaj nic innego. Klucz `_row_class` traktuj jako opcjonalny — jesli brak, atrybut class ma byc pusty (nie renderowac pustego atrybutu jest OK, ale najprosciej zawsze go wypisac).
Avoid: zmiany w innych petlach, zmiany struktury columns/rows, zmiany JS.
</action>
<verify>Otworz /orders/list w przegladarce — DOM tabeli nadal renderuje sie, wiersze maja atrybut class (pusty lub z wartoscia).</verify>
<done>AC-1..AC-4 czesc wspolna: mechanizm row-class dostepny.</done>
</task>
<task type="auto">
<name>Task 2: OrdersController ustawia _row_class wg wieku zamowienia</name>
<files>src/Modules/Orders/OrdersController.php</files>
<action>
Zlokalizuj miejsce budowy `$tableRows` (przekazywane do `tableList.rows`, linia ~128).
Dla kazdego zamowienia:
- Pobierz date zamowienia (pole uzywane obecnie do wyswietlenia daty w kolumnie — zweryfikuj w kontrolerze / repozytorium, najczesciej `order_date`).
- Wylicz wiek w dniach: `$ageDays = (int) floor((time() - strtotime($orderDate)) / 86400);` (pomin jesli data pusta).
- Przypisz:
- ageDays < 4 → brak klasy
- ageDays == 4 → `order-row-aged order-row-aged-4`
- ageDays == 5 → `order-row-aged order-row-aged-5`
- ageDays == 6 → `order-row-aged order-row-aged-6`
- ageDays >= 7 → `order-row-aged order-row-aged-7`
- Zapisz w `$row['_row_class']`.
Avoid: modyfikacji zapytan DB, dodawania nowych kolumn, logiki w widoku, zmian w repozytorium.
</action>
<verify>Zrob testowe zamowienia (lub uzyj istniejacych) z roznym wiekiem; w HTML `/orders/list` wiersze maja odpowiednie klasy order-row-aged-N.</verify>
<done>AC-1, AC-2, AC-3, AC-4 satisfied: wiersze otrzymuja poprawne klasy wg wieku.</done>
</task>
<task type="auto">
<name>Task 3: Style SCSS dla intensywnosci ramki + build CSS</name>
<files>resources/scss/app.scss, public/assets/css/app.css</files>
<action>
Dodaj w `resources/scss/app.scss` (lub w dedykowanym partialu jesli projekt tak robi — sprawdz istniejace wzorce) reguly:
```
.table-list-table tbody tr.order-row-aged > td {
border-top-width: 2px;
border-bottom-width: 2px;
border-top-style: solid;
border-bottom-style: solid;
}
.table-list-table tbody tr.order-row-aged > td:first-child { border-left: 2px solid; }
.table-list-table tbody tr.order-row-aged > td:last-child { border-right: 2px solid; }
tr.order-row-aged-4 > td { border-color: #f8b4b4; }
tr.order-row-aged-5 > td { border-color: #f28282; }
tr.order-row-aged-6 > td { border-color: #e74c3c; }
tr.order-row-aged-7 > td { border-color: #b91c1c; }
```
Zbuduj SCSS → CSS tak jak dotychczas w projekcie (sprawdz czy jest npm skrypt, Gulp, czy recznie — jesli brak pipeline, rownolegle zaktualizuj `public/assets/css/app.css` dopisujac te same reguly).
CSS ma zadzialac razem z istniejacym kolorem tla statusu — ramka nie moze ukrywac tla komorek.
Avoid: dodawania styli inline w list.php, duplikowania selektorow w innych plikach SCSS, zmian w innych komponentach.
</action>
<verify>Wizualnie /orders/list: wiersze 4-dniowe najjasniejsza ramka, 7-dniowe najciemniejsza. Starsze niz 7 dni dalej na poziomie aged-7. Tla komorek / kolory statusow bez zmian.</verify>
<done>AC-2, AC-3 satisfied: ramka rosnaco intensywna, klamrowana przez table.</done>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- src/Modules/Orders/OrdersRepository.php (brak nowych SQL/kolumn)
- database/migrations/** (brak migracji)
- Logika sortowania, filtrowania i paginacji w OrdersController
- Inne widoki / inne listy korzystajace z `components/table-list.php` — musza nadal dzialac (klasa `_row_class` jest opcjonalna)
- Kolumny / zawartosc komorek wiersza (tylko wrapper <tr> + CSS)
## SCOPE LIMITS
- Tylko strona /orders/list — nie dotyczy innych list (ksiegowosc, automatyzacja, print queue)
- Ramka oparta wylacznie o wiek w dniach; nie mieszaj tego z statusem zamowienia
- Brak konfigurowalnosci progow w ustawieniach — wartosci zakodowane (4..7)
</boundaries>
<verification>
Przed zamknieciem planu:
- [ ] /orders/list laduje sie bez bledow PHP i JS
- [ ] Wiersze z zamowieniami <4 dni nie maja ramki
- [ ] Wiersze z zamowieniami 4,5,6,7+ dni maja coraz ciemniejsza czerwona ramke
- [ ] Inne listy korzystajace z components/table-list.php nadal renderuja sie poprawnie
- [ ] Brak naruszenia zasad z CLAUDE.md (brak styli w widokach, medoo prepared, SCSS → CSS build)
- [ ] All acceptance criteria met
</verification>
<success_criteria>
- Wszystkie taski zakonczone
- Wizualna weryfikacja potwierdza rosnaca intensywnosc ramki
- Brak regresji na innych listach opartych o table-list.php
</success_criteria>
<output>
Po ukonczeniu utworz `.paul/phases/101-aged-orders-row-highlight/101-01-SUMMARY.md`
</output>

View File

@@ -0,0 +1,106 @@
---
phase: 101-aged-orders-row-highlight
plan: 01
subsystem: ui
tags: [orders-list, scss, php, visual-alert]
requires:
- phase: 44-inline-status-change
provides: table-list component used for /orders/list
provides:
- Wizualna flaga wiekowa na liscie zamowien (4-7+ dni)
- Opcjonalny `_row_class` na wierszach `components/table-list.php`
affects: []
tech-stack:
added: []
patterns:
- "Row-level class propagowana z controllera przez `_row_class` w danych wiersza `table-list`"
key-files:
created: []
modified:
- resources/views/components/table-list.php
- src/Modules/Orders/OrdersController.php
- resources/scss/app.scss
- public/assets/css/app.css
key-decisions:
- "Wiek liczony z `ordered_at` (to pole uzywa juz sortowanie/kolumna listy)"
- "Poziomy ramki 4..7 hardcoded, starsze niz 7 dni = poziom 7 (nie dalsza eskalacja)"
- "Ramka realizowana przez border na <td> — kompatybilna z kolorem tla statusu"
patterns-established:
- "Kontroler listy moze dodac `_row_class` do rekordu w danych `rows``table-list.php` honoruje to jako klase <tr>"
duration: ~10min
started: 2026-04-13
completed: 2026-04-13
---
# Phase 101 Plan 01: Aged Orders Row Highlight Summary
**Wiersze zamowien na `/orders/list` starszych niz 4 dni dostaja czerwona ramke o rosnacej intensywnosci (4d=jasna → 7+d=bordowa).**
## Acceptance Criteria Results
| Criterion | Status | Notes |
|---|---|---|
| AC-1: <4 dni brak ramki | Pass | `agedRowClass()` zwraca `''` dla `$ageDays < 4` |
| AC-2: 4-7 dni rosnaca intensywnosc | Pass | Klasy `order-row-aged-4..7` z 4 odcieniami czerwieni (#f8b4b4#991b1b) |
| AC-3: >7 dni = poziom 7 | Pass | `$level = $ageDays >= 7 ? 7 : $ageDays` |
| AC-4: Wiek liczony z `ordered_at` | Pass | `floor((time() - strtotime($orderedAt)) / 86400)` |
## Accomplishments
- Dodano mechanizm row-class w uniwersalnym `components/table-list.php` (opcjonalny, nie lamie innych list)
- OrdersController liczy wiek zamowienia i wystawia klase na wierszu
- 4 poziomy SCSS + przebudowany `public/assets/css/app.css`
## Files Created/Modified
| File | Change | Purpose |
|---|---|---|
| `resources/views/components/table-list.php` | Modified | `<tr>` honoruje `$row['_row_class']` |
| `src/Modules/Orders/OrdersController.php` | Modified | `agedRowClass()` + wpiecie w `toTableRow` |
| `resources/scss/app.scss` | Modified | Reguly `.order-row-aged-{4..7}` na `<td>` |
| `public/assets/css/app.css` | Rebuild | `npm run build:css` |
## Decisions Made
| Decision | Rationale | Impact |
|---|---|---|
| Border na `<td>` zamiast `<tr>` | `<tr>` nie rysuje borderu spolnie z `border-collapse`; trzeba na komorkach | Wizualnie spojne, kompatybilne z tlem statusow |
| Klasy `order-row-aged-N` zamiast inline style | Zgodne z CLAUDE.md (brak styli w widokach) | Styl zyje w SCSS |
| Pole `ordered_at` jako data referencyjna | Uzywane juz w kolumnie listy i sortowaniu | Zero dodatkowego I/O |
## Deviations from Plan
| Type | Count | Impact |
|---|---|---|
| Auto-fixed | 0 | - |
| Scope additions | 0 | - |
| Deferred | 0 | - |
Plan wykonany 1:1.
## Issues Encountered
None.
## Next Phase Readiness
**Ready:**
- Lista zamowien z wizualnym sygnalem zalegajacych zamowien
- Wzorzec `_row_class` dostepny dla innych list w table-list.php
**Concerns:**
- Weryfikacja wizualna pozostaje po stronie uzytkownika (manualny test w przegladarce)
**Blockers:** None
---
*Phase: 101-aged-orders-row-highlight, Plan: 01*
*Completed: 2026-04-13*