pagelet_rails 0.1.1 → 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 +19 -4
- data/app/helpers/pagelets_helper.rb +27 -3
- data/app/views/layouts/pagelet_rails/container.html.erb +8 -0
- data/app/views/layouts/pagelet_rails/inner.html.erb +1 -0
- data/app/views/layouts/pagelet_rails/{loading_placeholder.slim → loading_placeholder.html.erb} +20 -15
- data/lib/pagelet_rails/concerns/controller.rb +3 -2
- data/lib/pagelet_rails/concerns/options.rb +2 -2
- data/lib/pagelet_rails/concerns/response_wrapper.rb +1 -1
- data/lib/pagelet_rails/concerns/routes.rb +1 -39
- data/lib/pagelet_rails/version.rb +1 -1
- metadata +23 -9
- data/app/views/layouts/pagelet_rails/container.html.slim +0 -24
- data/app/views/layouts/pagelet_rails/inner.slim +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4e50eed9cbc5cc8321966e7f7ffe1ec0aac7f74e
|
4
|
+
data.tar.gz: 7a0462d6c842b876a84711e06c3c0e214c95d111
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1d13544c9d7c095b7493f6873de350a548f85089626473865c22b917a9cad4772404ada34f19b3639785085265404614c4b1cf96abe1fa820971410df9aa8ac3
|
7
|
+
data.tar.gz: 7f226cf84f54bca6949d85d32f2a962917ad2d3774b3f4e1a7b602a7c20b85a478f0674c646235e8f87e3e4d7dcc6824f51b4993eb47c96fc7f49db2204e1167
|
data/README.md
CHANGED
@@ -11,7 +11,7 @@
|
|
11
11
|
|
12
12
|
Don't make your users wait for page to load.
|
13
13
|
|
14
|
-
[View Demo Project](
|
14
|
+
[View Demo Project](http://polar-river-18908.herokuapp.com)
|
15
15
|
|
16
16
|
## Example
|
17
17
|
|
@@ -405,13 +405,28 @@ Only relevant for `remote: true` and `remote: :turbolinks` when request is loade
|
|
405
405
|
|
406
406
|
There will be one request per group. Missing value is considered a separate group as well.
|
407
407
|
|
408
|
-
|
408
|
+
## All possible advantages of this gem's approach
|
409
|
+
|
410
|
+
This is a list of all advantages that would be made possible by using this gem's approach of abstraction and decomposition. Note: not all features are implemented yet.
|
411
|
+
|
412
|
+
- Ability to use HTTP public cache for fragment caching
|
413
|
+
- Easier fragment caching on the server
|
414
|
+
- Batch Ajax requests
|
415
|
+
- Custom loading placeholders
|
416
|
+
- Progressive rendering of the page
|
417
|
+
- Partial page updates
|
418
|
+
- "Super smart caching"
|
419
|
+
- Delay render below the fold
|
420
|
+
- Simplified development and testing
|
421
|
+
- Minimum DSL or new syntax
|
422
|
+
- Asset dependencies
|
423
|
+
- Parallel rendering
|
424
|
+
- Take advantage of HTTP2 features
|
425
|
+
|
409
426
|
## Todo
|
410
427
|
|
411
428
|
* delay load of not visible pagelets (aka. below the fold)
|
412
429
|
* do not load pagelets which are not visible to the user until user scrolls down. For example like Youtube comments.
|
413
|
-
* fix streaming with nested layouts (rails bug?)
|
414
|
-
* add rails 4 support
|
415
430
|
* high test coverage
|
416
431
|
* update actionpack-action_caching gem to support rails 5
|
417
432
|
|
@@ -1,5 +1,25 @@
|
|
1
1
|
module PageletsHelper
|
2
2
|
|
3
|
+
def html_container_attributes
|
4
|
+
html_opts = pagelet_options.html || {}
|
5
|
+
classes = html_opts.fetch(:class, '').split(' ')
|
6
|
+
classes << "pagelet-#{controller_name}"
|
7
|
+
classes << "pagelet-#{controller_name}-#{action_name}"
|
8
|
+
|
9
|
+
html_opts[:id] ||= pagelet_default_id
|
10
|
+
html_opts[:class] = classes.join(' ')
|
11
|
+
|
12
|
+
html_opts['data-pagelet-container'] = true
|
13
|
+
|
14
|
+
encode_data = pagelet_options.original_options.to_h.except('remote')
|
15
|
+
html_opts['data-pagelet-options'] = PageletRails::Encryptor.encode(encode_data)
|
16
|
+
|
17
|
+
if pagelet_options.ajax_group
|
18
|
+
html_opts['data-pagelet-group'] = pagelet_options.ajax_group
|
19
|
+
end
|
20
|
+
html_opts
|
21
|
+
end
|
22
|
+
|
3
23
|
def pagelet_stream
|
4
24
|
return nil if pagelet_stream_objects.empty?
|
5
25
|
pagelet_stream_objects.each do |key, block|
|
@@ -24,7 +44,7 @@ module PageletsHelper
|
|
24
44
|
end
|
25
45
|
|
26
46
|
def pagelet path, p_options = {}
|
27
|
-
|
47
|
+
Rails.logger.info "Rendering pagelet #{path}"
|
28
48
|
|
29
49
|
p_params = p_options.delete(:params) { {} }.with_indifferent_access
|
30
50
|
|
@@ -72,8 +92,12 @@ module PageletsHelper
|
|
72
92
|
p_request.parameters.clear
|
73
93
|
p_request.parameters.merge! p_params
|
74
94
|
|
75
|
-
|
76
|
-
|
95
|
+
if c.method(:dispatch).arity == 3
|
96
|
+
p_response = controller_class.make_response! p_request
|
97
|
+
c.dispatch(action, p_request, p_response)
|
98
|
+
else
|
99
|
+
c.dispatch(action, p_request)
|
100
|
+
end
|
77
101
|
|
78
102
|
body = c.response.body
|
79
103
|
body.html_safe
|
@@ -0,0 +1,8 @@
|
|
1
|
+
<% if pagelet_request? || pagelet_options.skip_container %>
|
2
|
+
<%= content_for?(:content) ? yield(:content) : yield %>
|
3
|
+
|
4
|
+
<% else %>
|
5
|
+
<%= content_tag :div, html_container_attributes do %>
|
6
|
+
<%= content_for?(:content) ? yield(:content) : yield %>
|
7
|
+
<% end %>
|
8
|
+
<% end %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= content_for?(:content) ? yield(:content) : yield %>
|
data/app/views/layouts/pagelet_rails/{loading_placeholder.slim → loading_placeholder.html.erb}
RENAMED
@@ -1,9 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
height = height.is_a?(Numeric) ? "#{height}px" : 'auto'
|
1
|
+
<% height = pagelet_options.placeholder.try(:[], :height) %>
|
2
|
+
<% height = height.is_a?(Numeric) ? "#{height}px" : 'auto' %>
|
3
|
+
<% text = pagelet_options.placeholder.try(:[], :text) || 'Loading ...' %>
|
5
4
|
|
6
|
-
css
|
5
|
+
<style type="text/css">
|
7
6
|
/* Three Bounce */
|
8
7
|
.spinner.spinner-three-bounce {
|
9
8
|
width: 70px;
|
@@ -53,14 +52,20 @@ css:
|
|
53
52
|
-webkit-transform: scale(1.0);
|
54
53
|
}
|
55
54
|
}
|
55
|
+
</style>
|
56
56
|
|
57
|
-
|
58
|
-
div style="display: table;
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
br
|
66
|
-
span
|
57
|
+
<div style="display: table; height: <%= height %>; overflow: hidden; width: 100%;">
|
58
|
+
<div style="display: table-cell; vertical-align: middle;">
|
59
|
+
<div class="text-center">
|
60
|
+
<div class="spinner spinner-three-bounce">
|
61
|
+
<div class="bounce1"></div>
|
62
|
+
<div class="bounce2"></div>
|
63
|
+
<div class="bounce3"></div>
|
64
|
+
</div>
|
65
|
+
<br>
|
66
|
+
<span>
|
67
|
+
<%= text %>
|
68
|
+
</span>
|
69
|
+
</div>
|
70
|
+
</div>
|
71
|
+
</div>
|
@@ -16,13 +16,13 @@ module PageletRails::Concerns::Controller
|
|
16
16
|
|
17
17
|
helper_method :pagelet_request?
|
18
18
|
|
19
|
-
pagelet_options layout: '
|
19
|
+
pagelet_options layout: 'container'
|
20
20
|
end
|
21
21
|
|
22
22
|
def layout_name
|
23
23
|
layout = params[:layout] || pagelet_options.layout
|
24
24
|
|
25
|
-
"
|
25
|
+
"pagelet_rails/#{layout}"
|
26
26
|
end
|
27
27
|
|
28
28
|
def pagelet_request?
|
@@ -33,6 +33,7 @@ module PageletRails::Concerns::Controller
|
|
33
33
|
|
34
34
|
def append_pagelet_view_paths
|
35
35
|
self.view_paths.unshift 'app/pagelets/'
|
36
|
+
self.view_paths.unshift 'test/dummy/app/pagelets/' if Rails.env.test?
|
36
37
|
|
37
38
|
# lookup_context.prefixes.clear
|
38
39
|
view = "#{controller_name}/views"
|
@@ -8,7 +8,7 @@ module PageletRails::Concerns::Options
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def pagelet_options *args
|
11
|
-
set_pagelet_options
|
11
|
+
set_pagelet_options(*args)
|
12
12
|
|
13
13
|
opts = self.class.pagelet_options
|
14
14
|
class_default_opts = opts.fetch('default', {})
|
@@ -47,7 +47,7 @@ module PageletRails::Concerns::Options
|
|
47
47
|
include Shared
|
48
48
|
|
49
49
|
def pagelet_options *args
|
50
|
-
set_pagelet_options
|
50
|
+
set_pagelet_options(*args)
|
51
51
|
|
52
52
|
if superclass && superclass.instance_variable_defined?(:@pagelet_options)
|
53
53
|
parent = superclass.instance_variable_get :@pagelet_options
|
@@ -14,7 +14,7 @@ module PageletRails::Concerns::ResponseWrapper
|
|
14
14
|
memo
|
15
15
|
}
|
16
16
|
|
17
|
-
if html.match
|
17
|
+
if html.match(/^\s*</)
|
18
18
|
# the body could be javascript, make sure it's html before wrapping
|
19
19
|
|
20
20
|
id = ActionController::Base.helpers.escape_javascript params[:target_container]
|
@@ -29,52 +29,14 @@ module PageletRails::Concerns::Routes
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
# Define inline single route for the following method.
|
33
|
-
# It automatically adds :controller and :action names to the route
|
34
|
-
#
|
35
|
-
# class PageletRails::Examples::ExamplesController
|
36
|
-
# pageletlet_route :get, ''
|
37
|
-
# def bingo
|
38
|
-
# end
|
39
|
-
# end
|
40
|
-
#
|
41
|
-
# will generate routes
|
42
|
-
# Helper: pagelets_examples_path
|
43
|
-
# HTTP Verb: GET
|
44
|
-
# Path: /pagelets/examples(.:format)
|
45
|
-
# Controller#Action: pagelets/examples/examples#bingo
|
46
|
-
#
|
47
|
-
def pagelet_route *args
|
48
|
-
@pagelet_route << args
|
49
|
-
end
|
50
|
-
|
51
|
-
def method_added method_name
|
52
|
-
return unless @pagelet_route
|
53
|
-
@pagelet_route.each do |args|
|
54
|
-
options = args.extract_options!
|
55
|
-
options[:controller] ||= self.controller_name
|
56
|
-
options[:action] ||= method_name
|
57
|
-
|
58
|
-
@pagelet_routes << Proc.new do
|
59
|
-
scope path: options[:controller], as: options[:controller] do
|
60
|
-
self.send *args, options
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
@pagelet_route = []
|
66
|
-
super
|
67
|
-
end
|
68
|
-
|
69
32
|
def load_pagelet_routes! context
|
70
33
|
@pagelet_routes.each do |proc|
|
71
|
-
context.instance_eval
|
34
|
+
context.instance_eval(&proc)
|
72
35
|
end
|
73
36
|
end
|
74
37
|
|
75
38
|
def inherited subklass
|
76
39
|
subklass.instance_variable_set(:@pagelet_routes, [])
|
77
|
-
subklass.instance_variable_set(:@pagelet_route, [])
|
78
40
|
super
|
79
41
|
end
|
80
42
|
end
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pagelet_rails
|
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
|
- Anton Katunin
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-09-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 4.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 4.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: ejs
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
25
32
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: sqlite3
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,9 +73,9 @@ files:
|
|
59
73
|
- app/controllers/pagelet_controller.rb
|
60
74
|
- app/controllers/pagelet_proxy_controller.rb
|
61
75
|
- app/helpers/pagelets_helper.rb
|
62
|
-
- app/views/layouts/pagelet_rails/container.html.
|
63
|
-
- app/views/layouts/pagelet_rails/inner.
|
64
|
-
- app/views/layouts/pagelet_rails/loading_placeholder.
|
76
|
+
- app/views/layouts/pagelet_rails/container.html.erb
|
77
|
+
- app/views/layouts/pagelet_rails/inner.html.erb
|
78
|
+
- app/views/layouts/pagelet_rails/loading_placeholder.html.erb
|
65
79
|
- config/routes.rb
|
66
80
|
- lib/action_controller/action_caching.rb
|
67
81
|
- lib/action_controller/caching/actions.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
- if pagelet_request? || pagelet_options.skip_container
|
2
|
-
= content_for?(:content) ? yield(:content) : yield
|
3
|
-
|
4
|
-
- else
|
5
|
-
ruby:
|
6
|
-
html_opts = pagelet_options.html || {}
|
7
|
-
classes = html_opts.fetch(:class, '').split(' ')
|
8
|
-
classes << "pagelet-#{controller_name}"
|
9
|
-
classes << "pagelet-#{controller_name}-#{action_name}"
|
10
|
-
|
11
|
-
html_opts[:id] ||= pagelet_default_id
|
12
|
-
html_opts[:class] = classes.join(' ')
|
13
|
-
|
14
|
-
html_opts['data-pagelet-container'] = true
|
15
|
-
|
16
|
-
encode_data = pagelet_options.original_options.to_h.except('remote')
|
17
|
-
html_opts['data-pagelet-options'] = PageletRails::Encryptor.encode(encode_data)
|
18
|
-
|
19
|
-
if pagelet_options.ajax_group
|
20
|
-
html_opts['data-pagelet-group'] = pagelet_options.ajax_group
|
21
|
-
end
|
22
|
-
|
23
|
-
div *html_opts
|
24
|
-
= content_for?(:content) ? yield(:content) : yield
|
@@ -1 +0,0 @@
|
|
1
|
-
= content_for?(:content) ? yield(:content) : yield
|