j1-template 2021.1.26 → 2021.1.27

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  # -----------------------------------------------------------------------------
3
- # ~/assets/themes/j1/modules/infiniteScroll/css/uno.css
4
- # Provides styles for J1 Module infiniteScroll
3
+ # ~/assets/themes/j1/modules/j1Scroll/css/uno.css
4
+ # Provides styles for J1 Module j1Scroll
5
5
  #
6
6
  # Product/Info:
7
7
  # https://jekyll.one
@@ -32,53 +32,7 @@ span {
32
32
  }
33
33
  */
34
34
 
35
- /* groups and items
36
- -------------------------------------------------------------------------------- */
37
- .list-group-item {
38
- width: 96%;
39
- margin-right: 1% !important;
40
- }
41
-
42
- /* Media breakpoints */
43
- @media only screen and (min-width: 576px) {
44
- .list-group-item.items-auto {
45
- width: 48.3%; }
46
- .list-group-item.items-1 {
47
- width: 96%; }
48
- .list-group-item.items-2 {
49
- width: 48.3%; }
50
- .list-group-item.items-3 {
51
- width: 48.3%; }
52
- .list-group-item.items-4 {
53
- width: 48.3%; } }
54
-
55
- @media only screen and (min-width: 768px) {
56
- .list-group-item.items-auto {
57
- width: 31.333%; }
58
- .list-group-item.items-1 {
59
- width: 96%; }
60
- .list-group-item.items-2 {
61
- width: 48.3%; }
62
- .list-group-item.items-3 {
63
- width: 48.3%; }
64
- .list-group-item.items-4 {
65
- width: 48.3%; } }
66
-
67
- @media only screen and (min-width: 992px) {
68
- .list-group-item.items-auto {
69
- width: 23.8%; }
70
- .list-group-item.items-1 {
71
- width: 96%; }
72
- .list-group-item.items-2 {
73
- width: 48.3%;
74
- }
75
- .list-group-item.items-3 {
76
- width: 31.333%; }
77
- .list-group-item.items-4 {
78
- width: 23.8%; } }
79
-
80
-
81
- /* controls
35
+ /* plugin controls
82
36
  -------------------------------------------------------------------------------- */
83
37
  .page-load-status, .page-scroll-last {
84
38
  display: none; /* hidden by default */
@@ -97,7 +51,7 @@ span.infinite-scroll-last {
97
51
  padding: 10px 3px;
98
52
  }
99
53
 
100
- /* spinner
54
+ /* plugin spinner
101
55
  -------------------------------------------------------------------------------- */
102
56
  .loader-ellips {
103
57
  font-size: 20px; /* change size here */
@@ -21,77 +21,93 @@
21
21
 
22
22
  'use strict';
23
23
 
24
- // undefined is used here as the undefined global variable in ECMAScript 3 is
25
- // mutable (ie. it can be changed by someone else). undefined isn't really being
26
- // passed in so we can ensure the value of it is truly undefined. In ES5, undefined
27
- // can no longer be modified.
28
-
29
- // window and document are passed through as local variable rather than global
30
- // as this (slightly) quickens the resolution process and can be more efficiently
31
- // minified (especially when both are regularly referenced in your plugin).
32
-
33
- // Create the defaults once
24
+ // Create the defaults
34
25
  var pluginName = 'j1Scroll',
35
26
  defaults = {
36
- type: 'infiniteScroll',
37
- scrollThreshold: 100,
38
- elementScroll: false,
39
- pNum: 2,
40
- pMaxNum: 6,
41
- enable: true,
27
+ type: 'infiniteScroll',
28
+ scrollThreshold: 400,
29
+ elementScroll: false,
30
+ firstPage: 2,
31
+ lastPage: false,
32
+ loadStatus: true,
33
+ onInit: function (){}, // callback after plugin has initialized
34
+ onBeforeLoad: function (){}, // callback before new items are loaded
35
+ onAfterLoad: function (){} // callback after new items are loaded
42
36
  };
43
37
 
44
38
  // Plugin constructor
45
39
  function Plugin (element, options) {
46
40
  this.element = element;
47
41
  this.settings = $.extend( {}, defaults, options);
48
- this.settings.elementID = this.element["id"]
49
- this._defaults = defaults;
50
- this._name = pluginName;
42
+ this.settings.elementID = '#' + this.element["id"]
51
43
 
52
44
  // call the initializer
53
45
  this.init(this.settings);
54
46
  }
55
47
 
56
48
  // Avoid Plugin.prototype conflicts
57
- //
58
49
  $.extend(Plugin.prototype, {
59
- // -----------------------------------------------------------------------
50
+ // -------------------------------------------------------------------------
60
51
  // init: initializer
61
- //
62
- // -----------------------------------------------------------------------
52
+ // -------------------------------------------------------------------------
63
53
  init: function(options) {
64
- var logger = log4javascript.getLogger('j1.core.j1Scroll');
54
+ var logger = log4javascript.getLogger('j1Scroll');
65
55
 
66
- if ( this.settings.elementScroll ) {
67
- this.scroller = this.element;
68
- } else {
69
- this.scroller = window;
56
+ logger.info('\n' + 'initializing plugin: started');
57
+ logger.info('\n' + 'state: started');
58
+
59
+ if (options.loadStatus) {
60
+ var spinner = '<div class="loader-ellips" style="display: none"> <span class="loader-ellips__dot"></span> <span class="loader-ellips__dot"></span> <span class="loader-ellips__dot"></span> <span class="loader-ellips__dot"></span> </div>';
61
+ $(spinner).insertAfter(options.elementID);
62
+ }
63
+
64
+ if (options.infoLastPage ) {
65
+ var scroll_last_en = 'More articles can be found with the ';
66
+ var scroll_last_de = 'Weitere Artikel finden Sie im ';
67
+ var scroll_last;
68
+
69
+ if (document.documentElement.lang === 'en') {
70
+ scroll_last = scroll_last_en;
71
+ } else if (document.documentElement.lang === 'de') {
72
+ scroll_last = scroll_last_de;
73
+ } else {
74
+ scroll_last = scroll_last_en;
75
+ }
76
+
77
+ if ( this.settings.elementScroll ) {
78
+ this.scroller = this.element;
79
+ } else {
80
+ this.scroller = window;
81
+ }
82
+ var message = '<div class="page-scroll-last"><p class="infinite-scroll-last">' + scroll_last + '<a href="/pages/public/blog/navigator/">Blog Navigator</a></p> </div>';
83
+ $(message).insertAfter(options.elementID);
70
84
  }
71
85
 
72
- logger.info('\n' + 'initializing core module: started');
73
- logger.info('\n' + 'state: started');
74
86
 
75
87
  // initialize infinite scroll
76
88
  if ( options.type === 'infiniteScroll') {
77
- this.detectScroll(options);
89
+ logger.info('\n' + 'processing mode: infiniteScroll');
90
+ logger.info('\n' + 'loading items from path: ' + options.path + "#");
91
+ logger.info('\n' + 'monitoring element set to: ' + this.scroller);
92
+ this.registerScrollEvent(options);
78
93
  }
94
+ logger.info('\n' + 'initializing plugin: finished');
95
+ logger.info('\n' + 'state: finished');
79
96
  },
80
- // -----------------------------------------------------------------------
97
+ // -------------------------------------------------------------------------
81
98
  // bottomReached: detect final scroll position
82
- //
83
- // -----------------------------------------------------------------------
99
+ // -------------------------------------------------------------------------
84
100
  isBottomReached: function (options) {
85
101
  var _this = this;
86
102
  let bottom, scrollY;
87
- var clientHeight = $('#' + options.elementID).height();
103
+ var clientHeight = $(options.elementID).height();
88
104
 
89
105
  if ( _this.settings.elementScroll ) {
90
106
  var $window = $(window);
91
107
  var viewport_top = $window.scrollTop();
92
108
  var viewport_height = $window.height();
93
109
  var viewport_bottom = viewport_top + viewport_height;
94
- var $elm = $('#' + options.elementID);
110
+ var $elm = $(options.elementID);
95
111
  var top = $elm.offset().top + clientHeight;
96
112
  var height = $elm.height();
97
113
  // bottom = top + height - options.scrollThreshold
@@ -104,84 +120,132 @@
104
120
  return (window.innerHeight + window.pageYOffset + options.scrollThreshold >= document.body.offsetHeight);
105
121
  }
106
122
  },
107
- // -----------------------------------------------------------------------
123
+ // -------------------------------------------------------------------------
108
124
  // detectScroll: EventHandler to load new items for infinite scroll
109
125
  // if final scroll position reached
110
- // -----------------------------------------------------------------------
111
- detectScroll: function (options) {
126
+ // -------------------------------------------------------------------------
127
+ registerScrollEvent: function (options) {
112
128
  var _this = this;
113
- var logger = log4javascript.getLogger('j1.core.j1Scroll.detectScroll');
114
-
115
- logger.info('\n' + 'detectScroll: started');
129
+ var logger = log4javascript.getLogger('j1Scroll');
130
+
131
+ logger.info('\n' + 'scroll event: register');
132
+
133
+ var eventHandler_onscroll = function (event) {
134
+ var options = _this.settings;
135
+
136
+ if (_this.isBottomReached(options)) {
137
+ if (options.firstPage > options.lastPage ) {
138
+ logger.info('\n' + 'last page detected on: ' + options.lastPage);
139
+ window.removeEventListener('scroll', eventHandler_onscroll);
140
+ logger.info('\n' + 'scroll event: removed');
141
+
142
+ if (options.infoLastPage ) {
143
+ _this.infoLastPage(options);
144
+ }
145
+ return false;
146
+ }
147
+ _this.getNewPost(options);
148
+ }
149
+ }
150
+ window.addEventListener('scroll', eventHandler_onscroll);
116
151
 
117
- window.onscroll = function (ev) {
118
- var bottomReached = _this.isBottomReached(options);
119
- if (bottomReached) _this.getNewPost(options);
120
- };
152
+ logger.info('\n' + 'scroll event: registered');
121
153
  },
122
- // -----------------------------------------------------------------------
123
- // getNewPost: load/append new items
124
- //
125
- // -----------------------------------------------------------------------
154
+ // -------------------------------------------------------------------------
155
+ // getNewPost: load new items (from current path)
156
+ // Note: loader flag prevents to load items if AJAX load in progress
157
+ // is NOT finished
158
+ // -------------------------------------------------------------------------
126
159
  getNewPost: function (options) {
127
160
  var _this = this;
161
+ var logger = log4javascript.getLogger('j1Scroll');
128
162
 
129
- if (options.pNum >= options.pMaxNum ) {
130
- return;
131
- }
132
- if (this.enable === false) return false;
133
- this.enable = false;
163
+ // display spinner while loading
164
+ if (options.loadStatus) {
165
+ $('.loader-ellips').show();
166
+ }
167
+
168
+ // initialze loader flag
169
+ if (this.itemsLoaded === false) return false;
170
+
171
+ // set loader flag (false == not loaded)
172
+ this.itemsLoaded = false;
134
173
  var xmlhttp = new XMLHttpRequest();
135
174
  xmlhttp.onreadystatechange = function () {
136
175
  if (xmlhttp.readyState == XMLHttpRequest.DONE) {
137
176
  if (xmlhttp.status == 200) {
138
- options.pNum++;
177
+ options.firstPage++;
139
178
  var childItems = _this.getChildItemsByAjaxHTML(options, xmlhttp.responseText);
140
179
  _this.appendNewItems(childItems);
141
- }
142
- return _this.enable = true;
180
+ // set loader flag (true == loaded)
181
+ logger.info('\n' + 'loading new items: successful');
182
+
183
+ // hide the spinner after loading
184
+ if (options.loadStatus) {
185
+ $('.loader-ellips').hide();
186
+ }
187
+ // set loader flag (true == loaded)
188
+ return _this.itemsLoaded = true;
189
+ } else {
190
+ logger.error('\n' + 'loading new items failed, HTTP response: ' + xmlhttp.status );
191
+ // set loader flag (true == loaded)
192
+ return _this.itemsLoaded = false;
193
+ }
143
194
  }
144
195
  };
145
- xmlhttp.open("GET", location.origin + options.path + options.pNum + '/index.html', true);
196
+ logger.info('\n' + 'loading new items from path: ' + options.path + options.firstPage);
197
+ xmlhttp.open("GET", location.origin + options.path + options.firstPage + '/index.html', true);
146
198
  xmlhttp.send();
147
199
  },
148
- // -----------------------------------------------------------------------
149
- // getChildItemsByAjaxHTML:
150
- //
151
- // -----------------------------------------------------------------------
200
+ // -------------------------------------------------------------------------
201
+ // getChildItemsByAjaxHTML: extract items from page loaded
202
+ // -------------------------------------------------------------------------
152
203
  getChildItemsByAjaxHTML: function (options, HTMLText) {
153
204
  var newHTML = document.createElement('html');
205
+ var logger = log4javascript.getLogger('j1Scroll');
154
206
 
207
+ logger.info('\n' + 'load new items');
155
208
  newHTML.innerHTML = HTMLText;
156
- var childItems = newHTML.querySelectorAll('#' + options.elementID + ' > *');
209
+ var childItems = newHTML.querySelectorAll(options.elementID + ' > *');
157
210
  return childItems;
158
211
  },
159
- // -----------------------------------------------------------------------
160
- // appendNewItems:
161
- //
162
- // -----------------------------------------------------------------------
212
+ // -------------------------------------------------------------------------
213
+ // appendNewItems: append items and run post processing
214
+ // -------------------------------------------------------------------------
163
215
  appendNewItems: function (items) {
164
216
  var _this = this;
217
+ var logger = log4javascript.getLogger('j1Scroll');
165
218
 
219
+ logger.info('\n' + 'append new items');
166
220
  items.forEach(function (item) {
167
221
  _this.element.appendChild(item);
168
222
  });
169
223
 
224
+ logger.info('\n' + 'post processing: createDropCap');
170
225
  // initialize backdrops
171
226
  j1.core.createDropCap();
227
+ },
228
+ // -------------------------------------------------------------------------
229
+ // getNewPost: load/append new items
230
+ // Note: loader flag prevents to load items if AJAX load in progress
231
+ // is NOT finished
232
+ // -------------------------------------------------------------------------
233
+ infoLastPage: function (options) {
234
+ var _this = this;
235
+ var logger = log4javascript.getLogger('j1Scroll');
236
+
237
+ logger.info('\n' + 'post processing: infoLastPage');
238
+ $('.page-scroll-last').show();
172
239
  }
173
-
174
240
  }); // END prototype
175
241
 
176
- // lightweight plugin wrapper around the constructor,
177
- // preventing multiple instantiations
178
- //
242
+ // wrapper around the constructor to prevent multiple instantiations
179
243
  $.fn [pluginName] = function(options) {
180
244
  return this.each(function() {
181
- if (!$.data( this, "plugin_" + pluginName)) {
182
- $.data(this, "plugin_" +
183
- pluginName, new Plugin(this, options));
184
- }
245
+ if (!$.data( this, "plugin_" + pluginName)) {
246
+ $.data(this, "plugin_" +
247
+ pluginName, new Plugin(this, options));
248
+ }
185
249
  });
186
250
  };
187
251
 
@@ -1,7 +1,7 @@
1
1
  /*
2
2
  # -----------------------------------------------------------------------------
3
3
  # ~/assets/themes/j1/modules/showOnScroll/js/showOnScroll.js
4
- # J1 implementation for showOnScroll
4
+ # Very simple J1 implementation for showOnScroll
5
5
  #
6
6
  # Product/Info:
7
7
  # https://jekyll.one
@@ -12,7 +12,10 @@
12
12
  # For details, see https://jekyll.one
13
13
  # -----------------------------------------------------------------------------
14
14
  */
15
-
15
+ // -------------------------------------------------------------------------
16
+ // isInViewport:
17
+ // Detects if an element is visible in an viewport specified
18
+ // -------------------------------------------------------------------------
16
19
  function isInViewport(elm, offset) {
17
20
  // if the element doesn't exist, abort
18
21
  if( elm.length == 0 ) {
@@ -32,40 +35,36 @@ function isInViewport(elm, offset) {
32
35
  (height > viewport_height && top <= viewport_top && bottom >= viewport_bottom);
33
36
  }
34
37
 
38
+ // -----------------------------------------------------------------------------
39
+ // Initializer
40
+ // -----------------------------------------------------------------------------
35
41
  $(document).ready( function() {
36
42
 
37
43
  var showDelay = 700;
38
44
  var yOffset = 500;
39
- var logger = log4javascript.getLogger('j1.core.showOnScroll');
40
-
41
- // var eventHandler_news_panel = function (event) {
42
- // var clientHeight = $('#home_news_panel-scroll-group').height();
43
- // var inViewport = isInViewport ($('#home_news_panel-scroll-group'), clientHeight);
44
- //
45
- // if (inViewport) {
46
- // logger.info('\n' + 'The specified container end reached: home_news_panel-scroll-group');
47
- // //console.log('The specified container is in view.');
48
- // // $(".home_service_panel").show(showDelay);
49
- // // window.removeEventListener('scroll', eventHandler_news_panel);
50
- // }
51
- // }
52
- // window.addEventListener('scroll', eventHandler_news_panel);
45
+ var logger = log4javascript.getLogger('j1ShowOnScroll');
53
46
 
47
+ // ---------------------------------------------------------------------------
48
+ // EventHandler: Service Panel
49
+ // ---------------------------------------------------------------------------
54
50
  var eventHandler_service_panel = function (event) {
55
51
  if (isInViewport ($('#home_service_panel'), yOffset)) {
56
- logger.info('\n' + 'The specified container is in view: home_service_panel');
57
- //console.log('The specified container is in view.');
52
+ logger.info('\n' + 'specified container is in view: home_service_panel');
58
53
  $(".home_service_panel").show(showDelay);
54
+ logger.info('\n' + 'remove eventHandler');
59
55
  window.removeEventListener('scroll', eventHandler_service_panel);
60
56
  }
61
57
  }
62
58
  window.addEventListener('scroll', eventHandler_service_panel);
63
59
 
60
+ // ---------------------------------------------------------------------------
61
+ // EventHandler: Intro Panel
62
+ // ---------------------------------------------------------------------------
64
63
  var eventHandler_intro_panel = function (event) {
65
64
  if (isInViewport ($('#home_intro_panel'), yOffset)) {
66
- logger.info('\n' + 'The specified container is in view: home_intro_panel');
67
- //console.log('The specified container is in view.');
65
+ logger.info('\n' + 'specified container is in view: home_intro_panel');
68
66
  $(".home_intro_panel").show(showDelay);
67
+ logger.info('\n' + 'remove eventHandler');
69
68
  window.removeEventListener('scroll', eventHandler_intro_panel);
70
69
  }
71
70
  }
data/lib/j1/version.rb CHANGED
@@ -1,3 +1,3 @@
1
- module J1
2
- VERSION = '2021.1.26'
3
- end
1
+ module J1
2
+ VERSION = '2021.1.27'
3
+ end
@@ -53,7 +53,7 @@ gem 'jekyll', '~> 4.2'
53
53
 
54
54
  # Theme Rubies, default: J1 Template (NOT used for the development system)
55
55
  #
56
- gem 'j1-template', '~> 2021.1.26'
56
+ gem 'j1-template', '~> 2021.1.27'
57
57
 
58
58
  # ------------------------------------------------------------------------------
59
59
  # PRODUCTION: Gem needed for the Jekyll and J1 prod environment
@@ -53,7 +53,7 @@ environment: production
53
53
  # ------------------------------------------------------------------------------
54
54
  # Sets the build version of J1 Template Gem
55
55
  #
56
- version: 2021.1.26
56
+ version: 2021.1.27
57
57
 
58
58
  # version
59
59
  # ------------------------------------------------------------------------------
@@ -423,7 +423,7 @@ end::tables[]
423
423
  // -----------------------------------------------------------------------------
424
424
  tag::products[]
425
425
  :j1--license: MIT License
426
- :j1--version: 2021.1.26
426
+ :j1--version: 2021.1.27
427
427
  :j1--site-name: Jekyll One
428
428
  end::products[]
429
429
 
@@ -364,6 +364,6 @@ end
364
364
 
365
365
  module Jekyll
366
366
  module J1LunrSearch
367
- VERSION = '2021.1.26'
367
+ VERSION = '2021.1.27'
368
368
  end
369
369
  end
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "j1_starter",
4
- "version": "2021.1.26",
4
+ "version": "2021.1.27",
5
5
  "description": "J1 Template Starter Web",
6
6
  "homepage": "https://your.site",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "utls",
4
- "version": "2021.1.26",
4
+ "version": "2021.1.27",
5
5
  "description": "J1 Template Utility Server",
6
6
  "homepage": "https://jekyll.one",
7
7
  "author": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "private": true,
3
3
  "name": "utls",
4
- "version": "2021.1.26",
4
+ "version": "2021.1.27",
5
5
  "description": "J1 Template Utility Server",
6
6
  "homepage": "https://jekyll.one",
7
7
  "author": {
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: j1-template
3
3
  version: !ruby/object:Gem::Version
4
- version: 2021.1.26
4
+ version: 2021.1.27
5
5
  platform: ruby
6
6
  authors:
7
7
  - juergen_jekyll_one
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-09-18 00:00:00.000000000 Z
11
+ date: 2021-09-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -382,7 +382,6 @@ files:
382
382
  - assets/themes/j1/adapter/js/cookieConsent.js
383
383
  - assets/themes/j1/adapter/js/fam.js
384
384
  - assets/themes/j1/adapter/js/framer.js
385
- - assets/themes/j1/adapter/js/infiniteScroll.js
386
385
  - assets/themes/j1/adapter/js/j1.js
387
386
  - assets/themes/j1/adapter/js/j1scroll.js
388
387
  - assets/themes/j1/adapter/js/justifiedGallery.js
@@ -542,10 +541,6 @@ files:
542
541
  - assets/themes/j1/modules/iframeResizer/js/resizer.js
543
542
  - assets/themes/j1/modules/iframeResizer/js/resizer.map
544
543
  - assets/themes/j1/modules/iframeResizer/js/resizer.min.js
545
- - assets/themes/j1/modules/infiniteScroll/css/theme/uno.css
546
- - assets/themes/j1/modules/infiniteScroll/css/theme/uno.min.css
547
- - assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.js
548
- - assets/themes/j1/modules/infiniteScroll/js/infiniteScroll.min.js
549
544
  - assets/themes/j1/modules/j1Scroll/css/theme/uno.css
550
545
  - assets/themes/j1/modules/j1Scroll/css/theme/uno.min.css
551
546
  - assets/themes/j1/modules/j1Scroll/js/j1scroll.js