j1-template 2021.1.6 → 2021.1.7

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.
@@ -0,0 +1,928 @@
1
+ ---
2
+ regenerate: true
3
+ ---
4
+
5
+ {% capture cache %}
6
+
7
+ {% comment %}
8
+ # -----------------------------------------------------------------------------
9
+ # ~/assets/themes/j1/adapter/js/navigator.js
10
+ # Liquid template to adapt Navigator Core functions
11
+ #
12
+ # Product/Info:
13
+ # https://jekyll.one
14
+ #
15
+ # Copyright (C) 2021 Juergen Adams
16
+ #
17
+ # J1 Template is licensed under the MIT License.
18
+ # For details, see https://jekyll.one
19
+ # -----------------------------------------------------------------------------
20
+ # Test data:
21
+ # {{ liquid_var | debug }}
22
+ # -----------------------------------------------------------------------------
23
+ # NOTE:
24
+ #
25
+ # JSON pretty print
26
+ # Example: var str = JSON.stringify(obj, null, 2); // spacing level = 2
27
+ # See: https://stackoverflow.com/questions/4810841/how-can-i-pretty-print-json-using-javascript
28
+ # -----------------------------------------------------------------------------
29
+ # NOTE:
30
+ # jadams, 2020-06-21:
31
+ # J1 Navigator needs a general revision on BS4 code and functionalities
32
+ # Current, only base function are tested with BS4 (was coded for BS3)
33
+ # -----------------------------------------------------------------------------
34
+ # NOTE:
35
+ # jadams, 2020-07-17:
36
+ # J1 Navigator can't be minfied for now. Uglifier fails on an ES6
37
+ # (most probably) structure that couldn't fixed by 'harmony' setting.
38
+ # Minifier fails by:
39
+ # Unexpected token: punc ())
40
+ # Current, minifying has been disabled
41
+ # -----------------------------------------------------------------------------
42
+ {% endcomment %}
43
+
44
+ {% comment %} Liquid procedures
45
+ -------------------------------------------------------------------------------- {% endcomment %}
46
+ {% capture select_color %}themes/{{site.template.name}}/procedures/global/select_color.proc{% endcapture %}
47
+
48
+ {% comment %} Set global settings
49
+ -------------------------------------------------------------------------------- {% endcomment %}
50
+ {% assign environment = site.environment %}
51
+ {% assign brand_image_height = site.brand.image_height %}
52
+
53
+ {% comment %} Process YML config data
54
+ ================================================================================ {% endcomment %}
55
+
56
+
57
+ {% comment %} Set config files
58
+ {% assign auth_manager_config = site.j1_auth %}
59
+ -------------------------------------------------------------------------------- {% endcomment %}
60
+ {% assign template_config = site.data.j1_config %}
61
+ {% assign blocks = site.data.blocks %}
62
+ {% assign modules = site.data.modules %}
63
+
64
+ {% assign themer_defaults = modules.defaults.themer.defaults %}
65
+ {% assign themer_settings = modules.themer.settings %}
66
+
67
+ {% assign authentication_defaults = modules.defaults.authentication.defaults %}
68
+ {% assign authentication_settings = modules.authentication.settings %}
69
+
70
+ {% assign template_config = site.data.template_settings %}
71
+ {% assign navigator_defaults = site.data.modules.defaults.navigator.defaults %}
72
+ {% assign navigator_settings = site.data.modules.navigator.settings %}
73
+
74
+ {% comment %} Set config data
75
+ -------------------------------------------------------------------------------- {% endcomment %}
76
+ {% assign nav_bar_defaults = navigator_defaults.nav_bar %}
77
+ {% assign nav_bar_settings = navigator_settings.nav_bar %}
78
+ {% assign nav_menu_defaults = navigator_defaults.nav_menu %}
79
+ {% assign nav_menu_settings = navigator_settings.nav_menu %}
80
+
81
+ {% assign nav_quicklinks_defaults = navigator_defaults.nav_quicklinks %}
82
+ {% assign nav_quicklinks_settings = navigator_settings.nav_quicklinks %}
83
+ {% assign nav_topsearch_defaults = navigator_defaults.nav_topsearch %}
84
+ {% assign nav_topsearch_settings = navigator_settings.nav_topsearch %}
85
+ {% assign nav_authclient_defaults = authentication_defaults.auth_client %}
86
+ {% assign nav_authclient_settings = authentication_settings.auth_client %}
87
+
88
+ {% comment %} Set config options
89
+ -------------------------------------------------------------------------------- {% endcomment %}
90
+ {% assign authentication_options = authentication_defaults | merge: authentication_settings %}
91
+ {% assign themer_options = themer_defaults | merge: themer_settings %}
92
+ {% assign nav_bar_options = nav_bar_defaults | merge: nav_bar_settings %}
93
+ {% assign nav_menu_options = nav_menu_defaults | merge: nav_menu_settings %}
94
+ {% assign quicklinks_options = nav_quicklinks_defaults | merge: nav_quicklinks_settings %}
95
+ {% assign topsearch_options = nav_topsearch_defaults | merge: nav_topsearch_settings %}
96
+ {% assign authclient_options = nav_authclient_defaults | merge: nav_authclient_settings %}
97
+
98
+ {% assign nav_bar_id = navigator_defaults.nav_bar.id %}
99
+ {% assign nav_menu_id = navigator_defaults.nav_menu.id %}
100
+ {% assign nav_quicklinks_id = navigator_defaults.nav_quicklinks.id %}
101
+ {% assign nav_navbar_media_breakpoint = navigator_defaults.nav_bar.media_breakpoint %}
102
+ {% assign authclient_modals_id = navigator_defaults.nav_authclient.xhr_container_id %}
103
+
104
+ {% if nav_bar_options.dropdown_animate_duration != null %}
105
+ {% assign animate_duration = nav_bar_options.dropdown_animate_duration %}
106
+ {% else %}
107
+ {% assign animate_duration = 1 %}
108
+ {% endif %}
109
+
110
+ {% assign production = false %}
111
+ {% if environment == 'prod' or environment == 'production' %}
112
+ {% assign production = true %}
113
+ {% endif %}
114
+
115
+ {% comment %}
116
+ --------------------------------------------------------------------------------
117
+ Set|Overload Liquid vars hardwired to NOT break the (MD) style
118
+ ToDo: Remove configuration from j1_navigator.yml
119
+ -------------------------------------------------------------------------------- {% endcomment %}
120
+ {% assign dropdown_border_height = "3" %}
121
+
122
+ /*
123
+ # -----------------------------------------------------------------------------
124
+ # ~/assets/themes/j1/adapter/js/navigator.js
125
+ # JS Adapter for J1 Navigator
126
+ #
127
+ # Product/Info:
128
+ # {{site.data.template_settings.theme_author_url}}
129
+ #
130
+ # Copyright (C) 2021 Juergen Adams
131
+ #
132
+ # J1 Template is licensed under the MIT License.
133
+ # For details, see {{site.data.template_settings.theme_author_url}}
134
+ # -----------------------------------------------------------------------------
135
+ # NOTE: For AJAX (XHR) loads see
136
+ # https://stackoverflow.com/questions/3709597/wait-until-all-jquery-ajax-requests-are-done
137
+ # -----------------------------------------------------------------------------
138
+ # NOTE: For getStyleValue helper see
139
+ # https://stackoverflow.com/questions/16965515/how-to-get-a-style-attribute-from-a-css-class-by-javascript-jquery
140
+ # -----------------------------------------------------------------------------
141
+ # Adapter generated: {{site.time}}
142
+ # -----------------------------------------------------------------------------
143
+ */
144
+
145
+ // -----------------------------------------------------------------------------
146
+ // ESLint shimming
147
+ // -----------------------------------------------------------------------------
148
+ /* eslint indent: "off" */
149
+ // -----------------------------------------------------------------------------
150
+ 'use strict';
151
+
152
+ j1.adapter['navigator'] = (function (j1, window) {
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // globals
156
+ // ---------------------------------------------------------------------------
157
+ var environment = '{{environment}}';
158
+ var dclFinished = false;
159
+ var moduleOptions = {};
160
+
161
+ var nav_menu_id = '{{nav_menu_id}}';
162
+ var nav_quicklinks_id = '{{nav_quicklinks_id}}';
163
+
164
+ var authclient_modals_id = '{{authclient_modals_id}}';
165
+ var authclient_xhr_data_element = '{{authclient_options.xhr_data_element}}';
166
+ var authclient_modals_data_path = '{{authclient_options.xhr_data_path}}';
167
+
168
+ var nav_menu_data_path = '{{nav_menu_options.data_path}}';
169
+ var nav_quicklinks_data_path = '{{quicklinks_options.data_path}}';
170
+
171
+ var colors_data_path = '{{template_config.colors_data_path}}';
172
+ var font_size_data_path = '{{template_config.font_size_data_path}}';
173
+
174
+
175
+ var cookie_names = j1.getCookieNames();
176
+ var cookie_user_session_name = cookie_names.user_session;
177
+
178
+ var user_session = {};
179
+ var user_session_merged = {};
180
+ var session_state = {};
181
+
182
+ var themerEnabled = {{themer_options.enabled}}; //was (test): false;
183
+ var authClientEnabled;
184
+ var appDetected;
185
+ var json_data;
186
+ var _this;
187
+ var logger;
188
+ var logText;
189
+
190
+
191
+ // ---------------------------------------------------------------------------
192
+ // helper functions
193
+ // ---------------------------------------------------------------------------
194
+
195
+ // ---------------------------------------------------------------------------
196
+ // main object
197
+ // ---------------------------------------------------------------------------
198
+ return {
199
+
200
+ // -------------------------------------------------------------------------
201
+ // module initializer
202
+ // -------------------------------------------------------------------------
203
+ init: function (options) {
204
+
205
+ // -----------------------------------------------------------------------
206
+ // globals
207
+ // -----------------------------------------------------------------------
208
+ _this = j1.adapter.navigator;
209
+ logger = log4javascript.getLogger('j1.adapter.navigator');
210
+
211
+ // initialize state flag
212
+ _this.setState('started');
213
+ logger.info('state: ' + _this.getState());
214
+ logger.info('module is being initialized');
215
+
216
+ // -----------------------------------------------------------------------
217
+ // defaults
218
+ // -----------------------------------------------------------------------
219
+ var settings = $.extend({
220
+ module_name: 'j1.adapter.navigator',
221
+ generated: '{{site.time}}'
222
+ }, options);
223
+
224
+ // -----------------------------------------------------------------------
225
+ // options loader
226
+ // -----------------------------------------------------------------------
227
+ /* eslint-disable */
228
+ var authConfig = {};
229
+ var navDefaults = {};
230
+ var navBarConfig = {};
231
+ var navMenuConfig = {};
232
+ var navQuicklinksConfig = {};
233
+ var navTopsearchConfig = {};
234
+ var navAuthClientConfig = {};
235
+ var navBarOptions = {};
236
+ var navMenuOptions = {};
237
+ var navQuicklinksOptions = {};
238
+ var navTopsearchOptions = {};
239
+ var navAuthClientOptions = {};
240
+ var navAuthMAnagerConfig = {};
241
+
242
+ var user_state = {};
243
+ var cookie_names = j1.getCookieNames();
244
+ var cookie_user_state_name = cookie_names.user_state;
245
+
246
+ var themerOptions = {};
247
+ var interval_count = 0;
248
+ var user_state_detected;
249
+ var themes_count;
250
+ var max_count = 100;
251
+
252
+
253
+ navDefaults = $.extend({}, {{navigator_defaults | replace: '=>', ':' }});
254
+ navBarConfig = $.extend({}, {{nav_bar_options | replace: '=>', ':' }});
255
+ navMenuConfig = $.extend({}, {{nav_menu_options | replace: '=>', ':' }});
256
+ navQuicklinksConfig = $.extend({}, {{quicklinks_options | replace: '=>', ':' }});
257
+ navTopsearchConfig = $.extend({}, {{topsearch_options | replace: '=>', ':' }});
258
+ navAuthClientConfig = $.extend({}, {{authclient_options | replace: '=>', ':' }});
259
+
260
+ navAuthMAnagerConfig = $.extend({}, {{authentication_options | replace: '=>', ':' }});
261
+ authClientEnabled = navAuthMAnagerConfig.enabled;
262
+
263
+ themerOptions = $.extend({}, {{themer_options | replace: '=>', ':' | replace: 'nil', '""' }});
264
+
265
+ // Merge|Overload module CONFIG by DEFAULTS
266
+ //
267
+ navBarOptions = j1.mergeData(navBarConfig, navDefaults.nav_bar);
268
+ navMenuOptions = j1.mergeData(navMenuConfig, navDefaults.nav_menu);
269
+ navQuicklinksOptions = j1.mergeData(navQuicklinksConfig, navDefaults.nav_quicklinks);
270
+ navTopsearchOptions = j1.mergeData(navTopsearchConfig, navDefaults.nav_topsearch);
271
+ navAuthClientConfig = j1.mergeData(navAuthClientConfig, navDefaults.nav_authclient);
272
+
273
+ // save config settings into the adapter object for global access
274
+ //
275
+ _this['navDefaults'] = navDefaults;
276
+ _this['navBarOptions'] = navBarOptions;
277
+ _this['navMenuOptions'] = navMenuOptions;
278
+ _this['navQuicklinksOptions'] = navQuicklinksOptions;
279
+ _this['navTopsearchOptions'] = navTopsearchOptions;
280
+ _this['navAuthClientConfig'] = navAuthClientConfig;
281
+ _this['navAuthManagerConfig'] = navAuthMAnagerConfig;
282
+
283
+ // Load (individual) frontmatter options (currently NOT used)
284
+ if (options != null) { var frontmatterOptions = $.extend({}, options) }
285
+ /* eslint-enable */
286
+
287
+ // -----------------------------------------------------------------------
288
+ // Load HTML data (AJAX)
289
+ // -----------------------------------------------------------------------
290
+ // jadams, 202-06-24: Promise (chain) if $.when seems NOT to work correctly.
291
+ // It seems a chain using .then will be a better solution to make it sure
292
+ // that the last Deferred set the state to 'data_loaded'.
293
+ // Found the final state randomly set to 'null' what prevent the module
294
+ // to run mmenuInitializer.
295
+ // Workaround: Set 'data_loaded' to be returned by all Deferred in
296
+ // the chain.
297
+ // See: https://stackoverflow.com/questions/5436327/jquery-deferreds-and-promises-then-vs-done
298
+ // authclient_xhr_data_element
299
+ // -----------------------------------------------------------------------
300
+ // data loader
301
+ // -----------------------------------------------------------------------
302
+ j1.xhrData({
303
+ xhr_container_id: navQuicklinksOptions.xhr_container_id,
304
+ xhr_data_path: navQuicklinksOptions.xhr_data_path,
305
+ xhr_data_element: navQuicklinksOptions.xhr_data_element },
306
+ 'j1.adapter.navigator',
307
+ null);
308
+ j1.xhrData({
309
+ xhr_container_id: navAuthClientConfig.xhr_container_id,
310
+ xhr_data_path: navAuthClientConfig.xhr_data_path,
311
+ xhr_data_element: navAuthClientConfig.xhr_data_element },
312
+ 'j1.adapter.navigator',
313
+ null);
314
+ j1.xhrData({
315
+ xhr_container_id: navMenuOptions.xhr_container_id,
316
+ xhr_data_path: navMenuOptions.xhr_data_path,
317
+ xhr_data_element: navMenuOptions.xhr_data_element },
318
+ 'j1.adapter.navigator',
319
+ 'data_loaded');
320
+
321
+ var dependencies_met_load_menu_finished = setInterval (function () {
322
+ if (j1.xhrDOMState['#'+navQuicklinksOptions.xhr_container_id] === 'not loaded' ||
323
+ j1.xhrDOMState['#'+navAuthClientConfig.xhr_container_id] === 'not loaded' ||
324
+ j1.xhrDOMState['#'+navMenuOptions.xhr_container_id] === 'not loaded' ){
325
+ logger.error('load HTML data (AJAX): failed');
326
+ _this.setState('finished');
327
+ logger.info('state: ' + _this.getState());
328
+ logger.info('initializing module: failed');
329
+ logger.info('met dependencies for: xhrData');
330
+ clearInterval(dependencies_met_load_menu_finished);
331
+ } else if (j1.xhrDOMState['#'+navQuicklinksOptions.xhr_container_id] === 'success' &&
332
+ j1.xhrDOMState['#'+navAuthClientConfig.xhr_container_id] === 'success' &&
333
+ j1.xhrDOMState['#'+navMenuOptions.xhr_container_id] === 'success' ) {
334
+ // continue if all AJAX loads (xhrData) has finished
335
+ _this.setState('processing');
336
+ logger.info('status: ' + _this.getState());
337
+ logger.info('initialize navigator core');
338
+
339
+ // Detect|Set J1 App status
340
+ appDetected = j1.appDetected();
341
+ authClientEnabled = j1.authEnabled();
342
+ logger.info('application status detected: ' + appDetected);
343
+
344
+ j1.core.navigator.init (_this.navDefaults, _this.navMenuOptions);
345
+
346
+ // load themes (to menu) if themer is enabled|finished
347
+ if (themerEnabled) {
348
+ logText = 'theme switcher: enabled';
349
+ logger.info(logText);
350
+
351
+ // Detect|Set J1 UserState
352
+ user_state_detected = j1.existsCookie(cookie_user_state_name);
353
+ if (user_state_detected) {
354
+ user_state = j1.readCookie(cookie_user_state_name);
355
+ }
356
+
357
+ var dependencies_met_page_finished = setInterval(function() {
358
+ // jadams, 2020-10-03: NOT needed to wait for j1 get finished
359
+ // if (j1.getState() == 'finished') {
360
+ // jadams, 2021-06-22: disabled check on themer get finished
361
+ if (j1.adapter.navigator.getState() == 'core_initialized') {
362
+ // if ('true' === 'true') {
363
+ // initialize theme switcher menus
364
+
365
+ logText = 'load themes';
366
+ logger.info(logText);
367
+
368
+ // load LOCAL themes from JSON data
369
+ logText = 'load local themes (json file)';
370
+ logger.info(logText);
371
+ $('#local_themes').bootstrapThemeSwitcher({
372
+ localFeed: themerOptions.localThemes
373
+ });
374
+
375
+ // load REMOTE themes from Bootswatch API (localFeed EMPTY!)
376
+ $('#remote_themes').bootstrapThemeSwitcher({
377
+ localFeed: '',
378
+ bootswatchApiVersion: themerOptions.bootswatchApiVersion
379
+ });
380
+
381
+ // jadams, 2021-04-22: Up to now, it is unclear why in some
382
+ // cases the menu bar is NOT fully loaded for THEMES
383
+ // TODO: Add additional checks to find the reason
384
+
385
+ // added same checks (as already done by adapter themer) to
386
+ // check if remote theme menu detected as LOADED
387
+ //
388
+ var dependencies_met_remote_themes_loaded = setInterval(function() {
389
+ interval_count += 1;
390
+ themes_count = document.getElementById("remote_themes").getElementsByTagName("li").length;
391
+ if ( themes_count > 0 ) {
392
+ logger.info('remote themes loaded: successfully');
393
+ logger.info('remote themes loaded: successfully after: ' + interval_count * 25 + ' ms');
394
+
395
+ clearInterval(dependencies_met_remote_themes_loaded);
396
+ // clearInterval(dependencies_met_page_finished);
397
+ } else {
398
+ logger.debug('wait for theme to be loaded: ' + user_state.theme_name);
399
+ }
400
+ if (interval_count > max_count) {
401
+ logger.warn('remote themes loading: failed');
402
+ logger.warn('continue processing');
403
+ clearInterval(dependencies_met_remote_themes_loaded);
404
+ // clearInterval(dependencies_met_page_finished);
405
+ }
406
+ clearInterval(dependencies_met_page_finished);
407
+ }, 25);
408
+
409
+ // clearInterval(dependencies_met_page_finished);
410
+ }
411
+ _this.setState('initialized');
412
+ }, 25); // END 'dependencies_met_page_finished'
413
+ } else {
414
+ logText = 'theme switcher detected as: disabled';
415
+ logger.info(logText);
416
+ }
417
+
418
+ // -----------------------------------------------------------------
419
+ // event handler|css styles
420
+ // -----------------------------------------------------------------
421
+ // continue if Theme CSS is applied
422
+ var dependencies_met_themer_finished = setInterval(function() {
423
+ if (themerEnabled) {
424
+ if (j1.adapter.themer.getState() === 'finished') {
425
+ _this.setState('processing');
426
+
427
+ // logger.info('initialize eventHandler');
428
+ // j1.core.navigator.eventHandler();
429
+
430
+ var dependencies_met_page_finished = setInterval(function() {
431
+ // if (j1.getState() == 'finished') {
432
+ if (true) {
433
+ // set general|global theme colors
434
+ logger.info('initializing dynamic CSS styles: started');
435
+ _this.setCSS (
436
+ navDefaults, navBarOptions, navMenuOptions,
437
+ navQuicklinksOptions, navTopsearchOptions
438
+ );
439
+ clearInterval(dependencies_met_page_finished);
440
+ }
441
+ logger.info('initializing dynamic CSS styles: finished');
442
+ }, 25); // END 'dependencies_met_page_finished'
443
+
444
+ logger.info('init auth client');
445
+ _this.initAuthClient(_this.navAuthManagerConfig);
446
+
447
+ _this.setState('finished');
448
+ logger.info('state: ' + _this.getState());
449
+ logger.info('module initialized successfully');
450
+ logger.info('met dependencies for: j1');
451
+ clearInterval(dependencies_met_themer_finished);
452
+ }
453
+ } else {
454
+ _this.setState('processing');
455
+
456
+ // logger.info('initialize eventHandler');
457
+ // j1.core.navigator.eventHandler();
458
+
459
+ // set general|global theme colors
460
+ logger.info('apply dynamic CSS styles');
461
+ _this.setCSS (
462
+ navDefaults, navBarOptions, navMenuOptions,
463
+ navQuicklinksOptions, navTopsearchOptions
464
+ );
465
+
466
+ logger.info('init auth client');
467
+ _this.initAuthClient(_this.navAuthManagerConfig);
468
+ _this.setState('finished');
469
+ logger.info('state: ' + _this.getState());
470
+ clearInterval(dependencies_met_themer_finished);
471
+ }
472
+ }, 25); // END 'dependencies_met_themer_finished'
473
+ logger.info('met dependencies for: themer');
474
+ clearInterval(dependencies_met_load_menu_finished);
475
+ } else {
476
+ logger.error('load HTML data (AJAX) failed for unknown reason');
477
+ _this.setState('finished');
478
+ logger.info('state: ' + _this.getState());
479
+ logger.info('met dependencies for: xhrData');
480
+ clearInterval(dependencies_met_load_menu_finished);
481
+ }
482
+ }, 25); // END 'dependencies_met_load_menu_finished'
483
+
484
+ // --------------------------------------------------------------------
485
+ // Register event 'reset on resize' to call j1.core.navigator on
486
+ // manageDropdownMenu to manage the (current) NAV menu for
487
+ // desktop or mobile
488
+ // ---------------------------------------------------------------------
489
+ $(window).on('resize', function() {
490
+ j1.core.navigator.manageDropdownMenu(navDefaults, navMenuOptions);
491
+
492
+ // jadams, 2020-07-10: cause severe trouble on mobile devices if
493
+ // OnScreen Kbd comes up and reduces the window size (resize event)
494
+ // DISABLED
495
+ // -------------------------------------------------------------------
496
+ // Hide|Close topSearch on resize event
497
+ // $('.top-search').slideUp();
498
+
499
+ // Manage sticky NAV bars
500
+ setTimeout (function() {
501
+ j1.core.navigator.navbarSticky();
502
+ }, 500);
503
+
504
+ // Scroll the page one pixel back and forth to get
505
+ // the right position for Toccer (trigger) and SSM
506
+ $(window).scrollTop($(window).scrollTop()+1);
507
+ $(window).scrollTop($(window).scrollTop()-1);
508
+
509
+ // jadams, 2020-06-21: unclear|forgotten what I'm doing here!
510
+ // Looks like the old BS3 implementation
511
+ //
512
+ // $('.navbar-collapse').removeClass('in');
513
+ // $('.navbar-collapse').removeClass('on');
514
+ // $('.navbar-collapse').removeClass('bounceIn');
515
+ });
516
+ }, // END init
517
+
518
+ // -------------------------------------------------------------------------
519
+ // initialize JS portion for the dialogs (modals) used by J1AuthClient
520
+ // NOTE: Currently cookie updates NOT processed at the NAV module
521
+ // All updates on Cookies are managed by Cookie Consent.
522
+ // To be considered to re-add cookie updates for the auth state
523
+ // -------------------------------------------------------------------------
524
+ initAuthClient: function(auth_config) {
525
+ var logger = log4javascript.getLogger('j1.adapter.navigator.initAuthClient');
526
+ var user_session = j1.readCookie(cookie_user_session_name);
527
+
528
+ _this.modalEventHandler(auth_config);
529
+
530
+ if (j1.appDetected() && j1.authEnabled()) {
531
+ // Toggle/Set SignIn/SignOut icon|link in QuickLinks
532
+ // See: https://stackoverflow.com/questions/13524107/how-to-set-data-attributes-in-html-elements
533
+ if (user_session.authenticated === 'true') {
534
+ // Set SignOut
535
+ $('#navLinkSignInOut').attr('data-target', '#modalOmniSignOut');
536
+ $('#iconSignInOut').removeClass('mdi-login').addClass('mdi-logout');
537
+ } else {
538
+ // Set SignIn
539
+ $('#navLinkSignInOut').attr('data-target', '#modalOmniSignIn');
540
+ $('#iconSignInOut').removeClass('mdi-logout').addClass('mdi-login');
541
+ }
542
+ }
543
+
544
+ return true;
545
+ }, // END initAuthClient
546
+
547
+ // -------------------------------------------------------------------------
548
+ // modalEventHandler
549
+ // Manage button click events for all BS Modals
550
+ // See: https://www.nickang.com/add-event-listener-for-loop-problem-in-javascript/
551
+ // -------------------------------------------------------------------------
552
+ modalEventHandler: function (options) {
553
+ // var logger = log4javascript.getLogger('j1.adapter.navigator.EventHandler');
554
+ var authConfig = options.j1_auth;
555
+ var route;
556
+ var provider;
557
+ var provider_url;
558
+ var allowed_users;
559
+ var logText;
560
+
561
+ var signIn = {
562
+ provider: authConfig.providers.activated[0],
563
+ users: authConfig.providers[authConfig.providers['activated'][0]]['users'],
564
+ do: false
565
+ };
566
+
567
+ var signOut = {
568
+ provider: authConfig.providers.activated[0],
569
+ providerSignOut: false,
570
+ do: false
571
+ };
572
+
573
+ logText = 'initialize button click events';
574
+ logger.info(logText);
575
+
576
+ // Manage button click events for modal "signInOutButton"
577
+ // -----------------------------------------------------------------------
578
+ $('ul.nav-pills > li').click(function (e) {
579
+ e.preventDefault();
580
+ // jadams, 2019-07-30: To be checked if needed
581
+ signIn.provider = $(this).text().trim();
582
+ signIn.provider = signIn.provider.toLowerCase();
583
+ signIn.allowed_users = signIn.users.toString();
584
+ });
585
+
586
+ $('a.btn').click(function() {
587
+ if (this.id === 'signInButton') {
588
+ signIn.do = true;
589
+ } else {
590
+ signIn.do = false;
591
+ }
592
+ if (this.id === 'signOutButton') {
593
+ signOut.do = true;
594
+ } else {
595
+ signOut.do = false;
596
+ }
597
+ });
598
+
599
+ $('input:checkbox[name="providerSignOut"]').on('click', function (e) {
600
+ e.stopPropagation();
601
+ signOut.providerSignOut = $('input:checkbox[name="providerSignOut"]').is(':checked');
602
+ if(environment === 'development') {
603
+ logText = 'provider signout set to: ' + signOut.providerSignOut;
604
+ logger.info(logText);
605
+ }
606
+ });
607
+
608
+ // Manage pre events on modal "modalOmniSignIn"
609
+ // -----------------------------------------------------------------------
610
+ $('#modalOmniSignOut').on('show.bs.modal', function() {
611
+ var modal = $(this);
612
+ logger.info('place current user data');
613
+ user_session = j1.readCookie(cookie_user_session_name);
614
+ modal.find('.user-info').text('You are signed in to provider: ' + user_session.provider);
615
+ }); // END SHOW modalOmniSignOut
616
+
617
+ // Manage post events on modal "modalOmniSignIn"
618
+ // -----------------------------------------------------------------------
619
+ $('#modalOmniSignIn').on('hidden.bs.modal', function() {
620
+ if (signIn.do == true) {
621
+ provider = signIn.provider.toLowerCase();
622
+ allowed_users = signIn.users.toString();
623
+ logText = 'provider detected: ' + provider;
624
+ logger.info(logText);
625
+
626
+ var route = '/authentication?request=signin&provider=' +provider+ '&allowed_users=' +allowed_users;
627
+ logText = 'call middleware for signin on route: ' + route;
628
+ logger.info(logText);
629
+ window.location.href = route;
630
+ } else {
631
+ provider = signIn.provider.toLowerCase();
632
+ logText = 'provider detected: ' + provider;
633
+ logger.info(logText);
634
+ logText = 'login declined for provider: ' +provider;
635
+ logger.info(logText);
636
+ }
637
+ }); // END post events "modalOmniSignIn"
638
+
639
+ // Manage post events on modal "modalOmniSignOut"
640
+ // -----------------------------------------------------------------------
641
+ $('#modalOmniSignOut').on('hidden.bs.modal', function() {
642
+ if (signOut.do == true) {
643
+ logger.info('load active provider from cookie: ' + cookie_user_session_name);
644
+
645
+ user_session = j1.readCookie(cookie_user_session_name);
646
+ provider = user_session.provider;
647
+ provider_url = user_session.provider_site_url;
648
+
649
+ logText = 'provider detected: ' + provider;
650
+ logger.info(logText);
651
+ logText = 'initiate signout for provider: ' +provider;
652
+ logger.info(logText);
653
+
654
+ var route = '/authentication?request=signout&provider=' + provider + '&provider_signout=' + signOut.providerSignOut; // + '/logout/';
655
+ logText = 'call middleware on route : ' +route;
656
+ logger.info(logText);
657
+ window.location.href = route;
658
+ } else {
659
+ provider = signOut.provider.toLowerCase();
660
+ logText = 'provider detected: ' + provider;
661
+ logger.info(logText);
662
+ logText = 'signout declined for provider: ' +provider ;
663
+ logger.info(logText);
664
+ }
665
+ }); // END post events "modalSignOut"
666
+
667
+ logText = 'initialize button click events completed';
668
+ logger.info(logText);
669
+
670
+ return true;
671
+ }, // END modalEventHandler
672
+
673
+ // -------------------------------------------------------------------------
674
+ // setCSS
675
+ // Set dynamic CSS styles
676
+ // -------------------------------------------------------------------------
677
+ setCSS: function (navDefaults, navBarOptions, navMenuOptions, navQuicklinksOptions, navTopsearchOptions) {
678
+ var logger = log4javascript.getLogger('j1.adapter.navigator.setCSS');
679
+ var gridBreakpoint_lg = '992px';
680
+ var gridBreakpoint_md = '768px';
681
+ var gridBreakpoint_sm = '576px';
682
+ var navPrimaryColor = navDefaults.nav_primary_color;
683
+
684
+ logger.info('set dynamic styles for the theme loaded');
685
+
686
+ // Set|Resolve navMenuOptions
687
+ // ------------------------------------------------------------------------
688
+ navMenuOptions.dropdown_font_size = navMenuOptions.dropdown_font_size;
689
+ navMenuOptions.megamenu_font_size = navMenuOptions.megamenu_font_size;
690
+
691
+ // Set|Resolve navBarOptions
692
+ // -----------------------------------------------------------------------
693
+ navBarOptions.background_color_full = navBarOptions.background_color_full;
694
+
695
+ // Set|Resolve navMenuOptions
696
+ // -----------------------------------------------------------------------
697
+ navMenuOptions.menu_item_color = navMenuOptions.menu_item_color;
698
+ navMenuOptions.menu_item_color_hover = navMenuOptions.menu_item_color_hover;
699
+ navMenuOptions.menu_item_dropdown_color = navMenuOptions.menu_item_dropdown_color;
700
+ navMenuOptions.dropdown_item_color = navMenuOptions.dropdown_item_color;
701
+ navMenuOptions.dropdown_background_color_hover = navMenuOptions.dropdown_background_color_hover;
702
+ navMenuOptions.dropdown_background_color_active = navMenuOptions.dropdown_background_color_active;
703
+ navMenuOptions.dropdown_border_color = navMenuOptions.dropdown_border_color;
704
+
705
+ // Set|Resolve navQuicklinksOptions
706
+ // -----------------------------------------------------------------------
707
+ navQuicklinksOptions.icon_color = navQuicklinksOptions.icon_color;
708
+ navQuicklinksOptions.icon_color_hover = navQuicklinksOptions.icon_color_hover;
709
+ navQuicklinksOptions.background_color = navQuicklinksOptions.background_color;
710
+
711
+ // Set|Resolve navTopsearchOptions
712
+ // -----------------------------------------------------------------------
713
+ navTopsearchOptions.input_color = navTopsearchOptions.input_color;
714
+ navTopsearchOptions.background_color = navTopsearchOptions.background_color;
715
+
716
+ // Set dymanic styles
717
+ // -----------------------------------------------------------------------
718
+ // $('nav-primary').css({"background-color": "navPrimaryColor"});
719
+
720
+ // navBar styles
721
+ // -----------------------------------------------------------------------
722
+ var bg_primary = j1.getStyleValue('bg-primary', 'background-color');
723
+ var bg_scrolled = bg_primary;
724
+ var bg_collapsed = bg_primary;
725
+
726
+ $('head').append('<style>.mdi-bg-primary {color: ' +bg_scrolled+ ';}</style>');
727
+
728
+ // Size of brand image
729
+ $('head').append('<style>.navbar-brand > img { height: {{brand_image_height}}px !important; }</style>');
730
+
731
+ // Navbar transparent-light (light)
732
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator.navbar-transparent.light { background-color: ' +navBarOptions.background_color_full+ ' !important; border-bottom: solid 0px !important; } }</style>');
733
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator.navbar-scrolled.light { background-color: ' +bg_scrolled+ ' !important; } }</style>');
734
+
735
+ $('head').append('<style id="dynNav">@media (max-width: ' +gridBreakpoint_md+ ') { nav.navbar.navigator.navbar-transparent.light { background-color: ' +navBarOptions.background_color_full+ ' !important; border-bottom: solid 0px !important; } }</style>');
736
+ $('head').append('<style id="dynNav">@media (max-width: ' +gridBreakpoint_md+ ') { nav.navbar.navigator.navbar-scrolled.light { background-color: ' +bg_scrolled+ ' !important; } }</style>');
737
+ $('head').append('<style id="dynNav">@media (min-width: ' +gridBreakpoint_md+ ') { nav.navbar.navigator.navbar-transparent.light { background-color: ' +navBarOptions.background_color_full+ ' !important; border-bottom: solid 0px !important; } }</style>');
738
+ $('head').append('<style id="dynNav">@media (min-width: ' +gridBreakpoint_md+ ') { nav.navbar.navigator.navbar-scrolled.light { background-color: ' +bg_scrolled+ ' !important; } }</style>');
739
+
740
+ $('head').append('<style id="dynNav">@media (max-width: ' +gridBreakpoint_sm+ ') { nav.navbar.navigator.navbar-transparent.light { background-color: ' +navBarOptions.background_color_full+ ' !important; border-bottom: solid 0px !important; } }</style>');
741
+ $('head').append('<style id="dynNav">@media (max-width: ' +gridBreakpoint_sm+ ') { nav.navbar.navigator.navbar-scrolled.light { background-color: ' +bg_scrolled+ ' !important; } }</style>');
742
+
743
+ // navQuicklinks styles
744
+ // -----------------------------------------------------------------------
745
+ $('head').append('<style>.attr-nav> ul > li > a { color: ' +navQuicklinksOptions.icon_color+ ' !important; }</style>');
746
+ $('head').append('<style>.attr-nav> ul > li > a:hover { color: ' +navQuicklinksOptions.icon_color_hover+ ' !important; }</style>');
747
+
748
+ // navMenu styles
749
+ // -----------------------------------------------------------------------
750
+ // Remove background for anchor
751
+ $('head').append('<style>.dropdown-menu > .active > a { background-color: transparent !important; }</style>');
752
+ // hover menu-item|menu-sub-item
753
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator .dropdown-item:focus, nav.navbar.navigator .dropdown-item:hover, nav.navbar.navigator .nav-sub-item:focus, nav.navbar.navigator .nav-sub-item:hover { background: ' +navMenuOptions.dropdown_background_color_hover+ ' !important; }}</style>');
754
+
755
+ // Limit 1st dropdown item width
756
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator ul.nav.navbar-right .dropdown-menu .dropdown-menu { left: -' +navMenuOptions.dropdown_item_min_width+ 'rem !important; } }</style>');
757
+
758
+ // Limit last (2nd) dropdown in height (nav.navbar.navigator li.dropdown ul.dropdown-menu ul.dropdown-menu)
759
+ // !important
760
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator li.dropdown ul.dropdown-menu ul.dropdown-menu { top: -' +navMenuOptions.dropdown_border_top+ 'px !important; max-height: ' +navMenuOptions.dropdown_menu_max_height+ 'em; } }</style>');
761
+
762
+ // Set dropdown item colors
763
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator ul.nav > li > a { color: ' +navMenuOptions.menu_item_color+ ' !important; } }</style>');
764
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator ul.nav > li > a:hover { color: ' +navMenuOptions.menu_item_color_hover+ ' !important; } }</style>');
765
+
766
+ // Dropdown menu styles
767
+ // jadams, 2017-11-30: removed left padding from dropdown mwenu (for new j1nav style based on Navigator|Slate)
768
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator li.dropdown ul.dropdown-menu { animation-duration: ' +navMenuOptions.dropdown_animate_duration+ 's !important; color: ' +bg_scrolled+ ' !important; min-width: ' +navMenuOptions.dropdown_item_min_width+ 'rem !important; border-top: solid ' +navMenuOptions.dropdown_border_top+ 'px !important; border-radius: ' +navMenuOptions.dropdown_border_radius+ 'px !important; left: 0; } }</style>');
769
+
770
+ {% if dropdown_style == 'raised' %}
771
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator li.dropdown ul.dropdown-menu { box-shadow: 0 16px 38px -12px rgba(0, 0, 0, 0.56), 0 4px 25px 0px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.2) !important; } }</style>');
772
+ {% endif %}
773
+
774
+ // jadams, 2017-11-22: configure dropdown_font_size|color
775
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator li.dropdown ul.dropdown-menu > li > a { color: ' +navMenuOptions.dropdown_item_color+ ' !important; font-size: ' +navMenuOptions.dropdown_font_size+ ' !important; font-weight: 400; } }</style>');
776
+ $('head').append('<style>@media (min-width: ' +gridBreakpoint_lg+ ') { nav.navbar.navigator ul.dropdown-menu.megamenu-content .content ul.menu-col li a { color: ' +navMenuOptions.dropdown_item_color+ ' !important; font-size: ' +navMenuOptions.megamenu_font_size+ ' !important; font-weight: 400; } }</style>');
777
+
778
+ // navQuicklinks styles
779
+ // -----------------------------------------------------------------------
780
+
781
+ // navTopSearch Styles
782
+ // -----------------------------------------------------------------------
783
+ // jadams, 2020-07-08: disabled because colors for icons set by the icon font settings
784
+ // $('head').append('<style>.top-search .input-group-addon { color: ' +navTopsearchOptions.input_color+ ' !important; }</style>');
785
+ $('head').append('<style>.top-search { background-color: ' +navTopsearchOptions.background_color+ ' !important; }</style>');
786
+ $('head').append('<style>.top-search input.form-control { color: ' +navTopsearchOptions.input_color+ ' !important; }</style>');
787
+
788
+ // Timeline styles
789
+ // -----------------------------------------------------------------------
790
+ $('head').append('<style>.timeline > li > .timeline-panel:after {border-right-color: ' +bg_scrolled+ '; border-left-color: ' +bg_scrolled+ ';}</style>');
791
+ $('head').append('<style>.tmicon {background: ' +bg_scrolled+ ';}</style>');
792
+
793
+ // Heading styles
794
+ // -----------------------------------------------------------------------
795
+ $('head').append('<style>.heading:after {background: ' +bg_scrolled+ ' !important;}</style>');
796
+
797
+ // Tag Cloud styles
798
+ // -----------------------------------------------------------------------
799
+ $('head').append('<style>.tag-cloud ul li a {background-color: ' +bg_scrolled+ ' !important;}</style>');
800
+ // $('head').append('<style>.tag-cloud ul li a:hover {background-color: #212121 !important;}</style>');
801
+
802
+ // Toccer styles
803
+ // -----------------------------------------------------------------------
804
+ $('head').append('<style>.is-active-link::before {background-color: ' +bg_scrolled+ ' !important;}</style>');
805
+
806
+ // BS extended Modal styles
807
+ // -----------------------------------------------------------------------
808
+ $('head').append('<style>.modal-dialog.modal-notify.modal-primary .modal-header {background-color: ' +bg_scrolled+ ';}</style>');
809
+
810
+ // BS nav|pills styles
811
+ // -----------------------------------------------------------------------
812
+ $('head').append('<style>.nav-pills .nav-link.active, .nav-pills .show > .nav-link {background-color: ' +bg_scrolled+ ' !important;}</style>');
813
+
814
+ return true;
815
+ }, // END setCSS
816
+
817
+ // -------------------------------------------------------------------------
818
+ // delayShowMenu
819
+ // delay all dropdown menu to open for "delay" time
820
+ // See: http://jsfiddle.net/AndreasPizsa/NzvKC/
821
+ // -------------------------------------------------------------------------
822
+ delayShowMenu: function ( menuOpenDelay ) {
823
+ var logger = log4javascript.getLogger('j1.adapter.navigator.delayShowMenu');
824
+ var theTimer = 0;
825
+ var theElement = null;
826
+ var theLastPosition = {x:0,y:0};
827
+
828
+ logText ='entered delayShowMenu';
829
+ logger.info(logText);
830
+
831
+ // $('#navigator_nav_menu')
832
+ // .find('li.dropdown.nav-item')
833
+
834
+ $('[data-toggle]').closest('li')
835
+ .on('mouseenter', function (inEvent) {
836
+ if (theElement) theElement.removeClass('open');
837
+ window.clearTimeout(theTimer);
838
+ theElement = $(this);
839
+
840
+ theTimer = window.setTimeout(function () {
841
+ theElement.addClass('open');
842
+ }, menuOpenDelay);
843
+ })
844
+ .on('mousemove', function (inEvent) {
845
+ if(Math.abs(theLastPosition.x - inEvent.ScreenX) > 4 ||
846
+ Math.abs(theLastPosition.y - inEvent.ScreenY) > 4) {
847
+ theLastPosition.x = inEvent.ScreenX;
848
+ theLastPosition.y = inEvent.ScreenY;
849
+ return;
850
+ }
851
+ if (theElement.hasClass('open')) return;
852
+ window.clearTimeout(theTimer);
853
+ theTimer = window.setTimeout(function () {
854
+ theElement.addClass('open');
855
+ }, menuOpenDelay);
856
+ })
857
+ .on('mouseleave', function (inEvent) {
858
+ window.clearTimeout(theTimer);
859
+ theElement = $(this);
860
+ theTimer = window.setTimeout(function () {
861
+ theElement.removeClass('open');
862
+ }, menuOpenDelay);
863
+ });
864
+
865
+ return true;
866
+ }, // END delayShowMenu
867
+
868
+ // -------------------------------------------------------------------------
869
+ // messageHandler
870
+ // Manage messages (paylods) send from other J1 modules
871
+ // -------------------------------------------------------------------------
872
+ messageHandler: function (sender, message) {
873
+ // var json_message = JSON.stringify(message, undefined, 2); // multiline
874
+ var json_message = JSON.stringify(message);
875
+ _this.setState(message.action);
876
+
877
+ logText = 'received message from ' + sender + ': ' + json_message;
878
+ logger.info(logText);
879
+
880
+ logText = 'set state to: ' + message.action;
881
+ logger.info(logText);
882
+
883
+ // -----------------------------------------------------------------------
884
+ // Process commands|actions
885
+ // -----------------------------------------------------------------------
886
+ if (message.type === 'command' && message.action === 'module_initialized') {
887
+ //
888
+ // Place handling of command|action here
889
+ //
890
+ logger.info(message.text);
891
+ }
892
+ if (message.type === 'command' && message.action === 'status') {
893
+ logger.info('messageHandler: received - ' + message.action);
894
+ }
895
+
896
+ //
897
+ // Place handling of other command|action here
898
+ //
899
+
900
+ return true;
901
+ }, // END messageHandler
902
+
903
+ // -------------------------------------------------------------------------
904
+ // setState()
905
+ // Sets the current (processing) state of the module
906
+ // -------------------------------------------------------------------------
907
+ setState: function (stat) {
908
+ _this.state = stat;
909
+ }, // END setState
910
+
911
+ // -------------------------------------------------------------------------
912
+ // getState()
913
+ // Returns the current (processing) state of the module
914
+ // -------------------------------------------------------------------------
915
+ getState: function () {
916
+ return _this.state;
917
+ } // END getState
918
+
919
+ }; // END return
920
+ })(j1, window);
921
+
922
+ {% endcapture %}
923
+ {% if production %}
924
+ {{ cache | minifyJS }}
925
+ {% else %}
926
+ {{ cache | strip_empty_lines }}
927
+ {% endif %}
928
+ {% assign cache = nil %}