From ce20e5705acb4c375315b804b7ad9e747812c515 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Sun, 10 May 2026 15:17:48 +0200 Subject: [PATCH] update --- .paul/STATE.md | 31 ++-- .paul/changelog/2026-05-10.md | 29 ++++ .paul/governance/governance_2026-05-10.jsonl | 6 + .paul/phases/09-finalizacja/09-07-SUMMARY.md | 165 +++++++++++++++++++ 4 files changed, 216 insertions(+), 15 deletions(-) create mode 100644 .paul/changelog/2026-05-10.md create mode 100644 .paul/phases/09-finalizacja/09-07-SUMMARY.md diff --git a/.paul/STATE.md b/.paul/STATE.md index 3252648..1d4a7c8 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -10,21 +10,21 @@ See: .paul/PROJECT.md (updated 2026-05-05) ## Current Position Milestone: v1.0 Production Release (v1.0.0) -Phase: 9 of 9 (Finalizacja) — Planning -Plan: 09-07 created, awaiting approval (Kolory per jacht w kalendarzu zbiorczym) -Status: PLAN created, ready for APPLY -Last activity: 2026-05-10 — Created .paul/phases/09-finalizacja/09-07-PLAN.md +Phase: 9 of 9 (Finalizacja) — In progress +Plan: 09-07 — Complete (Kolory per jacht + UX widget zbiorczy) +Status: Loop closed, ready for next plan (09-08 Security audit) +Last activity: 2026-05-10 — Closed loop 09-07 (admin color picker + name matching + layout 2:1 + event padding/centering) Progress: -- Milestone: [█████████░] 97% -- Phase 9: [██████░░░░] 67% (6 of 9 plans complete — security i docs przesunięte na 09-08/09-09) +- Milestone: [█████████░] 98% +- Phase 9: [███████░░░] 78% (7 of 9 plans complete) ## Loop Position Current loop state: ``` PLAN ──▶ APPLY ──▶ UNIFY - ✓ ○ ○ [Plan 09-07 created, awaiting approval] + ✓ ✓ ✓ [Loop 09-07 complete, ready for 09-08] ``` ## Accumulated Context @@ -36,9 +36,10 @@ PLAN ──▶ APPLY ──▶ UNIFY | OAuth bez Google PHP Client | 7 | Brak zależności zewnętrznych, manual token refresh | | FullCalendar via CDN | 4 | Brak bundlera, update ręczny | | Custom tabela availability | 1 | Wydajne zapytania, custom cache logic | -| Privacy hardening REST `/availability/all` (09-04) → COFNIĘTE w 09-05 | 9 | Tytuły rezerwacji znów publicznie widoczne; security audit 09-07 ma to przeanalizować | +| Privacy hardening REST `/availability/all` (09-04) → COFNIĘTE w 09-05 | 9 | Tytuły rezerwacji znów publicznie widoczne; security audit 09-08 ma to przeanalizować | | Per-day allDay events zamiast timed cross-midnight | 9 | Czysty layout w FC dayGrid; każda doba w osobnej komórce | -| Publiczny endpoint `/availability/bounds` (09-06) | 9 | Frontend ogranicza nawigację bez auth; security audit 09-07 dorzuca do listy publicznych endpointów | +| Publiczny endpoint `/availability/bounds` (09-06) | 9 | Frontend ogranicza nawigację bez auth; security audit 09-08 dorzuca do listy publicznych endpointów | +| Admin color picker per jacht + matching globalnych eventów GCal po nazwie w tytule (09-07) | 9 | `_yacht_color` z fallbackiem na paletę; substring longest-match w `get_all_availability` — security audit 09-08 ocenia escapowanie tytułów | ### Deferred Issues @@ -55,13 +56,13 @@ None. ## Session Continuity Last session: 2026-05-10 -Stopped at: Plan 09-07 utworzony — kolory per jacht w kalendarzu zbiorczym -Next action: Review and approve plan, then run /paul:apply .paul/phases/09-finalizacja/09-07-PLAN.md -Resume file: .paul/phases/09-finalizacja/09-07-PLAN.md +Stopped at: Loop 09-07 zamknięty — kolory per jacht + UX widget zbiorczy zatwierdzone +Next action: Run /paul:plan to plan 09-08 (Security audit) +Resume file: .paul/phases/09-finalizacja/09-07-SUMMARY.md Resume context: -- Plan 09-07 wstawiony przed security audit (per żądaniu klienta — kolory w `/rezerwacja/`) -- Roadmap przesunięty: 09-07 kolory, 09-08 security, 09-09 docs -- 1 checkpoint human-verify na końcu (autonomous: false) +- Faza 9: 7/9 planów ukończonych (78%), milestone v1.0 98% +- 09-08 (Security audit) ma do oceny: TRZY publiczne endpointy (`/availability/{yacht_id}`, `/availability/all`, `/availability/bounds`), privacy revert (tytuły rezerwacji publicznie), nową logikę matchingu nazw w `get_all_availability` (escapowanie, performance) +- Skompilowany `calendar.css` edytowany ręcznie obok `calendar.scss` — synchronizacja manualna (do udokumentowania w 09-09) - Brak open issues, brak blockers --- diff --git a/.paul/changelog/2026-05-10.md b/.paul/changelog/2026-05-10.md new file mode 100644 index 0000000..d5266cc --- /dev/null +++ b/.paul/changelog/2026-05-10.md @@ -0,0 +1,29 @@ +# 2026-05-10 + +## Co zrobiono + +- [Phase 9, Plan 07] Kolory per jacht w kalendarzu zbiorczym + UX poprawki widgetu +- Color picker WP w formularzu jachtu (meta `_yacht_color`, sanityzacja `#rrggbb`) +- Backend: `get_yacht_color_palette()` honoruje admin color z fallbackiem na deterministyczną paletę po ID +- Globalne eventy GCal (yacht_id=0) kolorowane po nazwie/aliasie jachtu w tytule (substring, longest-match wins, mb_strpos case-insensitive) +- Drop `is_global_mode` override — kolory działają niezależnie od trybu sync +- Legenda widgetu zbiorczego pokazuje per-yacht kolory zawsze (+ "Inne" jako fallback w trybie global) +- Layout `/rezerwacja/` przeskalowany 1fr:1fr → 2fr:1fr (kalendarz : formularz) +- Padding pasków eventów zmniejszony (`2px 4px` → `0 1px`), tytuł wyśrodkowany w pionie i w poziomie +- ROADMAP: 09-07 kolory, 09-08 security audit (przesunięte), 09-09 testy/tłumaczenia/docs (przesunięte) + +## Zmienione pliki + +- `wp-content/plugins/yacht-booking-system/includes/class-yacht.php` +- `wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php` +- `wp-content/plugins/yacht-booking-system/admin/class-admin.php` +- `wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php` +- `wp-content/plugins/yacht-booking-system/api/class-rest-controller.php` +- `wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php` +- `wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss` +- `wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css` +- `wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar-all.css` +- `.paul/ROADMAP.md` +- `.paul/STATE.md` +- `.paul/phases/09-finalizacja/09-07-PLAN.md` +- `.paul/phases/09-finalizacja/09-07-SUMMARY.md` diff --git a/.paul/governance/governance_2026-05-10.jsonl b/.paul/governance/governance_2026-05-10.jsonl index cfa0ee4..a88f177 100644 --- a/.paul/governance/governance_2026-05-10.jsonl +++ b/.paul/governance/governance_2026-05-10.jsonl @@ -23,3 +23,9 @@ {"ts":"2026-05-10T12:54:48Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} {"ts":"2026-05-10T13:01:31Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} {"ts":"2026-05-10T13:01:34Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\wp-content\\\\plugins\\\\yacht-booking-system\\\\frontend\\\\assets\\\\css\\\\calendar-all.css","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:09:52Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\phases\\\\09-finalizacja\\\\09-07-SUMMARY.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:10:04Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:10:12Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:10:21Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:10:33Z","tool":"Bash","cmd":"mkdir -p .paul/changelog\",\"description\":\"ensure changelog dir\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExpected\":true},\"tool_use_id","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} +{"ts":"2026-05-10T13:10:45Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\jachty3.pagedev.pl\\\\.paul\\\\changelog\\\\2026-05-10.md","cwd":"/c/visual studio code/projekty/jachty3.pagedev.pl"} diff --git a/.paul/phases/09-finalizacja/09-07-SUMMARY.md b/.paul/phases/09-finalizacja/09-07-SUMMARY.md new file mode 100644 index 0000000..d3573eb --- /dev/null +++ b/.paul/phases/09-finalizacja/09-07-SUMMARY.md @@ -0,0 +1,165 @@ +--- +phase: 09-finalizacja +plan: 07 +subsystem: ui +tags: [color-picker, fullcalendar, wp-color-picker, ical-global, branding] + +requires: + - phase: 09-finalizacja + provides: Widget zbiorczy `/rezerwacja/`, REST `/availability/all` z paletą kolorów per-jacht (09-04) +provides: + - Admin color picker per jacht (meta `_yacht_color`) + - Honor `_yacht_color` w `Rest_Controller::get_yacht_color_palette()` z fallbackiem na paletę + - Substring matching nazwy/aliasu jachtu w tytule globalnych eventów GCal (longest-match wins) + - Legenda widgetu zbiorczego pokazuje per-yacht kolory także w trybie global + - Proporcje 2fr:1fr w `.yacht-inquiry-layout` (kalendarz : formularz) + - Zmniejszony padding w paskach eventów + wyśrodkowanie tekstu (poziomo + pionowo) +affects: [09-08 security audit, 09-09 docs/translations] + +tech-stack: + added: [] + patterns: + - Per-yacht admin meta z fallbackiem na deterministyczną paletę + - Name/alias matching dla bookings yacht_id=0 (longest-match-first) + +key-files: + created: [] + modified: + - wp-content/plugins/yacht-booking-system/includes/class-yacht.php + - wp-content/plugins/yacht-booking-system/admin/views/yacht-edit.php + - wp-content/plugins/yacht-booking-system/admin/class-admin.php + - wp-content/plugins/yacht-booking-system/includes/class-yacht-booking.php + - wp-content/plugins/yacht-booking-system/api/class-rest-controller.php + - wp-content/plugins/yacht-booking-system/frontend/class-calendar-widget-all.php + - wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.scss + - wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar.css + - wp-content/plugins/yacht-booking-system/frontend/assets/css/calendar-all.css + +key-decisions: + - "Fallback z palety zachowany — admin color jest opcjonalny, brak meta = paleta po posortowanym yacht_id" + - "Matching globalnych eventów po substring w tytule (case-insensitive, mb_*), longest match wygrywa" + - "Drop is_global_mode override w get_all_availability — kolory działają niezależnie od trybu sync" + - "Proporcje layoutu zbiorczego 2fr:1fr (poprzednio 1fr:1fr) per żądanie klienta" + +patterns-established: + - "Per-yacht admin overrides z fallbackiem na deterministyczny algorytm po ID" + +duration: ~50min +started: 2026-05-10T00:00:00Z +completed: 2026-05-10T00:50:00Z +--- + +# Phase 09 Plan 07: Kolory per jacht w kalendarzu zbiorczym + +**Admin może wybrać kolor jachtu w panelu, eventy z globalnego GCal dopasowują się do jachtu po nazwie/aliasie w tytule. Layout `/rezerwacja/` przeskalowany 2:1 na korzyść kalendarza.** + +## Performance + +| Metric | Value | +|--------|-------| +| Duration | ~50 min | +| Started | 2026-05-10 | +| Completed | 2026-05-10 | +| Tasks | 3 auto + 1 checkpoint approved | +| Files modified | 9 | + +## Acceptance Criteria Results + +| Criterion | Status | Notes | +|-----------|--------|-------| +| AC-1: Admin może wybrać kolor jachtu | Pass | `_yacht_color` zapisywane przez `Yacht::update_color()`, walidacja regex `#rrggbb`, color picker przez `wp-color-picker` | +| AC-2: Kolor admina ma priorytet w widgecie zbiorczym | Pass | `get_yacht_color_palette()` honoruje meta przed paletą, legenda używa tej samej funkcji | +| AC-3: Fallback z palety dla jachtów bez koloru | Pass | Brak meta → `palette[i % count]` po posortowanym ID (deterministycznie) | +| AC-4: Globalne eventy GCal kolorowane po nazwie | Pass | `name_map` z `post_title` + `_yacht_gcal_alias`, sort DESC po długości, `mb_strpos` case-insensitive | + +## Accomplishments + +- Color picker WP w formularzu jachtu z meta `_yacht_color` (sanityzacja `#rrggbb`, pusta wartość usuwa meta) +- Backend z dwupoziomową logiką kolorów: per-yacht event → admin color/paleta; global event (yacht_id=0) → match po nazwie w tytule (longest-match-first) +- Legenda widgetu zbiorczego pokazuje teraz wszystkie jachty z ich kolorami, niezależnie od trybu sync (+ "Inne" jako fallback w trybie global) +- Layout `/rezerwacja/` przeskalowany do 2fr:1fr — więcej miejsca dla kalendarza +- Paski eventów: padding zredukowany (`2px 4px` → `0 1px`), tytuł wyśrodkowany w poziomie (`text-align:center`) i w pionie (`display:flex; align-items:center` na `.fc-event` i `.fc-event-main`) + +## Files Created/Modified + +| File | Change | Purpose | +|------|--------|---------| +| `includes/class-yacht.php` | Modified | Dodane `get_color()` / `update_color()` ze sanityzacją hex | +| `admin/views/yacht-edit.php` | Modified | Pole color picker + label + opis | +| `admin/class-admin.php` | Modified | `save_yacht()` zapisuje meta `_yacht_color` | +| `includes/class-yacht-booking.php` | Modified | Enqueue `wp-color-picker` + inline init na stronie edycji jachtu | +| `api/class-rest-controller.php` | Modified | `get_yacht_color_palette()` honoruje admin color; `get_all_availability()` dopasowuje globalne eventy po nazwie | +| `frontend/class-calendar-widget-all.php` | Modified | Legenda zawsze per-yacht; "Inne" jako fallback w trybie global | +| `frontend/assets/css/calendar.scss` | Modified | `.yacht-inquiry-layout` `1fr 1fr` → `2fr 1fr` | +| `frontend/assets/css/calendar.css` | Modified | Skompilowane CSS (calendar.scss) | +| `frontend/assets/css/calendar-all.css` | Modified | Padding eventów + flex-center poziomo i pionowo | +| `.paul/ROADMAP.md` | Modified | 09-07 nowy plan, security przesunięty na 09-08, docs na 09-09 | + +## Decisions Made + +| Decision | Rationale | Impact | +|----------|-----------|--------| +| Fallback z palety zachowany | Niski próg wejścia — admin nie musi ustawiać koloru by system działał | Spójność wsteczna z 09-04 | +| Matching globalnych eventów: substring + longest-match | Klient: "naprostsze wyszukiwanie nazwy w tytule" — nazwa może być w dowolnym miejscu, najdłuższe trafienie wygrywa (np. "Maja Bis" > "Maja") | Eventy z wspólnego GCal automatycznie kolorowane bez zmian w schemacie DB | +| Drop `is_global_mode` override | Wcześniej w trybie global wszystkie eventy szły `GLOBAL_EVENT_COLOR` ignorując yacht_id; klient chce kolory zawsze | Tryb global = pełna kolorystyka (bonus poza pierwotnym scope) | +| Layout 2fr:1fr | Klient: "kalendarz 2/3, formularz 1/3" | Mobile breakpoint @992px nadal stackuje | + +## Deviations from Plan + +### Summary + +| Type | Count | Impact | +|------|-------|--------| +| Auto-fixed | 0 | — | +| Scope additions | 4 | Bonus UX poprawki, niski risk | +| Deferred | 0 | — | + +**Total impact:** Plan zrealizowany w pełni + 4 dodatkowe poprawki UX zgłoszone w trakcie checkpoint review (proporcje 2:1, padding pasków, wyrównanie poziome i pionowe tekstu). + +### Scope Additions + +**1. Layout proportions 2fr:1fr (`/rezerwacja/`)** +- Found during: Po approve checkpoint +- Change: `.yacht-inquiry-layout` z `1fr 1fr` na `2fr 1fr` w SCSS i skompilowanym CSS +- Files: `calendar.scss`, `calendar.css` +- Verification: Wzrokowo na `/rezerwacja/` po deploy + +**2. Padding pasków eventów** +- Found during: Po approve checkpoint +- Change: `.fc-event` `2px 4px` → `0 1px`, `.yc-event-title` `1px 6px` → `0 2px`, margin pasków `1px 2px` → `1px 0` +- Files: `calendar-all.css` +- Verification: Więcej miejsca na tekst tytułu rezerwacji + +**3. Tekst tytułu wyśrodkowany poziomo** +- Found during: Po zmianie paddingu +- Change: `text-align: center` + `width: 100%` na `.yc-event-title` +- Files: `calendar-all.css` + +**4. Tekst tytułu wyśrodkowany pionowo** +- Found during: Po zmianie poziomej +- Change: `display:flex; align-items:center` na `.fc-event` i `.fc-event-main` +- Files: `calendar-all.css` + +### Deferred Items + +None. + +## Issues Encountered + +None — wszystkie zmiany przeszły `php -l` bez błędów, layout zachowany. + +## Next Phase Readiness + +**Ready:** +- Plan 09-08 (Security audit) — endpoint `/availability/all` ma teraz dodatkową logikę matchingu nazw, do oceny w audycie (escapowanie tytułów, performance pętli `mb_strpos`) +- Plan 09-09 (Testy + tłumaczenia + docs) — nowe stringi w yacht-edit.php (label, description) wymagają wpisów w .pot + +**Concerns:** +- Skompilowany `calendar.css` jest plikiem ręcznie edytowanym (brak workflow build) — zmiany w SCSS i CSS muszą być synchronizowane manualnie. Do udokumentowania w 09-09. +- `name_map` w `get_all_availability()` budowana per-request — przy dużej liczbie jachtów + długim oknie czasowym może wpłynąć na performance. Aktualnie pomijalne (kilka jachtów). + +**Blockers:** None. + +--- +*Phase: 09-finalizacja, Plan: 07* +*Completed: 2026-05-10*