j1-template 2021.1.5 → 2021.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/themes.json +6 -6
  3. data/assets/themes/j1/adapter/js/cookieConsent.js +54 -28
  4. data/assets/themes/j1/adapter/js/j1.js +119 -150
  5. data/assets/themes/j1/adapter/js/themer.js +37 -29
  6. data/assets/themes/j1/adapter/js/toccer.js +4 -45
  7. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js +286 -286
  8. data/assets/themes/j1/modules/cookieConsent/js/cookieConsent.min.js +3 -3
  9. data/assets/themes/j1/modules/fam/css/{uno → theme/uno}/fam.css +0 -0
  10. data/assets/themes/j1/modules/fam/css/theme/uno/fam.min.css +15 -0
  11. data/assets/themes/j1/modules/fam/js/fam.js +1 -6
  12. data/assets/themes/j1/modules/mmenuLight/css/{mmenu.css → mmenu-light.css} +0 -0
  13. data/assets/themes/j1/modules/mmenuLight/css/{mmenu.min.css → mmenu-light.min.css} +0 -0
  14. data/assets/themes/j1/modules/mmenuLight/css/theme/{uno.css → uno/mmenu.css} +0 -0
  15. data/assets/themes/j1/modules/mmenuLight/css/theme/{uno.min.css → uno/mmenu.min.css} +0 -0
  16. data/assets/themes/j1/modules/rtable/css/theme/{uno.css → uno/rtable.css} +0 -0
  17. data/assets/themes/j1/modules/rtable/css/theme/{uno.min.css → uno/rtable.min.css} +0 -0
  18. data/assets/themes/j1/modules/themeSwitcher/js/switcher.js +33 -47
  19. data/assets/themes/j1/modules/themeSwitcher/js/switcher.min.js +410 -2
  20. data/lib/j1/version.rb +1 -1
  21. data/lib/j1_app/j1_auth_manager/auth_manager.rb +2 -3
  22. data/lib/starter_web/Gemfile +1 -1
  23. data/lib/starter_web/_config.yml +1 -1
  24. data/lib/starter_web/_data/j1_config.yml +20 -17
  25. data/lib/starter_web/_data/modules/defaults/themer.yml +2 -1
  26. data/lib/starter_web/_data/private.default.yml +119 -0
  27. data/lib/starter_web/_data/resources.yml +6 -7
  28. data/lib/starter_web/_includes/attributes.asciidoc +1 -1
  29. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  30. data/lib/starter_web/dot.gitignore +1 -1
  31. data/lib/starter_web/package.json +1 -1
  32. data/lib/starter_web/pages/public/blog/navigator/archive.html +3 -2
  33. data/lib/starter_web/pages/public/blog/navigator/archive/categoryview.html +3 -2
  34. data/lib/starter_web/pages/public/blog/navigator/archive/dateview.html +3 -2
  35. data/lib/starter_web/pages/public/blog/navigator/archive/tagview.html +3 -2
  36. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  37. data/lib/starter_web/utilsrv/package.json +1 -1
  38. metadata +11 -9
@@ -101,32 +101,34 @@ j1.adapter['themer'] = (function (j1, window) {
101
101
  // ---------------------------------------------------------------------------
102
102
  // globals
103
103
  // ---------------------------------------------------------------------------
104
- var environment = '{{environment}}';
105
- var themerOptions = $.extend({}, {{themer_options | replace: '=>', ':' | replace: 'nil', '""' }});
106
- var user_state = {};
107
- var cookie_names = j1.getCookieNames();
108
- var cookie_user_state_name = cookie_names.user_state;
109
- var user_state_detected = false;
110
- var styleLoaded = false;
111
- var id = 'default';
104
+ var environment = '{{environment}}';
105
+ var themerOptions = $.extend({}, {{themer_options | replace: '=>', ':' | replace: 'nil', '""' }});
106
+ var user_state = {};
107
+ var user_consent = {};
108
+ var cookie_names = j1.getCookieNames();
109
+ var user_state_detected = false;
110
+ var styleLoaded = false;
111
+ var id = 'default';
112
112
  var user_state_cookie;
113
113
  var theme_css_html;
114
114
  var _this;
115
115
  var logger;
116
116
  var logText;
117
117
 
118
+ var cssExtension = (environment === 'production')
119
+ ? '.min.css'
120
+ : '.css';
121
+
118
122
  var default_theme_name = '{{default_theme.name}}';
119
123
  var default_theme_author = '{{default_theme.author}}';
120
- var default_theme_author_url = '{{default_theme.theme_author_url}}';
124
+ var default_theme_author_url = '{{default_theme.author_url}}';
121
125
  var default_theme_css_name = default_theme_name.toLowerCase().replace(' ', '-');
122
- var default_theme_css = (environment == 'production')
123
- ? '{{asset_path}}/{{theme_base}}/' +default_theme_css_name+ '/bootstrap.min.css'
124
- : '{{asset_path}}/{{theme_base}}/' +default_theme_css_name+ '/bootstrap.css';
126
+ var default_theme_css = '{{asset_path}}/{{theme_base}}/' + default_theme_css_name + '/bootstrap' + cssExtension;
125
127
 
126
128
  // ---------------------------------------------------------------------------
127
129
  // helper functions
128
130
  // ---------------------------------------------------------------------------
129
- // Example: var styleLoaded = styleSheetLoaded('');
131
+
130
132
  function styleSheetLoaded(styleSheet) {
131
133
  var sheets = document.styleSheets, stylesheet = sheets[(sheets.length - 1)];
132
134
 
@@ -157,15 +159,15 @@ j1.adapter['themer'] = (function (j1, window) {
157
159
  _this.state = 'started';
158
160
  logger.info('state: ' + _this.getState());
159
161
 
160
- // Detect|Set J1 UserState
161
- user_state_detected = j1.existsCookie(cookie_user_state_name);
162
+ // detect|set user state cookie
163
+ user_state_detected = j1.existsCookie(cookie_names.user_state);
162
164
  if (user_state_detected) {
163
- user_state = j1.readCookie(cookie_user_state_name);
165
+ user_state = j1.readCookie(cookie_names.user_state);
166
+ user_consent = j1.readCookie(cookie_names.user_consent);
164
167
  }
165
168
 
166
- // initial user_state cookie
167
- //
168
- if ( user_state.theme_name == '') {
169
+ // initial theme data
170
+ if (user_state.theme_css === '') {
169
171
  user_state.theme_name = default_theme_name;
170
172
  user_state.theme_css = default_theme_css;
171
173
  user_state.theme_author = default_theme_author;
@@ -175,29 +177,35 @@ j1.adapter['themer'] = (function (j1, window) {
175
177
  styleLoaded = styleSheetLoaded(user_state.theme_css);
176
178
  theme_css_html = '<link rel="stylesheet" id="' + id + '" href="' + user_state.theme_css + '" type="text/css" />';
177
179
 
178
- // skip loading UNO CSS file except it is NOT loaded
179
- //
180
+ // skip loading theme UNO css file except NOT loaded
180
181
  if (!user_state.theme_name.includes('Uno') || !styleLoaded) {
181
182
  $('head').append(theme_css_html);
182
183
  }
183
184
 
184
185
  // store if theme_switcher is enabled
185
- //
186
186
  user_state.theme_switcher = themerOptions.enabled;
187
187
 
188
- j1.writeCookie({
189
- name: cookie_user_state_name,
190
- data: user_state,
191
- expires: 365 // was missing
192
- });
188
+ if (!user_consent.analyses || !user_consent.personalization) {
189
+ // expire state cookie to session
190
+ j1.writeCookie({
191
+ name: cookie_names.user_state,
192
+ data: user_state,
193
+ samesite: 'Strict'
194
+ });
195
+ } else {
196
+ j1.writeCookie({
197
+ name: cookie_names.user_state,
198
+ data: user_state,
199
+ samesite: 'Strict',
200
+ expires: 365
201
+ });
202
+ }
193
203
 
194
204
  // jadams, 2021-01-03: dependency has to be checked in more detail
195
- //
196
205
  var dependencies_met_j1_finished = setInterval (function () {
197
206
  if (j1.getState() == 'finished') {
198
207
  if (themerOptions.enabled) {
199
208
  // enable BS ThemeSwitcher
200
- //
201
209
  logger.info('themes detected as: enabled');
202
210
  logger.info('theme is being initialized: ' + user_state.theme_name);
203
211
 
@@ -156,65 +156,25 @@ j1.adapter['toccer'] = (function () {
156
156
  /* eslint-enable */
157
157
 
158
158
  // save config settings into the toccer object for global access
159
- //
160
159
  _this['moduleOptions'] = moduleOptions;
161
160
 
162
- // if (options !== undefined) {
163
- // var settings = $.extend({}, options);
164
- // } else {
165
- // var settings = false;
166
- // }
167
-
168
161
  // cast text-based booleans
169
- var isToc = (moduleOptions.toc === 'true');
170
- var isComments = (moduleOptions.comments === 'true');
162
+ var isToc = (moduleOptions.toc === 'true');
163
+ var isComments = (moduleOptions.comments === 'true');
171
164
 
172
- if (moduleOptions.collapseDepth === undefined) {
165
+ if ( typeof moduleOptions.collapseDepth === 'undefined') {
173
166
  moduleOptions.collapseDepth = 3;
174
167
  }
175
168
 
176
- // if (settings.scrollSmoothOffset === undefined) {
177
- // settings.scrollSmoothOffset = {{toccer_options.scrollSmoothOffset}};
178
- // }
179
- //
180
- // if (settings.enabled === undefined) {
181
- // settings.enabled = true;
182
- // }
183
-
184
- // save config settings into the toccer object for global|later access
185
- //
186
- // _this['moduleOptions'] = settings;
187
-
188
169
  if (isToc) {
189
170
  var dependencies_met_navigator = setInterval(function() {
190
171
  // if ( j1.adapter.navigator.getState() == 'finished' ) {
191
172
  if ( j1.getState() == 'finished' ) {
192
173
  var settings = j1.adapter.toccer.moduleOptions;
193
174
 
194
- // calculate (tocbot page) offset DYMICALLY for correct
195
- // smoothscroll position
196
- //
197
- // var $pagehead = $('.attic');
198
- // var $navbar = $('nav.navbar');
199
- // var $adblock = $('#adblock');
200
- //
201
- // var navbarType = $navbar.hasClass('navbar-fixed') ? 'fixed' : 'scrolled';
202
- // var fontSize = $('body').css('font-size').replace('px','');
203
- // var start = window.pageYOffset;
204
- //
205
- // var l = parseInt(fontSize);
206
- //
207
- // var h = $pagehead.length ? $pagehead.height() : 0;
208
- // var n = $navbar.length ? $navbar.height() : 0;
209
- // var a = $adblock.length ? $adblock.height() : 0;
210
- //
211
- // var o = navbarType == 'fixed' ? -1*(n + a + l) : -1*(h + n + a + l);
212
- //
213
- // settings.scrollSmoothOffset = o;
214
-
215
175
  _this.initToccerCore(settings);
216
-
217
176
  _this.setState('finished');
177
+
218
178
  logger.info('state: ' + _this.getState());
219
179
  logger.info('module initialized successfully');
220
180
  logger.info('met dependencies for: j1');
@@ -322,7 +282,6 @@ j1.adapter['toccer'] = (function () {
322
282
  scrollOffset = navbarType == 'fixed' ? -1*(n + a + l) : -1*(h + n + a + l);
323
283
 
324
284
  // static offset, to be checked why this is needed
325
- //
326
285
  scrollOffset = scrollOffset + moduleOptions.scrollSmoothOffset
327
286
 
328
287
  tocbot.refresh({
@@ -1,286 +1,286 @@
1
- /*
2
- # -----------------------------------------------------------------------------
3
- # ~/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js
4
- # Provides JS Core for J1 Module BS Cookie Consent
5
- #
6
- # Product/Info:
7
- # https://shaack.com
8
- # http://jekyll.one
9
- #
10
- # Copyright (C) 2020 Stefan Haack
11
- # Copyright (C) 2021 Juergen Adams
12
- #
13
- # bootstrap-cookie-banner is licensed under MIT License.
14
- # See: https://github.com/shaack/bootstrap-cookie-banner/blob/master/LICENSE
15
- # J1 Template is licensed under MIT License.
16
- # See: https://github.com/jekyll-one/J1 Template/blob/master/LICENSE
17
- # -----------------------------------------------------------------------------
18
- # TODO:
19
- #
20
- # -----------------------------------------------------------------------------
21
- # NOTE:
22
- # BS Cookie Consent is an MODIFIED version of bootstrap-cookie-banner
23
- # for the use with J1 Template. This modiefied version cannot be used
24
- # outside of J1 Template!
25
- # -----------------------------------------------------------------------------
26
- */
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 logText;
42
- var current_page;
43
- var whitelisted;
44
- var logger = log4javascript.getLogger('j1.core.bsCookieConsent');
45
- var modalId = "bccs-modal"
46
- var self = this
47
- var detailedSettingsShown = false
48
-
49
- this.props = {
50
- autoShowDialog: true, // disable autoShowModal on the privacy policy and legal notice pages, to make these pages readable
51
- language: navigator.language, // the language, in which the modal is shown
52
- languages: ["en", "de"], // supported languages (in ./content/), defaults to first in array
53
- contentURL: "./content", // this URL must contain the dialogs content in the needed languages
54
- cookieName: "cookie-consent-settings", // the name of the cookie in which the configuration is stored as JSON
55
- cookieStorageDays: 365, // the duration the cookie configuration is stored on the client
56
- postSelectionCallback: undefined, // callback function, called after the user has made his selection
57
- whitelisted: [], // pages NO consent modal page is issued
58
- xhr_data_element: "" // container for the language-specific consent modal taken from /assets/data/cookieconsent.html
59
- }
60
-
61
- for (var property in props) {
62
- this.props[property] = props[property];
63
- }
64
-
65
- this.language = this.props.language
66
- if (this.language.indexOf("-") !== -1) {
67
- this.language = this.language.split("-")[0];
68
- }
69
-
70
- if (!this.props.languages.includes(this.language)) {
71
- this.language = this.props.languages[0]; // fallback on default language
72
- }
73
-
74
- var Cookie = {
75
- set: function (name, value, days) {
76
- var value_encoded = window.btoa(value);
77
- var expires = "";
78
- if (days) {
79
- var date = new Date();
80
- date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
81
- expires = "; expires=" + date.toUTCString();
82
- }
83
- document.cookie = name + "=" + (value_encoded || "") + expires + "; Path=/; SameSite=Strict;";
84
- },
85
- get: function (name) {
86
- var nameEQ = name + "=";
87
- var ca = document.cookie.split(';');
88
- for (var i = 0; i < ca.length; i++) {
89
- var c = ca[i];
90
- while (c.charAt(0) === ' ') {
91
- c = c.substring(1, c.length);
92
- }
93
- if (c.indexOf(nameEQ) === 0) {
94
- var value_encoded = c.substring(nameEQ.length, c.length);
95
- var value = window.atob(value_encoded);
96
- return value;
97
- }
98
- }
99
- return undefined
100
- }
101
- }
102
-
103
- var Events = {
104
- documentReady: function (onDocumentReady) {
105
- if (document.readyState !== 'loading') {
106
- onDocumentReady();
107
- } else {
108
- document.addEventListener('DOMContentLoaded', onDocumentReady);
109
- }
110
- }
111
- }
112
-
113
- function showDialog(options) {
114
- Events.documentReady(function () {
115
- self.modal = document.getElementById(modalId);
116
-
117
- if (!self.modal) {
118
- self.modal = document.createElement("div");
119
- self.modal.id = modalId;
120
- self.modal.setAttribute("class", "modal fade");
121
- self.modal.setAttribute("tabindex", "-1");
122
- self.modal.setAttribute("role", "dialog");
123
- self.modal.setAttribute("aria-labelledby", modalId);
124
- document.body.append(self.modal);
125
- self.$modal = $(self.modal);
126
-
127
- if (self.props.postSelectionCallback) {
128
- self.$modal.on("hidden.bs.modal", function () {
129
- self.props.postSelectionCallback();
130
- });
131
- }
132
-
133
- // load modal content
134
- //
135
- var templateUrl = self.props.contentURL + '/' + 'index.html';
136
- $.get(templateUrl)
137
- .done(function (data) {
138
- self.modal.innerHTML = data;
139
- self.modal.innerHTML = $('#' + self.props.xhr_data_element).eq(0).html();
140
-
141
- $(self.modal).modal({
142
- backdrop: "static",
143
- keyboard: false
144
- });
145
-
146
- self.$buttonDoNotAgree = $("#bccs-buttonDoNotAgree");
147
- self.$buttonAgree = $("#bccs-buttonAgree");
148
- self.$buttonSave = $("#bccs-buttonSave");
149
- self.$buttonAgreeAll = $("#bccs-buttonAgreeAll");
150
-
151
- updateButtons();
152
- updateOptionsFromCookie();
153
-
154
- $("#bccs-options").on("hide.bs.collapse", function () {
155
- detailedSettingsShown = false;
156
- updateButtons();
157
- }).on("show.bs.collapse", function () {
158
- detailedSettingsShown = true;
159
- updateButtons();
160
- });
161
- self.$buttonDoNotAgree.click(function () {
162
- doNotAgree();
163
- });
164
- self.$buttonAgree.click(function () {
165
- agreeAll();
166
- });
167
- self.$buttonSave.click(function () {
168
- $("#bccs-options").collapse('hide');
169
- saveSettings();
170
- updateOptionsFromCookie();
171
- });
172
- self.$buttonAgreeAll.click(function () {
173
- $("#bccs-options").collapse('hide');
174
- agreeAll();
175
- updateOptionsFromCookie();
176
- });
177
- })
178
- .fail(function () {
179
- logger.error('You probably need to set `contentURL` in the props');
180
- })
181
- } else {
182
- self.$modal.modal("show")
183
- }
184
- }.bind(this))
185
- }
186
-
187
- function updateOptionsFromCookie() {
188
- var settings = self.getSettings();
189
- if (settings) {
190
- for (var setting in settings) {
191
- var $checkbox = self.$modal.find("#bccs-options .bccs-option[data-name='" + setting + "'] input[type='checkbox']");
192
- $checkbox.prop("checked", settings[setting]);
193
- }
194
- }
195
- }
196
-
197
- function updateButtons() {
198
- if (detailedSettingsShown) {
199
- self.$buttonDoNotAgree.hide();
200
- self.$buttonAgree.hide();
201
- self.$buttonSave.show();
202
- self.$buttonAgreeAll.show();
203
- } else {
204
- self.$buttonDoNotAgree.show();
205
- self.$buttonAgree.show();
206
- self.$buttonSave.hide();
207
- self.$buttonAgreeAll.hide();
208
- }
209
- }
210
-
211
- function gatherOptions(setAllExceptNecessary) {
212
- var $options = self.$modal.find("#bccs-options .bccs-option");
213
- var options = {};
214
- for (var i = 0; i < $options.length; i++) {
215
- var option = $options[i];
216
- var name = option.getAttribute("data-name");
217
- if (name === "necessary") {
218
- options[name] = true;
219
- } else if (setAllExceptNecessary === undefined) {
220
- var $checkbox = $(option).find("input[type='checkbox']");
221
- options[name] = $checkbox.prop("checked");
222
- } else {
223
- options[name] = !!setAllExceptNecessary;
224
- }
225
- }
226
- return options
227
- }
228
-
229
- function agreeAll() {
230
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays);
231
- self.$modal.modal("hide");
232
- }
233
-
234
- function doNotAgree() {
235
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays);
236
- logger.warn('delete cookie: j1.user.consent');
237
- // j1.deleteCookie('j1.user.consent');
238
- j1.deleteCookie('all');
239
- self.$modal.modal('hide')
240
- j1.goHome();
241
- }
242
-
243
- function saveSettings() {
244
- Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays);
245
- self.$modal.modal("hide");
246
- }
247
-
248
- // call consent dialog if no cookie found (except pages whitelisted)
249
- //
250
- whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
251
- if (Cookie.get(this.props.cookieName) === undefined && this.props.autoShowDialog && !whitelisted) {
252
- showDialog();
253
- }
254
-
255
- // API functions
256
- // -------------------------------------------------------------------------
257
-
258
- // show the consent dialog (modal)
259
- // -------------------------------------------------------------------------
260
- this.showDialog = function () {
261
- whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
262
- if (!whitelisted) {
263
- showDialog();
264
- }
265
- }
266
-
267
- // collect settings from consent cookie
268
- // -------------------------------------------------------------------------
269
- this.getSettings = function (optionName) {
270
- var cookie = Cookie.get(self.props.cookieName);
271
- if (cookie) {
272
- var settings = JSON.parse(Cookie.get(self.props.cookieName));
273
- if (optionName === undefined) {
274
- return settings;
275
- } else {
276
- if (settings) {
277
- return settings[optionName];
278
- } else {
279
- return false;
280
- }
281
- }
282
- } else {
283
- return undefined;
284
- }
285
- }
286
- }
1
+ /*
2
+ # -----------------------------------------------------------------------------
3
+ # ~/assets/themes/j1/modules/cookieConsent/js/cookieConsent.js
4
+ # Provides JS Core for J1 Module BS Cookie Consent
5
+ #
6
+ # Product/Info:
7
+ # https://shaack.com
8
+ # http://jekyll.one
9
+ #
10
+ # Copyright (C) 2020 Stefan Haack
11
+ # Copyright (C) 2021 Juergen Adams
12
+ #
13
+ # bootstrap-cookie-banner is licensed under MIT License.
14
+ # See: https://github.com/shaack/bootstrap-cookie-banner/blob/master/LICENSE
15
+ # J1 Template is licensed under MIT License.
16
+ # See: https://github.com/jekyll-one/J1 Template/blob/master/LICENSE
17
+ # -----------------------------------------------------------------------------
18
+ # TODO:
19
+ #
20
+ # -----------------------------------------------------------------------------
21
+ # NOTE:
22
+ # BS Cookie Consent is a MODIFIED version of bootstrap-cookie-banner
23
+ # for the use with J1 Template. This modified version cannot be used
24
+ # outside of J1 Template!
25
+ # -----------------------------------------------------------------------------
26
+ */
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 logText;
42
+ var current_page;
43
+ var whitelisted;
44
+ var logger = log4javascript.getLogger('j1.core.bsCookieConsent');
45
+ var modalId = "bccs-modal"
46
+ var self = this
47
+ var detailedSettingsShown = false
48
+
49
+ this.props = {
50
+ autoShowDialog: true, // disable autoShowModal on the privacy policy and legal notice pages, to make these pages readable
51
+ language: navigator.language, // the language, in which the modal is shown
52
+ languages: ["en", "de"], // supported languages (in ./content/), defaults to first in array
53
+ contentURL: "./content", // this URL must contain the dialogs content in the needed languages
54
+ cookieName: "cookie-consent-settings", // the name of the cookie in which the configuration is stored as JSON
55
+ cookieStorageDays: 365, // the duration the cookie configuration is stored on the client
56
+ postSelectionCallback: undefined, // callback function, called after the user has made his selection
57
+ whitelisted: [], // pages NO consent modal page is issued
58
+ xhr_data_element: "" // container for the language-specific consent modal taken from /assets/data/cookieconsent.html
59
+ }
60
+
61
+ for (var property in props) {
62
+ this.props[property] = props[property];
63
+ }
64
+
65
+ this.language = this.props.language
66
+ if (this.language.indexOf("-") !== -1) {
67
+ this.language = this.language.split("-")[0];
68
+ }
69
+
70
+ if (!this.props.languages.includes(this.language)) {
71
+ this.language = this.props.languages[0]; // fallback on default language
72
+ }
73
+
74
+ var Cookie = {
75
+ set: function (name, value, days) {
76
+ var value_encoded = window.btoa(value);
77
+ var expires = "";
78
+ if (days) {
79
+ var date = new Date();
80
+ date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
81
+ expires = "; expires=" + date.toUTCString();
82
+ }
83
+ document.cookie = name + "=" + (value_encoded || "") + expires + "; Path=/; SameSite=Strict;";
84
+ },
85
+ get: function (name) {
86
+ var nameEQ = name + "=";
87
+ var ca = document.cookie.split(';');
88
+ for (var i = 0; i < ca.length; i++) {
89
+ var c = ca[i];
90
+ while (c.charAt(0) === ' ') {
91
+ c = c.substring(1, c.length);
92
+ }
93
+ if (c.indexOf(nameEQ) === 0) {
94
+ var value_encoded = c.substring(nameEQ.length, c.length);
95
+ var value = window.atob(value_encoded);
96
+ return value;
97
+ }
98
+ }
99
+ return undefined
100
+ }
101
+ }
102
+
103
+ var Events = {
104
+ documentReady: function (onDocumentReady) {
105
+ if (document.readyState !== 'loading') {
106
+ onDocumentReady();
107
+ } else {
108
+ document.addEventListener('DOMContentLoaded', onDocumentReady);
109
+ }
110
+ }
111
+ }
112
+
113
+ function showDialog(options) {
114
+ Events.documentReady(function () {
115
+ self.modal = document.getElementById(modalId);
116
+
117
+ if (!self.modal) {
118
+ self.modal = document.createElement("div");
119
+ self.modal.id = modalId;
120
+ self.modal.setAttribute("class", "modal fade");
121
+ self.modal.setAttribute("tabindex", "-1");
122
+ self.modal.setAttribute("role", "dialog");
123
+ self.modal.setAttribute("aria-labelledby", modalId);
124
+ document.body.append(self.modal);
125
+ self.$modal = $(self.modal);
126
+
127
+ if (self.props.postSelectionCallback) {
128
+ self.$modal.on("hidden.bs.modal", function () {
129
+ self.props.postSelectionCallback();
130
+ });
131
+ }
132
+
133
+ // load modal content
134
+ //
135
+ var templateUrl = self.props.contentURL + '/' + 'index.html';
136
+ $.get(templateUrl)
137
+ .done(function (data) {
138
+ self.modal.innerHTML = data;
139
+ self.modal.innerHTML = $('#' + self.props.xhr_data_element).eq(0).html();
140
+
141
+ $(self.modal).modal({
142
+ backdrop: "static",
143
+ keyboard: false
144
+ });
145
+
146
+ self.$buttonDoNotAgree = $("#bccs-buttonDoNotAgree");
147
+ self.$buttonAgree = $("#bccs-buttonAgree");
148
+ self.$buttonSave = $("#bccs-buttonSave");
149
+ self.$buttonAgreeAll = $("#bccs-buttonAgreeAll");
150
+
151
+ updateButtons();
152
+ updateOptionsFromCookie();
153
+
154
+ $("#bccs-options").on("hide.bs.collapse", function () {
155
+ detailedSettingsShown = false;
156
+ updateButtons();
157
+ }).on("show.bs.collapse", function () {
158
+ detailedSettingsShown = true;
159
+ updateButtons();
160
+ });
161
+ self.$buttonDoNotAgree.click(function () {
162
+ doNotAgree();
163
+ });
164
+ self.$buttonAgree.click(function () {
165
+ agreeAll();
166
+ });
167
+ self.$buttonSave.click(function () {
168
+ $("#bccs-options").collapse('hide');
169
+ saveSettings();
170
+ updateOptionsFromCookie();
171
+ });
172
+ self.$buttonAgreeAll.click(function () {
173
+ $("#bccs-options").collapse('hide');
174
+ agreeAll();
175
+ updateOptionsFromCookie();
176
+ });
177
+ })
178
+ .fail(function () {
179
+ logger.error('You probably need to set `contentURL` in the props');
180
+ })
181
+ } else {
182
+ self.$modal.modal("show")
183
+ }
184
+ }.bind(this))
185
+ }
186
+
187
+ function updateOptionsFromCookie() {
188
+ var settings = self.getSettings();
189
+ if (settings) {
190
+ for (var setting in settings) {
191
+ var $checkbox = self.$modal.find("#bccs-options .bccs-option[data-name='" + setting + "'] input[type='checkbox']");
192
+ $checkbox.prop("checked", settings[setting]);
193
+ }
194
+ }
195
+ }
196
+
197
+ function updateButtons() {
198
+ if (detailedSettingsShown) {
199
+ self.$buttonDoNotAgree.hide();
200
+ self.$buttonAgree.hide();
201
+ self.$buttonSave.show();
202
+ self.$buttonAgreeAll.show();
203
+ } else {
204
+ self.$buttonDoNotAgree.show();
205
+ self.$buttonAgree.show();
206
+ self.$buttonSave.hide();
207
+ self.$buttonAgreeAll.hide();
208
+ }
209
+ }
210
+
211
+ function gatherOptions(setAllExceptNecessary) {
212
+ var $options = self.$modal.find("#bccs-options .bccs-option");
213
+ var options = {};
214
+ for (var i = 0; i < $options.length; i++) {
215
+ var option = $options[i];
216
+ var name = option.getAttribute("data-name");
217
+ if (name === "necessary") {
218
+ options[name] = true;
219
+ } else if (setAllExceptNecessary === undefined) {
220
+ var $checkbox = $(option).find("input[type='checkbox']");
221
+ options[name] = $checkbox.prop("checked");
222
+ } else {
223
+ options[name] = !!setAllExceptNecessary;
224
+ }
225
+ }
226
+ return options
227
+ }
228
+
229
+ function agreeAll() {
230
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(true)), self.props.cookieStorageDays);
231
+ self.$modal.modal("hide");
232
+ }
233
+
234
+ function doNotAgree() {
235
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions(false)), self.props.cookieStorageDays);
236
+ logger.warn('delete cookie: j1.user.consent');
237
+ // j1.deleteCookie('j1.user.consent');
238
+ j1.deleteCookie('all');
239
+ self.$modal.modal('hide')
240
+ j1.goHome();
241
+ }
242
+
243
+ function saveSettings() {
244
+ Cookie.set(self.props.cookieName, JSON.stringify(gatherOptions()), self.props.cookieStorageDays);
245
+ self.$modal.modal("hide");
246
+ }
247
+
248
+ // call consent dialog if no cookie found (except pages whitelisted)
249
+ //
250
+ whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
251
+ if (Cookie.get(this.props.cookieName) === undefined && this.props.autoShowDialog && !whitelisted) {
252
+ showDialog();
253
+ }
254
+
255
+ // API functions
256
+ // -------------------------------------------------------------------------
257
+
258
+ // show the consent dialog (modal)
259
+ // -------------------------------------------------------------------------
260
+ this.showDialog = function () {
261
+ whitelisted = (this.props.whitelisted.indexOf(window.location.pathname) > -1);
262
+ if (!whitelisted) {
263
+ showDialog();
264
+ }
265
+ }
266
+
267
+ // collect settings from consent cookie
268
+ // -------------------------------------------------------------------------
269
+ this.getSettings = function (optionName) {
270
+ var cookie = Cookie.get(self.props.cookieName);
271
+ if (cookie) {
272
+ var settings = JSON.parse(Cookie.get(self.props.cookieName));
273
+ if (optionName === undefined) {
274
+ return settings;
275
+ } else {
276
+ if (settings) {
277
+ return settings[optionName];
278
+ } else {
279
+ return false;
280
+ }
281
+ }
282
+ } else {
283
+ return undefined;
284
+ }
285
+ }
286
+ }