flex_infinite_scroll 0.1.0
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 +7 -0
- data/lib/flex_infinite_scroll.rb +17 -0
- data/vendor/assets/javascript/flex_infinite_scroll.js +86 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: c06e8d3f9cc52fcfb5f27ecf04f9aa527fe9d8a68605ab27c8655b9e59a110f6
|
4
|
+
data.tar.gz: e38bd3e917d5cf558d7c501d450c1331e7bb9ba7e64ab6b34fc5703907a9195e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3c289900ff552c532db39185bb4405b2500de066160ee5c4752e2fab2855660be01233d5d16e9e4d4ccbd01bfa5c5e87dd4b6c03bae5b2b0d431e61ae3ca59db
|
7
|
+
data.tar.gz: 7b9c06824b812f18b52454a520051b0a9d5b1e3b4c5be807b5311a972a7ee44dcd50b6c40026fb547e0f3db5b9e678efe50d3da927defe02db9d2b9591d87199
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Infinite scroll module
|
2
|
+
module FlexInfiniteScroll
|
3
|
+
class Engine < ::Rails::Engine; end
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
def infinite_scroll(page = 1, page_size = (ENV['FIS_PAGE_SIZE'] || 20))
|
6
|
+
page = page.to_i if page.class == String
|
7
|
+
offset_skip = (page - 1) * page_size
|
8
|
+
total_page = (count / page_size.to_f).ceil
|
9
|
+
{
|
10
|
+
data: offset(offset_skip).limit(page_size),
|
11
|
+
total_page: total_page,
|
12
|
+
prev_page: (page == 1 ? nil : page - 1),
|
13
|
+
current_page: page,
|
14
|
+
next_page: (page == total_page ? nil : page + 1)
|
15
|
+
}
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
// Flex Infinite Scroll initialization
|
2
|
+
|
3
|
+
$.fn.extend({
|
4
|
+
flexInfiniteScroll: function(config = {}) {
|
5
|
+
// Config preparing
|
6
|
+
var startPage = config.startPage || 1;
|
7
|
+
var nextPage = startPage + 1;
|
8
|
+
var dataUrl = config.url;
|
9
|
+
var scrollContainer = this[0];
|
10
|
+
var queryParams = config.queryParams;
|
11
|
+
var dataProcess = config.dataProcess;
|
12
|
+
var initialLoad = config.initialLoad;
|
13
|
+
var loadMargin = config.loadMargin || 50;
|
14
|
+
var beforeAction = config.beforeAction;
|
15
|
+
var afterAction = config.afterAction;
|
16
|
+
var targetContainer = config.targetContainer || scrollContainer ;
|
17
|
+
var eventTarget;
|
18
|
+
if (config.lastPage) nextPage = 'last';
|
19
|
+
scrollContainer.dataset.fisNextPage = nextPage;
|
20
|
+
scrollContainer.dataset.fisUrl = dataUrl;
|
21
|
+
scrollContainer.dataset.fisLoading = 0;
|
22
|
+
|
23
|
+
function getData(page = 1){
|
24
|
+
// Check for loading process and last page
|
25
|
+
if (scrollContainer.dataset.fisLoading === '1' || page == 'last') return false
|
26
|
+
scrollContainer.dataset.fisLoading = 1;
|
27
|
+
// before load action
|
28
|
+
if (beforeAction) beforeAction;
|
29
|
+
$.ajax({
|
30
|
+
url: scrollContainer.dataset.fisUrl,
|
31
|
+
// custom query params
|
32
|
+
data: (queryParams || {page: page}),
|
33
|
+
dataType: 'json',
|
34
|
+
type: 'GET',
|
35
|
+
success: function(json) {
|
36
|
+
|
37
|
+
if (dataProcess){
|
38
|
+
// custom user processor
|
39
|
+
dataProcess(json,$(targetContainer));
|
40
|
+
} else {
|
41
|
+
// default data processor
|
42
|
+
$(json.data).appendTo($(targetContainer));
|
43
|
+
}
|
44
|
+
scrollContainer.dataset.fisNextPage = json.next_page || 'last';
|
45
|
+
scrollContainer.dataset.fisLoading = 0;
|
46
|
+
if (scrollNotApear()) {
|
47
|
+
// check if on initial load not enough elements on screen
|
48
|
+
getData(scrollContainer.dataset.fisNextPage)
|
49
|
+
}
|
50
|
+
// after load action
|
51
|
+
if (afterAction) afterAction;
|
52
|
+
},
|
53
|
+
error: function() {
|
54
|
+
scrollContainer.dataset.fisLoading = 0;
|
55
|
+
}
|
56
|
+
});
|
57
|
+
}
|
58
|
+
|
59
|
+
// intial load
|
60
|
+
if (initialLoad) {
|
61
|
+
getData(startPage)
|
62
|
+
} else if (scrollNotApear()) {
|
63
|
+
// check if on initial load not enough elements on screen
|
64
|
+
getData(scrollContainer.dataset.fisNextPage)
|
65
|
+
}
|
66
|
+
|
67
|
+
function scrollNotApear(){
|
68
|
+
var containerSize=$(scrollContainer).innerHeight();
|
69
|
+
var scrollSize=scrollContainer.scrollHeight;
|
70
|
+
return (scrollSize - containerSize - (loadMargin * 1.1) < 0)
|
71
|
+
}
|
72
|
+
|
73
|
+
// check if body scroll
|
74
|
+
eventTarget = (scrollContainer.localName == 'body' ? window : scrollContainer);
|
75
|
+
|
76
|
+
$(eventTarget).on('scroll', () => {
|
77
|
+
var scrollTop=$(eventTarget).scrollTop();
|
78
|
+
var containerSize=$(scrollContainer).innerHeight();
|
79
|
+
var scrollSize=scrollContainer.scrollHeight;
|
80
|
+
if (scrollTop + containerSize > scrollSize - loadMargin && scrollContainer.dataset.fisNextPage != 'last'){
|
81
|
+
getData(scrollContainer.dataset.fisNextPage);
|
82
|
+
};
|
83
|
+
})
|
84
|
+
|
85
|
+
}
|
86
|
+
})
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: flex_infinite_scroll
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Anton Ignatov
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-04-14 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: belmek@me.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/flex_infinite_scroll.rb
|
20
|
+
- vendor/assets/javascript/flex_infinite_scroll.js
|
21
|
+
homepage: https://github.com/aignatov-bio/flex_infinite_scroll
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.7.6
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Add infinite scrolling to models and views
|
45
|
+
test_files: []
|