mirror of
https://git.hexahost.dev/smueller/HexaHost-Frontend.git
synced 2026-06-02 08:58:43 +00:00
211 lines
6.9 KiB
JavaScript
211 lines
6.9 KiB
JavaScript
(function () {
|
|
"use strict";
|
|
const CONSENT_COOKIE_NAME = "hexahost_cookie_consent";
|
|
const CONSENT_DAYS = 365;
|
|
const cookieBanner = document.getElementById("cookieConsent");
|
|
const settingsPanel = document.getElementById("cookieSettingsPanel");
|
|
const acceptAllButton = document.getElementById("cookieAcceptAll");
|
|
const acceptEssentialButton = document.getElementById("cookieAcceptEssential");
|
|
const settingsButton = document.getElementById("cookieSettings");
|
|
const saveSettingsButton = document.getElementById("cookieSaveSettings");
|
|
const closeSettingsButton = document.getElementById("cookieCloseSettings");
|
|
const analyticsCheckbox = document.getElementById("cookieAnalytics");
|
|
const marketingCheckbox = document.getElementById("cookieMarketing");
|
|
const cookieStore = {
|
|
set: function (name, value, days) {
|
|
const expiresDate = new Date();
|
|
expiresDate.setTime(expiresDate.getTime() + days * 24 * 60 * 60 * 1000);
|
|
const expiresString = "expires=" + expiresDate.toUTCString();
|
|
document.cookie = name + "=" + JSON.stringify(value) + ";" + expiresString + ";path=/;SameSite=Lax;Secure";
|
|
},
|
|
get: function (name) {
|
|
const prefix = name + "=";
|
|
const cookies = document.cookie.split(";");
|
|
for (let index = 0; index < cookies.length; index++) {
|
|
let cookie = cookies[index].trim();
|
|
if (cookie.indexOf(prefix) === 0) {
|
|
try {
|
|
return JSON.parse(cookie.substring(prefix.length));
|
|
} catch (parseError) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
delete: function (name) {
|
|
document.cookie = name + "=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;";
|
|
}
|
|
};
|
|
const cookieConsentManager = {
|
|
defaultConsent: {
|
|
essential: true,
|
|
analytics: false,
|
|
marketing: false,
|
|
timestamp: null
|
|
},
|
|
init: function () {
|
|
if (!cookieBanner) {
|
|
return;
|
|
}
|
|
const storedConsent = this.getConsent();
|
|
if (storedConsent && storedConsent.timestamp) {
|
|
this.hideBanner();
|
|
this.applyConsent(storedConsent);
|
|
} else {
|
|
this.showBanner();
|
|
}
|
|
this.bindEvents();
|
|
},
|
|
bindEvents: function () {
|
|
if (acceptAllButton) {
|
|
acceptAllButton.addEventListener("click", () => this.acceptAll());
|
|
}
|
|
if (acceptEssentialButton) {
|
|
acceptEssentialButton.addEventListener("click", () => this.acceptEssential());
|
|
}
|
|
if (settingsButton) {
|
|
settingsButton.addEventListener("click", () => this.showSettings());
|
|
}
|
|
if (saveSettingsButton) {
|
|
saveSettingsButton.addEventListener("click", () => this.saveSettings());
|
|
}
|
|
if (closeSettingsButton) {
|
|
closeSettingsButton.addEventListener("click", () => this.hideSettings());
|
|
}
|
|
document.addEventListener("keydown", event => {
|
|
if (event.key === "Escape" && settingsPanel && settingsPanel.style.display !== "none") {
|
|
this.hideSettings();
|
|
}
|
|
});
|
|
},
|
|
acceptAll: function () {
|
|
const allConsent = {
|
|
essential: true,
|
|
analytics: true,
|
|
marketing: true,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
this.saveConsent(allConsent);
|
|
this.hideBanner();
|
|
this.applyConsent(allConsent);
|
|
this.showNotification("Alle Cookies wurden akzeptiert.", "success");
|
|
},
|
|
acceptEssential: function () {
|
|
const essentialConsent = {
|
|
essential: true,
|
|
analytics: false,
|
|
marketing: false,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
this.saveConsent(essentialConsent);
|
|
this.hideBanner();
|
|
this.applyConsent(essentialConsent);
|
|
this.showNotification("Nur notwendige Cookies wurden akzeptiert.", "info");
|
|
},
|
|
saveSettings: function () {
|
|
const customConsent = {
|
|
essential: true,
|
|
analytics: analyticsCheckbox ? analyticsCheckbox.checked : false,
|
|
marketing: marketingCheckbox ? marketingCheckbox.checked : false,
|
|
timestamp: new Date().toISOString()
|
|
};
|
|
this.saveConsent(customConsent);
|
|
this.hideSettings();
|
|
this.hideBanner();
|
|
this.applyConsent(customConsent);
|
|
this.showNotification("Cookie-Einstellungen wurden gespeichert.", "success");
|
|
},
|
|
saveConsent: function (consent) {
|
|
cookieStore.set(CONSENT_COOKIE_NAME, consent, CONSENT_DAYS);
|
|
},
|
|
getConsent: function () {
|
|
return cookieStore.get(CONSENT_COOKIE_NAME);
|
|
},
|
|
applyConsent: function (consent) {
|
|
const eventPayload = {
|
|
detail: consent
|
|
};
|
|
window.dispatchEvent(new CustomEvent("cookieConsentUpdated", eventPayload));
|
|
if (consent.analytics) {
|
|
this.enableAnalytics();
|
|
} else {
|
|
this.disableAnalytics();
|
|
}
|
|
if (consent.marketing) {
|
|
this.enableMarketing();
|
|
} else {
|
|
this.disableMarketing();
|
|
}
|
|
},
|
|
enableAnalytics: function () {
|
|
console.log("Analytics enabled");
|
|
},
|
|
disableAnalytics: function () {
|
|
console.log("Analytics disabled");
|
|
},
|
|
enableMarketing: function () {
|
|
console.log("Marketing enabled");
|
|
},
|
|
disableMarketing: function () {
|
|
console.log("Marketing disabled");
|
|
},
|
|
showBanner: function () {
|
|
if (cookieBanner) {
|
|
cookieBanner.classList.remove("hide");
|
|
cookieBanner.classList.add("show");
|
|
cookieBanner.setAttribute("aria-hidden", "false");
|
|
setTimeout(() => {
|
|
if (acceptAllButton) {
|
|
acceptAllButton.focus();
|
|
}
|
|
}, 100);
|
|
}
|
|
},
|
|
hideBanner: function () {
|
|
if (cookieBanner) {
|
|
cookieBanner.classList.remove("show");
|
|
cookieBanner.classList.add("hide");
|
|
cookieBanner.setAttribute("aria-hidden", "true");
|
|
}
|
|
},
|
|
showSettings: function () {
|
|
if (settingsPanel) {
|
|
const savedConsent = this.getConsent() || this.defaultConsent;
|
|
if (analyticsCheckbox) {
|
|
analyticsCheckbox.checked = savedConsent.analytics;
|
|
}
|
|
if (marketingCheckbox) {
|
|
marketingCheckbox.checked = savedConsent.marketing;
|
|
}
|
|
settingsPanel.style.display = "block";
|
|
settingsPanel.setAttribute("aria-hidden", "false");
|
|
}
|
|
},
|
|
hideSettings: function () {
|
|
if (settingsPanel) {
|
|
settingsPanel.style.display = "none";
|
|
settingsPanel.setAttribute("aria-hidden", "true");
|
|
}
|
|
},
|
|
showNotification: function (message, type) {
|
|
if (window.HexaHost && typeof window.HexaHost.showNotification === "function") {
|
|
window.HexaHost.showNotification(message, type);
|
|
}
|
|
},
|
|
resetConsent: function () {
|
|
cookieStore.delete(CONSENT_COOKIE_NAME);
|
|
this.showBanner();
|
|
if (settingsPanel) {
|
|
settingsPanel.style.display = "none";
|
|
}
|
|
}
|
|
};
|
|
if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", () => cookieConsentManager.init());
|
|
} else {
|
|
cookieConsentManager.init();
|
|
}
|
|
window.CookieConsent = cookieConsentManager;
|
|
})();
|