crazy_render 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,103 @@
1
+ (function() {
2
+ <% if turbolinks %>
3
+ if (document.documentElement.hasAttribute("data-turbolinks-preview")) {
4
+ return;
5
+ }
6
+ <% end %>
7
+
8
+ var _listener = function(currentRetryCount) {
9
+ var request = new XMLHttpRequest();
10
+ var asyncRequest = true;
11
+ var SUCCESS = 200;
12
+ var ERROR = 400;
13
+
14
+ request.open('<%= method %>', '<%= path.html_safe %>', asyncRequest);
15
+
16
+ var headers = <%= headers.to_json.html_safe %>;
17
+ var csrfTokenElement = document.querySelector('meta[name="csrf-token"]')
18
+ if (csrfTokenElement)
19
+ headers['X-CSRF-Token'] = csrfTokenElement.content
20
+
21
+ Object.keys(headers).map(function(key) {
22
+ request.setRequestHeader(key, headers[key]);
23
+ });
24
+
25
+ request.onreadystatechange = function() {
26
+ if (request.readyState === 4) {
27
+ if (request.status >= SUCCESS && request.status < ERROR) {
28
+ var container = document.getElementById('<%= container_id %>');
29
+ <% if interval %>
30
+ container.innerHTML = request.response;
31
+ <% else %>
32
+ container.outerHTML = request.response;
33
+ <% end %>
34
+
35
+ <% if event_name.present? %>
36
+ var event = undefined;
37
+ if (typeof(Event) === 'function') {
38
+ event = new Event("<%= event_name %>");
39
+ } else {
40
+ event = document.createEvent('Event');
41
+ event.initEvent('<%= event_name %>', true, true);
42
+ }
43
+ document.dispatchEvent(event);
44
+ <% end %>
45
+ } else {
46
+ var skipErrorMessage = false;
47
+ <% if retry_count > 0 %>
48
+ skipErrorMessage = retry(currentRetryCount)
49
+ <% end %>
50
+
51
+ if (skipErrorMessage) return;
52
+
53
+ var container = document.getElementById('<%= container_id %>');
54
+ container.outerHTML = '<%= error_message.try(:html_safe) %>';
55
+
56
+ <% if error_event_name.present? %>
57
+ var event = undefined;
58
+ if (typeof(Event) === 'function') {
59
+ event = new Event("<%= error_event_name %>");
60
+ } else {
61
+ event = document.createEvent('Event');
62
+ event.initEvent('<%= error_event_name %>', true, true);
63
+ }
64
+ document.dispatchEvent(event);
65
+ <% end %>
66
+ }
67
+ }
68
+ };
69
+
70
+ var body = "<%= escape_javascript(data.to_s.html_safe) %>";
71
+ request.send(body);
72
+ };
73
+
74
+ <% if retry_count > 0 %>
75
+ var retry = function(currentRetryCount) {
76
+ if (typeof(currentRetryCount) === 'number') {
77
+ if (currentRetryCount >= <%= retry_count %>)
78
+ return false;
79
+
80
+ _listener(currentRetryCount + 1);
81
+ return true;
82
+ }
83
+
84
+ _listener(1);
85
+ return true;
86
+ }
87
+ <% end %>
88
+
89
+ <% if turbolinks %>
90
+ document.addEventListener("turbolinks:load", function (e) {
91
+ e.target.removeEventListener(e.type, arguments.callee);
92
+ _listener.call(this);
93
+ });
94
+ <% elsif interval %>
95
+ var _intervalFunction = function() {
96
+ _listener();
97
+ setInterval(_listener, <%= interval %>);
98
+ }
99
+ document.addEventListener("DOMContentLoaded", _intervalFunction);
100
+ <% else %>
101
+ document.addEventListener("DOMContentLoaded", _listener);
102
+ <% end %>
103
+ })();
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "render_async"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ git submodule init
5
+ git submodule update
6
+
7
+ gem build render_async.gemspec
8
+ gem install render_async*.gem
9
+
10
+ cd spec/fixtures/rails-5-base-app
11
+ ls
12
+ bundle install
13
+ bundle exec cucumber
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,10 @@
1
+ module RenderAsync
2
+ class Configuration
3
+ attr_accessor :jquery, :turbolinks
4
+
5
+ def initialize
6
+ @jquery = false
7
+ @turbolinks = false
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,5 @@
1
+ module RenderAsync
2
+ class Engine < Rails::Engine
3
+ # Make it a Rails Engine
4
+ end
5
+ end
@@ -0,0 +1,3 @@
1
+ module RenderAsync
2
+ VERSION = "2.1.0".freeze
3
+ end
@@ -0,0 +1,56 @@
1
+ require 'securerandom'
2
+
3
+ module RenderAsync
4
+ module ViewHelper
5
+
6
+ def render_async_cache_key(path)
7
+ "render_async_#{path}"
8
+ end
9
+
10
+ def render_async_cache(path, options = {}, &placeholder)
11
+ cached_view = Rails.cache.read("views/#{render_async_cache_key(path)}")
12
+
13
+ if cached_view.present?
14
+ render :html => cached_view.html_safe
15
+ else
16
+ render_async(path, options, &placeholder)
17
+ end
18
+ end
19
+
20
+ def render_async(path, options = {}, &placeholder)
21
+ html_element_name = options.delete(:html_element_name) || 'div'
22
+ container_id = options.delete(:container_id) || generate_container_id
23
+ container_class = options.delete(:container_class)
24
+ event_name = options.delete(:event_name)
25
+ placeholder = capture(&placeholder) if block_given?
26
+ method = options.delete(:method) || 'GET'
27
+ data = options.delete(:data)
28
+ headers = options.delete(:headers) || {}
29
+ error_message = options.delete(:error_message)
30
+ error_event_name = options.delete(:error_event_name)
31
+ retry_count = options.delete(:retry_count) || 0
32
+ interval = options.delete(:interval)
33
+
34
+ render 'render_async/render_async', html_element_name: html_element_name,
35
+ container_id: container_id,
36
+ container_class: container_class,
37
+ path: path,
38
+ html_options: options,
39
+ event_name: event_name,
40
+ placeholder: placeholder,
41
+ method: method,
42
+ data: data,
43
+ headers: headers,
44
+ error_message: error_message,
45
+ error_event_name: error_event_name,
46
+ retry_count: retry_count,
47
+ interval: interval
48
+ end
49
+
50
+ private
51
+
52
+ def generate_container_id
53
+ "render_async_#{SecureRandom.hex(5)}#{Time.now.to_i}"
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,24 @@
1
+ require "render_async/version"
2
+ require "render_async/view_helper"
3
+ require "render_async/engine" if defined? Rails
4
+ require "render_async/configuration"
5
+
6
+ ActionView::Base.send :include, RenderAsync::ViewHelper if defined? ActionView::Base
7
+
8
+ module RenderAsync
9
+ class << self
10
+ attr_accessor :configuration
11
+ end
12
+
13
+ def self.configuration
14
+ @configuration ||= RenderAsync::Configuration.new
15
+ end
16
+
17
+ def self.reset
18
+ @configuration = RenderAsync::Configuration.new
19
+ end
20
+
21
+ def self.configure
22
+ yield(configuration)
23
+ end
24
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'render_async/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "crazy_render"
8
+ spec.version = RenderAsync::VERSION
9
+ spec.authors = ["ThanhKhoaIT", "Kasper Grubbe", "nikolalsvk"]
10
+ spec.email = ["thanhkhoait@gmail.com"]
11
+
12
+ spec.summary = "Render parts of the page asynchronously with AJAX"
13
+ spec.description = "Load parts of your page through simple JavaScript and Rails pipeline"
14
+ spec.homepage = "https://github.com/ThanhKhoaIT/render_async"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
18
+ f.match(%r{^(test|spec|features)/})
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "rspec", "~> 3.2"
26
+ spec.add_development_dependency "codeclimate-test-reporter", "~> 1.0.8"
27
+ end
metadata ADDED
@@ -0,0 +1,108 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: crazy_render
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.1.0
5
+ platform: ruby
6
+ authors:
7
+ - ThanhKhoaIT
8
+ - Kasper Grubbe
9
+ - nikolalsvk
10
+ autorequire:
11
+ bindir: exe
12
+ cert_chain: []
13
+ date: 2019-07-08 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rake
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - "~>"
20
+ - !ruby/object:Gem::Version
21
+ version: '10.0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - "~>"
27
+ - !ruby/object:Gem::Version
28
+ version: '10.0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rspec
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - "~>"
34
+ - !ruby/object:Gem::Version
35
+ version: '3.2'
36
+ type: :development
37
+ prerelease: false
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - "~>"
41
+ - !ruby/object:Gem::Version
42
+ version: '3.2'
43
+ - !ruby/object:Gem::Dependency
44
+ name: codeclimate-test-reporter
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - "~>"
48
+ - !ruby/object:Gem::Version
49
+ version: 1.0.8
50
+ type: :development
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - "~>"
55
+ - !ruby/object:Gem::Version
56
+ version: 1.0.8
57
+ description: Load parts of your page through simple JavaScript and Rails pipeline
58
+ email:
59
+ - thanhkhoait@gmail.com
60
+ executables: []
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - ".all-contributorsrc"
65
+ - ".gitignore"
66
+ - ".gitmodules"
67
+ - ".rspec"
68
+ - CHANGELOG.md
69
+ - Gemfile
70
+ - LICENSE
71
+ - README.md
72
+ - Rakefile
73
+ - app/views/render_async/_render_async.html.erb
74
+ - app/views/render_async/_request_jquery.js.erb
75
+ - app/views/render_async/_request_vanilla.js.erb
76
+ - bin/console
77
+ - bin/integration-tests
78
+ - bin/setup
79
+ - lib/render_async.rb
80
+ - lib/render_async/configuration.rb
81
+ - lib/render_async/engine.rb
82
+ - lib/render_async/version.rb
83
+ - lib/render_async/view_helper.rb
84
+ - render_async.gemspec
85
+ homepage: https://github.com/ThanhKhoaIT/render_async
86
+ licenses:
87
+ - MIT
88
+ metadata: {}
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ required_rubygems_version: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ version: '0'
103
+ requirements: []
104
+ rubygems_version: 3.0.3
105
+ signing_key:
106
+ specification_version: 4
107
+ summary: Render parts of the page asynchronously with AJAX
108
+ test_files: []