This commit is contained in:
2026-05-10 15:17:48 +02:00
parent 8d75a95e69
commit ce20e5705a
4 changed files with 216 additions and 15 deletions

View File

@@ -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
---

View File

@@ -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`

View File

@@ -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"}

View File

@@ -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*