j1-template 2020.0.0 → 2020.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/_includes/themes/j1/layouts/content_generator_blog_archive.html +22 -18
  3. data/_includes/themes/j1/layouts/content_generator_collection.html +15 -12
  4. data/_includes/themes/j1/layouts/content_generator_page.html +16 -17
  5. data/_includes/themes/j1/layouts/content_generator_post.html +19 -24
  6. data/_includes/themes/j1/modules/navigator/generator.html +62 -40
  7. data/assets/data/menu.html +6 -5
  8. data/assets/data/mmenu.html +455 -0
  9. data/assets/data/{sidebar.html → mmenu_sidebar.html} +24 -18
  10. data/assets/data/mmenu_toc.html +45 -0
  11. data/assets/data/quicklinks.html +9 -4
  12. data/assets/data/ssm.html +227 -0
  13. data/assets/error_pages/HTTP204.html +3 -3
  14. data/assets/themes/j1/core/css/bootstrap.css +116 -93
  15. data/assets/themes/j1/core/css/bootstrap.min.css +4 -4
  16. data/assets/themes/j1/core/css/globals.css +1 -1
  17. data/assets/themes/j1/core/css/theme_extensions.css +150 -23
  18. data/assets/themes/j1/core/css/theme_extensions.min.css +1 -1
  19. data/assets/themes/j1/core/css/uno.css +150 -23
  20. data/assets/themes/j1/core/css/uno.min.css +1 -1
  21. data/assets/themes/j1/core/css/vendor.css +130 -104
  22. data/assets/themes/j1/core/css/vendor.min.css +4 -4
  23. data/assets/themes/j1/core/js/template.js +296 -24
  24. data/assets/themes/j1/core/js/template.js.map +1 -1
  25. data/assets/themes/j1/core/js/template.min.js +1 -1
  26. data/lib/j1/version.rb +1 -1
  27. data/lib/j1_app/j1_auth_manager/auth_manager.rb +21 -17
  28. data/lib/j1_app/j1_auth_manager/config.rb +13 -9
  29. data/lib/j1_app/j1_site_manager/static_site.rb +1 -1
  30. data/lib/starter_web/Gemfile +2 -2
  31. data/lib/starter_web/_config.yml +12 -139
  32. data/lib/starter_web/_data/layouts/default.yml +5 -5
  33. data/lib/starter_web/_data/modules/authentication.yml +4 -4
  34. data/lib/starter_web/_data/modules/cookie_consent.yml +10 -10
  35. data/lib/starter_web/_data/modules/defaults/navigator.yml +25 -24
  36. data/lib/starter_web/_data/modules/defaults/ssm.yml +50 -0
  37. data/lib/starter_web/_data/modules/defaults/toccer.yml +1 -1
  38. data/lib/starter_web/_data/modules/navigator.yml +161 -97
  39. data/lib/starter_web/_data/modules/navigator.yml.new +232 -0
  40. data/lib/starter_web/_data/modules/ssm.yml +133 -0
  41. data/lib/starter_web/_data/modules/toccer.yml +2 -1
  42. data/lib/starter_web/_data/private.yml +66 -98
  43. data/lib/starter_web/_data/resources.yml +76 -10
  44. data/lib/starter_web/apps/public/{cc → cc/cc.yml} +0 -0
  45. data/lib/starter_web/apps/public/cc/index.adoc +107 -0
  46. data/lib/starter_web/assets/images/modules/icons/j1/{j1..ico → j1.ico} +0 -0
  47. data/lib/starter_web/assets/themes/j1/adapter/js/algolia.js +321 -0
  48. data/lib/starter_web/assets/themes/j1/adapter/js/back2top.js +2 -2
  49. data/lib/starter_web/assets/themes/j1/adapter/js/cookie_consent.js +38 -28
  50. data/lib/starter_web/assets/themes/j1/adapter/js/gallery_customizer.js +7 -7
  51. data/lib/starter_web/assets/themes/j1/adapter/js/j1.js +55 -30
  52. data/lib/starter_web/assets/themes/j1/adapter/js/logger.js +2 -2
  53. data/lib/starter_web/assets/themes/j1/adapter/js/mmenu.js +439 -0
  54. data/lib/starter_web/assets/themes/j1/adapter/js/mmenu.js.new +432 -0
  55. data/lib/starter_web/assets/themes/j1/adapter/js/navigator.js +29 -47
  56. data/lib/starter_web/assets/themes/j1/adapter/js/ssm.js +496 -0
  57. data/lib/starter_web/assets/themes/j1/adapter/js/themer.js +2 -1
  58. data/lib/starter_web/assets/themes/j1/adapter/js/toccer.js +40 -36
  59. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/css/mmenu-light.css +384 -0
  60. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/css/mmenu-light.min.css +384 -0
  61. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/css/themes/uno.css +95 -0
  62. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/css/themes/uno.min.css +95 -0
  63. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/js/mmenu-light.js +11 -0
  64. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/js/mmenu-light.min.js +11 -0
  65. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/js/mmenu-light.polyfills.js +118 -0
  66. data/lib/starter_web/assets/themes/j1/extensions/mmenu-light/js/mmenu-light.polyfills.min.js +118 -0
  67. data/lib/starter_web/collections/posts/public/{jekyll → featured}/_posts/2018-05-01-confusion-about-base-url.adoc +0 -0
  68. data/lib/starter_web/package.json +1 -1
  69. data/lib/starter_web/pages/public/learn/floating_sidebar.adoc +199 -0
  70. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +2 -2
  71. data/lib/starter_web/pages/public/learn/roundtrip/200_typography.adoc +2 -2
  72. data/lib/starter_web/pages/public/learn/whats_up.adoc +12 -11
  73. data/lib/starter_web/pages/public/legal/en/500_support.adoc +1 -1
  74. data/lib/starter_web/pages/public/previewer/000_includes/tables/mdi_icons/200_rotate.asciidoc +1 -1
  75. data/lib/starter_web/pages/public/previewer/mdi_icons_preview.adoc +2 -3
  76. data/lib/starter_web/pages/public/previewer/twitter_emoji_preview.adoc +3 -3
  77. data/lib/starter_web/pages/public/site_search.adoc +196 -0
  78. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  79. data/lib/starter_web/utilsrv/package.json +1 -1
  80. metadata +27 -6
@@ -1,5 +1,5 @@
1
1
  ---
2
- regenerate: true
2
+ regenerate: false
3
3
  ---
4
4
 
5
5
  {% capture cache %}
@@ -156,7 +156,7 @@ j1.adapter['gallery_customizer'] = (function (j1, window) {
156
156
  $.when (
157
157
  j1.xhrData (
158
158
  'j1.adapter.gallery_customizer', {
159
- xhr_container_id: customizerOptions.xhr_container_id,
159
+ xhr_container_id: customizerOptions.xhr_container_id,
160
160
  xhr_data_path: customizerOptions.xhr_data_path },
161
161
  'data_loaded'))
162
162
  .then (function (success) {
@@ -260,7 +260,7 @@ j1.adapter['gallery_customizer'] = (function (j1, window) {
260
260
  e.stopPropagation();
261
261
  });
262
262
 
263
- $('input:checkbox[name="captions"]').on('click', function (e) {
263
+ $('input:checkbox[name="captions"]').on('click', function (e) {
264
264
  var value = $(this).is(':checked');
265
265
 
266
266
  $instance.justifiedGallery({captions: value});
@@ -299,7 +299,7 @@ j1.adapter['gallery_customizer'] = (function (j1, window) {
299
299
  e.stopPropagation();
300
300
  });
301
301
 
302
- $('input:checkbox[name="hide_last_row"]').on('click', function (e) {
302
+ $('input:checkbox[name="hide_last_row"]').on('click', function (e) {
303
303
  var value = $(this).is(":checked");
304
304
 
305
305
  if (value == true) {
@@ -316,14 +316,14 @@ j1.adapter['gallery_customizer'] = (function (j1, window) {
316
316
  e.stopPropagation();
317
317
  });
318
318
 
319
- $('#jg-customizer-form button[name="reset-defaults"]').on('click', function (e) {
319
+ $('#jg-customizer-form button[name="reset-defaults"]').on('click', function (e) {
320
320
 
321
321
  $('#rowHeight').val(customizerOptions.gallery_settings.rowHeight);
322
322
  $('#rowHeightMax').val(customizerOptions.gallery_settings.maxRowHeight);
323
323
  $('#margins').val(customizerOptions.gallery_settings.margins);
324
324
  $('#border').val(customizerOptions.gallery_settings.border);
325
325
  $('input:checkbox[name="captions"]').val("on").filter('[value="on"]').prop('checked', customizerOptions.gallery_settings.captions);
326
- $('input:checkbox[name="random"]').val("off").filter('[value="off"]').prop('checked', customizerOptions.gallery_settings.randomize);
326
+ $('input:checkbox[name="random"]').val("off").filter('[value="off"]').prop('checked', customizerOptions.gallery_settings.randomize);
327
327
  $('input:checkbox[name="justify_last_row"]').val("on").filter('[value="on"]').prop('checked', customizerOptions.gallery_settings.justifyLastRow);
328
328
  $('input:checkbox[name="hide_last_row"]').val("off").filter('[value="off"]').prop('checked', customizerOptions.gallery_settings.hideLastRow);
329
329
 
@@ -424,4 +424,4 @@ j1.adapter['gallery_customizer'] = (function (j1, window) {
424
424
 
425
425
  {% endcapture %}
426
426
  {{ cache | strip_empty_lines }}
427
- {% assign cache = nil %}
427
+ {% assign cache = nil %}
@@ -89,6 +89,10 @@ regenerate: true
89
89
  # J1 Template is licensed under the MIT License.
90
90
  # For details, see https://jekyll.one
91
91
  # -----------------------------------------------------------------------------
92
+ # TODO:
93
+ # MANAGE themeExtensionCss is to be checked
94
+ #
95
+ # -----------------------------------------------------------------------------
92
96
  # Adapter generated: {{site.time}}
93
97
  # -----------------------------------------------------------------------------
94
98
  */
@@ -122,7 +126,7 @@ var j1 = (function () {
122
126
  // Theme information
123
127
  var themeName;
124
128
  var themeCss;
125
- var themeExtensionCss;
129
+ var themeExtensionCss = environment === 'production' ? '/assets/themes/j1/core/css/theme_extensions.min.css' : '/assets/themes/j1/core/css/theme_extensions.css';
126
130
 
127
131
  // Pathes of J1 data files
128
132
  var colors_data_path = '{{template_config.colors_data_path}}';
@@ -168,20 +172,20 @@ var j1 = (function () {
168
172
  'provider_privacy_url': '{{template_config.user.provider_privacy_url}}',
169
173
  'requested_page': 'na',
170
174
  'previous_page': 'na',
171
- 'last_pager': '/pages/public/blog/navigator/'
175
+ 'last_pager': '/pages/public/blog/navigator/'
172
176
  };
173
177
 
174
178
  // user STATE cookie (initial values)
175
179
  var user_state = {
176
180
  'theme_css': default_theme_css,
177
- 'theme_extension_css': '{{themer_options.includeBootswatch}}',
181
+ 'theme_extension_css': themeExtensionCss,
178
182
  'theme_name': default_theme_name,
179
183
  'theme_author': default_theme_author,
180
184
  'theme_author_url': '{{template_config.theme_author_url}}',
181
185
  'theme_link': default_theme_link,
182
186
  'theme_version': '{{site.version}}',
183
187
  'cookies_accepted': 'pending',
184
- 'whitelistedPages': default_white_listed_pages,
188
+ 'whitelistedPages': default_white_listed_pages,
185
189
  'deleteOnDecline': false,
186
190
  'showConsentOnPending': false,
187
191
  'stopScrolling': true,
@@ -233,15 +237,15 @@ var j1 = (function () {
233
237
  {
234
238
  foo: 'foo_option',
235
239
  bar: 'bar_option'
236
- },
237
- options
240
+ },
241
+ options
238
242
  );
239
243
 
240
244
  // catch senseless detect url 404 errors (middleware /status)
241
245
  // See: https://stackoverflow.com/questions/4687235/jquery-get-or-post-to-catch-page-load-error-eg-404
242
246
  $.ajaxSetup({
243
247
  // called on `$.get()`, `$.post()`, `$.ajax()`
244
- statusCode : {
248
+ statusCode : {
245
249
  // raised on response status code 404
246
250
  404 : function (jqxhr, textStatus, errorThrown) {
247
251
  var interval_count = 0;
@@ -251,7 +255,7 @@ var j1 = (function () {
251
255
  if ( j1.adapter.logger.getState() == 'finished' ) {
252
256
  var logger = log4javascript.getLogger('j1.init');
253
257
  clearInterval(dependencies_met_logger);
254
- if(jqxhr.responseText.indexOf('GET /status') > -1) {
258
+ if(jqxhr.responseText.indexOf('GET /status') > -1) {
255
259
  logger.info('no middleware found on url /status: ignored');
256
260
  logger.info('continue on mode: web');
257
261
  }
@@ -285,12 +289,19 @@ var j1 = (function () {
285
289
  user_state.session_active = false;
286
290
  user_state.last_session_ts = timestamp_now;
287
291
 
292
+ // DANGEROUS (??): delete user session in browser using MULTI_TAB!
293
+ // if (j1.existsCookie(cookie_names.user_session)) {
294
+ // var bla = cookie_names.user_session;
295
+ // j1.deleteCookie(cookie_names.user_session)
296
+ // }
297
+
288
298
  j1.writeCookie({
289
299
  name: cookie_user_state_name,
290
300
  data: user_state,
291
301
  expires: 365
292
302
  });
293
303
 
304
+
294
305
  });
295
306
 
296
307
  // -----------------------------------------------------------------------
@@ -335,7 +346,7 @@ var j1 = (function () {
335
346
  .then(function(data) {
336
347
  var logger = log4javascript.getLogger('j1.init');
337
348
  user_session = j1.readCookie(cookie_names.user_session);
338
- user_session.mode = 'app';
349
+ user_session.mode = 'app';
339
350
  user_session.requested_page = window.location.pathname;
340
351
  user_session.timestamp = timestamp_now;
341
352
  user_session = j1.mergeData(user_session, data);
@@ -855,9 +866,9 @@ var j1 = (function () {
855
866
  var providerPermissions = {};
856
867
  var provider;
857
868
  var previous_page;
858
- var appDetected;
869
+ var appDetected;
859
870
  var categoryAllowed;
860
-
871
+
861
872
 
862
873
  logger.info('finalize page');
863
874
  j1.setCss();
@@ -885,8 +896,8 @@ var j1 = (function () {
885
896
  // -------------------------------------------------------------------
886
897
  if (
887
898
  j1.authEnabled() &&
888
- user_session.page_permission !== 'public' &&
889
- categoryAllowed === false)
899
+ user_session.page_permission !== 'public' &&
900
+ categoryAllowed === false)
890
901
  {
891
902
  // redirect to middleware|page_authentication
892
903
  if (data.authenticated === 'true') {
@@ -927,7 +938,7 @@ var j1 = (function () {
927
938
  $('#quickLinksControlCenterButton').css('display', 'block');
928
939
 
929
940
  // show|hide signin|out icon
930
- if (j1.authEnabled()) {
941
+ if (j1.authEnabled()) {
931
942
  if (user_session.authenticated === 'true') {
932
943
  // set signout
933
944
  logger.info('show signout icon');
@@ -959,7 +970,7 @@ var j1 = (function () {
959
970
  // update sidebar for changed consent|theme data
960
971
  logger.info('update sidebar');
961
972
  user_state = j1.readCookie(cookie_names.user_state);
962
- current_user_data = j1.mergeData(user_session, user_state);
973
+ current_user_data = j1.mergeData(user_session, user_state);
963
974
  j1.core.navigator.updateSidebar(current_user_data);
964
975
 
965
976
  // Set|Log status
@@ -1023,7 +1034,7 @@ var j1 = (function () {
1023
1034
  // update sidebar for changed consent|theme data
1024
1035
  logger.info('update sidebar');
1025
1036
  user_state = j1.readCookie(cookie_names.user_state);
1026
- current_user_data = j1.mergeData(user_session, user_state);
1037
+ current_user_data = j1.mergeData(user_session, user_state);
1027
1038
  j1.core.navigator.updateSidebar(current_user_data);
1028
1039
 
1029
1040
  // Set|Log status
@@ -1165,9 +1176,17 @@ var j1 = (function () {
1165
1176
  // Returns true if a web session cookie exists
1166
1177
  // -------------------------------------------------------------------------
1167
1178
  appDetected: function () {
1168
- var user_session = j1.readCookie(cookie_names.user_session);
1169
- var detected = user_session.mode === 'app' ? true : false;
1179
+ var user_session;
1180
+ var cookieExists = j1.existsCookie(cookie_names.user_session);
1181
+ var detected = false;
1170
1182
 
1183
+ if (cookieExists) {
1184
+ user_session = j1.readCookie(cookie_names.user_session);
1185
+ detected = user_session.mode === 'app' ? true : false;
1186
+ } else {
1187
+ // detected = 'unknown';
1188
+ detected = false;
1189
+ }
1171
1190
  return detected;
1172
1191
  }, // END appDetected
1173
1192
 
@@ -1280,7 +1299,7 @@ var j1 = (function () {
1280
1299
 
1281
1300
  // -------------------------------------------------------------------------
1282
1301
  // getRuntimeData: Returns the j1_runtime data object
1283
- //
1302
+ //
1284
1303
  // -------------------------------------------------------------------------
1285
1304
  getRuntimeData: function (data_path) {
1286
1305
  var logger = log4javascript.getLogger('j1.getRuntimeData');
@@ -1344,8 +1363,8 @@ var j1 = (function () {
1344
1363
  }, // END getColorData
1345
1364
 
1346
1365
  // -------------------------------------------------------------------------
1347
- // setColorData:
1348
- //
1366
+ // setColorData:
1367
+ //
1349
1368
  // -------------------------------------------------------------------------
1350
1369
  setColorData: function (color) {
1351
1370
 
@@ -1482,11 +1501,17 @@ var j1 = (function () {
1482
1501
  readCookie: function (name) {
1483
1502
  var data;
1484
1503
  var data_json;
1485
- data_json = window.atob(Cookies.get(name));
1486
- data = JSON.parse(data_json);
1504
+ var cookieExists = j1.existsCookie(name);
1505
+
1506
+ if (cookieExists) {
1507
+ data_json = window.atob(Cookies.get(name));
1508
+ data = JSON.parse(data_json);
1487
1509
 
1488
- if (data) {
1489
- return data;
1510
+ if (data) {
1511
+ return data;
1512
+ } else {
1513
+ return false;
1514
+ }
1490
1515
  } else {
1491
1516
  return false;
1492
1517
  }
@@ -1613,7 +1638,7 @@ var j1 = (function () {
1613
1638
  //see if cookie is in first position
1614
1639
  begin = dc.indexOf(prefix);
1615
1640
  // not found at all or found as a portion of another cookie name
1616
- if (begin === -1 || begin !== 0 ) return null;
1641
+ if (begin === -1 || begin !== 0 ) return false;
1617
1642
  }
1618
1643
 
1619
1644
  // if ";" is found somewhere after the prefix position then "end" is
@@ -1947,7 +1972,7 @@ var j1 = (function () {
1947
1972
  var tabs_pills_link_color_hover = j1.setColorData('md_gray_300'); // j1.getStyleValue('btn-secondary', 'background-color');
1948
1973
 
1949
1974
  // nav module
1950
- // -----------------------------------------------------------------------
1975
+ // -----------------------------------------------------------------------
1951
1976
  $('head').append('<style>.nav-link:hover { background-color: ' +tabs_pills_link_color_hover+ ' !important; }</style>');
1952
1977
  $('head').append('<style>.nav-link.active { background-color: ' +tabs_pills_link_color_active+ ' !important; }</style>');
1953
1978
 
@@ -2015,10 +2040,10 @@ var j1 = (function () {
2015
2040
  // -------------------------------------------------------------------------
2016
2041
  goHome: function () {
2017
2042
  // most browsers
2018
- if (typeof window.home == 'function') {
2043
+ if (typeof window.home == 'function') {
2019
2044
  window.home();
2020
2045
  } else if (document.all) {
2021
- // for IE
2046
+ // for IE
2022
2047
  window.location.href = "about:home";
2023
2048
  } else {
2024
2049
  window.location.href = "about:blank";
@@ -2031,4 +2056,4 @@ var j1 = (function () {
2031
2056
  {% endcapture %}
2032
2057
 
2033
2058
  {{ cache | strip_empty_lines }}
2034
- {% assign cache = nil %}
2059
+ {% assign cache = nil %}
@@ -1,5 +1,5 @@
1
1
  ---
2
- regenerate: true
2
+ regenerate: false
3
3
  ---
4
4
 
5
5
  {% capture cache %}
@@ -313,4 +313,4 @@ j1.adapter['logger'] = (function (j1, window) {
313
313
 
314
314
  {% endcapture %}
315
315
  {{ cache | strip_empty_lines }}
316
- {% assign cache = nil %}
316
+ {% assign cache = nil %}
@@ -0,0 +1,439 @@
1
+ ---
2
+ regenerate: true
3
+ ---
4
+
5
+ {% capture cache %}
6
+
7
+ {% comment %}
8
+ # -----------------------------------------------------------------------------
9
+ # ~/assets/themes/j1/adapter/js/mmenu.js
10
+ # Liquid template to adapt Mmenu-Light Core functions
11
+ #
12
+ # Product/Info:
13
+ # https://jekyll.one
14
+ #
15
+ # Copyright (C) 2020 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
+ {% endcomment %}
30
+
31
+ {% comment %} Liquid procedures
32
+ -------------------------------------------------------------------------------- {% endcomment %}
33
+ {% capture select_color %}themes/{{site.template.name}}/procedures/global/select_color.proc{% endcapture %}
34
+
35
+ {% comment %} Set global settings
36
+ -------------------------------------------------------------------------------- {% endcomment %}
37
+ {% assign environment = site.environment %}
38
+ {% assign brand_image_height = site.brand.image_height %}
39
+
40
+ {% comment %} Process YML config data
41
+ ================================================================================ {% endcomment %}
42
+
43
+ {% comment %} Set config files
44
+ {% assign auth_manager_config = site.j1_auth %}
45
+ -------------------------------------------------------------------------------- {% endcomment %}
46
+ {% assign site_config = site %}
47
+ {% assign template_config = site.data.template_settings %}
48
+ {% assign blocks = site.data.blocks %}
49
+ {% assign modules = site.data.modules %}
50
+
51
+ {% assign template_config = site.data.template_settings %}
52
+ {% assign navigator_defaults = site.data.modules.defaults.navigator.defaults %}
53
+ {% assign navigator_settings = site.data.modules.navigator.settings %}
54
+
55
+ {% comment %} Set config data
56
+ -------------------------------------------------------------------------------- {% endcomment %}
57
+ {% assign nav_mmenu_defaults = navigator_defaults.nav_mmenu %}
58
+ {% assign nav_mmenu_settings = navigator_settings.nav_mmenu %}
59
+
60
+ {% comment %} Set config options
61
+ -------------------------------------------------------------------------------- {% endcomment %}
62
+ {% assign nav_mmenu_options = nav_mmenu_defaults | merge: nav_mmenu_settings %}
63
+ {% assign nav_mmenu_id = navigator_defaults.nav_mmenu.xhr_container_id %}
64
+ {% assign nav_navbar_media_breakpoint = navigator_defaults.nav_bar.media_breakpoint %}
65
+
66
+ /*
67
+ # -----------------------------------------------------------------------------
68
+ # ~/assets/themes/j1/adapter/js/mmenu.js
69
+ # JS Adapter for J1 MobileMenu (MMenu Light)
70
+ #
71
+ # Product/Info:
72
+ # {{site.data.template_settings.theme_author_url}}
73
+ #
74
+ # Copyright (C) 2020 Juergen Adams
75
+ #
76
+ # J1 Template is licensed under the MIT License.
77
+ # For details, see {{site.data.template_settings.theme_author_url}}
78
+ # -----------------------------------------------------------------------------
79
+ # NOTE: For AJAX (XHR) loads see
80
+ # https://stackoverflow.com/questions/3709597/wait-until-all-jquery-ajax-requests-are-done
81
+ # -----------------------------------------------------------------------------
82
+ # NOTE: For getStyleValue helper see
83
+ # https://stackoverflow.com/questions/16965515/how-to-get-a-style-attribute-from-a-css-class-by-javascript-jquery
84
+ # -----------------------------------------------------------------------------
85
+ # Adapter generated: {{site.time}}
86
+ # -----------------------------------------------------------------------------
87
+ */
88
+ 'use strict';
89
+
90
+ j1.adapter['mmenu'] = (function (j1, window) {
91
+
92
+ // ---------------------------------------------------------------------------
93
+ // globals
94
+ // ---------------------------------------------------------------------------
95
+ var environment = '{{environment}}';
96
+ var dclFinished = false;
97
+ var moduleOptions = {};
98
+ var cookie_names = j1.getCookieNames();
99
+ var user_state;
100
+ var user_session;
101
+ var user_data;
102
+ var _this;
103
+ var logger;
104
+ var logText;
105
+
106
+ // ---------------------------------------------------------------------------
107
+ // helper functions
108
+ // ---------------------------------------------------------------------------
109
+
110
+
111
+ // ---------------------------------------------------------------------------
112
+ // main object
113
+ // ---------------------------------------------------------------------------
114
+ return {
115
+
116
+ // -------------------------------------------------------------------------
117
+ // module initializer
118
+ // -------------------------------------------------------------------------
119
+ init: function (options) {
120
+ // initialize state flag
121
+ j1.adapter.mmenu.state = 'pending';
122
+
123
+ // -----------------------------------------------------------------------
124
+ // defaults
125
+ // -----------------------------------------------------------------------
126
+ var settings = $.extend({
127
+ module_name: 'j1.adapter.mmenu',
128
+ generated: '{{site.time}}'
129
+ }, options);
130
+
131
+ // -----------------------------------------------------------------------
132
+ // globals
133
+ // -----------------------------------------------------------------------
134
+ _this = j1.adapter.mmenu;
135
+ logger = log4javascript.getLogger('j1.adapter.mmenu');
136
+
137
+ // -----------------------------------------------------------------------
138
+ // options loader
139
+ // -----------------------------------------------------------------------
140
+ var navMenuOptions = $.extend({}, {{nav_mmenu_options | replace: '=>', ':' }});
141
+ var xhr_data_path;
142
+ var menu_id;
143
+
144
+ // save config settings into the mmenu object for global access
145
+ //
146
+ j1.adapter.mmenu['navMenuOptions'] = navMenuOptions;
147
+
148
+ // Load (individual) frontmatter options (currently NOT used)
149
+ //
150
+ if (options != null) { var frontmatterOptions = $.extend({}, options) }
151
+
152
+ _this.setState('started');
153
+ logger.info('state: ' + _this.getState());
154
+ logger.info('module is being initialized');
155
+
156
+ // jadams, 2020-06-24: Set max_count to 100 what cause to wait 2.5s
157
+ // for J1 Navigator to finish (init)
158
+ //
159
+ var interval_count = 0;
160
+ var max_count = 100;
161
+
162
+ var dependencies_met_navigator = setInterval(function() {
163
+ interval_count += 1;
164
+ if ( j1.adapter.navigator.getState() == 'finished' ) {
165
+ logger.info('dependencies of module navigator met for: mmenu');
166
+ logger.info('dependencies of module navigator met after: ' + interval_count * 25 + ' ms');
167
+ j1.adapter.mmenu.mmenuLoader(navMenuOptions);
168
+ clearInterval(dependencies_met_navigator);
169
+ }
170
+ if (interval_count > max_count) {
171
+ logger.warn('dependency check failed for module: navigator');
172
+ logger.warn('dependencies of module navigator met after: ' + interval_count * 25 + ' ms');
173
+ clearInterval(dependencies_met_navigator);
174
+ j1.adapter.mmenu.mmenuLoader(navMenuOptions);
175
+ }
176
+ }, 25);
177
+
178
+ }, // END init
179
+
180
+ // -------------------------------------------------------------------------
181
+ // MMenu Loader
182
+ // -------------------------------------------------------------------------
183
+ mmenuLoader: function (mmOptions) {
184
+ var menu_id;
185
+ var xhr_data_path;
186
+
187
+ _this.setState('loading');
188
+ logger.info('status: ' + _this.getState());
189
+ logger.info('load HTML data for navs and drawers');
190
+
191
+ {% assign id_list = "" %}
192
+
193
+ // -----------------------------------------------------------------------
194
+ // Load HTML data (AJAX)
195
+ // -----------------------------------------------------------------------
196
+ // jadams, 202-06-24: Promise (chain) if $.when seems NOT to work correctly.
197
+ // It semms a chain using .then will be a better solution to make it sure
198
+ // that the last Deferred set the state to 'data_loaded'.
199
+ // Found the final state randomly set to 'null' what prevent the module
200
+ // to run mmenuInitializer.
201
+ // Workaround: Set 'data_loaded' to be returned by all Deferred in
202
+ // the chain.
203
+ // See: https://stackoverflow.com/questions/5436327/jquery-deferreds-and-promises-then-vs-done
204
+ //
205
+ {% comment %} Modify chain
206
+ --------------------------------------------------------------------------
207
+ {% if forloop.last %}'data_loaded'{% else %}'null'{% endif %}){% if forloop.last %}{% else %},{% endif %}
208
+ to
209
+ {% if forloop.last %}'data_loaded'{% else %}'data_loaded'{% endif %}){% if forloop.last %}{% else %},{% endif %}
210
+ -------------------------------------------------------------------------- {% endcomment %}
211
+ $.when (
212
+ {% for item in nav_mmenu_options.menus %} {% if item.menu.enabled %}
213
+ {% assign menu_id = item.menu.xhr_container_id %}
214
+ {% assign xhr_data_path = item.menu.xhr_data_path %}
215
+
216
+ j1.xhrData (
217
+ 'j1.adapter.mmenu', {
218
+ xhr_container_id: "{{menu_id}}",
219
+ xhr_data_path: "{{xhr_data_path}}" },
220
+ {% if forloop.last %}'data_loaded'{% else %}'data_loaded'{% endif %}){% if forloop.last %}{% else %},{% endif %}
221
+
222
+ {% endif %}
223
+ {% capture id_list %}{{id_list}}{{menu_id}}{% if forloop.last %}{% else %},{% endif %} {% endcapture %}
224
+ {% endfor %} // ENDFOR menus
225
+ ).done (function ({{id_list}}) {
226
+ // ---------------------------------------------------------------------
227
+ // Initialize MMenu Navs and Drawers
228
+ // ---------------------------------------------------------------------
229
+ var dependencies_met_mmenu_initialized = setInterval (function () {
230
+ if (_this.getState() === 'data_loaded') {
231
+ logger.info('load HTML data (AJAX): finished');
232
+ _this.setState('processing');
233
+ logger.info('status: ' + _this.getState());
234
+ logger.info('initialize navs and drawers');
235
+ j1.adapter.mmenu.mmenuInitializer(mmOptions);
236
+ clearInterval(dependencies_met_mmenu_initialized);
237
+ }
238
+ }); // END dependencies_met_mmenu_loaded
239
+ }); // END done
240
+ }, // END dataLoader
241
+
242
+ // -------------------------------------------------------------------------
243
+ // MMenu Initializer
244
+ // -------------------------------------------------------------------------
245
+ mmenuInitializer: function (mmOptions) {
246
+ var menu_id;
247
+ var xhr_data_path;
248
+
249
+ {% for item in nav_mmenu_options.menus %} {% if item.menu.enabled %}
250
+
251
+ {% assign menu_id = item.menu.xhr_container_id %}
252
+ menu_id = "{{menu_id}}";
253
+ xhr_data_path = "{{item.menu.xhr_data_path}}";
254
+
255
+ // Create an mmenu instance if id exists: {{menu_id}}
256
+ if ($('#{{menu_id}}').length) {
257
+
258
+ logger.info('mmenu is being initialized on id: {{menu_id}}');
259
+
260
+ {% if item.menu.content.type == "navigation" %}
261
+ // Create an mmenu instance of type NAVIGATION
262
+ logger.info('found content type: NAVIGATION');
263
+ // ---------------------------------------------------------------------
264
+ // menu initializer (NAVIGATION)
265
+ // ---------------------------------------------------------------------
266
+ logger.info('initialize mmenu on id: #{{menu_id}}');
267
+ var dependencies_met_{{menu_id}}_loaded = setInterval (function () {
268
+ if ({{menu_id}}) {
269
+ const menu_selector = document.querySelector('#{{menu_id}}');
270
+ const mmenu_{{menu_id}} = new MmenuLight (
271
+ menu_selector,
272
+ '(max-width: ' + mmOptions.mmenu_plugin.max_width +'px)', {
273
+ // plugin options
274
+ node: mmOptions.mmenu_plugin.node,
275
+ mediaQuery: mmOptions.mmenu_plugin.mediaQuery
276
+ });
277
+
278
+ const drawer_{{menu_id}} = mmenu_{{menu_id}}.offcanvas ({
279
+ // drawer options
280
+ position: mmOptions.mmenu_drawer.position
281
+ });
282
+
283
+ const navigator_{{menu_id}} = mmenu_{{menu_id}}.navigation ({
284
+ // navigator options
285
+ selected: mmOptions.mmenu_navigator.selected,
286
+ slidingSubmenus: mmOptions.mmenu_navigator.slidingSubmenus,
287
+ title: mmOptions.mmenu_navigator.title,
288
+ theme: mmOptions.mmenu_navigator.theme
289
+ });
290
+
291
+ // Toggle Bars (Hamburger) for the NavBar to open|close
292
+ // the mmenu drawer
293
+ $('{{item.menu.content.button}}').each(function(e) {
294
+ var $this = $(this);
295
+
296
+ $this.on('click', function(e){
297
+ const button_{{menu_id}} = this;
298
+
299
+ // TODO: Animated toggle button
300
+ //
301
+ // $('{{item.menu.content.toggler}}').toggleClass('fadeIn');
302
+ // $('{{item.menu.content.toggler}}').toggleClass('rotateIn')
303
+
304
+ // $('.mdi', this).toggleClass('mdi-menu');
305
+ // $('.mdi', this).toggleClass('mdi-close');
306
+
307
+ e.preventDefault();
308
+
309
+ // (toggler_{{menu_id}}.t = !toggler_{{menu_id}}.t)
310
+ // ? drawer_{{menu_id}}.open()
311
+ // : drawer_{{menu_id}}.close();
312
+
313
+ drawer_{{menu_id}}.open()
314
+ });
315
+ });
316
+ clearInterval(dependencies_met_{{menu_id}}_loaded);
317
+ logger.info('initializing mmenu finished on id: #{{menu_id}}');
318
+ }; // END mmenu_loaded
319
+ }); // END dependencies_met_mmenu_loaded
320
+ {% endif %} // ENDIF content_type: NAVIGATION
321
+
322
+ {% if item.menu.content.type == "drawer" %}
323
+ // Create an mmenu instance of type HTML
324
+ logger.info('found content type: DRAWER');
325
+ // -------------------------------------------------------------------
326
+ // menu initializer (DRAWER)
327
+ // -------------------------------------------------------------------
328
+ logger.info('initialize mmenu on id: #{{menu_id}}');
329
+ var dependencies_met_{{menu_id}}_loaded = setInterval (function () {
330
+ if ({{menu_id}}) {
331
+ const menu_selector = document.querySelector('#{{menu_id}}');
332
+
333
+ const mmenu_{{menu_id}} = new MmenuLight (
334
+ menu_selector,
335
+ '(max-width: ' + mmOptions.mmenu_plugin.max_width +'px)', {
336
+ // plugin options
337
+ node: mmOptions.mmenu_plugin.node,
338
+ mediaQuery: mmOptions.mmenu_plugin.mediaQuery
339
+ });
340
+
341
+ const drawer_{{menu_id}} = mmenu_{{menu_id}}.offcanvas ({
342
+ // drawer options
343
+ position: "{{item.menu.drawer.position}}"
344
+ });
345
+
346
+ // button for the MMenu tocbar to open|close the toc drawer
347
+ $('{{item.menu.content.button}}').each(function(e) {
348
+ var $this = $(this);
349
+
350
+ $this.on('click', function(e) {
351
+ var button_{{menu_id}} = this;
352
+ var hasClass;
353
+
354
+ // check if the button should be activated
355
+ // e.g for TOC only if clas js-toc-content is found
356
+ //
357
+ if ('{{item.menu.content.button_activated}}' != 'always') {
358
+ hasClass = $('main').hasClass('{{item.menu.content.button_activated}}');
359
+ } else {
360
+ hasClass = true;
361
+ }
362
+ if (hasClass) {
363
+ // Toggle button animation
364
+ //$('{{item.menu.content.toggler}}').toggleClass('{{item.menu.content.toggler_animation}}')
365
+
366
+ e.preventDefault();
367
+
368
+ // (toggler_{{menu_id}}.t = !toggler_{{menu_id}}.t)
369
+ // ? drawer_{{menu_id}}.open()
370
+ // : drawer_{{menu_id}}.close();
371
+
372
+ drawer_{{menu_id}}.open()
373
+ } // END if hasclass
374
+ });
375
+ });
376
+ clearInterval(dependencies_met_{{menu_id}}_loaded);
377
+ }; // END if menu_loaded
378
+ }); // END dependencies_met_mmenu_loaded
379
+ logger.info('initializing mmenu finished on id: #{{menu_id}}');
380
+ {% endif %} // ENDIF content_type: DRAWER
381
+ } // END menus|drawers
382
+
383
+ {% endif %} // ENDIF menu enabled
384
+ {% endfor %} // ENDFOR menus
385
+ }, // END mmenuInitializer
386
+
387
+ // -------------------------------------------------------------------------
388
+ // messageHandler
389
+ // Manage messages (paylods) send from other J1 modules
390
+ // -------------------------------------------------------------------------
391
+ messageHandler: function (sender, message) {
392
+ // var json_message = JSON.stringify(message, undefined, 2); // multiline
393
+ var json_message = JSON.stringify(message);
394
+
395
+ logText = 'received message from ' + sender + ': ' + json_message;
396
+ logger.debug(logText);
397
+
398
+ // -----------------------------------------------------------------------
399
+ // Process commands|actions
400
+ // -----------------------------------------------------------------------
401
+ if (message.type === 'command' && message.action === 'module_initialized') {
402
+ //
403
+ // Place handling of command|action here
404
+ //
405
+ logger.info(message.text);
406
+ }
407
+ if (message.type === 'command' && message.action === 'status') {
408
+ logger.info('messageHandler: received - ' + message.action);
409
+ }
410
+
411
+ //
412
+ // Place handling of other command|action here
413
+ //
414
+
415
+ return true;
416
+ }, // END messageHandler
417
+
418
+ // -------------------------------------------------------------------------
419
+ // setState
420
+ // Set the current (processing) state of the module
421
+ // -------------------------------------------------------------------------
422
+ setState: function (stat) {
423
+ j1.adapter.mmenu.state = stat;
424
+ }, // END setState
425
+
426
+ // -------------------------------------------------------------------------
427
+ // getState
428
+ // Returns the current (processing) state of the module
429
+ // -------------------------------------------------------------------------
430
+ getState: function () {
431
+ return j1.adapter.mmenu.state;
432
+ } // END state
433
+
434
+ }; // END return
435
+ })(j1, window);
436
+
437
+ {% endcapture %}
438
+ {{ cache | strip_empty_lines }}
439
+ {% assign cache = nil %}