mirror of
https://github.com/CaiJimmy/hugo-theme-stack.git
synced 2025-06-19 04:23:30 +08:00
Integrate GDPR banner add-on following https://hugocodex.org/add-ons/cookie-consent/ with little modification for better button colors management
This commit is contained in:
parent
6474b9dfd8
commit
2d724f5fb4
9
data/consent.yaml
Normal file
9
data/consent.yaml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
items:
|
||||||
|
- title: Google Anaytics (functional)
|
||||||
|
description: This code gives us insight into the number of people that visit our website, where they are from and what they are clicking on. We follow the guidelines of the Dutch Government, which describe how to use Google Analytics without requiring explicit consent.
|
||||||
|
is_functional: true
|
||||||
|
script_file: ga.js
|
||||||
|
- title: Crisp chat
|
||||||
|
description: This code gives users the option to chat directly with us through a chat box in the bottom right corner. Visitor data will (also) be sent to Crisp.
|
||||||
|
is_functional: false
|
||||||
|
script_file: crisp.js
|
@ -29,6 +29,9 @@ params:
|
|||||||
rssFullContent: true
|
rssFullContent: true
|
||||||
favicon:
|
favicon:
|
||||||
|
|
||||||
|
GDPRbanner:
|
||||||
|
enabled: true
|
||||||
|
|
||||||
footer:
|
footer:
|
||||||
since: 2020
|
since: 2020
|
||||||
customText:
|
customText:
|
||||||
|
@ -63,6 +63,9 @@ search:
|
|||||||
other: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
|
other: "#PAGES_COUNT pages (#TIME_SECONDS seconds)"
|
||||||
|
|
||||||
footer:
|
footer:
|
||||||
|
GDPRsettings:
|
||||||
|
other: Manage GDPR settings
|
||||||
|
|
||||||
builtWith:
|
builtWith:
|
||||||
other: Built with {{ .Generator }}
|
other: Built with {{ .Generator }}
|
||||||
|
|
||||||
|
@ -62,6 +62,9 @@ search:
|
|||||||
other: "#PAGES_COUNT pagine (#TIME_SECONDS secondi)"
|
other: "#PAGES_COUNT pagine (#TIME_SECONDS secondi)"
|
||||||
|
|
||||||
footer:
|
footer:
|
||||||
|
GDPRsettings:
|
||||||
|
other: Gestisci il consenso GDPR
|
||||||
|
|
||||||
builtWith:
|
builtWith:
|
||||||
other: Realizzato con {{ .Generator }}
|
other: Realizzato con {{ .Generator }}
|
||||||
|
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
{{ if .Site.Params.GDPRbanner.enabled }}
|
||||||
|
{{ partial "helper/consent.html" . }}
|
||||||
|
{{ end }}
|
@ -1,5 +1,10 @@
|
|||||||
{{- $ThemeVersion := "3.7.0" -}}
|
{{- $ThemeVersion := "3.7.0" -}}
|
||||||
<footer class="site-footer">
|
<footer class="site-footer">
|
||||||
|
|
||||||
|
{{ if .Site.Params.GDPRbanner.enabled }}
|
||||||
|
<a class="manage-consent" href="#manage-consent">{{ T "footer.GDPRsettings" }}</a>
|
||||||
|
{{ end }}
|
||||||
|
|
||||||
<section class="copyright">
|
<section class="copyright">
|
||||||
©
|
©
|
||||||
{{ if and (.Site.Params.footer.since) (ne .Site.Params.footer.since (int (now.Format "2006"))) }}
|
{{ if and (.Site.Params.footer.since) (ne .Site.Params.footer.since (int (now.Format "2006"))) }}
|
||||||
|
169
layouts/partials/helper/consent.html
Normal file
169
layouts/partials/helper/consent.html
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
<style>
|
||||||
|
#consent-notice {padding: 1rem 1rem; display: none; text-align: center; position: fixed; bottom: 0; width: calc(100% - 2rem); background: #222; color: rgba(255,255,255,0.8);}
|
||||||
|
#consent-notice span {margin-right: 1rem;}
|
||||||
|
#consent-notice button {cursor: pointer; display: inline-block; width: auto;}
|
||||||
|
#consent-notice span a {color: inherit; text-decoration: underline; text-decoration-color: rgba(255,255,255,0.5);}
|
||||||
|
#consent-notice button.btn {margin-left: 0.5rem;}
|
||||||
|
#consent-notice button.btn.manage-consent {background: rgba(255,255,255,1); font-weight: normal;}
|
||||||
|
#consent-notice button.btn.deny-consent {background: rgba(255,0,0,1); font-weight: normal;}
|
||||||
|
#consent-notice button.btn.approve-consent {background: rgba(0,255,0,1); font-weight: normal;}
|
||||||
|
|
||||||
|
#consent-overlay {position: fixed; left: 0; top: 0; width: 100%; height: 100vh; display: none; background: rgba(0,0,0,0.75); z-index: 999999; overflow: auto; cursor: pointer;}
|
||||||
|
#consent-overlay.active {display: flex;}
|
||||||
|
#consent-overlay > div {background: white; width: 100%; max-width: 30rem; padding: 1.75rem; margin: auto; cursor: initial;}
|
||||||
|
#consent-overlay > div > div {display: flex; align-items: flex-start; margin-bottom: 1rem;}
|
||||||
|
#consent-overlay > div > div:last-child {margin: 0;}
|
||||||
|
#consent-overlay h3 {padding-top: 0;}
|
||||||
|
#consent-overlay input {margin-top: 0.3rem;}
|
||||||
|
#consent-overlay label {display: block;}
|
||||||
|
#consent-overlay .btn {margin-right: 0.5rem;}
|
||||||
|
#consent-overlay button.btn.save-consent {background: rgba(255,255,255,0.6); font-weight: normal;}
|
||||||
|
#consent-overlay button.btn.approve-consent {background: rgba(0,255,0,1); font-weight: normal;}
|
||||||
|
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
#consent-overlay > div {padding: 1.75rem 1rem;}
|
||||||
|
#consent-notice span {display: block; padding-top: 3px; margin-bottom: 1.5rem;}
|
||||||
|
#consent-notice button.btn {position: relative; bottom: 4px;}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="consent-notice"><span>We would like to use <a class="manage-consent" href="#manage-consent">third party code</a> to improve the functionality of this website.</span><button class="btn manage-consent">Manage preferences</button><button class="btn deny-consent">Deny</button><button class="btn approve-consent">Allow</button></div>
|
||||||
|
<div id="consent-overlay">
|
||||||
|
<div>
|
||||||
|
{{ range $index, $item := .Site.Data.consent.items }}
|
||||||
|
<div>
|
||||||
|
<input type="checkbox" id="item{{ $index }}" value="1" name="item{{ $index }}" {{ if $item.is_functional }}checked disabled{{ end }} />
|
||||||
|
<label for="item{{ $index }}">
|
||||||
|
<h3>{{ $item.title }}</h3>
|
||||||
|
<p>{{ $item.description }}</p>
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
<div>
|
||||||
|
<button id="save-consent" class="btn save-consent" data-consentvalue="{{ range $index, $item := .Site.Data.consent.items }}{{ if $item.is_functional}}{{ else }}0{{ end }}{{ end }}">Save preferences</button>
|
||||||
|
<button class="btn approve-consent">Allow all</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script>
|
||||||
|
|
||||||
|
const scripts = [];{{ range $index, $item := (where .Site.Data.consent.items "is_functional" false) }}
|
||||||
|
scripts[{{ $index }}] = "/js/{{ $item.script_file }}";{{ end }}
|
||||||
|
|
||||||
|
function createCookie(name,value,days) {
|
||||||
|
var expires = "";
|
||||||
|
if (days) {
|
||||||
|
var date = new Date();
|
||||||
|
date.setTime(date.getTime() + (days*24*60*60*1000));
|
||||||
|
expires = "; expires=" + date.toUTCString();
|
||||||
|
}
|
||||||
|
document.cookie = name + "=" + value + expires + "; path=/";
|
||||||
|
}
|
||||||
|
function readCookie(name) {
|
||||||
|
var nameEQ = name + "=";
|
||||||
|
var ca = document.cookie.split(';');
|
||||||
|
for(var i=0;i < ca.length;i++) {
|
||||||
|
var c = ca[i];
|
||||||
|
while (c.charAt(0)==' ') c = c.substring(1,c.length);
|
||||||
|
if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
function eraseCookie(name) {
|
||||||
|
createCookie(name,"",-1);
|
||||||
|
}
|
||||||
|
function denyAllConsentScripts() {
|
||||||
|
var consentValue = "";
|
||||||
|
scripts.forEach(function(){
|
||||||
|
consentValue = consentValue + "0";
|
||||||
|
});
|
||||||
|
acceptSomeConsentScripts(consentValue);
|
||||||
|
}
|
||||||
|
function acceptAllConsentScripts() {
|
||||||
|
var consentValue = "";
|
||||||
|
scripts.forEach(function(){
|
||||||
|
consentValue = consentValue + "1";
|
||||||
|
});
|
||||||
|
acceptSomeConsentScripts(consentValue);
|
||||||
|
}
|
||||||
|
function acceptSomeConsentScripts(consentValue) {
|
||||||
|
setConsentInputs(consentValue);
|
||||||
|
createCookie('consent-settings',consentValue,31);
|
||||||
|
document.getElementById('consent-notice').style.display = 'none';
|
||||||
|
document.getElementById('consent-overlay').classList.remove('active');
|
||||||
|
loadConsentScripts(consentValue);
|
||||||
|
}
|
||||||
|
function loadConsentScripts(consentValue) {
|
||||||
|
scripts.forEach(function(value,key){
|
||||||
|
//console.log('script'+key+' is set to ' +consentValue[key]+' and is file '+value);
|
||||||
|
if(consentValue[key]=="1") {
|
||||||
|
var s = document.createElement('script');
|
||||||
|
s.type = 'text/javascript';
|
||||||
|
s.src = value;
|
||||||
|
document.body.appendChild(s);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function setConsentInputs(consentValue) {
|
||||||
|
var elements = document.querySelectorAll('#consent-overlay input:not([disabled])');
|
||||||
|
elements.forEach(function(el,index) {
|
||||||
|
if(consentValue[index]=="1") el.checked = true;
|
||||||
|
else el.checked = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function setConsentValue() {
|
||||||
|
var elements = document.querySelectorAll('#consent-overlay input:not([disabled])');
|
||||||
|
var consentValue = "";
|
||||||
|
elements.forEach(function(el) {
|
||||||
|
if(el.checked) consentValue = consentValue + "1";
|
||||||
|
else consentValue = consentValue + "0";
|
||||||
|
});
|
||||||
|
document.getElementById("save-consent").dataset.consentvalue = consentValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
var elements = document.querySelectorAll('#consent-overlay input:not([disabled])');
|
||||||
|
elements.forEach(function(el) {
|
||||||
|
el.checked = false;
|
||||||
|
});
|
||||||
|
|
||||||
|
if(readCookie('consent-settings')) {
|
||||||
|
var consentValue = readCookie('consent-settings').toString();
|
||||||
|
console.log(consentValue);
|
||||||
|
setConsentInputs(consentValue);
|
||||||
|
loadConsentScripts(consentValue);
|
||||||
|
} else {
|
||||||
|
document.getElementById('consent-notice').style.display = 'block';
|
||||||
|
}
|
||||||
|
var elements = document.querySelectorAll('.manage-consent');
|
||||||
|
elements.forEach(function(el) {
|
||||||
|
el.addEventListener("click",function() {
|
||||||
|
document.getElementById('consent-overlay').classList.toggle('active');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
var elements = document.querySelectorAll('.deny-consent');
|
||||||
|
elements.forEach(function(el) {
|
||||||
|
el.addEventListener("click",function() {
|
||||||
|
denyAllConsentScripts();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
var elements = document.querySelectorAll('.approve-consent');
|
||||||
|
elements.forEach(function(el) {
|
||||||
|
el.addEventListener("click",function() {
|
||||||
|
acceptAllConsentScripts();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
document.getElementById("save-consent").addEventListener("click",function() {
|
||||||
|
setConsentValue();
|
||||||
|
acceptSomeConsentScripts(this.dataset.consentvalue);
|
||||||
|
});
|
||||||
|
document.getElementById("consent-overlay").addEventListener("click",function(e) {
|
||||||
|
if (!document.querySelector("#consent-overlay > div").contains(e.target)){
|
||||||
|
this.classList.toggle('active');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{ range $index, $item := .Site.Data.consent.items }}
|
||||||
|
{{ if $item.is_functional }}
|
||||||
|
<script type="text/javascript" src="/js/{{ $item.script_file }}"></script>
|
||||||
|
{{ end }}
|
||||||
|
{{ end }}
|
Loading…
Reference in New Issue
Block a user