jquery_helpers 0.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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,9 @@
1
+ Description:
2
+ A port of the unobtrusive Prototype helpers in Rails 3 to jQuery.
3
+
4
+ Example:
5
+ ./script/generate jquery_helpers
6
+
7
+ This will create:
8
+ public/javascripts/jquery.rails.js
9
+ public/javascripts/jquery.rails.min.js
@@ -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);
@@ -0,0 +1,2 @@
1
+ module JqueryHelpers
2
+ end
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
+