Aggiunge i tornei con hub, pagina pubblica e tabellone per semifinali e finali.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-05 15:05:57 +02:00
co-authored by Cursor
parent d52434fb2e
commit a1f4c24a43
124 changed files with 6979 additions and 91 deletions
+124
View File
@@ -0,0 +1,124 @@
(function () {
document.addEventListener(
"submit",
function (event) {
var form = event.target;
if (!(form instanceof HTMLFormElement)) return;
if (!form.classList.contains("tournament-match-swap__form")) return;
event.preventDefault();
event.stopImmediatePropagation();
if (form.dataset.swapBusy === "1") return;
var row = form.closest("tr");
if (!row) return;
form.dataset.swapBusy = "1";
var btn = form.querySelector("button");
if (btn) btn.disabled = true;
swapRowSides(row);
var token = document.querySelector('meta[name="csrf-token"]');
fetch(form.action, {
method: "POST",
headers: {
Accept: "application/json",
"X-Requested-With": "XMLHttpRequest",
"X-CSRF-Token": token ? token.content : ""
},
body: new FormData(form),
credentials: "same-origin"
})
.then(function (res) {
return res
.json()
.then(function (data) {
return { ok: res.ok && data && data.ok !== false, data: data || {} };
})
.catch(function () {
return { ok: false, data: {} };
});
})
.then(function (result) {
if (!result.ok) {
swapRowSides(row);
showSwapError(form, result.data.error);
return;
}
if (result.data.matchup_label) {
var del = row.querySelector(".tournament-match-delete-form");
if (del) {
del.setAttribute("data-turbo-confirm", result.data.matchup_label);
del.setAttribute("data-confirm", result.data.matchup_label);
}
}
})
.catch(function () {
swapRowSides(row);
showSwapError(form, null);
})
.finally(function () {
delete form.dataset.swapBusy;
if (btn) btn.disabled = false;
});
},
true
);
function swapRowSides(row) {
var home = row.querySelector("[data-swap-side='home']");
var away = row.querySelector("[data-swap-side='away']");
if (home && away) {
var tmp = home.innerHTML;
home.innerHTML = away.innerHTML;
away.innerHTML = tmp;
pulse(home);
pulse(away);
}
var homeScore = row.querySelector("[data-swap-score='home']");
var awayScore = row.querySelector("[data-swap-score='away']");
if (homeScore && awayScore) {
var hv = homeScore.value;
homeScore.value = awayScore.value;
awayScore.value = hv;
}
var played = row.querySelector("[data-swap-played-score]");
if (played) {
var parts = played.textContent.trim().split(/\s*[-]\s*/);
if (parts.length === 2) {
played.textContent = parts[1] + "" + parts[0];
}
}
}
function pulse(el) {
el.classList.remove("is-swapped");
void el.offsetWidth;
el.classList.add("is-swapped");
}
function showSwapError(form, message) {
var table = form.closest(".tournament-match-table");
var text =
message ||
(table && table.getAttribute("data-swap-error")) ||
"Impossibile invertire casa e ospite.";
var host = document.querySelector(".tournament-hub") || document.querySelector("main");
if (!host) return;
var prev = host.querySelector(".flash.alert[data-swap-flash]");
if (prev) prev.remove();
var el = document.createElement("div");
el.className = "flash alert";
el.setAttribute("data-swap-flash", "1");
el.textContent = text;
host.insertBefore(el, host.firstChild);
window.setTimeout(function () {
if (el.parentNode) el.remove();
}, 5000);
}
})();