pagelet_rails 0.1.1 → 0.1.2
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 +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
|