vanilla-ujs 0.1.1
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/LICENSE.txt +22 -0
- data/README.md +18 -0
- data/lib/vanilla-ujs.rb +4 -0
- data/vanilla-ujs.gemspec +18 -0
- data/vendor/assets/javascripts/src/confirm.js +17 -0
- data/vendor/assets/javascripts/src/csrf.js +52 -0
- data/vendor/assets/javascripts/src/liteajax.js +53 -0
- data/vendor/assets/javascripts/src/method.js +67 -0
- data/vendor/assets/javascripts/src/polyfills.js +18 -0
- data/vendor/assets/javascripts/vanilla-ujs.js +1 -0
- metadata +55 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 19fc8b7fed4191579e3470edff79f673e1ca50b7
|
4
|
+
data.tar.gz: 46d027b35b3132dcd45ed13afbfd3e88707e9b40
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: d0467d38e7eb42108bd019429767df979663c14dc529a97e00d73d1283c0ed004bc1d4b67f66e26716722da39413305c7362638e2299f68cc1679544fc731718
|
7
|
+
data.tar.gz: 279ca95cea0c444d65fd89a899bc21ede487f13792709df9984979cb4b9bed743b2207c0e49705f596e3a3be423874bd7b55a9de57fd6816a61540d7f75ded4d
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2015 Tsokurov Alex
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# Vanilla UJS
|
2
|
+
|
3
|
+
It is implementation of Rails jQuery UJS in pure JavaScript. Based on [code of Łukasz Niemier](http://github.com/hauleth/vanilla-ujs).
|
4
|
+
No extra dependencies.
|
5
|
+
|
6
|
+
## Installation
|
7
|
+
|
8
|
+
_Vanilla UJS_ is meant to work as a Rails plugin. To install it in your current application, add the following to your `Gemfile`:
|
9
|
+
|
10
|
+
```ruby
|
11
|
+
gem 'vanilla-ujs'
|
12
|
+
```
|
13
|
+
|
14
|
+
The _Vanilla UJS_ files will be added to the asset pipeline and available for you to use. Just add these lines in `app/assets/javascripts/application.js`:
|
15
|
+
|
16
|
+
```js
|
17
|
+
//= require vanilla-ujs
|
18
|
+
```
|
data/lib/vanilla-ujs.rb
ADDED
data/vanilla-ujs.gemspec
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "vanilla-ujs"
|
5
|
+
s.version = "0.1.1"
|
6
|
+
s.platform = Gem::Platform::RUBY
|
7
|
+
s.authors = ["Alex Tsokurov", "Łukasz Niemier"]
|
8
|
+
s.email = ["me@ximik.net"]
|
9
|
+
s.homepage = "https://github.com/Ximik/vanilla-ujs"
|
10
|
+
s.summary = "UJS without jQuery dependency"
|
11
|
+
s.description = "This gem provides Rails UJS features without jQuery library."
|
12
|
+
s.license = "MIT"
|
13
|
+
|
14
|
+
s.required_rubygems_version = ">= 1.3.6"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.require_path = 'lib'
|
18
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
document.addEventListener('click', function (event) {
|
2
|
+
var message, element;
|
3
|
+
|
4
|
+
element = event.target;
|
5
|
+
|
6
|
+
if (matches.call(element, 'a[data-confirm], button[data-confirm]')) {
|
7
|
+
message = element.getAttribute('data-confirm');
|
8
|
+
if (!confirm(message)) {
|
9
|
+
event.stopPropagation();
|
10
|
+
event.stopImmediatePropagation();
|
11
|
+
event.preventDefault();
|
12
|
+
return false;
|
13
|
+
}
|
14
|
+
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
}, false);
|
@@ -0,0 +1,52 @@
|
|
1
|
+
var CSRF = {
|
2
|
+
token: function () {
|
3
|
+
var token = document.querySelector('meta[name="csrf-token"]');
|
4
|
+
return token && token.getAttribute('content');
|
5
|
+
},
|
6
|
+
param: function () {
|
7
|
+
var param = document.querySelector('meta[name="csrf-param"]');
|
8
|
+
return param && param.getAttribute('content');
|
9
|
+
}
|
10
|
+
};
|
11
|
+
|
12
|
+
var sameOrigin = function (url) {
|
13
|
+
var a = document.create('a'), origin;
|
14
|
+
a.href = url;
|
15
|
+
origin = a.href.split('/', 3).join('/');
|
16
|
+
|
17
|
+
return window.location.href.indexOf(origin) === 0;
|
18
|
+
};
|
19
|
+
|
20
|
+
window.CSRF = CSRF;
|
21
|
+
|
22
|
+
document.addEventListener('ajax:before', function (e) {
|
23
|
+
var token = CSRF.token(), xhr = e.detail;
|
24
|
+
if (token)
|
25
|
+
xhr.setRequestHeader('X-CSRF-Token', token);
|
26
|
+
});
|
27
|
+
|
28
|
+
document.addEventListener('submit', function (e) {
|
29
|
+
var token = CSRF.token(),
|
30
|
+
param = CSRF.param(),
|
31
|
+
form = e.target;
|
32
|
+
|
33
|
+
if (matches.call(form, 'form')) {
|
34
|
+
if (matches.call(form, 'form[data-remote]'))
|
35
|
+
return true;
|
36
|
+
if (!form.method || form.method.toUpperCase() == 'GET')
|
37
|
+
return true;
|
38
|
+
if (!sameOrigin(form.action))
|
39
|
+
return true;
|
40
|
+
|
41
|
+
if (param && token && !form.querySelector('input[name='+param+']')) {
|
42
|
+
var input = document.createElement('input');
|
43
|
+
input.setAttribute('type', 'hidden');
|
44
|
+
input.setAttribute('name', param);
|
45
|
+
input.setAttribute('value', token);
|
46
|
+
|
47
|
+
form.appendChild(input);
|
48
|
+
}
|
49
|
+
|
50
|
+
return true;
|
51
|
+
}
|
52
|
+
});
|
@@ -0,0 +1,53 @@
|
|
1
|
+
var LiteAjax = (function () {
|
2
|
+
var LiteAjax = {};
|
3
|
+
|
4
|
+
LiteAjax.options = {
|
5
|
+
method: 'GET',
|
6
|
+
url: window.location.href,
|
7
|
+
async: true,
|
8
|
+
};
|
9
|
+
|
10
|
+
LiteAjax.ajax = function (url, options) {
|
11
|
+
if (typeof url == 'object') {
|
12
|
+
options = url;
|
13
|
+
url = undefined;
|
14
|
+
}
|
15
|
+
|
16
|
+
options = options || {};
|
17
|
+
url = url || options.url || location.href || '';
|
18
|
+
|
19
|
+
var xhr;
|
20
|
+
|
21
|
+
xhr = new XMLHttpRequest();
|
22
|
+
|
23
|
+
xhr.addEventListener('load', function () {
|
24
|
+
var event = new CustomEvent('ajaxComplete', {detail: xhr});
|
25
|
+
document.dispatchEvent(event);
|
26
|
+
});
|
27
|
+
|
28
|
+
if (typeof options.success == 'function')
|
29
|
+
xhr.addEventListener('load', function (event) {
|
30
|
+
if (xhr.status >= 200 && xhr.status < 300)
|
31
|
+
options.success(xhr);
|
32
|
+
});
|
33
|
+
|
34
|
+
if (typeof options.error == 'function') {
|
35
|
+
xhr.addEventListener('load', function (event) {
|
36
|
+
if (xhr.status < 200 || xhr.status >= 300)
|
37
|
+
options.error(xhr);
|
38
|
+
});
|
39
|
+
xhr.addEventListener('error', function (event) {
|
40
|
+
options.error(xhr);
|
41
|
+
});
|
42
|
+
}
|
43
|
+
|
44
|
+
xhr.open(options.method || 'GET', url, options.async);
|
45
|
+
var beforeSend = new CustomEvent('ajax:before', {detail: xhr});
|
46
|
+
document.dispatchEvent(beforeSend);
|
47
|
+
xhr.send(options.data);
|
48
|
+
|
49
|
+
return xhr;
|
50
|
+
};
|
51
|
+
|
52
|
+
return LiteAjax;
|
53
|
+
})();
|
@@ -0,0 +1,67 @@
|
|
1
|
+
document.addEventListener('click', function(event) {
|
2
|
+
var element, url, method, data, handler;
|
3
|
+
|
4
|
+
element = event.target;
|
5
|
+
|
6
|
+
if (matches.call(element, 'a[data-method]')) {
|
7
|
+
url = element.getAttribute('href');
|
8
|
+
method = element.getAttribute('data-method').toUpperCase();
|
9
|
+
data = {};
|
10
|
+
|
11
|
+
if (CSRF.param() && CSRF.token()) {
|
12
|
+
data[CSRF.param()] = CSRF.token();
|
13
|
+
}
|
14
|
+
|
15
|
+
if (matches.call(element, 'a[data-remote]')) {
|
16
|
+
handler = xhr;
|
17
|
+
} else {
|
18
|
+
handler = submit;
|
19
|
+
}
|
20
|
+
|
21
|
+
if (handler({ url: url, method: method, data: data })) {
|
22
|
+
event.preventDefault();
|
23
|
+
} else {
|
24
|
+
return true;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
function submit(options) {
|
29
|
+
var form, input, param;
|
30
|
+
|
31
|
+
if (options.method == 'GET') {
|
32
|
+
return false;
|
33
|
+
}
|
34
|
+
|
35
|
+
form = document.createElement('form');
|
36
|
+
form.method = 'POST';
|
37
|
+
form.action = options.url;
|
38
|
+
form.style.display = 'none';
|
39
|
+
|
40
|
+
for (param in options.data) {
|
41
|
+
if (Object.prototype.hasOwnProperty.call(options.data, param)) {
|
42
|
+
input = document.createElement('input');
|
43
|
+
input.setAttribute('type', 'hidden');
|
44
|
+
input.setAttribute('name', param);
|
45
|
+
input.setAttribute('value', options.data[param]);
|
46
|
+
form.appendChild(input);
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
if (options.method != 'POST') {
|
51
|
+
input = document.createElement('input');
|
52
|
+
input.setAttribute('type', 'hidden');
|
53
|
+
input.setAttribute('name', '_method');
|
54
|
+
input.setAttribute('value', options.method);
|
55
|
+
form.appendChild(input);
|
56
|
+
}
|
57
|
+
|
58
|
+
document.body.appendChild(form);
|
59
|
+
form.submit();
|
60
|
+
return true;
|
61
|
+
}
|
62
|
+
|
63
|
+
function xhr(options) {
|
64
|
+
LiteAjax.ajax(options);
|
65
|
+
return true;
|
66
|
+
}
|
67
|
+
}, false);
|
@@ -0,0 +1,18 @@
|
|
1
|
+
var matches = (function(doc) {
|
2
|
+
return doc.matchesSelector ||
|
3
|
+
doc.webkitMatchesSelector ||
|
4
|
+
doc.mozMatchesSelector ||
|
5
|
+
doc.oMatchesSelector ||
|
6
|
+
doc.msMatchesSelector;
|
7
|
+
})(document.documentElement);
|
8
|
+
|
9
|
+
var CustomEvent = function (event, params) {
|
10
|
+
params = params || {bubbles: false, cancelable: false, detail: undefined};
|
11
|
+
var evt = document.createEvent('CustomEvent');
|
12
|
+
evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);
|
13
|
+
return evt;
|
14
|
+
};
|
15
|
+
|
16
|
+
CustomEvent.prototype = window.CustomEvent.prototype;
|
17
|
+
|
18
|
+
window.CustomEvent = CustomEvent;
|
@@ -0,0 +1 @@
|
|
1
|
+
//= require_tree ./src
|
metadata
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: vanilla-ujs
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Alex Tsokurov
|
8
|
+
- Łukasz Niemier
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2015-03-10 00:00:00.000000000 Z
|
13
|
+
dependencies: []
|
14
|
+
description: This gem provides Rails UJS features without jQuery library.
|
15
|
+
email:
|
16
|
+
- me@ximik.net
|
17
|
+
executables: []
|
18
|
+
extensions: []
|
19
|
+
extra_rdoc_files: []
|
20
|
+
files:
|
21
|
+
- LICENSE.txt
|
22
|
+
- README.md
|
23
|
+
- lib/vanilla-ujs.rb
|
24
|
+
- vanilla-ujs.gemspec
|
25
|
+
- vendor/assets/javascripts/src/confirm.js
|
26
|
+
- vendor/assets/javascripts/src/csrf.js
|
27
|
+
- vendor/assets/javascripts/src/liteajax.js
|
28
|
+
- vendor/assets/javascripts/src/method.js
|
29
|
+
- vendor/assets/javascripts/src/polyfills.js
|
30
|
+
- vendor/assets/javascripts/vanilla-ujs.js
|
31
|
+
homepage: https://github.com/Ximik/vanilla-ujs
|
32
|
+
licenses:
|
33
|
+
- MIT
|
34
|
+
metadata: {}
|
35
|
+
post_install_message:
|
36
|
+
rdoc_options: []
|
37
|
+
require_paths:
|
38
|
+
- lib
|
39
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 1.3.6
|
49
|
+
requirements: []
|
50
|
+
rubyforge_project:
|
51
|
+
rubygems_version: 2.2.2
|
52
|
+
signing_key:
|
53
|
+
specification_version: 4
|
54
|
+
summary: UJS without jQuery dependency
|
55
|
+
test_files: []
|