flex_infinite_scroll 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA256:
3
- metadata.gz: 3cb41835798253e2a4d88bdcfe92c12777f14b68c8ed69b1983f59d70ef17253
4
- data.tar.gz: 50e727fdb17ba2d7fbf6990197e4d083e281fe0cfdd79cc10c0a449f156ec243
2
+ SHA1:
3
+ metadata.gz: 6dca995d94c2ad3e09019b7d273940ba9aaab2c7
4
+ data.tar.gz: 11616db0db37cbefd5d5a303d528440baa5c11f5
5
5
  SHA512:
6
- metadata.gz: ed2d0f945d3afe55c13e162cce7f4c8ef87bb8de0f644de7bd48e818b24e5c0c3d58a1e96769436a513976bd36bf119abf528d35d0e2327101cae85b28f4e415
7
- data.tar.gz: 0e80acdf4f616b7bb78374bed03b75598d4fc25c267fa2fcf22643ad4da39b5e477fdfb6ab73221dd03d7cfeeb1e609069ea7926d1699b82bd9e2b7148bbf807
6
+ metadata.gz: cd01ef3e67277c1805e030e6cce972978eb8e0f88839eb5fcf5166c7a7fb9497c1f1ecb5c504c979d45e3292cf5458d6315339cdd93855e65b3beeaeba7b402c
7
+ data.tar.gz: 83e655f62ab35e6c8f2375bddfeca4996dafb9add85de27eb1ef24d557133e63cfd71069f26d197b767bbb6fd206576b517160ab12508fdd21f152e2c3ccf8c6
@@ -6,24 +6,24 @@ module FlexInfiniteScroll
6
6
  include ActionView::Context
7
7
 
8
8
  def fis_init_list(data, partial, config = {})
9
+ data = kaminari_prepare(data) if config[:kaminari]
9
10
  result = if config[:targetContainer]
10
11
  fis_get_list(data, partial, 'html')
11
12
  else
12
- content_tag :div, class: "fis-container #{config[:container_class] || ''}" do
13
+ content_tag :div, id: 'fis-container', class: (config[:container_class] || '').to_s do
13
14
  fis_get_list(data, partial, 'html')
14
15
  end
15
16
  end
16
17
  config[:scrollContainer] ||= (config[:targetContainer] || 'body')
17
- config[:targetContainer] ||= '.fis-container'
18
+ config[:targetContainer] ||= 'fis-container'
18
19
  result += javascript_tag do
19
- "$('#{config[:scrollContainer]}').flexInfiniteScroll(#{config.to_json})".html_safe
20
+ "flexInfiniteScroll('#{config[:scrollContainer]}',#{config.to_json})".html_safe
20
21
  end
21
- Sanitize.fragment(result,
22
- Sanitize::Config.merge(Sanitize::Config::RELAXED,
23
- elements: Sanitize::Config::RELAXED[:elements] + %w(script))).html_safe
22
+ result.html_safe
24
23
  end
25
24
 
26
- def fis_next_page(data, partial)
25
+ def fis_next_page(data, partial, config = {})
26
+ data = kaminari_prepare(data) if config[:kaminari]
27
27
  data[:data] = fis_get_list(data, partial, 'json')
28
28
  data
29
29
  end
@@ -37,7 +37,16 @@ module FlexInfiniteScroll
37
37
  render partial: partial, locals: { fis_object: member }
38
38
  end
39
39
  end
40
- Sanitize.fragment(result, Sanitize::Config::RELAXED).html_safe
40
+ result.html_safe
41
+ end
42
+
43
+ private
44
+
45
+ def kaminari_prepare(data)
46
+ {
47
+ data: data,
48
+ next_page: data.next_page
49
+ }
41
50
  end
42
51
  end
43
52
  end
@@ -2,7 +2,6 @@
2
2
 
3
3
  # Infinite scroll module
4
4
  require 'flex_infinite_scroll/view_helpers'
5
- require 'sanitize'
6
5
 
7
6
  module FlexInfiniteScroll
8
7
  class Engine < ::Rails::Engine
@@ -1,12 +1,12 @@
1
1
  // Flex Infinite Scroll initialization
2
2
 
3
- $.fn.extend({
4
- flexInfiniteScroll: function(config = {}) {
3
+
4
+ function flexInfiniteScroll(object_id,config = {}) {
5
5
  // Config preparing
6
6
  var startPage = config.startPage || 1;
7
7
  var nextPage = startPage + 1;
8
8
  var dataUrl = config.url;
9
- var scrollContainer = this[0];
9
+ var scrollContainer = (object_id == 'body' ? document.body : document.getElementById(object_id));
10
10
  var queryParams = config.queryParams;
11
11
  var dataProcess = config.dataProcess;
12
12
  var initialLoad = config.initialLoad;
@@ -14,53 +14,68 @@ $.fn.extend({
14
14
  var beforeAction = config.beforeAction;
15
15
  var afterAction = config.afterAction;
16
16
  var targetContainer= config.targetContainer || scrollContainer ;
17
- var eventTarget = (scrollContainer.localName == 'body' ? window : scrollContainer);
17
+ var eventTarget = (object_id == 'body' ? window : scrollContainer);
18
18
  if (config.lastPage) nextPage = 'last';
19
19
  scrollContainer.dataset.fisNextPage = nextPage;
20
20
  scrollContainer.dataset.fisUrl = dataUrl;
21
21
  scrollContainer.dataset.fisLoading = 0;
22
22
 
23
23
  function getScrollHeight(){
24
- if (scrollContainer.localName == 'body'){
25
- return document.documentElement.scrollHeight
24
+ if (object_id == 'body'){
25
+ return document.documentElement.scrollHeight;
26
26
  } else {
27
- return eventTarget.scrollHeight
27
+ return eventTarget.scrollHeight;
28
28
  }
29
29
 
30
30
  }
31
+
32
+ function urlParams(object) {
33
+ var encodedString = '';
34
+ for (var prop in object) {
35
+ if (object.hasOwnProperty(prop)) {
36
+ if (encodedString.length > 0) {
37
+ encodedString += '&';
38
+ }
39
+ encodedString += encodeURI(prop + '=' + object[prop]);
40
+ }
41
+ }
42
+ return encodedString;
43
+ }
31
44
 
32
45
  function getData(page = 1){
33
46
  // Check for loading process and last page
34
- if (scrollContainer.dataset.fisLoading === '1' || page == 'last') return false
47
+ if (scrollContainer.dataset.fisLoading === '1' || page == 'last') return false;
35
48
  scrollContainer.dataset.fisLoading = 1;
36
49
  // before load action
37
50
  if (beforeAction) {
38
51
  if (typeof(beforeAction) == 'function') {
39
52
  beforeAction();
40
53
  }else if (typeof(beforeAction) == 'string') {
41
- eval(beforeAction)
54
+ eval(beforeAction);
42
55
  }
43
56
  }
44
- $.ajax({
45
- url: scrollContainer.dataset.fisUrl,
46
- // custom query params
47
- data: (queryParams || {page: page}),
48
- dataType: 'json',
49
- type: 'GET',
50
- success: function(json) {
51
-
57
+ var xhr = new XMLHttpRequest();
58
+ var params = (queryParams || {page: page});
59
+ xhr.open('GET', scrollContainer.dataset.fisUrl + '?' + urlParams(params));
60
+ xhr.onload = function() {
61
+ var json = JSON.parse(xhr.response)
62
+ if (xhr.status === 200) {
52
63
  if (dataProcess){
53
64
  // custom user processor
54
- dataProcess(json,$(targetContainer));
65
+ dataProcess(json,targetContainer);
55
66
  } else {
56
67
  // default data processor
57
- $(json.data).appendTo($(targetContainer));
68
+ var div = document.createElement('div');
69
+ div.innerHTML = json.data;
70
+ while (div.children.length > 0) {
71
+ document.getElementById(targetContainer).appendChild(div.children[0]);
72
+ }
58
73
  }
59
74
  scrollContainer.dataset.fisNextPage = json.next_page || 'last';
60
75
  scrollContainer.dataset.fisLoading = 0;
61
76
  if (scrollNotApear()) {
62
77
  // check if on initial load not enough elements on screen
63
- getData(scrollContainer.dataset.fisNextPage)
78
+ getData(scrollContainer.dataset.fisNextPage);
64
79
  }
65
80
  // after load action
66
81
  if (afterAction) {
@@ -69,17 +84,17 @@ $.fn.extend({
69
84
  }else if (typeof(afterAction) == 'string') {
70
85
  eval(afterAction)
71
86
  }
72
- }
73
- },
74
- error: function() {
87
+ }
88
+ } else {
75
89
  scrollContainer.dataset.fisLoading = 0;
76
90
  }
77
- });
91
+ };
92
+ xhr.send();
78
93
  }
79
94
 
80
95
  // intial load
81
96
  if (initialLoad) {
82
- getData(startPage)
97
+ getData(startPage);
83
98
  } else if (scrollNotApear()) {
84
99
  // check if on initial load not enough elements on screen
85
100
  getData(scrollContainer.dataset.fisNextPage);
@@ -88,14 +103,14 @@ $.fn.extend({
88
103
  // check if body scroll
89
104
 
90
105
  function scrollNotApear(){
91
- var containerSize=$(eventTarget).innerHeight();
106
+ var containerSize=(object_id == 'body' ? eventTarget.innerHeight : eventTarget.offsetHeight);
92
107
  var scrollSize=getScrollHeight();
93
- return (scrollSize - containerSize - loadMargin <= 0)
108
+ return (scrollSize - containerSize - loadMargin <= 0);
94
109
  }
95
110
 
96
- $(eventTarget).on('scroll', () => {
97
- var scrollTop=$(eventTarget).scrollTop();
98
- var containerSize=$(eventTarget).innerHeight();
111
+ eventTarget.addEventListener('scroll', function() {
112
+ var scrollTop= (object_id == 'body' ? eventTarget.scrollY : eventTarget.scrollTop);
113
+ var containerSize=(object_id == 'body' ? eventTarget.innerHeight : eventTarget.offsetHeight);
99
114
  var scrollSize=getScrollHeight();
100
115
  if (scrollTop + containerSize > scrollSize - loadMargin && scrollContainer.dataset.fisNextPage != 'last'){
101
116
  getData(scrollContainer.dataset.fisNextPage);
@@ -104,5 +119,4 @@ $.fn.extend({
104
119
 
105
120
 
106
121
 
107
- }
108
- })
122
+ }
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: flex_infinite_scroll
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Anton Ignatov
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-04-21 00:00:00.000000000 Z
11
+ date: 2019-05-05 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: sanitize
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: 4.6.3
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: 4.6.3
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: rails
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -65,11 +51,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
51
  - - ">="
66
52
  - !ruby/object:Gem::Version
67
53
  version: '0'
68
- requirements:
69
- - jQuery
54
+ requirements: []
70
55
  rubyforge_project:
71
- rubygems_version: 2.7.6
56
+ rubygems_version: 2.6.14.3
72
57
  signing_key:
73
58
  specification_version: 4
74
- summary: Add infinite scrolling to models and views
59
+ summary: Infinite scroll for Ruby on Rails applications on pure JavaScript. Also has
60
+ Kaminari support for pagination.
75
61
  test_files: []