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.
@@ -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
+