j1-template 2022.3.3 → 2022.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/assets/themes/j1/adapter/js/j1.js +150 -75
  3. data/assets/themes/j1/adapter/js/nbinteract.js +1 -0
  4. data/assets/themes/j1/adapter/js/rangeSlider.js +27 -10
  5. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.js +1 -1
  6. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.js.map +1 -1
  7. data/assets/themes/j1/modules/nbInteract/js/nbinteract/nbinteract-core.min.js +1 -1
  8. data/assets/themes/j1/modules/rangeSlider/css/theme/uno/nouislider.css +5 -0
  9. data/assets/themes/j1/modules/rangeSlider/css/theme/uno/nouislider.min.css +1 -1
  10. data/lib/j1/version.rb +1 -1
  11. data/lib/starter_web/Gemfile +1 -1
  12. data/lib/starter_web/_config.yml +1 -1
  13. data/lib/starter_web/_data/j1_config.yml +22 -7
  14. data/lib/starter_web/_data/modules/rangeSlider.yml +38 -1
  15. data/lib/starter_web/_plugins/asciidoctor-extensions/range-slider-block.rb +44 -0
  16. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  17. data/lib/starter_web/package.json +1 -1
  18. data/lib/starter_web/pages/public/jupyter/notebooks/j1/j1_odes_in_python.ipynb +16 -16
  19. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +919 -919
  20. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +10 -10
  21. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_graphing.html +473 -473
  22. data/lib/starter_web/pages/public/previewer/preview_bootstrap_theme.adoc +2 -2
  23. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  24. data/lib/starter_web/utilsrv/package.json +1 -1
  25. metadata +3 -7
  26. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_new/nbinteract-core.js +0 -94
  27. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_new/nbinteract-core.js.map +0 -1
  28. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_old/j1-nbinteract-core.js +0 -94
  29. data/assets/themes/j1/modules/nbInteract/js/nbinteract/_old/j1-nbinteract-core.js.map +0 -1
  30. data/lib/starter_web/pages/public/se/se-fake.adoc +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0516d27133f2c1f612ca527a69f7bd6978f8e89fe838ec60fe9bc6af6a427315
4
- data.tar.gz: dcfafe53e3c42c52bc0592a9e50795718b18e46ef7273bd255865b8e7cc1f44b
3
+ metadata.gz: 78d7b70f2625cb38a4303024648b75a6065785651dbdbc3b34d93551747ca09c
4
+ data.tar.gz: f50b7c36b92e7a7befa15e1c377330b8371d9aff7c678044e507498bfb7fb715
5
5
  SHA512:
6
- metadata.gz: bdfaa86c30d20a47c3c41318645658f9a522406693b8f2d4e0d021c42386ee174d9c9630219c0800e845b25ceadcc0e1d39b7631b466d486a1e8a190f43bc9f8
7
- data.tar.gz: 65700ba4360e6c75231f7c8271beebf59d49391c63d763fb9c52c6bb680162dd8484c5d632ef050a1f55e103bbd14e2b1e3267cada91f72c35d41e443b461dfb
6
+ metadata.gz: fe3590b5508762043117af7a4e68d61e3c9eadbde627ab4d1bb436755b4dacfc4b8e037aa92112eb299ffd0e3734a72a61b01754564eacf8c4926d07757f24f4
7
+ data.tar.gz: fbda39cbd894c5ac244002044fd31871f684aad817a865c9bcdc9bd154e1c020fbd27d43c3467c9c6adc1f89a80d7f3ff6026c248c3e303571aca8a23c595177
@@ -134,26 +134,41 @@ var j1 = (function () {
134
134
  // ---------------------------------------------------------------------------
135
135
  // globals
136
136
  // ---------------------------------------------------------------------------
137
+ // base page resources
137
138
  var rePager = new RegExp('navigator|dateview|tagview|archive');
138
139
  var environment = '{{environment}}';
139
140
  var moduleOptions = {};
140
141
  var j1_runtime_data = {};
142
+ var _this;
143
+ var settings;
144
+ var json_data;
145
+ var ep;
146
+ var baseUrl;
147
+ var referrer;
141
148
 
142
- // Status information
149
+ // defaults for status information
143
150
  var state = 'not_started';
144
151
  var mode = 'not_detected';
145
152
 
146
- // Default tracking provider information
147
- // var tracking_enabled = ('{{tracking_enabled}}' === 'true') ? true: false;
148
- // var tracking_id = '{{tracking_id}}';
149
- // var tracking_id_valid = (tracking_id.includes('tracking-id')) ? false : true;
153
+ // defaults for tracking providers
154
+ var tracking_enabled = ('{{tracking_enabled}}' === 'true') ? true: false;
155
+ var tracking_id = '{{tracking_id}}';
156
+ var tracking_id_valid = (tracking_id.includes('tracking-id')) ? false : true;
150
157
 
151
- // Default comment provider information
158
+ // defaults for comment providers
152
159
  var comment_provider = '{{comment_provider}}';
153
160
  var site_id = '{{site_id}}';
154
161
  var checkCookies = {{cookie_options.checkCookies}};
155
162
  var expireCookiesOnRequiredOnly = ('{{cookie_options.expireCookiesOnRequiredOnly}}' === 'true') ? true: false;
156
163
 
164
+ // defaults for dynamic pages
165
+ var autoScrollRatioThreshold = '{{template_config.autoScrollRatioThreshold}}';
166
+ var pageGrowthRatio = 0; // ratio a dynamic page has grown in height
167
+ var pageBaseHeigth = 0; // base height of a dynamic page
168
+ var staticPage = false; // defalt: false, but decided in ResizeObserver
169
+ var pageHeight; // height of a page dynamic detected in ResizeObserver
170
+
171
+ // defaults for the cookie management
157
172
  var current_user_data;
158
173
  var current_page;
159
174
  var previous_page;
@@ -163,30 +178,23 @@ var j1 = (function () {
163
178
  var user_session_detected;
164
179
  var cookie_written;
165
180
 
166
- // Theme information
181
+ // defaults for themes
167
182
  var themeName;
168
183
  var themeCss;
169
184
  var cssExtension = (environment === 'production')
170
185
  ? '.min.css'
171
186
  : '.css'
172
187
 
173
- // Pathes of J1 data files
188
+ // defaults for data files
174
189
  var colors_data_path = '{{template_config.colors_data_path}}';
175
190
  var font_size_data_path = '{{template_config.font_size_data_path}}';
176
191
  var runtime_data_path = '{{template_config.runtime_data_path}}';
177
192
  var message_catalog_data_path = '{{template_config.message_catalog_data_path}}';
178
193
 
179
- // Logger
194
+ // Logger resources
180
195
  var logger;
181
196
  var logText;
182
197
 
183
- var _this;
184
- var settings;
185
- var json_data;
186
- var ep;
187
- var baseUrl;
188
- var referrer;
189
-
190
198
  // initial cookie settings
191
199
  var cookie_names = {
192
200
  'app_session': '{{template_config.cookies.app_session}}',
@@ -282,44 +290,6 @@ var j1 = (function () {
282
290
  j1['xhrDataState'] = {};
283
291
  j1['xhrDOMState'] = {};
284
292
 
285
- // -----------------------------------------------------------------------
286
- // final updates before browser page|tab
287
- // see: https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing
288
- // -----------------------------------------------------------------------
289
- window.addEventListener('beforeunload', function (event) {
290
- var cookie_names = j1.getCookieNames();
291
- var date = new Date();
292
- var timestamp_now = date.toISOString();
293
- var user_state = j1.readCookie(cookie_names.user_state);
294
- var user_consent = j1.readCookie(cookie_names.user_consent);
295
- var ep_status;
296
- var url;
297
- var baseUrl;
298
-
299
- // final update of the user state cookie
300
- user_state.session_active = false;
301
- user_state.last_session_ts = timestamp_now;
302
-
303
- if (!user_consent.analysis || !user_consent.personalization) {
304
- logger.debug('\n' + 'write to cookie : ' + cookie_names.user_state);
305
-
306
- cookie_written = j1.writeCookie({
307
- name: cookie_names.user_state,
308
- data: user_state,
309
- secure: secure,
310
- expires: 0
311
- });
312
- } else {
313
- logger.debug('\n' + 'write to cookie : ' + cookie_names.user_state);
314
- cookie_written = j1.writeCookie({
315
- name: cookie_names.user_state,
316
- data: user_state,
317
- secure: secure,
318
- expires: 365
319
- });
320
- }
321
- }); // END beforeunload
322
-
323
293
  // -----------------------------------------------------------------------
324
294
  // initialize|load user cookies
325
295
  // -----------------------------------------------------------------------
@@ -354,11 +324,7 @@ var j1 = (function () {
354
324
  }
355
325
  }
356
326
 
357
- // initialize event handler for window/history/back on <ESC>
358
- // -----------------------------------------------------------------------
359
- window.onkeyup = function (event) {
360
- if (event.keyCode == 27) window.history.back();
361
- };
327
+ j1.registerEvents(logger);
362
328
 
363
329
  // detect middleware (mode 'app') and update user session cookie
364
330
  // -----------------------------------------------------------------------
@@ -988,12 +954,16 @@ var j1 = (function () {
988
954
  logText = '\n' + 'page finalized successfully';
989
955
  logger.info(logText);
990
956
 
991
- // do a (smooth) scroll if all nav elements ready
957
+ // do a (smooth) scroll for static pages (if all nav elements ready)
992
958
  // -----------------------------------------------------------------
993
959
  var dependencies_met_navigator_finished = setInterval(function() {
994
- if (j1.adapter.navigator.getState() == 'finished') {
960
+ // NOTE: dynamic pages scrolled at a growth ratio of 100 percent as well
961
+ if (j1.adapter.navigator.getState() == 'finished' && staticPage) {
995
962
  // if a page requested contains an anchor element, do a smooth scroll
996
- j1.scrollTo();
963
+ logger.debug('\n' + 'Scroll static page, growth ratio at 100 (percent)');
964
+ // NOTE: on some pages, the offset is NOT correct
965
+ var scrollOffset = j1.getScrollOffset();
966
+ j1.scrollTo(scrollOffset);
997
967
  clearInterval(dependencies_met_navigator_finished);
998
968
  }
999
969
  }, 25);
@@ -1003,7 +973,6 @@ var j1 = (function () {
1003
973
  // web mode
1004
974
  // ---------------------------------------------------------------------
1005
975
  setTimeout (function() {
1006
- // j1.setState('finished');
1007
976
  logger.info('\n' + 'state: finished');
1008
977
  logger.info('\n' + 'page initialization: finished');
1009
978
 
@@ -1129,15 +1098,19 @@ var j1 = (function () {
1129
1098
  logText = '\n' + 'page finalized successfully';
1130
1099
  logger.info(logText);
1131
1100
 
1132
- // do a (smooth) scroll if all nav elements ready
1101
+ // do a (smooth) scroll for static pages (if all nav elements ready)
1133
1102
  // -------------------------------------------------------------------
1134
1103
  var dependencies_met_navigator_finished = setInterval(function() {
1135
- if (j1.adapter.navigator.getState() == 'finished') {
1104
+ if (j1.adapter.navigator.getState() == 'finished' && staticPage) {
1105
+ logger.debug('\n' + 'Scroll static page, growth ratio at 100 (percent)');
1136
1106
  // if a page requested contains an anchor element, do a smooth scroll
1137
- j1.scrollTo();
1107
+ // NOTE: on some pages, the offset is NOT correct
1108
+ var scrollOffset = j1.getScrollOffset();
1109
+ j1.scrollTo(scrollOffset);
1138
1110
  clearInterval(dependencies_met_navigator_finished);
1139
1111
  }
1140
1112
  }, 25);
1113
+
1141
1114
  }, flickerTimeout);
1142
1115
  }
1143
1116
  },
@@ -1191,11 +1164,11 @@ var j1 = (function () {
1191
1164
 
1192
1165
  // -------------------------------------------------------------------------
1193
1166
  // getScrollOffset()
1194
- // Calculate offset for correct (smooth) scroll position
1167
+ // Calculate offset for a correct (smooth) scroll position
1195
1168
  // -------------------------------------------------------------------------
1196
1169
  getScrollOffset: function () {
1197
1170
  var scrollOffset;
1198
- var offsetCorrection;
1171
+ var offsetCorrection = 0;
1199
1172
 
1200
1173
  var $pagehead = $('.attic');
1201
1174
  var $navbar = $('nav.navbar');
@@ -1210,8 +1183,10 @@ var j1 = (function () {
1210
1183
 
1211
1184
  // Unclear why or what element cause the need of a correction
1212
1185
  // TODO: General revision of scrollOffset needed
1186
+ // NOTE: Disabled for now
1213
1187
  //
1214
- offsetCorrection = navbarType == 'fixed' ? 10 : -25;
1188
+ // offsetCorrection = navbarType == 'fixed' ? 10 : -25;
1189
+
1215
1190
  scrollOffset = navbarType == 'fixed'
1216
1191
  ? -1*(n + a + f) + offsetCorrection
1217
1192
  : -1*(n + a + f) + h + offsetCorrection;
@@ -1224,23 +1199,25 @@ var j1 = (function () {
1224
1199
  // Scrolls smooth to any anchor referenced by an page URL on
1225
1200
  // e.g. a page reload. Values e.g for delay are taken from
1226
1201
  // TOCCER module
1202
+ // NOTE: crollTo() is triggered by 'onDocumentHeigthChange'
1227
1203
  // -------------------------------------------------------------------------
1228
- scrollTo: function () {
1204
+ scrollTo: function (offset) {
1229
1205
  var logger = log4javascript.getLogger('j1.scrollTo');
1230
1206
  var anchor = window.location.href.split('#')[1];
1231
1207
  var anchor_id = typeof anchor !== 'undefined' ? '#' + anchor : false;
1232
1208
  var scrollDuration = {{toccer_options.scrollSmoothDuration}};
1233
- var scrollOffset = j1.getScrollOffset();
1209
+ var scrollOffset = offset ; // j1.getScrollOffset();
1234
1210
  var isSlider = false;
1235
- var selector;
1211
+ var selector = $(anchor_id);
1236
1212
 
1237
- if (typeof anchor === 'undefined') {
1238
- return false;
1239
- } else if (anchor.includes("googtrans")) {
1213
+ // skip invalid anchors|selectors
1214
+ //
1215
+ if (typeof anchor === 'undefined' || anchor.includes('googtrans') || !$(selector).length) {
1240
1216
  return false;
1241
1217
  }
1242
1218
 
1243
1219
  // Check if the anchor is an slider/gallery element
1220
+ //
1244
1221
  if (typeof anchor !== 'undefined') {
1245
1222
  isSlider = anchor.includes('slide');
1246
1223
  }
@@ -1249,6 +1226,7 @@ var j1 = (function () {
1249
1226
  // scroll only, if an anchor is given with an URL
1250
1227
  selector = $(anchor_id);
1251
1228
  if (selector.length) {
1229
+ logger.info('\n' + 'scrollTo header: ' + anchor_id);
1252
1230
  j1.core.scrollSmooth.scroll(anchor_id, {
1253
1231
  duration: scrollDuration,
1254
1232
  offset: scrollOffset,
@@ -2251,6 +2229,7 @@ var j1 = (function () {
2251
2229
  window.location.href = 'about:blank';
2252
2230
  }
2253
2231
  },
2232
+
2254
2233
  // -------------------------------------------------------------------------
2255
2234
  // goBack()
2256
2235
  // Redirect current page to last visited page (referrer)
@@ -2258,6 +2237,102 @@ var j1 = (function () {
2258
2237
  goBack: function () {
2259
2238
  // where visitor has come from
2260
2239
  window.location.href = document.referrer;
2240
+ },
2241
+
2242
+ // -------------------------------------------------------------------------
2243
+ // registerEvents()
2244
+ // Redirect current page to last visited page (referrer)
2245
+ // -------------------------------------------------------------------------
2246
+ registerEvents: function (logger) {
2247
+
2248
+ // Add ResizeObserver to monitor the page height of dynamic pages
2249
+ // see: https://stackoverflow.com/questions/14866775/detect-document-height-change
2250
+ //
2251
+ const observer = new ResizeObserver(entries => {
2252
+ const scrollOffset = j1.getScrollOffset();
2253
+ // Set autoScrollRatioThreshold if NOT specified
2254
+ autoScrollRatioThreshold = autoScrollRatioThreshold ? autoScrollRatioThreshold : 100;
2255
+ for (const entry of entries) {
2256
+
2257
+ // each entry is an instance of ResizeObserverEntry
2258
+ pageHeight = Math.round(entry.contentRect.height);
2259
+
2260
+ // set base height on a page height <> 0
2261
+ if (!pageBaseHeigth && pageHeight) {
2262
+ pageBaseHeigth = pageHeight;
2263
+ }
2264
+
2265
+ // calculation of the ratio a page that has lengthened
2266
+ if (pageBaseHeigth) {
2267
+ pageGrowthRatio = Math.round(pageHeight / pageBaseHeigth *100);
2268
+ }
2269
+
2270
+ // log only if page grown above 'autoScrollRatioThreshold'
2271
+ if (pageGrowthRatio > autoScrollRatioThreshold) {
2272
+ logger.debug('\n' + 'Page growth ratio reached the threshold: ', pageGrowthRatio);
2273
+ }
2274
+
2275
+ // identify a 'staticPage'
2276
+ if (pageGrowthRatio < autoScrollRatioThreshold) {
2277
+ staticPage = true;
2278
+ } else {
2279
+ // identify a page as 'dynamic' if autoScrollRatioThreshold reached
2280
+ staticPage = false;
2281
+ }
2282
+
2283
+ // dynamic page that has been increased in size above the threshold
2284
+ if (pageGrowthRatio > autoScrollRatioThreshold) {
2285
+ j1.scrollTo(scrollOffset);
2286
+ logger.debug('\n' + 'Scroll dynamic page on growth ratio: ', pageGrowthRatio);
2287
+ }
2288
+ }
2289
+ });
2290
+ // monitor the page 'body'
2291
+ observer.observe(document.querySelector('body'));
2292
+
2293
+ // -----------------------------------------------------------------------
2294
+ // final updates before browser page|tab
2295
+ // see: https://stackoverflow.com/questions/3888902/detect-browser-or-tab-closing
2296
+ // -----------------------------------------------------------------------
2297
+ window.addEventListener('beforeunload', function (event) {
2298
+ var cookie_names = j1.getCookieNames();
2299
+ var date = new Date();
2300
+ var timestamp_now = date.toISOString();
2301
+ var user_state = j1.readCookie(cookie_names.user_state);
2302
+ var user_consent = j1.readCookie(cookie_names.user_consent);
2303
+ var url = new liteURL(window.location.href);
2304
+ var secure = (url.protocol.includes('https')) ? true : false;
2305
+ var ep_status;
2306
+ var url;
2307
+ var baseUrl;
2308
+
2309
+ // final update of the user state cookie
2310
+ user_state.session_active = false;
2311
+ user_state.last_session_ts = timestamp_now;
2312
+
2313
+ if (!user_consent.analysis || !user_consent.personalization) {
2314
+
2315
+ cookie_written = j1.writeCookie({
2316
+ name: cookie_names.user_state,
2317
+ data: user_state,
2318
+ secure: secure,
2319
+ expires: 0
2320
+ });
2321
+ } else {
2322
+ cookie_written = j1.writeCookie({
2323
+ name: cookie_names.user_state,
2324
+ data: user_state,
2325
+ secure: secure,
2326
+ expires: 365
2327
+ });
2328
+ }
2329
+ }); // END beforeunload
2330
+
2331
+ // initialize event handler for window/history/back on <ESC>
2332
+ //
2333
+ window.onkeyup = function (event) {
2334
+ if (event.keyCode == 27) window.history.back();
2335
+ };
2261
2336
  }
2262
2337
  };
2263
2338
  }) (j1, window);
@@ -503,6 +503,7 @@ j1.adapter.nbinteract = (function (j1, window) {
503
503
  if (nbiButtonState) {
504
504
  // button NOT removed
505
505
  logger.warn('NBI initialialization failed on textbook: {{textbook_id}}');
506
+ spinner.stop();
506
507
  // hide the info modal
507
508
  $(nbiModalSuccessID).modal('hide');
508
509
 
@@ -93,8 +93,16 @@ j1.adapter.rangeSlider = (function (j1, window) {
93
93
  // Helper functions
94
94
  // ---------------------------------------------------------------------------
95
95
 
96
- function insertAfter(newNode, referenceNode) {
97
- referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
96
+ function prepend(newNode, referenceNode) {
97
+ referenceNode.parentNode.insertBefore(newNode, referenceNode);
98
+ }
99
+
100
+ function append(newNode, referenceNode) {
101
+ referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
102
+ }
103
+
104
+ function insert(newNode, referenceNode) {
105
+ referenceNode.appendChild(newNode);
98
106
  }
99
107
 
100
108
  // ---------------------------------------------------------------------------
@@ -133,7 +141,7 @@ j1.adapter.rangeSlider = (function (j1, window) {
133
141
  if (j1.getState() == 'finished') {
134
142
 
135
143
  logger.info('\n' + 'module is being initialized');
136
-
144
+
137
145
  // initialize state flag
138
146
  _this.setState('started');
139
147
  logger.debug('\n' + 'state: ' + _this.getState());
@@ -163,8 +171,10 @@ j1.adapter.rangeSlider = (function (j1, window) {
163
171
  {% assign format_decimals = range_slider_options.options.format.decimals %}
164
172
  {% assign cbOnUpdate = range_slider_options.options.cbOnUpdate %}
165
173
 
174
+
166
175
  {% comment %} overload defaults by slider options
167
- -------------------------------------------------------------------- {% endcomment %}
176
+ ---------------------------------------------------------------- {% endcomment %}
177
+ {% if item.slider.options.title %} {% assign title = item.slider.options.title %} {% endif %}
168
178
  {% if item.slider.options.label %} {% assign label = item.slider.options.label %} {% endif %}
169
179
  {% if item.slider.options.start %} {% assign start = item.slider.options.start %} {% endif %}
170
180
  {% if item.slider.options.connect %} {% assign connect = item.slider.options.connect %} {% endif %}
@@ -176,7 +186,8 @@ j1.adapter.rangeSlider = (function (j1, window) {
176
186
  {% if item.slider.options.cbOnUpdate %} {% assign cbOnUpdate = item.slider.options.cbOnUpdate %} {% endif %}
177
187
 
178
188
  elms.forEach(function (elm) {
179
- var id = elm.id;
189
+ var id = elm.id;
190
+ var parent = document.getElementById(id);
180
191
 
181
192
  if (id === '{{slider_id}}') {
182
193
  // processing rangeSlider: {{slider_id}}
@@ -198,11 +209,17 @@ j1.adapter.rangeSlider = (function (j1, window) {
198
209
  })
199
210
  });
200
211
 
201
- var el = document.createElement("label");
202
- el.classList.add('range-slider-label');
203
- el.innerHTML = '{{label}}';
204
- var div = document.getElementById(id);
205
- insertAfter(el, div);
212
+ if ('{{title}}'.length) {
213
+ var title = document.createElement('div');
214
+ title.classList.add('range-slider-title');
215
+ title.innerHTML = '{{title}}';
216
+ prepend(title, parent);
217
+ }
218
+
219
+ var label = document.createElement('label');
220
+ label.classList.add('range-slider-label');
221
+ label.innerHTML = '{{label}}';
222
+ insert(label, parent);
206
223
 
207
224
  slider_{{slider_id}}.noUiSlider.on('update', function (values, handle) {
208
225
  var logger = log4javascript.getLogger('j1.adapter.rangeSlider.cbOnUpdate');