fix(143): polish orders list and sidebar first paint

Phase 143 complete:

- remove orders list intro card

- apply persisted collapsed sidebar state before CSS first paint

- update PAUL and technical docs
This commit is contained in:
2026-05-18 11:52:20 +02:00
parent 2f89901ebf
commit d23dec8704
12 changed files with 363 additions and 36 deletions

View File

@@ -13,8 +13,8 @@ Sprzedawca moĹĽe obsĹugiwać zamĂłwienia ze wszystkich kanaĹĂłw
| Attribute | Value | | Attribute | Value |
|-----------|-------| |-----------|-------|
| Version | 3.9.0-dev | | Version | 3.9.0-dev |
| Status | v3.11 Polkurier shipment prepare hotfix complete - Phase 142 closed | | Status | v3.12 Orders List Sidebar UI Hotfix complete - Phase 143 closed |
| Last Updated | 2026-05-18 (Phase 142 unified) | | Last Updated | 2026-05-18 (Phase 143 unified) |
## Requirements ## Requirements
@@ -142,6 +142,7 @@ Sprzedawca moĹĽe obsĹugiwać zamĂłwienia ze wszystkich kanaĹĂłw
- [x] shopPRO Polkurier Delivery Mapping: zakladka `Dostawy` integracji shopPRO pozwala mapowac forme dostawy na Polkurier, laduje uslugi z `PolkurierShipmentService::getDeliveryServices()` i zapisuje `provider='polkurier'` w `carrier_delivery_method_mappings` bez migracji DB — Phase 140 - [x] shopPRO Polkurier Delivery Mapping: zakladka `Dostawy` integracji shopPRO pozwala mapowac forme dostawy na Polkurier, laduje uslugi z `PolkurierShipmentService::getDeliveryServices()` i zapisuje `provider='polkurier'` w `carrier_delivery_method_mappings` bez migracji DB — Phase 140
- [x] Integrations Hub Grouped Sections: `/settings/integrations` pokazuje lekkie sekcje dla marketplace, kurierow i pozostalych integracji, bez starego naglowka/opisu wspolnego panelu — Phase 141 - [x] Integrations Hub Grouped Sections: `/settings/integrations` pokazuje lekkie sekcje dla marketplace, kurierow i pozostalych integracji, bez starego naglowka/opisu wspolnego panelu — Phase 141
- [x] Polkurier Shipment Prepare Prefill: `/orders/{id}/shipment/prepare` rozpoznaje mapowania shopPRO z `provider='polkurier'`, preselectuje przewoznika i usluge oraz nie fallbackuje do Allegro — Phase 142 - [x] Polkurier Shipment Prepare Prefill: `/orders/{id}/shipment/prepare` rozpoznaje mapowania shopPRO z `provider='polkurier'`, preselectuje przewoznika i usluge oraz nie fallbackuje do Allegro — Phase 142
- [x] Orders List Sidebar UI Hotfix: `/orders/list` startuje bez opisowego boksu "Zamowienia", a zapisany zwiniety sidebar jest stosowany przed pierwszym renderem strony — Phase 143
- [x] Integracja polkurier.pl (fundament): pojedyncza globalna konfiguracja w `/settings/integrations/polkurier`, szyfrowany Token API + login, karta w hubie integracji obok Apaczki i realny test polaczenia przez `apimetod=test_auth_api` zweryfikowany na zywym koncie operatora; `ShipmentProviderRegistry` netkniety — `PolkurierShipmentService/TrackingService` w kolejnych fazach — Phase 127 - [x] Integracja polkurier.pl (fundament): pojedyncza globalna konfiguracja w `/settings/integrations/polkurier`, szyfrowany Token API + login, karta w hubie integracji obok Apaczki i realny test polaczenia przez `apimetod=test_auth_api` zweryfikowany na zywym koncie operatora; `ShipmentProviderRegistry` netkniety — `PolkurierShipmentService/TrackingService` w kolejnych fazach — Phase 127
- [x] polkurier ShipmentService + TrackingService + UI prepare panel: pelen kontrakt API (createShipment/getLabel/getStatus/cancelOrder/getAvailableCarriers), `PolkurierShipmentService` implementujacy `ShipmentProviderInterface` z normalizacja shipmenttype (lowercase) i splitem ulicy na street/housenumber/flatnumber, `PolkurierTrackingService` mapujacy statusy O/P/A/WP/D/Z/W na znormalizowane, panel "polkurier" w `prepare.php` z dynamiczna lista uslug z `available_carriers`, seed migracja `delivery_status_mappings(provider='polkurier')` z 7 wpisami z PDF v1.11; live test na #114/#115 zakonczony sukcesem po 4 iteracjach (ReferenceError → uppercase shipmenttype → orderno parsing → A4/A6); rozmiar etykiety sterowany w panelu klienta polkurier.pl (Ustawienia konta → Preferencje etykiet), NIE przez API — Phase 128 - [x] polkurier ShipmentService + TrackingService + UI prepare panel: pelen kontrakt API (createShipment/getLabel/getStatus/cancelOrder/getAvailableCarriers), `PolkurierShipmentService` implementujacy `ShipmentProviderInterface` z normalizacja shipmenttype (lowercase) i splitem ulicy na street/housenumber/flatnumber, `PolkurierTrackingService` mapujacy statusy O/P/A/WP/D/Z/W na znormalizowane, panel "polkurier" w `prepare.php` z dynamiczna lista uslug z `available_carriers`, seed migracja `delivery_status_mappings(provider='polkurier')` z 7 wpisami z PDF v1.11; live test na #114/#115 zakonczony sukcesem po 4 iteracjach (ReferenceError → uppercase shipmenttype → orderno parsing → A4/A6); rozmiar etykiety sterowany w panelu klienta polkurier.pl (Ustawienia konta → Preferencje etykiet), NIE przez API — Phase 128
- [x] Order User Notes module (Phase 129): pelen CRUD notatek autorskich operatora per zamowienie. Reuse `order_notes` przez nowy `note_type='user'` z `user_id` (FK→users SET NULL) + `author_name` (snapshot) + indeks `idx_order_notes_type_order`. `OrderNotesService` z autoryzacja DB-level (`WHERE user_id = :user_id`, rowCount=0 ⇒ 403). Sekcja `#notes` w "Wiadomosci i zalaczniki" w `/orders/{id}` z inline edit form + delete przez `OrderProAlerts.confirm`. Badge `[N]` (indigo neutralny) przy nr zamowienia na `/orders/list` (subquery `user_notes_count` w paginate). Brak admin override (brak systemu rol w aplikacji) — edit/delete tylko dla autora — Phase 129 - [x] Order User Notes module (Phase 129): pelen CRUD notatek autorskich operatora per zamowienie. Reuse `order_notes` przez nowy `note_type='user'` z `user_id` (FK→users SET NULL) + `author_name` (snapshot) + indeks `idx_order_notes_type_order`. `OrderNotesService` z autoryzacja DB-level (`WHERE user_id = :user_id`, rowCount=0 ⇒ 403). Sekcja `#notes` w "Wiadomosci i zalaczniki" w `/orders/{id}` z inline edit form + delete przez `OrderProAlerts.confirm`. Badge `[N]` (indigo neutralny) przy nr zamowienia na `/orders/list` (subquery `user_notes_count` w paginate). Brak admin override (brak systemu rol w aplikacji) — edit/delete tylko dla autora — Phase 129
@@ -324,6 +325,6 @@ Quick Reference:
--- ---
*PROJECT.md — Updated when requirements or context change* *PROJECT.md — Updated when requirements or context change*
*Last updated: 2026-05-18 after Phase 142 closure* *Last updated: 2026-05-18 after Phase 143 closure*

View File

@@ -6,6 +6,23 @@ orderPRO to narzedzie do wielokanalowego zarzadzania sprzedaza. Projekt przechod
## Current Milestone ## Current Milestone
v3.12 Orders List Sidebar UI Hotfix - Complete
Maly hotfix UX dla ekranu operacyjnego: usuniecie opisowego boksu z listy zamowien oraz likwidacja widocznego "pokaz i schowaj" przy odswiezaniu strony ze zwinietym sidebarem.
Progress: 1 of 1 phases complete (100%).
| Phase | Name | Plans | Status |
|-------|------|-------|--------|
| 143 | Orders List Sidebar UI Hotfix | 1/1 | Complete (2026-05-18; manual UI/Sonar follow-up pending) |
### Phase 143: Orders List Sidebar UI Hotfix
Focus: Usunac boks "Zamowienia / Kompaktowa lista zamowien oparta o lokalna baze orderPRO." z `/orders/list` i zastosowac zapisany stan zwinietego sidebaru przed pierwszym renderem strony.
Plans: 143-01 (complete; `.paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-SUMMARY.md`)
## Previous Milestone
v3.11 Polkurier Shipment Prepare Hotfix - Complete v3.11 Polkurier Shipment Prepare Hotfix - Complete
Pilny hotfix po Phase 140: mapowanie shopPRO -> Polkurier zapisuje sie poprawnie, ale formularz `/orders/{id}/shipment/prepare` nie podstawia providera i uslugi Polkuriera. Pilny hotfix po Phase 140: mapowanie shopPRO -> Polkurier zapisuje sie poprawnie, ale formularz `/orders/{id}/shipment/prepare` nie podstawia providera i uslugi Polkuriera.
@@ -21,7 +38,7 @@ Progress: 1 of 1 phases complete (100%).
Focus: Naprawic preselect w formularzu przygotowania przesylki, aby `carrier_delivery_method_mappings.provider='polkurier'` wybieral przewoznika Polkurier, zaznaczal zapisana usluge i ustawial hidden fields wymagane przez `PolkurierShipmentService`. Focus: Naprawic preselect w formularzu przygotowania przesylki, aby `carrier_delivery_method_mappings.provider='polkurier'` wybieral przewoznika Polkurier, zaznaczal zapisana usluge i ustawial hidden fields wymagane przez `PolkurierShipmentService`.
Plans: 142-01 (complete; `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-SUMMARY.md`) Plans: 142-01 (complete; `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-SUMMARY.md`)
## Previous Milestone ## Earlier Milestone
v3.10 Integrations UI Polish - Complete v3.10 Integrations UI Polish - Complete
@@ -653,4 +670,4 @@ Archive: `.paul/milestones/v0.1-ROADMAP.md`
--- ---
*Roadmap created: 2026-03-12* *Roadmap created: 2026-03-12*
*Last updated: 2026-05-18 - Phase 141 complete; v3.10 Integrations UI Polish complete* *Last updated: 2026-05-18 - Phase 143 complete; v3.12 Orders List Sidebar UI Hotfix complete*

View File

@@ -5,19 +5,19 @@
See: .paul/PROJECT.md (updated 2026-05-18) See: .paul/PROJECT.md (updated 2026-05-18)
**Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami. **Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami.
**Current focus:** v3.11 Polkurier Shipment Prepare Hotfix complete; Phase 142 unified. **Current focus:** v3.12 Orders List Sidebar UI Hotfix complete; Phase 143 unified.
## Current Position ## Current Position
Milestone: v3.11 Polkurier Shipment Prepare Hotfix Milestone: v3.12 Orders List Sidebar UI Hotfix
Phase: 142 of 142 (Polkurier Shipment Prepare Prefill) - Complete Phase: 143 of 143 (Orders List Sidebar UI Hotfix) - Complete
Plan: 142-01 complete Plan: 143-01 complete
Status: Milestone complete, ready for next milestone or release decision Status: Milestone complete, ready for next milestone or release decision
Last activity: 2026-05-18 10:34 - Unified .paul/phases/142-polkurier-shipment-prepare-prefill/142-01-PLAN.md Last activity: 2026-05-18 11:50 - Unified .paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-PLAN.md
Progress: Progress:
- Milestone v3.11: [##########] 100% (1 of 1 phases complete) - Milestone v3.12: [##########] 100% (1 of 1 phases complete)
- Phase 142: [##########] 100% (complete) - Phase 143: [##########] 100% (complete)
## Loop Position ## Loop Position
@@ -29,19 +29,19 @@ PLAN -> APPLY -> UNIFY
## Session Continuity ## Session Continuity
Last session: 2026-05-18 10:34 Last session: 2026-05-18 11:50
Stopped at: Phase 142 complete; v3.11 milestone complete Stopped at: Phase 143 complete; v3.12 milestone complete
Next action: Run $paul-complete-milestone or start next milestone planning Next action: Run $paul-complete-milestone or start next milestone planning
Resume file: .paul/phases/142-polkurier-shipment-prepare-prefill/142-01-SUMMARY.md Resume file: .paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-SUMMARY.md
## Pending parallel work ## Pending parallel work
- None — Phase 118, 121, 122 wszystkie zacommitowane (8f14851, 360eef1). - None — Phase 118, 121, 122 wszystkie zacommitowane (8f14851, 360eef1).
## Git State ## Git State
Last commit: HEAD fix(142): preselect polkurier shipment mapping Last commit: HEAD fix(143): polish orders list and sidebar first paint
Last phase commit: HEAD fix(142): preselect polkurier shipment mapping Last phase commit: HEAD fix(143): polish orders list and sidebar first paint
Previous: feat(141): group integrations hub sections Previous: fix(142): preselect polkurier shipment mapping
Branch: main Branch: main
### Skill Audit (Phase 139) ### Skill Audit (Phase 139)
@@ -69,6 +69,12 @@ Branch: main
|----------|---------|-------| |----------|---------|-------|
| `sonar-scanner` | gap documented | Attempted after APPLY with `sonar-scanner --version`; CLI is not available in PATH. | | `sonar-scanner` | gap documented | Attempted after APPLY with `sonar-scanner --version`; CLI is not available in PATH. |
### Skill Audit (Phase 143)
| Expected | Invoked | Notes |
|----------|---------|-------|
| `sonar-scanner` | gap documented | Attempted after APPLY with `sonar-scanner --version`; CLI is not available in PATH. |
### Skill Audit (Phase 129) ### Skill Audit (Phase 129)
| Expected | Invoked | Notes | | Expected | Invoked | Notes |
@@ -142,6 +148,7 @@ Branch: main
- Phase 139-01 fresh scan found 648 OPEN BLOCKER/CRITICAL/MAJOR issues; final scan after cleanup found 605. Delivery status target files are clean; `OrdersStatisticsRepository` still needs a class split for `php:S1448`. - Phase 139-01 fresh scan found 648 OPEN BLOCKER/CRITICAL/MAJOR issues; final scan after cleanup found 605. Delivery status target files are clean; `OrdersStatisticsRepository` still needs a class split for `php:S1448`.
- Phase 139-02 final scan found 495 OPEN BLOCKER/CRITICAL/MAJOR issues. `php:S4833` dropped to 3 and selected `php:S112` generic exception clusters were replaced with typed exceptions. - Phase 139-02 final scan found 495 OPEN BLOCKER/CRITICAL/MAJOR issues. `php:S4833` dropped to 3 and selected `php:S112` generic exception clusters were replaced with typed exceptions.
- Phase 141 grouped `/settings/integrations` into presentation-only sections: marketplace, couriers and other. Provider row contracts, routes and settings pages remain unchanged. - Phase 141 grouped `/settings/integrations` into presentation-only sections: marketplace, couriers and other. Provider row contracts, routes and settings pages remain unchanged.
- Phase 143 removed the descriptive intro card from `/orders/list` and added desktop sidebar pre-hydration through `html.has-collapsed-sidebar` so saved collapsed state applies before first paint.
### Blockers / Concerns ### Blockers / Concerns
@@ -153,6 +160,7 @@ Branch: main
- Phase 139 APPLY: local PATH still does not contain `sonar-scanner`, but the official Windows x64 scanner was downloaded to `%TEMP%` and used successfully. `vendor/bin/phpunit` remains unavailable because `vendor/` is missing and Composer is not installed in PATH. - Phase 139 APPLY: local PATH still does not contain `sonar-scanner`, but the official Windows x64 scanner was downloaded to `%TEMP%` and used successfully. `vendor/bin/phpunit` remains unavailable because `vendor/` is missing and Composer is not installed in PATH.
- Phase 140 APPLY: manual UI smoke was not run because local app/DB session was not started; Sonar scan could not run because `sonar-scanner` is unavailable. - Phase 140 APPLY: manual UI smoke was not run because local app/DB session was not started; Sonar scan could not run because `sonar-scanner` is unavailable.
- Phase 141 APPLY: manual UI smoke was not run because local app/browser session was not started; Sonar scan could not run because `sonar-scanner` is unavailable. - Phase 141 APPLY: manual UI smoke was not run because local app/browser session was not started; Sonar scan could not run because `sonar-scanner` is unavailable.
- Phase 143 APPLY: manual UI smoke was not run because local app/browser session was not started; Sonar scan could not run because `sonar-scanner` is unavailable.
- Obsolete Phase 140+ debt plans were removed from the active roadmap on 2026-05-18 by operator decision; performance/debt items can be reintroduced later only if still relevant. - Obsolete Phase 140+ debt plans were removed from the active roadmap on 2026-05-18 by operator decision; performance/debt items can be reintroduced later only if still relevant.
### Deferred Issues ### Deferred Issues
@@ -171,6 +179,9 @@ Branch: main
- Phase 142 follow-up: manual smoke `/orders/1164/shipment/prepare` -> potwierdz, ze mapowanie shopPRO -> Polkurier preselectuje przewoznika i usluge. - Phase 142 follow-up: manual smoke `/orders/1164/shipment/prepare` -> potwierdz, ze mapowanie shopPRO -> Polkurier preselectuje przewoznika i usluge.
- Phase 142 follow-up: `composer install` / przywroc `vendor/`, potem uruchom `vendor/bin/phpunit tests/Unit/ShipmentPreparePolkurierMappingTest.php`. - Phase 142 follow-up: `composer install` / przywroc `vendor/`, potem uruchom `vendor/bin/phpunit tests/Unit/ShipmentPreparePolkurierMappingTest.php`.
- Phase 142 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback. - Phase 142 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback.
- Phase 143 follow-up: manual smoke `/orders/list` -> potwierdz brak boksu "Zamowienia / Kompaktowa lista..." oraz status panel/table layout.
- Phase 143 follow-up: manual smoke desktop sidebar -> ustaw `localStorage.sidebarCollapsed='1'`, odswiez strone i potwierdz brak widocznego expanded-to-collapsed flash.
- Phase 143 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback.
- Phase 138 manual smoke: test a real SMTP SSL/STARTTLS mailbox in strict mode; test invalid and valid e-mail/SMS template saves in UI. - Phase 138 manual smoke: test a real SMTP SSL/STARTTLS mailbox in strict mode; test invalid and valid e-mail/SMS template saves in UI.
- Manualne testy AC-1..AC-7 dla Phase 112 na zywej bazie (XAMPP online). - Manualne testy AC-1..AC-7 dla Phase 112 na zywej bazie (XAMPP online).
- Backfill zamowienia #882 - operator robi recznie po wdrozeniu (poza zakresem planu). - Backfill zamowienia #882 - operator robi recznie po wdrozeniu (poza zakresem planu).

View File

@@ -16,6 +16,10 @@
- Formularz przygotowania przesylki rozpoznaje `provider='polkurier'`, pokazuje panel Polkuriera i zaznacza zapisana usluge. - Formularz przygotowania przesylki rozpoznaje `provider='polkurier'`, pokazuje panel Polkuriera i zaznacza zapisana usluge.
- Dodano test regresyjny renderowania widoku dla mapowania Polkuriera. - Dodano test regresyjny renderowania widoku dla mapowania Polkuriera.
- Gap: PHPUnit i SonarQube scan Phase 142 pozostaja do wykonania po przywroceniu `vendor/` i `sonar-scanner`. - Gap: PHPUnit i SonarQube scan Phase 142 pozostaja do wykonania po przywroceniu `vendor/` i `sonar-scanner`.
- [Phase 143, Plan 01] Usunieto opisowy boks "Zamowienia / Kompaktowa lista..." z `/orders/list`.
- Dodano pre-hydration klasy `html.has-collapsed-sidebar`, aby zapisany zwiniety sidebar byl schowany od pierwszego renderu.
- Zachowano runtime toggle sidebaru i mobilne slide-in menu; pre-hydration compact state jest ograniczony do desktopu.
- Gap: manualny smoke UI i SonarQube scan Phase 143 pozostaja do wykonania po uruchomieniu app/browser session i przywroceniu `sonar-scanner`.
## Zmienione pliki ## Zmienione pliki
@@ -39,5 +43,11 @@
- `.paul/phases/141-integrations-hub-grouped-sections/141-01-SUMMARY.md` - `.paul/phases/141-integrations-hub-grouped-sections/141-01-SUMMARY.md`
- `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-PLAN.md` - `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-PLAN.md`
- `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-SUMMARY.md` - `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-SUMMARY.md`
- `.paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-PLAN.md`
- `.paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-SUMMARY.md`
- `resources/views/layouts/app.php`
- `resources/views/orders/list.php`
- `resources/views/shipments/prepare.php` - `resources/views/shipments/prepare.php`
- `resources/scss/app.scss`
- `public/assets/css/app.css`
- `tests/Unit/ShipmentPreparePolkurierMappingTest.php` - `tests/Unit/ShipmentPreparePolkurierMappingTest.php`

View File

@@ -0,0 +1,160 @@
---
phase: 143-orders-list-sidebar-ui-hotfix
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- resources/views/orders/list.php
- resources/views/layouts/app.php
- resources/scss/app.scss
- public/assets/css/app.css
- DOCS/ARCHITECTURE.md
- DOCS/TECH_CHANGELOG.md
autonomous: true
delegation: off
---
<objective>
## Goal
Usunac niepotrzebny boks naglowka z `/orders/list` oraz wyeliminowac migotanie zwijanego sidebaru po odswiezeniu strony.
## Purpose
Lista zamowien jest glownym ekranem operacyjnym, wiec powinna startowac od danych i filtrow bez dodatkowego opisu. Sidebar ma respektowac zapamietany stan juz przy pierwszym renderze, zeby UI nie wykonywal widocznej animacji "pokaz i schowaj".
## Output
Zmieniony widok listy zamowien, layout aplikacji z pre-hydration state dla sidebaru, przebudowany CSS oraz krotka aktualizacja dokumentacji technicznej.
</objective>
<context>
<clarifications>
- No clarifications needed - zakres jest jednoznaczny: usunac wskazany boks z `/orders/list`; zwiniety sidebar ma byc schowany od razu po odswiezeniu, gdy `localStorage.sidebarCollapsed === '1'`.
</clarifications>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
@AGENTS.md
@DOCS/ARCHITECTURE.md
@DOCS/DB_SCHEMA.md
## Source Files
@resources/views/orders/list.php
@resources/views/layouts/app.php
@resources/scss/app.scss
@public/assets/css/app.css
@DOCS/ARCHITECTURE.md
@DOCS/TECH_CHANGELOG.md
</context>
<skills>
No specialized flows required for APPLY. `.paul/SPECIAL-FLOWS.md` lists SonarQube as required after APPLY/before UNIFY; run it if the CLI is available and document the gap if it is not.
</skills>
<acceptance_criteria>
## AC-1: Orders List Header Box Removed
```gherkin
Given operator opens /orders/list
When the orders list view renders
Then the boks containing "Zamowienia" and "Kompaktowa lista zamowien oparta o lokalna baze orderPRO." is not present
And the status panel, filters, alerts and orders table still render normally
```
## AC-2: Collapsed Sidebar Has No Refresh Flash
```gherkin
Given localStorage.sidebarCollapsed is "1"
When any authenticated page is refreshed on desktop
Then the sidebar is visually collapsed from first paint
And it does not animate from expanded to collapsed during page load
```
## AC-3: Sidebar Interactions Still Work
```gherkin
Given the authenticated app layout is loaded
When the operator toggles the sidebar or uses the mobile hamburger menu
Then the collapsed state is saved/restored on desktop
And the mobile slide-in menu behavior remains unchanged
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Remove orders list intro card</name>
<files>resources/views/orders/list.php, resources/scss/app.scss, public/assets/css/app.css</files>
<action>
Remove the top card/box that renders the orders title and description from `resources/views/orders/list.php`.
Keep the warning alert for `$errorMessage` visible above the shared table component, but do not wrap it in the removed intro card.
Remove or neutralize now-unused `.orders-list-page` styling only if it becomes dead after the markup change.
Rebuild `public/assets/css/app.css` from SCSS if SCSS changes are made.
</action>
<verify>Open `/orders/list` or inspect rendered markup: the exact description text is absent while `components/table-list` and `components/order-status-panel` remain present. Run `C:\xampp\php\php.exe -l resources/views/orders/list.php`.</verify>
<done>AC-1 satisfied.</done>
</task>
<task type="auto">
<name>Task 2: Apply saved sidebar collapse before first paint</name>
<files>resources/views/layouts/app.php, resources/scss/app.scss, public/assets/css/app.css</files>
<action>
Add a small inline script in the document head before the CSS links. It should read `localStorage.sidebarCollapsed` and add an HTML class when the saved value is `1`.
Extend sidebar SCSS so that the pre-hydration HTML class applies the same compact sidebar layout as `.sidebar.is-collapsed` before the main footer script runs. Avoid changing mobile transform behavior.
Update the existing footer sidebar script so it synchronizes the real `.is-collapsed` class with the pre-hydration state and removes the temporary HTML class after initialization. Keep the existing toggle, details expansion, mobile backdrop and link-close behavior.
Rebuild `public/assets/css/app.css`.
</action>
<verify>In browser devtools set `localStorage.sidebarCollapsed='1'`, refresh an authenticated page, and confirm the sidebar is collapsed immediately with no visible expanded-to-collapsed transition. Run `C:\xampp\php\php.exe -l resources/views/layouts/app.php` and `npm run build:css`.</verify>
<done>AC-2 and AC-3 satisfied.</done>
</task>
<task type="auto">
<name>Task 3: Update technical documentation</name>
<files>DOCS/ARCHITECTURE.md, DOCS/TECH_CHANGELOG.md</files>
<action>
Add a concise architecture note describing the sidebar pre-hydration class/localStorage contract and the simplified orders list header.
Add a dated technical changelog entry explaining what changed and why.
Do not modify `DOCS/DB_SCHEMA.md` because this plan has no schema changes.
</action>
<verify>Inspect docs for the new Phase 143 note and confirm no DB schema sections were changed.</verify>
<done>Documentation requirement satisfied for AC-1 through AC-3.</done>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- database/migrations/* - no database/schema work in this UI hotfix.
- src/Modules/Orders/* - no backend query, controller or repository changes needed.
- resources/views/components/table-list.php - filters/table behavior stays as-is.
- Mobile sidebar semantics beyond preserving existing hamburger/backdrop behavior.
## SCOPE LIMITS
- Do not redesign the orders list table or status panel.
- Do not add dependencies or new frontend build tooling.
- Do not remove translation keys unless a separate cleanup is requested.
</boundaries>
<verification>
Before declaring plan complete:
- [ ] `C:\xampp\php\php.exe -l resources/views/orders/list.php`
- [ ] `C:\xampp\php\php.exe -l resources/views/layouts/app.php`
- [ ] `npm run build:css`
- [ ] Manual/browser smoke for `/orders/list`: intro box absent, table/status panel present.
- [ ] Manual/browser smoke for collapsed sidebar refresh: no expanded flash.
- [ ] SonarQube scan attempted if `sonar-scanner` is available; gap documented if unavailable.
</verification>
<success_criteria>
- The indicated "Zamowienia / Kompaktowa lista..." box is gone from `/orders/list`.
- Previously collapsed desktop sidebar stays collapsed from first paint after refresh.
- Sidebar toggle and mobile hamburger interactions continue to work.
- CSS build and PHP lint checks pass.
- Documentation is updated without schema changes.
</success_criteria>
<output>
After completion, create `.paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-SUMMARY.md`.
</output>

View File

@@ -0,0 +1,93 @@
---
phase: 143-orders-list-sidebar-ui-hotfix
plan: 01
subsystem: ui
tags: [orders-list, sidebar, scss, layout]
requires:
- phase: 142-polkurier-shipment-prepare-prefill
provides: Completed prior hotfix milestone state
provides:
- Removed orders list intro card
- Sidebar collapsed-state pre-hydration before first paint
affects: [orders-list, app-layout, frontend-ui]
tech-stack:
added: []
patterns: [html pre-hydration class for persisted UI state]
key-files:
created: []
modified:
- resources/views/orders/list.php
- resources/views/layouts/app.php
- resources/scss/app.scss
- public/assets/css/app.css
- DOCS/ARCHITECTURE.md
- DOCS/TECH_CHANGELOG.md
key-decisions:
- "Use html.has-collapsed-sidebar before CSS loads to avoid expanded sidebar flash."
- "Keep pre-hydration collapsed rules desktop-only so mobile slide-in behavior stays unchanged."
patterns-established:
- "Persisted layout state that affects first paint can be bridged through a temporary html class, then synchronized by the runtime script."
duration: 6min
started: 2026-05-18T11:44:00+02:00
completed: 2026-05-18T11:50:00+02:00
---
# Phase 143 Plan 01 Summary: Orders List Sidebar UI Hotfix
## Outcome
Implemented the approved UI hotfix for `/orders/list` and the authenticated app sidebar.
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~6 minutes |
| Started | 2026-05-18 11:44 Europe/Warsaw |
| Completed | 2026-05-18 11:50 Europe/Warsaw |
| Tasks | 3 completed |
| Files modified | 8 plus PAUL state files |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Orders List Header Box Removed | Pass | Intro card removed from `resources/views/orders/list.php`; targeted `rg` no longer finds the description or `.orders-list-page` in source/SCSS. |
| AC-2: Collapsed Sidebar Has No Refresh Flash | Pass | Head script sets `html.has-collapsed-sidebar` before CSS loads; SCSS mirrors collapsed rules for first paint. |
| AC-3: Sidebar Interactions Still Work | Pass | Footer script still owns toggle/persistence/mobile menu behavior and removes the temporary HTML class after initialization. |
## Changes
- Removed the intro card from `resources/views/orders/list.php` that showed `Zamowienia` and `Kompaktowa lista zamowien oparta o lokalna baze orderPRO.`.
- Kept the orders-list warning alert above the shared table component, without the removed intro card wrapper.
- Added a head-time pre-hydration script in `resources/views/layouts/app.php` that marks `<html>` with `has-collapsed-sidebar` when `localStorage.sidebarCollapsed === '1'`.
- Updated `resources/scss/app.scss` so the temporary HTML class applies the same compact desktop sidebar dimensions before the footer script initializes.
- Kept mobile menu behavior isolated by applying the pre-hydration compact state only at desktop widths.
- Rebuilt `public/assets/css/app.css`.
- Updated `DOCS/ARCHITECTURE.md` and `DOCS/TECH_CHANGELOG.md`.
## Verification
| Check | Result |
|-------|--------|
| `C:\xampp\php\php.exe -l resources/views/orders/list.php` | Pass |
| `C:\xampp\php\php.exe -l resources/views/layouts/app.php` | Pass |
| `npm run build:css` | Pass |
| `rg -n "Kompaktowa lista zamowien oparta o lokalna baze orderPRO\|orders-list-page"` targeted source check | Pass - removed from `orders/list.php` and SCSS |
| `git diff --check` targeted files | Pass - only line-ending warnings from Git |
| `sonar-scanner --version` | Gap - CLI not available in PATH |
## Notes
- No database schema changes or migrations were introduced.
- Browser/live smoke was not run because no local authenticated app session was started in this turn.
## Deviations from Plan
- Summary was created during APPLY, then enriched during UNIFY with PAUL frontmatter and AC reconciliation.
- No scope changes were introduced.
## Next Phase Readiness
- Phase 143 is complete and this one-phase milestone can be closed.
- No blockers for a future milestone.

View File

@@ -107,6 +107,12 @@ HTTP Request
## Frontend Enhancement Modules ## Frontend Enhancement Modules
### Orders List and Sidebar State
- `/orders/list` renders the reusable order status panel and shared `components/table-list` directly; the previous descriptive intro card was removed so the operational table starts higher on the screen.
- The desktop sidebar collapse state is stored in `localStorage.sidebarCollapsed`.
- `resources/views/layouts/app.php` reads that value in the document head and adds `html.has-collapsed-sidebar` before CSS loads. `resources/scss/app.scss` mirrors the compact sidebar rules for that pre-hydration class, so a saved collapsed sidebar is collapsed on first paint instead of animating after the footer script runs.
- The footer sidebar script still owns runtime interactions: it applies/removes `.sidebar.is-collapsed`, updates the button labels, closes open `details`, persists the state, and then removes the temporary HTML pre-hydration class.
### Checkbox Multiselect (`public/assets/js/modules/checkbox-multiselect.js`) ### Checkbox Multiselect (`public/assets/js/modules/checkbox-multiselect.js`)
- Loaded globally from `resources/views/layouts/app.php`. - Loaded globally from `resources/views/layouts/app.php`.
- Enhances native `<select multiple data-checkbox-multiselect>` controls after `DOMContentLoaded`. - Enhances native `<select multiple data-checkbox-multiselect>` controls after `DOMContentLoaded`.

View File

@@ -1,5 +1,20 @@
# Technical Changelog # Technical Changelog
## 2026-05-18 - Phase 143 Plan 01: Orders List Sidebar UI Hotfix
**Co zrobiono:**
- Usunieto opisowy boks z `/orders/list` zawierajacy tytul "Zamowienia" i opis kompaktowej listy.
- Alert bledu listy zamowien pozostaje widoczny nad wspolnym komponentem tabeli, ale nie jest juz opakowany w usuniety intro-card.
- Dodano pre-hydration state dla zwiniwtego sidebaru: `layout/app.php` ustawia `html.has-collapsed-sidebar` przed ladowaniem CSS, gdy `localStorage.sidebarCollapsed` ma wartosc `1`.
- SCSS powiela kompaktowe reguly sidebaru dla tej tymczasowej klasy, a footer script synchronizuje docelowa klase `.sidebar.is-collapsed` i usuwa klase z `<html>` po inicjalizacji.
**Dlaczego:**
- Lista zamowien jest ekranem operacyjnym i ma pokazywac dane/filtrowanie bez dodatkowego opisowego boksu.
- Wczesniej zapisany zwiniwty sidebar byl najpierw renderowany jako rozwiniety, a dopiero po zaladowaniu skryptu chowal sie z animacja.
**BREAKING / migracja:**
- Brak migracji DB i brak zmian breaking. Zmiana dotyczy tylko renderowania UI i CSS.
## 2026-05-18 - Phase 142 Plan 01: Polkurier Shipment Prepare Prefill ## 2026-05-18 - Phase 142 Plan 01: Polkurier Shipment Prepare Prefill
**Co zrobiono:** **Co zrobiono:**

File diff suppressed because one or more lines are too long

View File

@@ -51,7 +51,7 @@ a {
flex-direction: column; flex-direction: column;
} }
.sidebar.is-collapsed { @mixin sidebar-collapsed-state {
width: 52px; width: 52px;
min-width: 52px; min-width: 52px;
padding: 18px 0; padding: 18px 0;
@@ -90,6 +90,16 @@ a {
} }
} }
.sidebar.is-collapsed {
@include sidebar-collapsed-state;
}
@media (min-width: 769px) {
.has-collapsed-sidebar .sidebar {
@include sidebar-collapsed-state;
}
}
.sidebar__brand { .sidebar__brand {
display: flex; display: flex;
align-items: center; align-items: center;
@@ -145,6 +155,12 @@ a {
transform: rotate(180deg); transform: rotate(180deg);
} }
@media (min-width: 769px) {
.has-collapsed-sidebar .sidebar .sidebar__collapse-icon {
transform: rotate(180deg);
}
}
.sidebar__nav { .sidebar__nav {
display: grid; display: grid;
gap: 4px; gap: 4px;
@@ -1056,11 +1072,6 @@ h4.section-title {
} }
} }
.orders-list-page {
padding: 10px;
margin-bottom: 10px;
}
.statistics-orders-page { .statistics-orders-page {
padding: 10px; padding: 10px;
} }

View File

@@ -9,6 +9,15 @@ use App\Modules\Shipments\DeliveryStatusMappingRepository;
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<title><?= $e($t('meta.title_pattern', ['title' => (string) ($title ?? $t('meta.default_panel_title'))])) ?></title> <title><?= $e($t('meta.title_pattern', ['title' => (string) ($title ?? $t('meta.default_panel_title'))])) ?></title>
<script>
(function () {
try {
if (localStorage.getItem('sidebarCollapsed') === '1') {
document.documentElement.classList.add('has-collapsed-sidebar');
}
} catch (e) {}
})();
</script>
<link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet"> <link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap" rel="stylesheet">
@@ -232,6 +241,7 @@ use App\Modules\Shipments\DeliveryStatusMappingRepository;
var sidebar = document.getElementById('js-sidebar'); var sidebar = document.getElementById('js-sidebar');
var collapseBtn = document.getElementById('js-sidebar-collapse'); var collapseBtn = document.getElementById('js-sidebar-collapse');
if (!sidebar || !collapseBtn) return; if (!sidebar || !collapseBtn) return;
var html = document.documentElement;
function setCollapsed(collapsed) { function setCollapsed(collapsed) {
sidebar.classList.toggle('is-collapsed', collapsed); sidebar.classList.toggle('is-collapsed', collapsed);
@@ -248,6 +258,7 @@ use App\Modules\Shipments\DeliveryStatusMappingRepository;
try { try {
if (localStorage.getItem(STORAGE_KEY) === '1') setCollapsed(true); if (localStorage.getItem(STORAGE_KEY) === '1') setCollapsed(true);
} catch (e) {} } catch (e) {}
html.classList.remove('has-collapsed-sidebar');
collapseBtn.addEventListener('click', function () { collapseBtn.addEventListener('click', function () {
setCollapsed(!sidebar.classList.contains('is-collapsed')); setCollapsed(!sidebar.classList.contains('is-collapsed'));

View File

@@ -8,17 +8,9 @@
]); ?> ]); ?>
<div class="order-show-main"> <div class="order-show-main">
<section class="card orders-list-page"> <?php if (!empty($errorMessage)): ?>
<div class="orders-head"> <div class="mb-12"><?php $component('components/alert', ['type' => 'warning', 'message' => (string) $errorMessage, 'dismissible' => true]); ?></div>
<div> <?php endif; ?>
<h2 class="section-title"><?= $e($t('orders.title')) ?></h2>
<p class="muted mt-12"><?= $e($t('orders.description')) ?></p>
</div>
</div>
<?php if (!empty($errorMessage)): ?>
<div class="mt-12"><?php $component('components/alert', ['type' => 'warning', 'message' => (string) $errorMessage, 'dismissible' => true]); ?></div>
<?php endif; ?>
</section>
<?php $component('components/table-list'); ?> <?php $component('components/table-list'); ?>
</div> </div>