jquery_helpers 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/jquery_helpers.gemspec +20 -0
- data/lib/generators/jquery_helpers/USAGE +9 -0
- data/lib/generators/jquery_helpers/jquery_helpers_generator.rb +20 -0
- data/lib/generators/jquery_helpers/templates/jquery.rails.js +151 -0
- data/lib/generators/jquery_helpers/templates/jquery.rails.min.js +117 -0
- data/lib/generators/jquery_helpers.rb +2 -0
- metadata +70 -0
@@ -0,0 +1,20 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = 'jquery_helpers'
|
3
|
+
s.version = '0.0.0'
|
4
|
+
s.date = %q{2010-02-08}
|
5
|
+
s.authors = ["Russell Jones"]
|
6
|
+
s.email = %q{spam@codeofficer.com}
|
7
|
+
s.description = %q{A port of the unobtrusive Prototype helpers in Rails 3 to jQuery}
|
8
|
+
s.summary = %q{jQuery helpers for Rails 3}
|
9
|
+
s.homepage = %q{http://github.com/CodeOfficer/jquery-helpers-for-rails3}
|
10
|
+
s.require_paths = ["lib", "lib/generators"]
|
11
|
+
s.files = [
|
12
|
+
"lib/generators/jquery_helpers.rb",
|
13
|
+
"lib/generators/jquery_helpers/jquery_helpers_generator.rb",
|
14
|
+
"lib/generators/jquery_helpers/templates/jquery.rails.js",
|
15
|
+
"lib/generators/jquery_helpers/templates/jquery.rails.min.js",
|
16
|
+
"lib/generators/jquery_helpers/USAGE",
|
17
|
+
"jquery_helpers.gemspec"
|
18
|
+
]
|
19
|
+
s.add_dependency 'rails', '3.0.0.beta'
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'rails/generators'
|
2
|
+
|
3
|
+
class JqueryHelpersGenerator < Rails::Generators::Base
|
4
|
+
|
5
|
+
def install_jquery_helpers
|
6
|
+
copy_file(
|
7
|
+
'jquery.rails.min.js',
|
8
|
+
'public/javascripts/jquery.rails.min.js'
|
9
|
+
)
|
10
|
+
copy_file(
|
11
|
+
'jquery.rails.js',
|
12
|
+
'public/javascripts/jquery.rails.js'
|
13
|
+
)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.source_root
|
17
|
+
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,151 @@
|
|
1
|
+
// http://dev.jquery.com/ticket/5945
|
2
|
+
// Namespaced events don't work with live in 1.4.1 (they are never fired).
|
3
|
+
// I'm ommiting the namespace for now on ajax events
|
4
|
+
// This demonstrates what doesn't work in 1.4.1
|
5
|
+
// $('body').live('click.foo', function(){ alert('clicked'); });
|
6
|
+
// $('body').trigger('click.foo');
|
7
|
+
|
8
|
+
;(function($) {
|
9
|
+
$(function() {
|
10
|
+
|
11
|
+
var authToken = $('meta[name=csrf-token]').attr('content');
|
12
|
+
var authParam = $('meta[name=csrf-param]').attr('content');
|
13
|
+
var formTemplate = '<form method="#{method}" action="#{action}">\
|
14
|
+
#{realmethod}<input name="#{param}" value="#{token}" type="hidden">\
|
15
|
+
</form>';
|
16
|
+
var realmethodTemplate = '<input name="_method" value="#{method}" type="hidden">';
|
17
|
+
|
18
|
+
String.prototype.interpolate = function() {
|
19
|
+
for ( i in arguments[0] ) {
|
20
|
+
eval( i + " = '" + arguments[0][i] + "'" );
|
21
|
+
};
|
22
|
+
return this.replace( /#\{.*?\}/g, function(match) {
|
23
|
+
return eval( match.replace( /^#\{|\}$/g , '') );
|
24
|
+
});
|
25
|
+
};
|
26
|
+
|
27
|
+
function handleRemote(element) {
|
28
|
+
var $element = $(element);
|
29
|
+
var method, url, params, dataType;
|
30
|
+
|
31
|
+
dataType = $element.attr('data-type') || 'script';
|
32
|
+
|
33
|
+
if ($element.is('form')) {
|
34
|
+
method = $element.attr('method') || 'post';
|
35
|
+
url = $element.attr('action');
|
36
|
+
params = $element.serialize();
|
37
|
+
} else {
|
38
|
+
method = $element.attr('data-method') || 'get';
|
39
|
+
// TODO: data-url support is going away, just use href
|
40
|
+
url = $element.attr('data-url') || $element.attr('href');
|
41
|
+
params = {};
|
42
|
+
};
|
43
|
+
|
44
|
+
// Trigger any beforeAjax event handlers on self and ancestors
|
45
|
+
// We're looking for a return of false to cancel this action.
|
46
|
+
// Prototype has a much cleaner way of doing this
|
47
|
+
// var event = element.fire("ajax:before");
|
48
|
+
// if (event.stopped) return false;
|
49
|
+
function triggerHandlers($element, event_name) {
|
50
|
+
var proceed = true;
|
51
|
+
if ($element.triggerHandler(event_name) == false) {
|
52
|
+
proceed = false;
|
53
|
+
} else {
|
54
|
+
var x = $.each( $element.parents(), function(index, dom) {
|
55
|
+
if ($(dom).triggerHandler(event_name) == false) {
|
56
|
+
proceed = false;
|
57
|
+
};
|
58
|
+
});
|
59
|
+
};
|
60
|
+
return proceed;
|
61
|
+
};
|
62
|
+
|
63
|
+
if (!triggerHandlers($element, "beforeAjax")) return false;
|
64
|
+
|
65
|
+
$.ajax({
|
66
|
+
url: url,
|
67
|
+
type: method,
|
68
|
+
dataType: dataType,
|
69
|
+
data: params,
|
70
|
+
beforeSend: function(request){ $element.trigger("beforeSendAjax", [request]); },
|
71
|
+
dataFilter: function(data, type){ $element.trigger("dataFilterAjax", [data, type]); },
|
72
|
+
complete: function(request, textStatus){ $element.trigger("completeAjax", [request, textStatus]); },
|
73
|
+
success: function(data, textStatus, request){ $element.trigger("successAjax", [data, textStatus, request]); },
|
74
|
+
error: function(request, textStatus, errorThrown){ $element.trigger("errorAjax", [request, textStatus, errorThrown]); }
|
75
|
+
});
|
76
|
+
|
77
|
+
$element.trigger("afterAjax");
|
78
|
+
};
|
79
|
+
|
80
|
+
$('body').live('click', function(e){
|
81
|
+
var target = e.target;
|
82
|
+
|
83
|
+
var message = $(target).attr('data-confirm');
|
84
|
+
if (message && !confirm(message)) {
|
85
|
+
return false;
|
86
|
+
};
|
87
|
+
|
88
|
+
var remoteElement = $(target).closest('a[data-remote=true]').get(0);
|
89
|
+
if (remoteElement) {
|
90
|
+
handleRemote(remoteElement);
|
91
|
+
return false;
|
92
|
+
};
|
93
|
+
|
94
|
+
var element = $(target).closest('a[data-method]').get(0);
|
95
|
+
if (element && $(element).attr('data-remote') != 'true') {
|
96
|
+
var method = $(element).attr('data-method');
|
97
|
+
var piggyback = method.toLowerCase() != 'post';
|
98
|
+
var formHTML = formTemplate.interpolate({
|
99
|
+
method: 'POST',
|
100
|
+
realmethod: piggyback ? realmethodTemplate.interpolate({ method: method }) : '',
|
101
|
+
action: $(element).attr('href'),
|
102
|
+
token: authToken,
|
103
|
+
param: authParam
|
104
|
+
});
|
105
|
+
var $form = $('<div>').html(formHTML).children().hide().appendTo('body');
|
106
|
+
|
107
|
+
$form.submit();
|
108
|
+
return false;
|
109
|
+
};
|
110
|
+
});
|
111
|
+
|
112
|
+
$('body').live('submit', function(e){
|
113
|
+
var target = e.target;
|
114
|
+
|
115
|
+
var message = $(target).attr('data-confirm');
|
116
|
+
if (message && !confirm(message)) {
|
117
|
+
return false;
|
118
|
+
};
|
119
|
+
|
120
|
+
var inputs = $(target).find('input[type=submit][data-disable-with]');
|
121
|
+
$.each(inputs, function(i, input) {
|
122
|
+
var $input = $(input);
|
123
|
+
$input.attr('disabled', 'disabled');
|
124
|
+
$input.attr('data-original-value', $input.val());
|
125
|
+
$input.val($input.attr('data-disable-with'));
|
126
|
+
});
|
127
|
+
|
128
|
+
var element = $(target).closest('form[data-remote=true]').get(0);
|
129
|
+
if (element) {
|
130
|
+
handleRemote(element);
|
131
|
+
return false;
|
132
|
+
};
|
133
|
+
});
|
134
|
+
|
135
|
+
$('body').live('completeAjax', function(e){
|
136
|
+
var target = e.target;
|
137
|
+
|
138
|
+
if (target.tagName.toLowerCase() == 'form') {
|
139
|
+
var inputs = $(target).find('input[type=submit][disabled=true][data-disable-with]');
|
140
|
+
$.each(inputs, function(i, input) {
|
141
|
+
var $input = $(input);
|
142
|
+
$input.val($input.attr('data-original-value'));
|
143
|
+
$input.attr('data-original-value', null);
|
144
|
+
$input.attr('disabled', false);
|
145
|
+
});
|
146
|
+
};
|
147
|
+
|
148
|
+
});
|
149
|
+
|
150
|
+
});
|
151
|
+
})(jQuery);
|
@@ -0,0 +1,117 @@
|
|
1
|
+
|
2
|
+
;(function($){
|
3
|
+
$(function(){
|
4
|
+
var authToken=$('meta[name=csrf-token]').attr('content');
|
5
|
+
var authParam=$('meta[name=csrf-param]').attr('content');
|
6
|
+
var formTemplate='<form method="#{method}" action="#{action}">\
|
7
|
+
#{realmethod}<input name="#{param}" value="#{token}" type="hidden">\
|
8
|
+
</form>';
|
9
|
+
var realmethodTemplate='<input name="_method" value="#{method}" type="hidden">';
|
10
|
+
String.prototype.interpolate=function(){
|
11
|
+
for(i in arguments[0]){
|
12
|
+
eval(i+" = '"+arguments[0][i]+"'");
|
13
|
+
};
|
14
|
+
return this.replace(/#\{.*?\}/g,function(match){
|
15
|
+
return eval(match.replace(/^#\{|\}$/g,''));
|
16
|
+
});
|
17
|
+
};
|
18
|
+
function handleRemote(element){
|
19
|
+
var $element=$(element);
|
20
|
+
var method,url,params,dataType;
|
21
|
+
dataType=$element.attr('data-type')||'script';
|
22
|
+
if($element.is('form')){
|
23
|
+
method=$element.attr('method')||'post';
|
24
|
+
url=$element.attr('action');
|
25
|
+
params=$element.serialize();
|
26
|
+
}else{
|
27
|
+
method=$element.attr('data-method')||'get';
|
28
|
+
url=$element.attr('data-url')||$element.attr('href');
|
29
|
+
params={};
|
30
|
+
};
|
31
|
+
function triggerHandlers($element,event_name){
|
32
|
+
var proceed=true;
|
33
|
+
if($element.triggerHandler(event_name)==false){
|
34
|
+
proceed=false;
|
35
|
+
}else{
|
36
|
+
var x=$.each($element.parents(),function(index,dom){
|
37
|
+
if($(dom).triggerHandler(event_name)==false){
|
38
|
+
proceed=false;
|
39
|
+
};
|
40
|
+
});
|
41
|
+
};
|
42
|
+
return proceed;
|
43
|
+
};
|
44
|
+
if(!triggerHandlers($element,"beforeAjax"))return false;
|
45
|
+
$.ajax({
|
46
|
+
url:url,
|
47
|
+
type:method,
|
48
|
+
dataType:dataType,
|
49
|
+
data:params,
|
50
|
+
beforeSend:function(request){$element.trigger("beforeSendAjax",[request]);},
|
51
|
+
dataFilter:function(data,type){$element.trigger("dataFilterAjax",[data,type]);},
|
52
|
+
complete:function(request,textStatus){$element.trigger("completeAjax",[request,textStatus]);},
|
53
|
+
success:function(data,textStatus,request){$element.trigger("successAjax",[data,textStatus,request]);},
|
54
|
+
error:function(request,textStatus,errorThrown){$element.trigger("errorAjax",[request,textStatus,errorThrown]);}
|
55
|
+
});
|
56
|
+
$element.trigger("afterAjax");
|
57
|
+
};
|
58
|
+
$('body').live('click',function(e){
|
59
|
+
var target=e.target;
|
60
|
+
var message=$(target).attr('data-confirm');
|
61
|
+
if(message&&!confirm(message)){
|
62
|
+
return false;
|
63
|
+
};
|
64
|
+
var remoteElement=$(target).closest('a[data-remote=true]').get(0);
|
65
|
+
if(remoteElement){
|
66
|
+
handleRemote(remoteElement);
|
67
|
+
return false;
|
68
|
+
};
|
69
|
+
var element=$(target).closest('a[data-method]').get(0);
|
70
|
+
if(element&&$(element).attr('data-remote')!='true'){
|
71
|
+
var method=$(element).attr('data-method');
|
72
|
+
var piggyback=method.toLowerCase()!='post';
|
73
|
+
var formHTML=formTemplate.interpolate({
|
74
|
+
method:'POST',
|
75
|
+
realmethod:piggyback?realmethodTemplate.interpolate({method:method}):'',
|
76
|
+
action:$(element).attr('href'),
|
77
|
+
token:authToken,
|
78
|
+
param:authParam
|
79
|
+
});
|
80
|
+
var $form=$('<div>').html(formHTML).children().hide().appendTo('body');
|
81
|
+
$form.submit();
|
82
|
+
return false;
|
83
|
+
};
|
84
|
+
});
|
85
|
+
$('body').live('submit',function(e){
|
86
|
+
var target=e.target;
|
87
|
+
var message=$(target).attr('data-confirm');
|
88
|
+
if(message&&!confirm(message)){
|
89
|
+
return false;
|
90
|
+
};
|
91
|
+
var inputs=$(target).find('input[type=submit][data-disable-with]');
|
92
|
+
$.each(inputs,function(i,input){
|
93
|
+
var $input=$(input);
|
94
|
+
$input.attr('disabled','disabled');
|
95
|
+
$input.attr('data-original-value',$input.val());
|
96
|
+
$input.val($input.attr('data-disable-with'));
|
97
|
+
});
|
98
|
+
var element=$(target).closest('form[data-remote=true]').get(0);
|
99
|
+
if(element){
|
100
|
+
handleRemote(element);
|
101
|
+
return false;
|
102
|
+
};
|
103
|
+
});
|
104
|
+
$('body').live('completeAjax',function(e){
|
105
|
+
var target=e.target;
|
106
|
+
if(target.tagName.toLowerCase()=='form'){
|
107
|
+
var inputs=$(target).find('input[type=submit][disabled=true][data-disable-with]');
|
108
|
+
$.each(inputs,function(i,input){
|
109
|
+
var $input=$(input);
|
110
|
+
$input.val($input.attr('data-original-value'));
|
111
|
+
$input.attr('data-original-value',null);
|
112
|
+
$input.attr('disabled',false);
|
113
|
+
});
|
114
|
+
};
|
115
|
+
});
|
116
|
+
});
|
117
|
+
})(jQuery);
|
metadata
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jquery_helpers
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Russell Jones
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2010-02-08 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: rails
|
17
|
+
type: :runtime
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - "="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: 3.0.0.beta
|
24
|
+
version:
|
25
|
+
description: A port of the unobtrusive Prototype helpers in Rails 3 to jQuery
|
26
|
+
email: spam@codeofficer.com
|
27
|
+
executables: []
|
28
|
+
|
29
|
+
extensions: []
|
30
|
+
|
31
|
+
extra_rdoc_files: []
|
32
|
+
|
33
|
+
files:
|
34
|
+
- lib/generators/jquery_helpers.rb
|
35
|
+
- lib/generators/jquery_helpers/jquery_helpers_generator.rb
|
36
|
+
- lib/generators/jquery_helpers/templates/jquery.rails.js
|
37
|
+
- lib/generators/jquery_helpers/templates/jquery.rails.min.js
|
38
|
+
- lib/generators/jquery_helpers/USAGE
|
39
|
+
- jquery_helpers.gemspec
|
40
|
+
has_rdoc: true
|
41
|
+
homepage: http://github.com/CodeOfficer/jquery-helpers-for-rails3
|
42
|
+
licenses: []
|
43
|
+
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
|
47
|
+
require_paths:
|
48
|
+
- lib
|
49
|
+
- lib/generators
|
50
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: "0"
|
55
|
+
version:
|
56
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: "0"
|
61
|
+
version:
|
62
|
+
requirements: []
|
63
|
+
|
64
|
+
rubyforge_project:
|
65
|
+
rubygems_version: 1.3.5
|
66
|
+
signing_key:
|
67
|
+
specification_version: 3
|
68
|
+
summary: jQuery helpers for Rails 3
|
69
|
+
test_files: []
|
70
|
+
|