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 +5 -5
- data/lib/flex_infinite_scroll/view_helpers.rb +17 -8
- data/lib/flex_infinite_scroll.rb +0 -1
- data/vendor/assets/javascript/flex_infinite_scroll.js +46 -32
- metadata +6 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6dca995d94c2ad3e09019b7d273940ba9aaab2c7
|
4
|
+
data.tar.gz: 11616db0db37cbefd5d5a303d528440baa5c11f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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,
|
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] ||= '
|
18
|
+
config[:targetContainer] ||= 'fis-container'
|
18
19
|
result += javascript_tag do
|
19
|
-
"
|
20
|
+
"flexInfiniteScroll('#{config[:scrollContainer]}',#{config.to_json})".html_safe
|
20
21
|
end
|
21
|
-
|
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
|
-
|
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
|
data/lib/flex_infinite_scroll.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
1
|
// Flex Infinite Scroll initialization
|
2
2
|
|
3
|
-
|
4
|
-
|
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 =
|
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 = (
|
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 (
|
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
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
65
|
+
dataProcess(json,targetContainer);
|
55
66
|
} else {
|
56
67
|
// default data processor
|
57
|
-
|
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
|
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
|
-
|
97
|
-
var scrollTop
|
98
|
-
var containerSize
|
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.
|
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-
|
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.
|
56
|
+
rubygems_version: 2.6.14.3
|
72
57
|
signing_key:
|
73
58
|
specification_version: 4
|
74
|
-
summary:
|
59
|
+
summary: Infinite scroll for Ruby on Rails applications on pure JavaScript. Also has
|
60
|
+
Kaminari support for pagination.
|
75
61
|
test_files: []
|