Files
ODOO4projects.com/static/buy.js
T
oliver 24e542f4ab Bootcamp page: CTAs say 'Buy for 790 USD' and post the basket natively
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).
2026-10-24 22:26:40 +00:00

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);
})();