j1-template 2021.1.12 → 2021.1.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_app.html +1 -1
  3. data/_includes/themes/j1/layouts/content_generator_blog_archive.html +1 -1
  4. data/_includes/themes/j1/layouts/content_generator_collection.html +1 -1
  5. data/_includes/themes/j1/layouts/content_generator_page.html +4 -1
  6. data/_includes/themes/j1/layouts/content_generator_post.html +1 -1
  7. data/_includes/themes/j1/layouts/content_generator_raw.html +1 -1
  8. data/_includes/themes/j1/layouts/layout_metadata_generator.html +55 -0
  9. data/_includes/themes/j1/modules/connectors/comment/commento.html +31 -0
  10. data/_includes/themes/j1/modules/connectors/comment/custom-provider.html +7 -8
  11. data/_includes/themes/j1/modules/connectors/comment/disqus.html +12 -54
  12. data/_includes/themes/j1/modules/connectors/comment/facebook.html +7 -8
  13. data/_includes/themes/j1/modules/connectors/comment/hyvor.html +33 -0
  14. data/_includes/themes/j1/modules/connectors/comment/just-comments.html +31 -0
  15. data/_includes/themes/j1/modules/connectors/comments +3 -0
  16. data/_layouts/default.html +51 -0
  17. data/assets/data/disqus.js +81 -0
  18. data/assets/data/hyvor.js +72 -0
  19. data/assets/error_pages/HTTP204.html +2 -1
  20. data/assets/error_pages/HTTP400.html +2 -1
  21. data/assets/error_pages/HTTP401.html +2 -1
  22. data/assets/error_pages/HTTP403.html +2 -1
  23. data/assets/error_pages/HTTP404.html +2 -1
  24. data/assets/error_pages/HTTP444.html +93 -0
  25. data/assets/error_pages/HTTP500.html +2 -1
  26. data/assets/error_pages/HTTP501.html +2 -1
  27. data/assets/error_pages/HTTP502.html +2 -1
  28. data/assets/error_pages/HTTP503.html +2 -1
  29. data/assets/themes/j1/adapter/js/algolia.js +10 -10
  30. data/assets/themes/j1/adapter/js/asciidoctor.js +6 -6
  31. data/assets/themes/j1/adapter/js/attic.js +17 -17
  32. data/assets/themes/j1/adapter/js/bmd.js +6 -6
  33. data/assets/themes/j1/adapter/js/carousel.js +10 -10
  34. data/assets/themes/j1/adapter/js/clipboard.js +10 -10
  35. data/assets/themes/j1/adapter/js/cookieConsent.js +46 -20
  36. data/assets/themes/j1/adapter/js/fam.js +34 -34
  37. data/assets/themes/j1/adapter/js/framer.js +6 -6
  38. data/assets/themes/j1/adapter/js/j1.js +322 -209
  39. data/assets/themes/j1/adapter/js/justifiedGallery.js +11 -11
  40. data/assets/themes/j1/adapter/js/justifiedGalleryCustomizer.js +19 -19
  41. data/assets/themes/j1/adapter/js/lightbox.js +6 -6
  42. data/assets/themes/j1/adapter/js/logger.js +7 -7
  43. data/assets/themes/j1/adapter/js/mmenu.js +25 -25
  44. data/assets/themes/j1/adapter/js/navigator.js +48 -48
  45. data/assets/themes/j1/adapter/js/quicksearch.js +6 -6
  46. data/assets/themes/j1/adapter/js/rouge.js +7 -7
  47. data/assets/themes/j1/adapter/js/rtable.js +6 -6
  48. data/assets/themes/j1/adapter/js/themer.js +24 -20
  49. data/assets/themes/j1/adapter/js/toccer.js +9 -9
  50. data/assets/themes/j1/modules/backstretch/js/backstretch.js +3 -3
  51. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +27 -20
  52. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.min.js +287 -1
  53. data/assets/themes/j1/modules/lunrSearch/js/quicksearch.js +1 -1
  54. data/assets/themes/j1/modules/themeSwitcher/js/switcher.js +19 -19
  55. data/lib/j1/version.rb +1 -1
  56. data/lib/starter_web/Gemfile +1 -1
  57. data/lib/starter_web/_config.yml +42 -24
  58. data/lib/starter_web/_data/j1_config.yml +22 -11
  59. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  60. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  61. data/lib/starter_web/index.html +3 -3
  62. data/lib/starter_web/package.json +1 -1
  63. data/lib/starter_web/pages/public/asciidoc_skeletons/book/book.adoc +3 -0
  64. data/lib/starter_web/pages/public/asciidoc_skeletons/multi-document/multi.adoc +3 -0
  65. data/lib/starter_web/pages/public/asciidoc_skeletons/simple-document/simple.adoc +3 -0
  66. data/lib/starter_web/pages/public/blog/navigator/archive.html +4 -0
  67. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +4 -0
  68. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +4 -0
  69. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +5 -1
  70. data/lib/starter_web/pages/public/blog/navigator/index.html +4 -0
  71. data/lib/starter_web/pages/public/cookieConsent.adoc +3 -0
  72. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +0 -1
  73. data/lib/starter_web/pages/public/learn/roundtrip/100_present_videos.adoc +2 -1
  74. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +0 -2
  75. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +0 -2
  76. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +0 -1
  77. data/lib/starter_web/pages/public/learn/roundtrip/410_bs_modals_extentions.adoc +0 -1
  78. data/lib/starter_web/pages/public/learn/roundtrip/420_responsive_tables_extensions.adoc +0 -1
  79. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +0 -1
  80. data/lib/starter_web/pages/public/learn/roundtrip/600_quicksearch.adoc +0 -1
  81. data/lib/starter_web/pages/public/learn/where_to_go.adoc +0 -1
  82. data/lib/starter_web/pages/public/legal/en/100_copyright.adoc +3 -1
  83. data/lib/starter_web/pages/public/legal/en/200_impress.adoc +3 -1
  84. data/lib/starter_web/pages/public/legal/en/300_privacy.adoc +78 -17
  85. data/lib/starter_web/pages/public/legal/en/400_comment_policy.adoc +3 -1
  86. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  87. data/lib/starter_web/utilsrv/package.json +1 -1
  88. metadata +8 -3
  89. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.org.asciidoc +0 -244
@@ -127,8 +127,8 @@ j1.adapter['toccer'] = (function () {
127
127
 
128
128
  // initialize state flag
129
129
  _this.setState('started');
130
- logger.info('state: ' + _this.getState());
131
- logger.info('Module is being initialized');
130
+ logger.info('\n' + 'state: ' + _this.getState());
131
+ logger.info('\n' + 'module is being initialized');
132
132
 
133
133
  // create settings object from frontmatterOptions
134
134
  var frontmatterOptions = options != null ? $.extend({}, options) : {};
@@ -175,9 +175,9 @@ j1.adapter['toccer'] = (function () {
175
175
  _this.initToccerCore(settings);
176
176
  _this.setState('finished');
177
177
 
178
- logger.info('state: ' + _this.getState());
179
- logger.info('module initialized successfully');
180
- logger.info('met dependencies for: j1');
178
+ logger.info('\n' + 'state: ' + _this.getState());
179
+ logger.info('\n' + 'module initialized successfully');
180
+ logger.info('\n' + 'met dependencies for: j1');
181
181
  clearInterval(dependencies_met_navigator);
182
182
  }
183
183
  }, 25);
@@ -219,7 +219,7 @@ j1.adapter['toccer'] = (function () {
219
219
  scrollOffset = scrollOffset + moduleOptions.scrollSmoothOffset
220
220
 
221
221
  _this.setState('running');
222
- logger.info('state: ' + _this.getState());
222
+ logger.info('\n' + 'state: ' + _this.getState());
223
223
 
224
224
  // tocbot get fired if HTML portion is loaded (AJAX load finished)
225
225
  //
@@ -256,7 +256,7 @@ j1.adapter['toccer'] = (function () {
256
256
  throttleTimeout: moduleOptions.throttleTimeout
257
257
  });
258
258
  /* eslint-enable */
259
- logger.info('met dependencies for: xhrData');
259
+ logger.info('\n' + 'met dependencies for: loadHTML');
260
260
  clearInterval(dependencies_met_ajax_load_finished);
261
261
  } // END AJAX load finished
262
262
  }, 25); // END dependencies_met_ajax_load_finished
@@ -323,7 +323,7 @@ j1.adapter['toccer'] = (function () {
323
323
  messageHandler: function (sender, message) {
324
324
  var json_message = JSON.stringify(message, undefined, 2);
325
325
 
326
- logText = 'received message from ' + sender + ': ' + json_message;
326
+ logText = '\n' + 'received message from ' + sender + ': ' + json_message;
327
327
  logger.debug(logText);
328
328
 
329
329
  // -----------------------------------------------------------------------
@@ -333,7 +333,7 @@ j1.adapter['toccer'] = (function () {
333
333
  //
334
334
  // Place handling of command|action here
335
335
  //
336
- logger.info(message.text);
336
+ logger.info('\n' + message.text);
337
337
  }
338
338
 
339
339
  //
@@ -861,12 +861,12 @@
861
861
 
862
862
  // jadams, 2017-12-07: Added log for testing
863
863
  if(this.options.debug) {
864
- logText = 'resize: boxHeight x boxWidth: ' + boxHeight + ' x ' + boxWidth;
864
+ logText = '\n' + 'resize: boxHeight x boxWidth: ' + boxHeight + ' x ' + boxWidth;
865
865
  logger.debug(logText);
866
866
  }
867
867
 
868
868
  if ( boxHeight == 0 || boxWidth == 0 ) {
869
- logText = 'Kacke am Schuh';
869
+ logText = '\n' + 'Kacke am Schuh';
870
870
  logger.warn(logText);
871
871
  }
872
872
 
@@ -1083,7 +1083,7 @@
1083
1083
  if ($(myID).is(':visible')) {
1084
1084
  // clear interval checking
1085
1085
  clearInterval(isVisible);
1086
- logger.info('container visible on id: ' + myID);
1086
+ logger.info('\n' + 'container visible on id: ' + myID);
1087
1087
  that.resize();
1088
1088
  }
1089
1089
  }, 50); // END 'isVisible'
@@ -38,16 +38,18 @@
38
38
  // -----------------------------------------------------------------------------
39
39
 
40
40
  function BootstrapCookieConsent(props) {
41
+ var logger = log4javascript.getLogger('j1.core.bsCookieConsent');
42
+ var modalId = 'bccs-modal';
43
+ var self = this;
44
+ var detailedSettingsShown = false;
45
+ var url = new liteURL(window.location.href);
46
+ var secure = (url.protocol.includes('https')) ? true : false;
41
47
  var logText;
42
48
  var current_page;
43
49
  var whitelisted;
44
- var logger = log4javascript.getLogger('j1.core.bsCookieConsent');
45
- var modalId = "bccs-modal"
46
- var self = this
47
- var detailedSettingsShown = false
48
50
 
49
- logger.info('Initializing core module: started');
50
- logger.info('state: started');
51
+ logger.info('\n' + 'initializing core module: started');
52
+ logger.info('\n' + 'state: started');
51
53
 
52
54
  this.props = {
53
55
  autoShowDialog: true, // disable autoShowModal on the privacy policy and legal notice pages, to make these pages readable
@@ -59,7 +61,8 @@ function BootstrapCookieConsent(props) {
59
61
  postSelectionCallback: undefined, // callback function, called after the user has made his selection
60
62
  whitelisted: [], // pages NO consent modal page is issued
61
63
  xhr_data_element: "", // container for the language-specific consent modal taken from /assets/data/cookieconsent.html
62
- sameSite: "Strict" // restrict consent cookie to first-party, do NOT send cookie to other domains
64
+ sameSite: "Strict", // restrict consent cookie to first-party, do NOT send cookie to other domains
65
+ secure: false //
63
66
  }
64
67
 
65
68
  for (var property in props) {
@@ -76,7 +79,7 @@ function BootstrapCookieConsent(props) {
76
79
  }
77
80
 
78
81
  var Cookie = {
79
- set: function (name, value, days, samesite) {
82
+ set: function (name, value, days, samesite, secure) {
80
83
  var value_encoded = window.btoa(value);
81
84
  var expires = "";
82
85
  if (days) {
@@ -84,7 +87,11 @@ function BootstrapCookieConsent(props) {
84
87
  date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
85
88
  expires = "; expires=" + date.toUTCString();
86
89
  }
87
- document.cookie = name + "=" + (value_encoded || '') + expires + '; Path=/; SameSite=' + samesite + ';';
90
+ if (secure) {
91
+ document.cookie = name + "=" + (value_encoded || '') + expires + '; Path=/; SameSite=' + samesite + '; ' + 'secure=' + secure + ';';
92
+ } else {
93
+ document.cookie = name + "=" + (value_encoded || '') + expires + '; Path=/; SameSite=' + samesite + ';';
94
+ }
88
95
  },
89
96
  get: function (name) {
90
97
  var nameEQ = name + "=";
@@ -119,7 +126,7 @@ function BootstrapCookieConsent(props) {
119
126
 
120
127
  self.modal = document.getElementById(modalId);
121
128
  if (!self.modal) {
122
- logger.info('Load consent modal');
129
+ logger.info('\n' + 'load consent modal');
123
130
  self.modal = document.createElement("div");
124
131
  self.modal.id = modalId;
125
132
  self.modal.setAttribute("class", "modal fade");
@@ -140,7 +147,7 @@ function BootstrapCookieConsent(props) {
140
147
  var templateUrl = self.props.contentURL + '/' + 'index.html';
141
148
  $.get(templateUrl)
142
149
  .done(function (data) {
143
- logger.info('Loading Consent modal: successfully');
150
+ logger.info('\n' + 'loading consent modal: successfully');
144
151
  self.modal.innerHTML = data;
145
152
  self.modal.innerHTML = $('#' + self.props.xhr_data_element).eq(0).html();
146
153
 
@@ -154,7 +161,7 @@ function BootstrapCookieConsent(props) {
154
161
  self.$buttonSave = $("#bccs-buttonSave");
155
162
  self.$buttonAgreeAll = $("#bccs-buttonAgreeAll");
156
163
 
157
- logger.info('Load/Initialze options from cookie');
164
+ logger.info('\n' + 'load/initialze options from cookie');
158
165
 
159
166
  updateButtons();
160
167
  updateOptionsFromCookie();
@@ -167,7 +174,7 @@ function BootstrapCookieConsent(props) {
167
174
  updateButtons();
168
175
  });
169
176
 
170
- logger.info('Initialze event handler');
177
+ logger.info('\n' + 'initialze event handler');
171
178
 
172
179
  self.$buttonDoNotAgree.click(function () {
173
180
  doNotAgree();
@@ -187,8 +194,8 @@ function BootstrapCookieConsent(props) {
187
194
  });
188
195
  })
189
196
  .fail(function () {
190
- logger.error('Loading Consent modal: failed');
191
- logger.info('Probably no `contentURL` set');
197
+ logger.error('\n' + 'loading consent modal: failed');
198
+ logger.warn('\n' + 'probably no `contentURL` set');
192
199
  })
193
200
  } else {
194
201
  self.$modal.modal("show")
@@ -239,12 +246,12 @@ function BootstrapCookieConsent(props) {
239
246
  }
240
247
 
241
248
  function agreeAll() {
242
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays, self.props.sameSite);
249
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
243
250
  self.$modal.modal("hide");
244
251
  }
245
252
 
246
253
  function doNotAgree() {
247
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays, self.props.sameSite);
254
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
248
255
 
249
256
  // jadams, 2021-07-15: all cookies NOT longer supported by j1.expireCookie
250
257
  // TODO: Create loop over all cookies found in page
@@ -257,7 +264,7 @@ function BootstrapCookieConsent(props) {
257
264
  }
258
265
 
259
266
  function saveSettings() {
260
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays, self.props.sameSite);
267
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
261
268
  self.$modal.modal("hide");
262
269
  }
263
270
 
@@ -271,8 +278,8 @@ function BootstrapCookieConsent(props) {
271
278
  // API functions
272
279
  // ---------------------------------------------------------------------------
273
280
 
274
- logger.info('Initializing core module finished');
275
- logger.info('state: finished');
281
+ logger.info('\n' + 'initializing core module finished');
282
+ logger.info('\n' + 'state: finished');
276
283
 
277
284
  // show the consent dialog (modal)
278
285
  // ---------------------------------------------------------------------------
@@ -24,4 +24,290 @@
24
24
  # outside of J1 Template!
25
25
  # -----------------------------------------------------------------------------
26
26
  */
27
- "use strict";function BootstrapCookieConsent(c){var g;var e;var q;var r=log4javascript.getLogger("j1.core.bsCookieConsent");var p="bccs-modal";var l=this;var n=false;r.info("Initializing core module: started");r.info("state: started");this.props={autoShowDialog:true,language:navigator.language,languages:["en","de"],contentURL:"./content",cookieName:"cookie-consent-settings",cookieStorageDays:365,postSelectionCallback:undefined,whitelisted:[],xhr_data_element:""};for(var d in c){this.props[d]=c[d]}this.language=this.props.language;if(this.language.indexOf("-")!==-1){this.language=this.language.split("-")[0]}if(!this.props.languages.includes(this.language)){this.language=this.props.languages[0]}var f={set:function(u,v,x){var w=window.btoa(v);var s="";if(x){var t=new Date();t.setTime(t.getTime()+(x*24*60*60*1000));s="; expires="+t.toUTCString()}document.cookie=u+"="+(w||"")+s+"; Path=/; SameSite=Strict;"},get:function(t){var w=t+"=";var s=document.cookie.split(";");for(var u=0;u<s.length;u++){var y=s[u];while(y.charAt(0)===" "){y=y.substring(1,y.length)}if(y.indexOf(w)===0){var x=y.substring(w.length,y.length);var v=window.atob(x);return v}}return undefined}};var k={documentReady:function(s){if(document.readyState!=="loading"){s()}else{document.addEventListener("DOMContentLoaded",s)}}};function j(s){k.documentReady(function(){l.modal=document.getElementById(p);if(!l.modal){r.info("Load consent modal");l.modal=document.createElement("div");l.modal.id=p;l.modal.setAttribute("class","modal fade");l.modal.setAttribute("tabindex","-1");l.modal.setAttribute("role","dialog");l.modal.setAttribute("aria-labelledby",p);document.body.append(l.modal);l.$modal=$(l.modal);if(l.props.postSelectionCallback){l.$modal.on("hidden.bs.modal",function(){l.props.postSelectionCallback()})}var t=l.props.contentURL+"/index.html";$.get(t).done(function(u){r.info("Loading Consent modal: successfully");l.modal.innerHTML=u;l.modal.innerHTML=$("#"+l.props.xhr_data_element).eq(0).html();$(l.modal).modal({backdrop:"static",keyboard:false});l.$buttonDoNotAgree=$("#bccs-buttonDoNotAgree");l.$buttonAgree=$("#bccs-buttonAgree");l.$buttonSave=$("#bccs-buttonSave");l.$buttonAgreeAll=$("#bccs-buttonAgreeAll");r.info("Load/Initialze options from cookie");i();h();$("#bccs-options").on("hide.bs.collapse",function(){n=false;i()}).on("show.bs.collapse",function(){n=true;i()});r.info("Initialze event handler");l.$buttonDoNotAgree.click(function(){b()});l.$buttonAgree.click(function(){m()});l.$buttonSave.click(function(){$("#bccs-options").collapse("hide");o();h()});l.$buttonAgreeAll.click(function(){$("#bccs-options").collapse("hide");m();h()})}).fail(function(){r.error("Loading Consent modal: failed");r.info("Probably no `contentURL` set")})}else{l.$modal.modal("show")}}.bind(this))}function h(){var u=l.getSettings();if(u){for(var t in u){var s=l.$modal.find("#bccs-options .bccs-option[data-name='"+t+"'] input[type='checkbox']");s.prop("checked",u[t])}}}function i(){if(n){l.$buttonDoNotAgree.hide();l.$buttonAgree.hide();l.$buttonSave.show();l.$buttonAgreeAll.show()}else{l.$buttonDoNotAgree.show();l.$buttonAgree.show();l.$buttonSave.hide();l.$buttonAgreeAll.hide()}}function a(t){var s=l.$modal.find("#bccs-options .bccs-option");var v={};for(var w=0;w<s.length;w++){var y=s[w];var u=y.getAttribute("data-name");if(u==="necessary"){v[u]=true}else{if(t===undefined){var x=$(y).find("input[type='checkbox']");v[u]=x.prop("checked")}else{v[u]=!!t}}}return v}function m(){f.set(l.props.cookieName,JSON.stringify(a(true)),l.props.cookieStorageDays);l.$modal.modal("hide")}function b(){f.set(l.props.cookieName,JSON.stringify(a(false)),l.props.cookieStorageDays);r.warn("delete cookie: j1.user.consent");j1.deleteCookie("all");l.$modal.modal("hide");j1.goHome()}function o(){f.set(l.props.cookieName,JSON.stringify(a()),l.props.cookieStorageDays);l.$modal.modal("hide")}q=(this.props.whitelisted.indexOf(window.location.pathname)>-1);if(f.get(this.props.cookieName)===undefined&&this.props.autoShowDialog&&!q){j()}r.info("Initializing core module finished");r.info("state: finished");this.showDialog=function(){q=(this.props.whitelisted.indexOf(window.location.pathname)>-1);if(!q){j()}};this.getSettings=function(t){var s=f.get(l.props.cookieName);if(s){var u=JSON.parse(f.get(l.props.cookieName));if(t===undefined){return u}else{if(u){return u[t]}else{return false}}}else{return undefined}}};
27
+ 'use strict';
28
+
29
+ // -----------------------------------------------------------------------------
30
+ // ESLint shimming
31
+ // -----------------------------------------------------------------------------
32
+ /* eslint indent: "off" */
33
+ /* eslint no-unused-vars: "off" */
34
+ /* eslint no-undef: "off" */
35
+ /* eslint no-redeclare: "off" */
36
+ /* eslint indent: "off" */
37
+ /* eslint JSUnfilteredForInLoop: "off" */
38
+ // -----------------------------------------------------------------------------
39
+
40
+ function BootstrapCookieConsent(props) {
41
+ var logger = log4javascript.getLogger('j1.core.bsCookieConsent');
42
+ var modalId = 'bccs-modal';
43
+ var self = this;
44
+ var detailedSettingsShown = false;
45
+ var url = new liteURL(window.location.href);
46
+ var secure = (url.protocol.includes('https')) ? true : false;
47
+ var logText;
48
+ var current_page;
49
+ var whitelisted;
50
+
51
+ logger.info('\n' + 'initializing core module: started');
52
+ logger.info('\n' + 'state: started');
53
+
54
+ this.props = {
55
+ autoShowDialog: true, // disable autoShowModal on the privacy policy and legal notice pages, to make these pages readable
56
+ language: navigator.language, // the language, in which the modal is shown
57
+ languages: ["en", "de"], // supported languages (in ./content/), defaults to first in array
58
+ contentURL: "./content", // this URL must contain the dialogs content in the needed languages
59
+ cookieName: "cookie-consent-settings", // the name of the cookie in which the configuration is stored as JSON
60
+ cookieStorageDays: 365, // the duration the cookie configuration is stored on the client
61
+ postSelectionCallback: undefined, // callback function, called after the user has made his selection
62
+ whitelisted: [], // pages NO consent modal page is issued
63
+ xhr_data_element: "", // container for the language-specific consent modal taken from /assets/data/cookieconsent.html
64
+ sameSite: "Strict", // restrict consent cookie to first-party, do NOT send cookie to other domains
65
+ secure: false //
66
+ }
67
+
68
+ for (var property in props) {
69
+ this.props[property] = props[property];
70
+ }
71
+
72
+ this.language = this.props.language
73
+ if (this.language.indexOf("-") !== -1) {
74
+ this.language = this.language.split("-")[0];
75
+ }
76
+
77
+ if (!this.props.languages.includes(this.language)) {
78
+ this.language = this.props.languages[0]; // fallback on default language
79
+ }
80
+
81
+ var Cookie = {
82
+ set: function (name, value, days, samesite, secure) {
83
+ var value_encoded = window.btoa(value);
84
+ var expires = "";
85
+ if (days) {
86
+ var date = new Date();
87
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
88
+ expires = "; expires=" + date.toUTCString();
89
+ }
90
+ if (secure) {
91
+ document.cookie = name + "=" + (value_encoded || '') + expires + '; Path=/; SameSite=' + samesite + '; ' + 'secure=' + secure + ';';
92
+ } else {
93
+ document.cookie = name + "=" + (value_encoded || '') + expires + '; Path=/; SameSite=' + samesite + ';';
94
+ }
95
+ },
96
+ get: function (name) {
97
+ var nameEQ = name + "=";
98
+ var ca = document.cookie.split(';');
99
+ for (var i = 0; i < ca.length; i++) {
100
+ var c = ca[i];
101
+ while (c.charAt(0) === ' ') {
102
+ c = c.substring(1, c.length);
103
+ }
104
+ if (c.indexOf(nameEQ) === 0) {
105
+ var value_encoded = c.substring(nameEQ.length, c.length);
106
+ var value = window.atob(value_encoded);
107
+ return value;
108
+ }
109
+ }
110
+ return undefined
111
+ }
112
+ }
113
+
114
+ var Events = {
115
+ documentReady: function (onDocumentReady) {
116
+ if (document.readyState !== 'loading') {
117
+ onDocumentReady();
118
+ } else {
119
+ document.addEventListener('DOMContentLoaded', onDocumentReady);
120
+ }
121
+ }
122
+ }
123
+
124
+ function showDialog(options) {
125
+ Events.documentReady(function () {
126
+
127
+ self.modal = document.getElementById(modalId);
128
+ if (!self.modal) {
129
+ logger.info('\n' + 'load consent modal');
130
+ self.modal = document.createElement("div");
131
+ self.modal.id = modalId;
132
+ self.modal.setAttribute("class", "modal fade");
133
+ self.modal.setAttribute("tabindex", "-1");
134
+ self.modal.setAttribute("role", "dialog");
135
+ self.modal.setAttribute("aria-labelledby", modalId);
136
+ document.body.append(self.modal);
137
+ self.$modal = $(self.modal);
138
+
139
+ if (self.props.postSelectionCallback) {
140
+ self.$modal.on("hidden.bs.modal", function () {
141
+ self.props.postSelectionCallback();
142
+ });
143
+ }
144
+
145
+ // load modal content
146
+ //
147
+ var templateUrl = self.props.contentURL + '/' + 'index.html';
148
+ $.get(templateUrl)
149
+ .done(function (data) {
150
+ logger.info('\n' + 'loading consent modal: successfully');
151
+ self.modal.innerHTML = data;
152
+ self.modal.innerHTML = $('#' + self.props.xhr_data_element).eq(0).html();
153
+
154
+ $(self.modal).modal({
155
+ backdrop: "static",
156
+ keyboard: false
157
+ });
158
+
159
+ self.$buttonDoNotAgree = $("#bccs-buttonDoNotAgree");
160
+ self.$buttonAgree = $("#bccs-buttonAgree");
161
+ self.$buttonSave = $("#bccs-buttonSave");
162
+ self.$buttonAgreeAll = $("#bccs-buttonAgreeAll");
163
+
164
+ logger.info('\n' + 'load/initialze options from cookie');
165
+
166
+ updateButtons();
167
+ updateOptionsFromCookie();
168
+
169
+ $("#bccs-options").on("hide.bs.collapse", function () {
170
+ detailedSettingsShown = false;
171
+ updateButtons();
172
+ }).on("show.bs.collapse", function () {
173
+ detailedSettingsShown = true;
174
+ updateButtons();
175
+ });
176
+
177
+ logger.info('\n' + 'initialze event handler');
178
+
179
+ self.$buttonDoNotAgree.click(function () {
180
+ doNotAgree();
181
+ });
182
+ self.$buttonAgree.click(function () {
183
+ agreeAll();
184
+ });
185
+ self.$buttonSave.click(function () {
186
+ $("#bccs-options").collapse('hide');
187
+ saveSettings();
188
+ updateOptionsFromCookie();
189
+ });
190
+ self.$buttonAgreeAll.click(function () {
191
+ $("#bccs-options").collapse('hide');
192
+ agreeAll();
193
+ updateOptionsFromCookie();
194
+ });
195
+ })
196
+ .fail(function () {
197
+ logger.error('\n' + 'loading consent modal: failed');
198
+ logger.warn('\n' + 'probably no `contentURL` set');
199
+ })
200
+ } else {
201
+ self.$modal.modal("show")
202
+ }
203
+ }.bind(this))
204
+ }
205
+
206
+ function updateOptionsFromCookie() {
207
+ var settings = self.getSettings();
208
+ if (settings) {
209
+ for (var setting in settings) {
210
+ var $checkbox = self.$modal.find("#bccs-options .bccs-option[data-name='" + setting + "'] input[type='checkbox']");
211
+ $checkbox.prop("checked", settings[setting]);
212
+ }
213
+ }
214
+ }
215
+
216
+ function updateButtons() {
217
+ if (detailedSettingsShown) {
218
+ self.$buttonDoNotAgree.hide();
219
+ self.$buttonAgree.hide();
220
+ self.$buttonSave.show();
221
+ self.$buttonAgreeAll.show();
222
+ } else {
223
+ self.$buttonDoNotAgree.show();
224
+ self.$buttonAgree.show();
225
+ self.$buttonSave.hide();
226
+ self.$buttonAgreeAll.hide();
227
+ }
228
+ }
229
+
230
+ function gatherOptions(setAllExceptNecessary) {
231
+ var $options = self.$modal.find("#bccs-options .bccs-option");
232
+ var options = {};
233
+ for (var i = 0; i < $options.length; i++) {
234
+ var option = $options[i];
235
+ var name = option.getAttribute("data-name");
236
+ if (name === "necessary") {
237
+ options[name] = true;
238
+ } else if (setAllExceptNecessary === undefined) {
239
+ var $checkbox = $(option).find("input[type='checkbox']");
240
+ options[name] = $checkbox.prop("checked");
241
+ } else {
242
+ options[name] = !!setAllExceptNecessary;
243
+ }
244
+ }
245
+ return options
246
+ }
247
+
248
+ function agreeAll() {
249
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
250
+ self.$modal.modal("hide");
251
+ }
252
+
253
+ function doNotAgree() {
254
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
255
+
256
+ // jadams, 2021-07-15: all cookies NOT longer supported by j1.expireCookie
257
+ // TODO: Create loop over all cookies found in page
258
+ //
259
+ // logger.warn('expire all cookies');
260
+ // j1.expireCookie('all');
261
+
262
+ self.$modal.modal('hide')
263
+ j1.goHome();
264
+ }
265
+
266
+ function saveSettings() {
267
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays, self.props.sameSite, self.props.secure);
268
+ self.$modal.modal("hide");
269
+ }
270
+
271
+ // call consent dialog if no cookie found (except pages whitelisted)
272
+ //
273
+ whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
274
+ if (Cookie.get(this.props.cookieName) === undefined && this.props.autoShowDialog && !whitelisted) {
275
+ showDialog();
276
+ }
277
+
278
+ // API functions
279
+ // ---------------------------------------------------------------------------
280
+
281
+ logger.info('\n' + 'initializing core module finished');
282
+ logger.info('\n' + 'state: finished');
283
+
284
+ // show the consent dialog (modal)
285
+ // ---------------------------------------------------------------------------
286
+ this.showDialog = function () {
287
+ whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
288
+ if (!whitelisted) {
289
+ showDialog();
290
+ }
291
+ }
292
+
293
+ // collect settings from consent cookie
294
+ // ---------------------------------------------------------------------------
295
+ this.getSettings = function (optionName) {
296
+ var cookie = Cookie.get(self.props.cookieName);
297
+ if (cookie) {
298
+ var settings = JSON.parse(Cookie.get(self.props.cookieName));
299
+ if (optionName === undefined) {
300
+ return settings;
301
+ } else {
302
+ if (settings) {
303
+ return settings[optionName];
304
+ } else {
305
+ return false;
306
+ }
307
+ }
308
+ } else {
309
+ return undefined;
310
+ }
311
+ } // END getSettings
312
+
313
+ } // END BootstrapCookieConsent