Aggiunge fatturazione club, pagina regia condivisibile senza account, roster squadre e rimuove la modalità controller dall'app (v1.1.0). Co-authored-by: Cursor <cursoragent@cursor.com>
130 lines
4.6 KiB
JavaScript
130 lines
4.6 KiB
JavaScript
(function () {
|
|
function initBrandingFieldset(fieldset) {
|
|
initLogoPreview(fieldset);
|
|
fieldset.querySelectorAll("[data-branding-color-row]").forEach(initColorRow);
|
|
initLivePreview(fieldset);
|
|
initNamePreview(fieldset);
|
|
}
|
|
|
|
function initLogoPreview(fieldset) {
|
|
var fileInput = fieldset.querySelector("[data-branding-logo-file]");
|
|
var previewImg = fieldset.querySelector("[data-branding-logo-img]");
|
|
var placeholder = fieldset.querySelector("[data-branding-logo-placeholder]");
|
|
if (!fileInput || !previewImg) return;
|
|
|
|
fileInput.addEventListener("change", function () {
|
|
var file = fileInput.files && fileInput.files[0];
|
|
if (!file) return;
|
|
|
|
var reader = new FileReader();
|
|
reader.onload = function (e) {
|
|
previewImg.src = e.target.result;
|
|
previewImg.hidden = false;
|
|
if (placeholder) placeholder.hidden = true;
|
|
fieldset.dispatchEvent(new CustomEvent("branding:logochange", { bubbles: true }));
|
|
};
|
|
reader.readAsDataURL(file);
|
|
});
|
|
|
|
var urlInput = fieldset.querySelector(".branding-url-input");
|
|
if (urlInput) {
|
|
urlInput.addEventListener("change", function () {
|
|
var url = urlInput.value.trim();
|
|
if (!url) return;
|
|
previewImg.src = url;
|
|
previewImg.hidden = false;
|
|
if (placeholder) placeholder.hidden = true;
|
|
fieldset.dispatchEvent(new CustomEvent("branding:logochange", { bubbles: true }));
|
|
});
|
|
}
|
|
}
|
|
|
|
function initColorRow(row) {
|
|
var picker = row.querySelector("[data-color-picker]");
|
|
var hexInput = row.querySelector("[data-color-hex]");
|
|
var swatch = row.querySelector("[data-color-swatch]");
|
|
if (!picker || !hexInput) return;
|
|
|
|
function applyColor(hex) {
|
|
var normalized = normalizeHex(hex);
|
|
if (!normalized) return;
|
|
picker.value = normalized;
|
|
hexInput.value = normalized;
|
|
if (swatch) swatch.style.background = normalized;
|
|
row.dispatchEvent(new CustomEvent("branding:colorchange", { bubbles: true }));
|
|
}
|
|
|
|
picker.addEventListener("input", function () {
|
|
applyColor(picker.value);
|
|
});
|
|
|
|
hexInput.addEventListener("input", function () {
|
|
var v = hexInput.value.trim();
|
|
if (/^#[0-9A-Fa-f]{6}$/.test(v)) applyColor(v);
|
|
else if (/^[0-9A-Fa-f]{6}$/.test(v)) applyColor("#" + v);
|
|
});
|
|
|
|
hexInput.addEventListener("blur", function () {
|
|
applyColor(hexInput.value || picker.value);
|
|
});
|
|
|
|
row.querySelectorAll("[data-color-preset]").forEach(function (btn) {
|
|
btn.addEventListener("click", function () {
|
|
applyColor(btn.getAttribute("data-color-preset"));
|
|
});
|
|
});
|
|
|
|
applyColor(picker.value || hexInput.value);
|
|
}
|
|
|
|
function initLivePreview(fieldset) {
|
|
var card = fieldset.querySelector("[data-branding-live-preview]");
|
|
if (!card) return;
|
|
|
|
function refresh() {
|
|
var primary = fieldset.querySelector('[data-branding-color-row="primary"] [data-color-picker]');
|
|
var secondary = fieldset.querySelector('[data-branding-color-row="secondary"] [data-color-picker]');
|
|
var logoImg = fieldset.querySelector("[data-branding-logo-img]");
|
|
var header = card.querySelector("[data-preview-header]");
|
|
var logoSlot = card.querySelector("[data-preview-logo]");
|
|
|
|
if (header && primary && secondary) {
|
|
header.style.setProperty("--preview-primary", primary.value);
|
|
header.style.setProperty("--preview-secondary", secondary.value);
|
|
}
|
|
if (logoSlot && logoImg && !logoImg.hidden && logoImg.src && logoImg.src.indexOf("data:image/gif") === -1) {
|
|
logoSlot.innerHTML =
|
|
'<img src="' + logoImg.src + '" width="40" height="40" alt="" style="border-radius:8px;object-fit:contain">';
|
|
}
|
|
}
|
|
|
|
fieldset.addEventListener("branding:colorchange", refresh);
|
|
fieldset.addEventListener("branding:logochange", refresh);
|
|
refresh();
|
|
}
|
|
|
|
function initNamePreview(fieldset) {
|
|
var card = fieldset.querySelector("[data-branding-live-preview]");
|
|
if (!card) return;
|
|
var nameEl = card.querySelector(".branding-live-preview__name");
|
|
var form = fieldset.closest("form");
|
|
if (!nameEl || !form) return;
|
|
|
|
var nameInput = form.querySelector("[name='club[name]'], [name='team[name]']");
|
|
if (!nameInput) return;
|
|
|
|
nameInput.addEventListener("input", function () {
|
|
nameEl.textContent = nameInput.value.trim() || nameEl.textContent;
|
|
});
|
|
}
|
|
|
|
function normalizeHex(value) {
|
|
var v = (value || "").trim();
|
|
if (/^[0-9A-Fa-f]{6}$/.test(v)) v = "#" + v;
|
|
if (!/^#[0-9A-Fa-f]{6}$/.test(v)) return null;
|
|
return v.toLowerCase();
|
|
}
|
|
|
|
document.querySelectorAll(".branding-fields").forEach(initBrandingFieldset);
|
|
})();
|