Public Access
The three CTAs (hero, mid-page, §7) were <a class="btn-buy"> that only worked
through JavaScript. They are now native <form method="post" target="_blank">
elements posting basket=[{"product_id":12,"qty":1}] + clear=1 to
https://20.odoo4projects.com/shop/post_basket, so the buy works with JavaScript
disabled; the button keeps the brass styling and the same size classes.
static/buy.js no longer builds a form on click. It is now pure progressive
enhancement: a capture-phase submit listener appends the utm_source/medium/
campaign hidden inputs from the cookies and lets the native submit proceed.
One page-scoped declaration keeps the button height at 55px: a <button> takes
line-height:normal from the UA font shorthand where the <a>s inherited the body
line-height (measured 49.19px vs 54.78px without it).
56 lines
2.1 KiB
JavaScript
56 lines
2.1 KiB
JavaScript
/* buy.js — page-local checkout helper (progressive enhancement).
|
|
*
|
|
* The checkout itself is a native <form method="post" target="_blank"> that posts
|
|
* basket=[{"product_id":12,"qty":1}] + clear=1 to
|
|
* https://20.odoo4projects.com/shop/post_basket. With JavaScript off it still works.
|
|
*
|
|
* This file only adds attribution: on submit it appends the utm_* hidden inputs
|
|
* from the cookies, then lets the native submit proceed (it never preventDefault).
|
|
*
|
|
* The UTM helpers mirror `script.js` `buyNow()` — the main page's checkout path.
|
|
* If that changes, change this too.
|
|
*/
|
|
(function () {
|
|
'use strict';
|
|
|
|
/* ---- UTM tracking helpers (verbatim from script.js) ---- */
|
|
function getCookie(name) {
|
|
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
return match ? decodeURIComponent(match[2]) : null;
|
|
}
|
|
|
|
function getStoredUTM() {
|
|
var utm = {};
|
|
var keys = ['source', 'medium', 'campaign'];
|
|
for (var i = 0; i < keys.length; i++) {
|
|
var val = getCookie('utm_' + keys[i]);
|
|
if (val) utm[keys[i]] = val;
|
|
}
|
|
return utm;
|
|
}
|
|
|
|
function appendToForm(form) {
|
|
var stored = getStoredUTM();
|
|
var keys = ['source', 'medium', 'campaign'];
|
|
for (var i = 0; i < keys.length; i++) {
|
|
if (stored[keys[i]] && !form.elements['utm_' + keys[i]]) {
|
|
var input = document.createElement('input');
|
|
input.type = 'hidden';
|
|
input.name = 'utm_' + keys[i];
|
|
input.value = stored[keys[i]];
|
|
form.appendChild(input);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* ---- Progressive enhancement: add UTM inputs to the native basket form ----
|
|
Capture phase, so the inputs are in the form before the browser serialises it.
|
|
No preventDefault — the native POST proceeds untouched. */
|
|
document.addEventListener('submit', function (e) {
|
|
var form = e.target;
|
|
if (!form || form.tagName !== 'FORM') return;
|
|
if (!form.querySelector('input[name="basket"]')) return;
|
|
appendToForm(form);
|
|
}, true);
|
|
})();
|