--- phase: 02-product-actions-fixes plan: 02 subsystem: ui+backend-integration tags: [prestashop, smarty, jquery, ajax, add-to-cart, squaremeter, customization, cache] status: PARTIAL (core flow działa, ale end-to-end UX wymaga Plan 02-03 — customization nie zapisuje się i modal nie pojawia) requires: - phase: 02-product-actions-fixes provides: - Plan 02-01 form `#add-to-cart-or-refresh` z hidden inputs (crop/mirror) — wykorzystane jako baseline POST payload - Plan 02-01 marker class `.product-variants-data--new` — użyty do scope'owania handler'a provides: - Capture-phase click handler na `[data-button-action=add-to-cart]` w `custom.js` (+inline mirror w `product.tpl` jako cache-buster) - Blokuje PS core handler (ktory crash'owal bo button poza forma) przez `stopImmediatePropagation` na capture phase - Manualny POST do form.action z `form.serialize() + qty + add=1&action=update` - Fancybox-blocker port (walidacja ze piece wybrany przed submit) - Sync is_crop/crop_width/crop_height przed POST (obejście crash'u checkedHandler) - `prestashop.emit('updatedCart')` + blockcart refresh fetch - Loading spinner + success flash animation affects: - Plan 02-03 (cena + customization + modal) — **BLOKER dla production readiness**: - Customization nie zapisuje się bo `squaremeter::hookActionObjectCartUpdateBefore` wymaga `discretion=on` + squaremeter fields (`dim`, `qty`, `qty_alth`, `product_total_price_calc`, `extrafeevalue`, `wastevalue`, `calculated_total`, etc.) - Plan 02-01 override `totalpriceinfospecific` wyłączył synchronizację tych pól w nowym layoucie - Success modal (po add-to-cart) wymaga osobnego POST do `/module/ps_shoppingcart/ajax?action=add-to-cart` → renderowany przez `Ps_Shoppingcart::renderModal()` - W koszyku brakuje "Szczegóły" button bo cart.id_customization = 0 tech-stack: added: [] patterns: - "Capture-phase native addEventListener z useCapture=true — jedyna metoda blokowania PS core delegated bubble handlers w jQuery.on()" - "Inline script w product.tpl jako cache-buster dla handler'a, guard'owany `window.__Bound` — immune na browser cache statycznych assetow" - "Stopniowa diagnoza structure-first (DOM traversal → event phases → POST payload) w Playwright przed zmianami kodu" key-files: created: - .paul/phases/02-product-actions-fixes/02-02-PLAN.md - .paul/phases/02-product-actions-fixes/02-02-SUMMARY.md modified: - themes/ayon/assets/js/custom.js (wrapped Plan 02-02 block w `if (!window.__p02p02Bound) { ... }` guard, ~115 linii) - themes/ayon/assets/css/custom.scss (+loading spinner + added-flash, ~42 linie) - themes/ayon/templates/catalog/product.tpl (+inline handler mirror przed `{/if}` new-layout, ~95 linii) — cache-buster key-decisions: - "Task 1 diagnoza via Playwright → S3 (własny AJAX submit) — struktura DOM: button+qty są poza forma, PS core `closest('form')` zwraca 0 elementów, POST nigdy nie wychodzi" - "Capture-phase native addEventListener zamiast jQuery `.on()` — eliminuje double-POST (PS core registered first, jQuery stopPropagation nie mogło cofnąć wcześniejszej rejestracji)" - "Manual sync is_crop/crop_width/crop_height w handlerze — obejście crash'u checkedHandler (totalpriceinfospecific override z 02-01 nie działa w produkcji)" - "Inline script w product.tpl + idempotency guard — cache-buster dla