diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md new file mode 100644 index 0000000..66f4a5e --- /dev/null +++ b/.paul/PROJECT.md @@ -0,0 +1,35 @@ +# PROJECT.md + +## Name +newwalls.pl — PrestaShop 1.7 (theme: ayon) + +## Mission +Sklep z tapetami na wymiar. Klient prowadzi migrację wyglądu strony produktu na nowy layout. Do czasu zakończenia testów nowy layout jest warunkowany IP administratora. + +## Core Constraints +- Stary i nowy wygląd strony produktu współegzystują w `themes/ayon/templates/catalog/product.tpl`: + - Stary layout: `{if $smarty.server.REMOTE_ADDR != '89.69.31.86'} ... {/if}` + - Nowy layout: `{if $smarty.server.REMOTE_ADDR == '89.69.31.86'} ... {/if}` +- Nie wolno modyfikować starego layoutu (produkcja działa dla zwykłych użytkowników). +- Partial `themes/ayon/templates/catalog/_partials/product-variants.tpl` jest współdzielony — zmiany w nim muszą być zgodne z oboma layoutami. +- Stack: PrestaShop 1.7, Smarty, jQuery, SCSS (`themes/ayon/assets/css/custom.scss` → `custom.css`). + +## Value Proposition +Nowy layout strony produktu ma dać czystszy, bardziej prezentowalny UI konfiguratora tapety przy zachowaniu dotychczasowej funkcjonalności (wybór wariantu kolorystycznego, wymiary, dodanie do koszyka itd.). + +## Known Broken After Redesign + +### ✅ Naprawione (Phase 01) +- `.product-variants` (wariant kolorystyczny) — wygląd grid 3×1 wg Figma 27:9867 + klik zmienia wariant in-place (AJAX `action=refresh` + `history.pushState`). + +### ⚠️ Do naprawy (Phase 02+) +- Brak `
` / `.product-actions` wokół `product_add_to_cart` w nowym layoucie — „Dodaj do koszyka" prawdopodobnie nie działa. +- Puste bloki `
`: `product-size-data`, `product-protect`, `product-installation`, `product-order-sample`. +- Konfigurator rozmiaru „piece" (crop + odbicie lustrzane) — brak markup'u. +- Brakujące elementy dla pełnego PS `updatedProduct` flow (`.product-cover-thumbnails`, `.js-product-images2-modal`, `.product-details`, `.product-customization`, `.product-additional-info`) — wpływa na edge case'y przy zmianie wariantu z różnymi miniaturami/opisami. + +## Established Patterns (Phase 01) +- **Scoped CSS under `body#product .product-variants-data--new`** — izoluje zmiany nowego layoutu od globalnych reguł i starego widoku. +- **Własny AJAX refresh w `custom.js`** — `action=refresh` (nie `productrefresh`), POST na `window.location.href.split('?')[0].split('#')[0]`, `dataType: 'json'`, header `Accept: application/json`. +- **In-place DOM update**: `history.pushState(resp.product_url)` + `$('.product-prices-data .product-prices').replaceWith(resp.product_prices)` + `$('.product_image_wrapper').html(resp.product_cover_thumbnails)` + `prestashop.emit('updatedProduct', resp)`. Fallback na `window.location.reload()` przy błędzie. +- **Pipeline SCSS → CSS**: edytuj tylko `themes/ayon/assets/css/custom.scss`, `custom.css` auto-generowany przez user'a watcher (feedback memory). diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md new file mode 100644 index 0000000..074af4e --- /dev/null +++ b/.paul/ROADMAP.md @@ -0,0 +1,35 @@ +# ROADMAP.md + +## Milestone v0.1 — Naprawa funkcji w nowym layoucie strony produktu + +Status: In progress (Phase 1 / 2 complete) + +Cel: przywrócić pełną funkcjonalność strony produktu w nowym wyglądzie (IP 89.69.31.86) bez naruszania starego. + +### Phase 01 — Product variants (wariant kolorystyczny) — **✅ Complete (2026-04-23)** +- Wizualnie: blok `.product-variants` w `.product-box.product-variants-data` wyglada jak `d:\temp\Frame 33.png` / Figma 27:9867 (3 kafelki z obrazem + podpis pod spodem, responsive 2×1 < 768 px). ✓ +- Funkcjonalnie: kliknięcie miniatury zmienia wariant produktu — AJAX `action=refresh` + in-place DOM update (obraz + cena + URL przez `history.pushState`), bez reloadu. ✓ +- Dotyczy tylko gałęzi `REMOTE_ADDR == '89.69.31.86'` w `product.tpl` oraz scope'owanego CSS/JS. Stary layout nietknięty. +- Summary: `.paul/phases/01-product-variants-fix/01-01-SUMMARY.md` + +### Phase 02 — Product actions fixes (piece + add-to-cart + empty blocks) — **Planning** + +Plan 02-01 (in planning): Konfigurator „piece" (crop + odbicie lustrzane) w nowym layoucie — port funkcjonalności ze starego layoutu z zachowaniem identycznego kontraktu DOM (hidden inputs `is_crop`, `crop_pos_x/y`, `crop_width/height`, `piece_bg_top/left`) dla serializacji do koszyka. Drag + resize przez inputy + mirror, re-init po AJAX refresh wariantu. Scope limit: zero nowych zależności, zero zmian w starym layoucie. + - Plan file: `.paul/phases/02-product-actions-fixes/02-01-PLAN.md` + +Plan 02-02 (**PARTIAL — closed 2026-04-23**): Add-to-cart submission działa (POST → cart saves item), ale customization nie zapisuje się i success modal nie pojawia. Core infrastructure: capture-phase native handler w custom.js + inline mirror w product.tpl (cache-buster), idempotency guard, blockcart refresh. 5 AC pass (technicznie), ale feature niekompletne z perspektywy UX. + - Plan file: `.paul/phases/02-product-actions-fixes/02-02-PLAN.md` + - Summary: `.paul/phases/02-product-actions-fixes/02-02-SUMMARY.md` + +Plan 02-03 (**wymagany dla production** — kolejny do zaplanowania): Customization + success modal + cena per-sqm + systemowy cache-buster. + - Root cause: Plan 02-01 override `totalpriceinfospecific` na no-op wyłączył squaremeter flow → customization hook `hookActionObjectCartUpdateBefore` gate'owany `discretion=on` + wiele pól (`dim`, `qty`, `qty_alth`, `product_total_price_calc`, `extrafeevalue`, `wastevalue`, `calculated_total`, etc.) nie jest wypełnianych. + - Zakres: + 1. Przywrócić squaremeter dimension flow w nowym layoucie (alternatywa dla `totalpriceinfospecific`) — UI dimension input'ów + live kalkulacja + synchronizacja hidden inputs. + 2. Cena per-sqm kalkulacja (zależna od #1). + 3. Success modal po add-to-cart przez POST do `/module/ps_shoppingcart/ajax?action=add-to-cart` → render modal (resp.modal HTML). + 4. Systemowy cache-buster `?v=` dla ` {/if}