125 lines
3.6 KiB
JavaScript
125 lines
3.6 KiB
JavaScript
(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);
|
||
}
|
||
})();
|