jquery_helpers 0.0.0
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.
- 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
|
+
|