turbo-scroll 0.1.0 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +77 -20
- data/Rakefile +2 -0
- data/lib/locales/en.yml +3 -0
- data/lib/locales/fr.yml +3 -0
- data/lib/locales/nl.yml +3 -0
- data/lib/locales/ro.yml +3 -0
- data/lib/locales/vn.yml +3 -0
- data/lib/turbo-scroll/loader.html.slim +2 -1
- data/lib/turbo-scroll/loader.rb +3 -3
- data/lib/turbo-scroll/loader.scss +3 -0
- data/lib/turbo-scroll/railtie.rb +3 -1
- data/lib/turbo-scroll/spin_loader.rb +15 -0
- data/lib/turbo-scroll/spin_loader.slim +50 -0
- data/lib/turbo-scroll/update.html.slim +1 -1
- data/lib/turbo-scroll/update.rb +3 -4
- data/lib/turbo-scroll/version.rb +1 -1
- data/lib/turbo-scroll.rb +11 -4
- metadata +21 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 795c13de80b15a25b9b37dcd9944855ac52c8b5270b0acfce62a959feddb5bec
|
4
|
+
data.tar.gz: 758a95cedc0db75a01c2619bc0eae553bc94afdabd514333c04d547942952cc4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8353ba4300980c23841f3ea261b871fe33f26a9766a4b6ba5892c876b8c6c57d5f321a012b5965d40f4b5f5a07292cdb20ac55b278ab455b4b2d998301ab4763
|
7
|
+
data.tar.gz: 0d2c3b2866a548b54b2cf79c8cc8b1953f1b4f399b7599f72b2f37e481f331ac63d1db7e6bd2d29b9ed40893cb0af3b2715736063e13d536c387bf549d8bc7cf
|
data/README.md
CHANGED
@@ -3,6 +3,17 @@
|
|
3
3
|
TurboScroll is a minimalistic gem that provides infinite scrolling for Rails based applications
|
4
4
|
using Turbo.
|
5
5
|
|
6
|
+
Why a new gem? Leveraging Turbo we can build a very small and efficient implementation
|
7
|
+
for infinite page scrolling without extra dependencies.
|
8
|
+
|
9
|
+
It's made to be independent from your choice of pagination.
|
10
|
+
You can use the [next-pageable](https://github.com/allcrux/next-pageable) gem, which
|
11
|
+
is another minimalistic gem for very basic paging leveraging Rails concerns, to just
|
12
|
+
provide the functionality you need for infinite scrolling and avoiding a count query
|
13
|
+
on each page request (Your main page might still do a count query but you won't
|
14
|
+
be repeating them when requesting next page data behind the scenes.)
|
15
|
+
|
16
|
+
|
6
17
|
Underlying it depends on ViewComponent and Slim but these are not forced upon the user.
|
7
18
|
|
8
19
|
## Usage
|
@@ -12,6 +23,8 @@ Underlying it depends on ViewComponent and Slim but these are not forced upon th
|
|
12
23
|
Make sure your index action responds both to html and turbo_stream
|
13
24
|
|
14
25
|
```
|
26
|
+
@articles = Article.scoped.page(params[:page]) # next-pageable
|
27
|
+
|
15
28
|
respond_to do |format|
|
16
29
|
format.html
|
17
30
|
format.turbo_stream
|
@@ -27,14 +40,21 @@ At the bottom of your page, add the infinite scrolling loader
|
|
27
40
|
by calling the `turbo_scroll_loader` helper and passing the next page index
|
28
41
|
if a next page is present.
|
29
42
|
|
30
|
-
|
31
|
-
|
43
|
+
This gem currently assumes that the page parameter is called `page`, so in
|
44
|
+
your controller make sure you use that parameter for selecting
|
45
|
+
the records for a given page.
|
32
46
|
|
33
|
-
|
47
|
+
When the loader component becomes visible, it will do 2 things
|
48
|
+
|
49
|
+
- append the next page to the #infinite dom id
|
50
|
+
- update the loader to load the next page (when present)
|
34
51
|
|
52
|
+
#### Slim Example
|
35
53
|
|
36
54
|
```
|
37
55
|
#infinite
|
56
|
+
/ render your page fragment here in whatever structure you desire
|
57
|
+
/ and extract it into a partial or a component to avoid repition, if desired.
|
38
58
|
- @articles.each do |article|
|
39
59
|
= article
|
40
60
|
|
@@ -49,15 +69,63 @@ Your turbo_stream response can use the `turbo_scroll_update` helper to
|
|
49
69
|
append the next page content and update the current loader with a
|
50
70
|
loader for the next page.
|
51
71
|
|
52
|
-
When using the [
|
72
|
+
When using the [next-pageable](https://github.com/allcrux/next-pageable) gem
|
53
73
|
the next_page_index is already present on the collection when a next page exists.
|
54
74
|
|
55
75
|
```
|
56
76
|
= turbo_scroll_update page: @articles.next_page_index
|
77
|
+
/ render your page fragment here in whatever structure you desire
|
78
|
+
/ and extract it into a partial or a component to avoid repition, if desired.
|
57
79
|
- @articles.each do |article|
|
58
80
|
= article
|
59
81
|
```
|
60
82
|
|
83
|
+
### An HTML table alternative for table layouts using CSS grids
|
84
|
+
|
85
|
+
As HTML is pretty picky on the tags allowed inside 'table', 'tr', 'td', etc you
|
86
|
+
can consider using CSS grid as an alternative.
|
87
|
+
|
88
|
+
```
|
89
|
+
.articles-table {
|
90
|
+
display: grid;
|
91
|
+
grid-template-columns: minmax(0, 2fr) minmax(0, 2fr) minmax(0, 8fr) minmax(0, 2fr) minmax(0, 1fr) 3em;
|
92
|
+
max-width: 100%;
|
93
|
+
width: 100%;
|
94
|
+
}
|
95
|
+
|
96
|
+
.articles-table .col {
|
97
|
+
height: 2.75rem;
|
98
|
+
display: flex;
|
99
|
+
align-items: center;
|
100
|
+
width: 100%;
|
101
|
+
padding-left: 0.5rem;
|
102
|
+
padding-right: 0.5rem;
|
103
|
+
}
|
104
|
+
|
105
|
+
.articles-table .col-striped:nth-child(12n+7),
|
106
|
+
.articles-table .col-striped:nth-child(12n+8),
|
107
|
+
.articles-table .col-striped:nth-child(12n+9),
|
108
|
+
.articles-table .col-striped:nth-child(12n+10),
|
109
|
+
.articles-table .col-striped:nth-child(12n+11),
|
110
|
+
.articles-table .col-striped:nth-child(12n+12) {
|
111
|
+
background-color: #EEEEEE;
|
112
|
+
}
|
113
|
+
```
|
114
|
+
|
115
|
+
which would go hand in hand with this partial for a record row
|
116
|
+
|
117
|
+
```
|
118
|
+
.col.col-striped = article.articlenumber
|
119
|
+
.col.col-striped = article.barcode
|
120
|
+
.col.col-striped = article.description
|
121
|
+
.col.col-striped = article.supplier
|
122
|
+
.col.col-striped.align-right = article.price.print
|
123
|
+
.col.col-striped.align-right
|
124
|
+
a.btn.btn-sm.btn-secondary href=edit_article_path(article)
|
125
|
+
i.bi.bi-pencil
|
126
|
+
```
|
127
|
+
|
128
|
+
|
61
129
|
### Using a different DOM ID
|
62
130
|
|
63
131
|
In case you want or need to use a different DOM ID you
|
@@ -84,26 +152,15 @@ index.turbo_stream.slim
|
|
84
152
|
= article
|
85
153
|
```
|
86
154
|
|
87
|
-
|
88
|
-
|
89
|
-
### index.
|
90
|
-
|
91
155
|
## Installation
|
92
|
-
Add this line to your application's Gemfile:
|
93
156
|
|
94
|
-
|
95
|
-
gem "turbo-scroll"
|
96
|
-
```
|
157
|
+
Install the gem and add to the application's Gemfile by executing:
|
97
158
|
|
98
|
-
|
99
|
-
```bash
|
100
|
-
$ bundle
|
101
|
-
```
|
159
|
+
$ bundle add turbo-scroll
|
102
160
|
|
103
|
-
|
104
|
-
|
105
|
-
$ gem install turbo-scroll
|
106
|
-
```
|
161
|
+
If bundler is not being used to manage dependencies, install the gem by executing:
|
162
|
+
|
163
|
+
$ gem install turbo-scroll
|
107
164
|
|
108
165
|
## License
|
109
166
|
|
data/Rakefile
CHANGED
data/lib/locales/en.yml
ADDED
data/lib/locales/fr.yml
ADDED
data/lib/locales/nl.yml
ADDED
data/lib/locales/ro.yml
ADDED
data/lib/locales/vn.yml
ADDED
@@ -1,3 +1,4 @@
|
|
1
1
|
= turbo_frame_tag :infinite_loader, src: next_page_stream_path, loading: "lazy", target: "_top"
|
2
2
|
.page-loading
|
3
|
-
p ==t(".click_here", next_page_path: next_page_path)
|
3
|
+
p == I18n.t(".click_here", next_page_path: next_page_path)
|
4
|
+
= render(TurboScroll::SpinLoader.new(loading_indicator: loading_indicator))
|
data/lib/turbo-scroll/loader.rb
CHANGED
@@ -5,10 +5,11 @@ require "turbo-rails"
|
|
5
5
|
class TurboScroll::Loader < ViewComponent::Base
|
6
6
|
include Turbo::FramesHelper
|
7
7
|
|
8
|
-
attr_reader :page
|
8
|
+
attr_reader :page, :loading_indicator
|
9
9
|
|
10
|
-
def initialize(page:)
|
10
|
+
def initialize(page:, loading_indicator: true)
|
11
11
|
@page = page
|
12
|
+
@loading_indicator = loading_indicator
|
12
13
|
end
|
13
14
|
|
14
15
|
def query_params
|
@@ -28,4 +29,3 @@ class TurboScroll::Loader < ViewComponent::Base
|
|
28
29
|
page
|
29
30
|
end
|
30
31
|
end
|
31
|
-
|
data/lib/turbo-scroll/railtie.rb
CHANGED
@@ -3,11 +3,13 @@ module TurboScroll
|
|
3
3
|
initializer "turbo-scrolls.load_components" do
|
4
4
|
require_relative "update"
|
5
5
|
require_relative "loader"
|
6
|
+
require_relative "spin_loader"
|
6
7
|
end
|
7
|
-
initializer "turbo-scrolls.view_helpers" do
|
8
|
+
initializer "turbo-scrolls.view_helpers" do |app|
|
8
9
|
ActiveSupport.on_load(:action_view) do
|
9
10
|
include TurboScroll::ViewHelpers
|
10
11
|
end
|
12
|
+
app.config.i18n.load_path += Dir[File.expand_path(File.join(File.dirname(__FILE__), '../locales', '*.yml')).to_s]
|
11
13
|
end
|
12
14
|
end
|
13
15
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "turbo-rails"
|
4
|
+
|
5
|
+
class TurboScroll::SpinLoader < ViewComponent::Base
|
6
|
+
attr_reader :loading_indicator
|
7
|
+
|
8
|
+
def initialize(loading_indicator: true)
|
9
|
+
@loading_indicator = loading_indicator
|
10
|
+
end
|
11
|
+
|
12
|
+
def render?
|
13
|
+
loading_indicator
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
css:
|
2
|
+
.loader {
|
3
|
+
display: inline-block;
|
4
|
+
position: relative;
|
5
|
+
width: 45px;
|
6
|
+
height: 45px;
|
7
|
+
margin: auto;
|
8
|
+
}
|
9
|
+
.loader div {
|
10
|
+
box-sizing: border-box;
|
11
|
+
display: block;
|
12
|
+
position: absolute;
|
13
|
+
width: 32px;
|
14
|
+
height: 32px;
|
15
|
+
margin: 8px 0px;
|
16
|
+
border: 3px solid #00afd4;
|
17
|
+
border-radius: 50%;
|
18
|
+
animation: loader 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite;
|
19
|
+
border-color: #00afd4 transparent transparent transparent;
|
20
|
+
}
|
21
|
+
.loader div:nth-child(1) {
|
22
|
+
animation-delay: -0.45s;
|
23
|
+
}
|
24
|
+
.loader div:nth-child(2) {
|
25
|
+
animation-delay: -0.3s;
|
26
|
+
}
|
27
|
+
.loader div:nth-child(3) {
|
28
|
+
animation-delay: -0.15s;
|
29
|
+
}
|
30
|
+
.page-loading {
|
31
|
+
display: flex;
|
32
|
+
flex-direction: column;
|
33
|
+
justify-content: center;
|
34
|
+
align-items: center;
|
35
|
+
}
|
36
|
+
|
37
|
+
@keyframes loader {
|
38
|
+
0% {
|
39
|
+
transform: rotate(0deg);
|
40
|
+
}
|
41
|
+
100% {
|
42
|
+
transform: rotate(360deg);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
.loader
|
47
|
+
div
|
48
|
+
div
|
49
|
+
div
|
50
|
+
div
|
data/lib/turbo-scroll/update.rb
CHANGED
@@ -6,12 +6,11 @@ class TurboScroll::Update < ViewComponent::Base
|
|
6
6
|
include Turbo::FramesHelper
|
7
7
|
include Turbo::StreamsHelper
|
8
8
|
|
9
|
-
attr_reader :page
|
10
|
-
attr_reader :infinite_dom_id
|
9
|
+
attr_reader :page, :infinite_dom_id, :loading_indicator
|
11
10
|
|
12
|
-
def initialize(page:, infinite_dom_id: :infinite)
|
11
|
+
def initialize(page:, loading_indicator:, infinite_dom_id: :infinite)
|
13
12
|
@page = page
|
14
13
|
@infinite_dom_id = infinite_dom_id
|
14
|
+
@loading_indicator = loading_indicator
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
data/lib/turbo-scroll/version.rb
CHANGED
data/lib/turbo-scroll.rb
CHANGED
@@ -3,12 +3,19 @@ require "turbo-scroll/railtie" if defined?(Rails::Railtie)
|
|
3
3
|
|
4
4
|
module TurboScroll
|
5
5
|
module ViewHelpers
|
6
|
-
def turbo_scroll_loader(page:)
|
7
|
-
render(TurboScroll::Loader.new(page: page))
|
6
|
+
def turbo_scroll_loader(page:, loading_indicator: true)
|
7
|
+
render(TurboScroll::Loader.new(page: page, loading_indicator: loading_indicator))
|
8
8
|
end
|
9
9
|
|
10
|
-
def turbo_scroll_update(page:, infinite_dom_id: :infinite, &block)
|
11
|
-
render(
|
10
|
+
def turbo_scroll_update(page:, infinite_dom_id: :infinite, loading_indicator: true, &block)
|
11
|
+
render(
|
12
|
+
TurboScroll::Update.new(
|
13
|
+
page: page,
|
14
|
+
infinite_dom_id: infinite_dom_id,
|
15
|
+
loading_indicator: loading_indicator
|
16
|
+
),
|
17
|
+
&block
|
18
|
+
)
|
12
19
|
end
|
13
20
|
end
|
14
21
|
end
|
metadata
CHANGED
@@ -1,72 +1,73 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turbo-scroll
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Koen handekyn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-08-
|
11
|
+
date: 2022-08-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '6'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '6'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: turbo-rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '1'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: view_component
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - "
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '2'
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - "
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '2'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: slim
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - "
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '4'
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - "
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '4'
|
69
|
-
description:
|
69
|
+
description: TurboScroll is a minimalistic gem that provides infinite scrolling for
|
70
|
+
Rails based applications using Turbo.
|
70
71
|
email:
|
71
72
|
- koen@handekyn.com
|
72
73
|
executables: []
|
@@ -76,12 +77,19 @@ files:
|
|
76
77
|
- MIT-LICENSE
|
77
78
|
- README.md
|
78
79
|
- Rakefile
|
80
|
+
- lib/locales/en.yml
|
81
|
+
- lib/locales/fr.yml
|
82
|
+
- lib/locales/nl.yml
|
83
|
+
- lib/locales/ro.yml
|
84
|
+
- lib/locales/vn.yml
|
79
85
|
- lib/tasks/turbo_scroll_tasks.rake
|
80
86
|
- lib/turbo-scroll.rb
|
81
87
|
- lib/turbo-scroll/loader.html.slim
|
82
88
|
- lib/turbo-scroll/loader.rb
|
83
89
|
- lib/turbo-scroll/loader.scss
|
84
90
|
- lib/turbo-scroll/railtie.rb
|
91
|
+
- lib/turbo-scroll/spin_loader.rb
|
92
|
+
- lib/turbo-scroll/spin_loader.slim
|
85
93
|
- lib/turbo-scroll/update.html.slim
|
86
94
|
- lib/turbo-scroll/update.rb
|
87
95
|
- lib/turbo-scroll/version.rb
|
@@ -93,6 +101,7 @@ metadata:
|
|
93
101
|
homepage_uri: https://github.com/allcrux/turbo-scroll
|
94
102
|
source_code_uri: https://github.com/allcrux/turbo-scroll
|
95
103
|
changelog_uri: https://github.com/allcrux/turbo-scroll/blob/main/CHANGELOG.md
|
104
|
+
rubygems_mfa_required: 'true'
|
96
105
|
post_install_message:
|
97
106
|
rdoc_options: []
|
98
107
|
require_paths:
|
@@ -111,5 +120,5 @@ requirements: []
|
|
111
120
|
rubygems_version: 3.3.7
|
112
121
|
signing_key:
|
113
122
|
specification_version: 4
|
114
|
-
summary:
|
123
|
+
summary: Modern infinite page scrolling for Rails.
|
115
124
|
test_files: []
|