Enhance cookie consent management and UI improvements
This commit refines the cookie consent management system by introducing a new function for handling cookie preferences and updating the UI elements in `inc_footer.php` and `inc_header.php`. It ensures that analytics and marketing scripts are executed based on user consent, improving compliance with privacy regulations. Additionally, it enhances the cookie consent interface, providing users with clearer options for managing their cookie preferences, and updates related functions for better maintainability.
This commit is contained in:
142
js/cookie-consent.js
Normal file
142
js/cookie-consent.js
Normal file
@ -0,0 +1,142 @@
|
||||
(function (window, $) {
|
||||
'use strict';
|
||||
|
||||
var STORAGE_KEY = 'cookiesPreferences';
|
||||
var LEGACY_ACCEPT = 'cookiesAccepted';
|
||||
var LEGACY_REJECT = 'cookiesRejected';
|
||||
|
||||
function setCookie(name, value, days) {
|
||||
var expires = '';
|
||||
|
||||
if (typeof days === 'number') {
|
||||
var date = new Date();
|
||||
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
||||
expires = ';expires=' + date.toUTCString();
|
||||
}
|
||||
|
||||
document.cookie = name + '=' + encodeURIComponent(value) + expires + ';path=/;SameSite=Lax';
|
||||
}
|
||||
|
||||
function deleteCookie(name) {
|
||||
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;SameSite=Lax';
|
||||
}
|
||||
|
||||
function getCookie(name) {
|
||||
var prefix = name + '=';
|
||||
var parts = decodeURIComponent(document.cookie).split(';');
|
||||
|
||||
for (var i = 0; i < parts.length; i++) {
|
||||
var part = parts[i];
|
||||
|
||||
while (part.charAt(0) === ' ') {
|
||||
part = part.substring(1);
|
||||
}
|
||||
|
||||
if (part.indexOf(prefix) === 0) {
|
||||
return part.substring(prefix.length);
|
||||
}
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
function readPreferences() {
|
||||
var raw = getCookie(STORAGE_KEY);
|
||||
|
||||
if (raw) {
|
||||
try {
|
||||
var parsed = JSON.parse(raw);
|
||||
|
||||
if (parsed && typeof parsed === 'object') {
|
||||
return {
|
||||
analytics: !!parsed.analytics,
|
||||
marketing: !!parsed.marketing,
|
||||
set: true
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
}
|
||||
}
|
||||
|
||||
if (getCookie(LEGACY_ACCEPT) === 'true') {
|
||||
return { analytics: true, marketing: true, set: true };
|
||||
}
|
||||
|
||||
if (getCookie(LEGACY_REJECT) === 'true') {
|
||||
return { analytics: false, marketing: false, set: true };
|
||||
}
|
||||
|
||||
return { analytics: false, marketing: false, set: false };
|
||||
}
|
||||
|
||||
function writePreferences(prefs, reload) {
|
||||
deleteCookie(LEGACY_ACCEPT);
|
||||
deleteCookie(LEGACY_REJECT);
|
||||
setCookie(STORAGE_KEY, JSON.stringify({
|
||||
analytics: prefs.analytics ? 1 : 0,
|
||||
marketing: prefs.marketing ? 1 : 0,
|
||||
v: 1
|
||||
}), 365);
|
||||
|
||||
if (reload !== false) {
|
||||
window.location.reload();
|
||||
}
|
||||
}
|
||||
|
||||
function syncPanel(prefs) {
|
||||
$('#cookiePrefAnalytics').prop('checked', !!prefs.analytics);
|
||||
$('#cookiePrefMarketing').prop('checked', !!prefs.marketing);
|
||||
}
|
||||
|
||||
function openBanner() {
|
||||
$('#cookieConsent').stop(true, true).fadeIn(200);
|
||||
}
|
||||
|
||||
function closeBanner() {
|
||||
$('#cookieConsent').stop(true, true).fadeOut(200);
|
||||
$('#cookiePreferencesPanel').addClass('d-none');
|
||||
}
|
||||
|
||||
window.ms1CookieConsent = {
|
||||
getPreferences: readPreferences,
|
||||
openManager: function () {
|
||||
syncPanel(readPreferences());
|
||||
$('#cookiePreferencesPanel').removeClass('d-none');
|
||||
openBanner();
|
||||
}
|
||||
};
|
||||
|
||||
$(function () {
|
||||
var prefs = readPreferences();
|
||||
|
||||
syncPanel(prefs);
|
||||
|
||||
if (!prefs.set) {
|
||||
openBanner();
|
||||
}
|
||||
|
||||
$('#acceptCookies').on('click', function () {
|
||||
writePreferences({ analytics: true, marketing: true });
|
||||
});
|
||||
|
||||
$('#rejectCookies').on('click', function () {
|
||||
writePreferences({ analytics: false, marketing: false });
|
||||
});
|
||||
|
||||
$('#customizeCookies').on('click', function () {
|
||||
$('#cookiePreferencesPanel').removeClass('d-none');
|
||||
});
|
||||
|
||||
$('#saveCookiePreferences').on('click', function () {
|
||||
writePreferences({
|
||||
analytics: $('#cookiePrefAnalytics').is(':checked'),
|
||||
marketing: $('#cookiePrefMarketing').is(':checked')
|
||||
});
|
||||
});
|
||||
|
||||
$('[data-cookie-manage]').on('click', function (event) {
|
||||
event.preventDefault();
|
||||
window.ms1CookieConsent.openManager();
|
||||
});
|
||||
});
|
||||
}(window, jQuery));
|
||||
Reference in New Issue
Block a user