hammock 0.4.2 → 0.5.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/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.5.0 2009-10-27
2
+ Redesigned ajaxinate implementation - instead of rendering JS separately for every link, use one generic method and a link map to store details for each link.
3
+
4
+
1
5
  == 0.4.2 2009-10-27
2
6
  Check rendered_or_redirected? on XHR requests as well as normal ones.
3
7
  Fix #ajaxinate to handle multiple entities.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.2
1
+ 0.5.0
data/hammock.gemspec CHANGED
@@ -5,7 +5,7 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{hammock}
8
- s.version = "0.4.2"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Ben Hoskings"]
@@ -68,6 +68,7 @@ Gem::Specification.new do |s|
68
68
  "lib/hammock/utils.rb",
69
69
  "misc/scaffold.txt",
70
70
  "misc/template.rb",
71
+ "public/javascripts/ajax.js",
71
72
  "tasks/hammock_tasks.rake"
72
73
  ]
73
74
  s.homepage = %q{http://github.com/benhoskings/hammock}
@@ -22,7 +22,7 @@ module Hammock
22
22
 
23
23
  content_tag :a,
24
24
  opts[:text] || route.verb.to_s.capitalize,
25
- :class => [opts[:class], link_class_for(route.verb, entities)].squash.join(' '),
25
+ :class => ['hammock', opts[:class], link_class_for(route.verb, entities), "hammock_link_#{link_class_for(route.verb, entities)}"].squash.join(' '),
26
26
  :href => route.path,
27
27
  :onclick => 'return false;',
28
28
  :style => opts[:style]
@@ -37,64 +37,18 @@ module Hammock
37
37
  attribute = link_params[:attribute]
38
38
  link_class = link_class_for route.verb, entities, attribute
39
39
 
40
- link_params[:_method] = route.http_method
41
- link_params[:format] = opts[:format].to_s unless opts[:format].blank?
42
-
43
- form_elements_hash = if route.get?
44
- '{ }'
45
- elsif attribute.blank?
46
- "jQuery('form').serializeHash()"
47
- else
48
- "{ '#{entity.base_model}[#{attribute}]': $('.#{link_class}').val() }"
49
- end
50
-
51
- response_action = case link_params[:format].to_s
52
- when 'js'
53
- "eval(response);"
54
- else
55
- "jQuery('.#{opts[:target] || link_class + '_target'}').before(response).remove();"
56
- end
57
-
58
- # TODO check the response code in the callback, and replace :after with :success and :failure.
59
- js = %Q{
60
- jQuery('.#{link_class}').#{opts[:on] || 'click'}(function() {
61
- var obj = null;
62
-
63
- if (#{opts[:spinner] ? 'true' : 'false'}) {
64
- obj = jQuery(this).parent().find('.statuses');
65
- obj.find('.spinner').animate({opacity: 'show'}, 100);
66
- }
67
-
68
- /*if (#{attribute.blank? ? 'false' : 'true'} && (jQuery('.#{link_class}_target .original_value').html() == jQuery('.#{link_class}_target .modify input').val())) {
69
- eval("#{clean_snippet opts[:skipped]}");
70
- } else*/ if (false == eval("#{clean_snippet opts[:before]}")) {
71
- // before callback failed
72
- } else { // fire the request
73
- jQuery.#{route.fake_http_method}(
74
- '#{route.path}',
75
- jQuery.extend(
76
- #{record_attributes.to_flattened_json},
77
- #{form_elements_hash},
78
- #{link_params.to_flattened_json},
79
- #{forgery_key_json(route.http_method)}
80
- ),
81
- function(response, textStatus) {
82
- #{response_action}
83
- if (obj) {
84
- obj.children('.spinner').hide();
85
- #{"if ('success' == textStatus) obj.children('.success').show().fadeOut(4000);" if opts[:spinner] != :pending}
86
- }
87
- eval("#{clean_snippet opts[:after]}");
88
- }
89
- );
90
- }
91
- });
40
+ link_data = {
41
+ :klass => link_class,
42
+ :path => route.path,
43
+ :http_method => route.http_method,
44
+ :fake_http_method => route.fake_http_method,
45
+ :format => (opts[:format].blank? ? 'html' : opts[:format].to_s)
92
46
  }
93
47
 
94
- append_javascript js
48
+ append_javascript %Q{hammock_link_map['#{link_class}'] = #{link_data.to_json};}
95
49
  route
96
50
  end
97
-
51
+
98
52
  def status_callback
99
53
  %Q{
100
54
  if ('success' == textStatus) {
@@ -0,0 +1,53 @@
1
+ var KEYS = { BACKSPACE:8, TAB:9, RETURN:13, ENTER:3, ESC:27, SPACE:32, LEFT:37, UP:38, RIGHT:39, DOWN:40, DELETE:46 };
2
+
3
+ var hammock_link_map = {};
4
+
5
+ var hamlink_log = function(link_key, message) {
6
+ if (console.log) console.log(link_key + ": " + message);
7
+ };
8
+
9
+ var hammock_ajax = function() {
10
+ $('a.hammock').live('click', function() {
11
+ link_key = $(this).attr('class').match(/hammock_link_(\w+)/)[1];
12
+ if (!hammock_link_map[link_key]) {
13
+ hamlink_log(link_key, 'no entry in link map');
14
+ } else {
15
+ fire_hammock_ajax(hammock_link_map[link_key]);
16
+ }
17
+ });
18
+ };
19
+
20
+ var fire_hammock_ajax = function(data) {
21
+ var obj = null;
22
+
23
+ if (data.spinner) {
24
+ obj = jQuery(this).parent().find('.statuses');
25
+ obj.find('.spinner').animate({opacity: 'show'}, 100);
26
+ }
27
+
28
+ if (data.before && false == data.before()) {
29
+ hamlink_log(data.klass, "before callback failed.");
30
+ } else {
31
+ jQuery[data.fake_http_method](
32
+ data.path,
33
+ {
34
+ '_method': data.http_method,
35
+ 'format': data.format
36
+ },
37
+ function(response, textStatus) {
38
+ if (data.format == 'js') {
39
+ eval(response);
40
+ } else {
41
+ jQuery('.' + (data.target || data.klass + '_target')).before(response).remove();
42
+ }
43
+ if (data.after && false == data.after()) {
44
+ hamlink_log(data.klass, "after callback failed.");
45
+ }
46
+ }
47
+ );
48
+ }
49
+ };
50
+
51
+ $(function() {
52
+ hammock_ajax();
53
+ });
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hammock
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ben Hoskings
@@ -93,6 +93,7 @@ files:
93
93
  - lib/hammock/utils.rb
94
94
  - misc/scaffold.txt
95
95
  - misc/template.rb
96
+ - public/javascripts/ajax.js
96
97
  - tasks/hammock_tasks.rake
97
98
  has_rdoc: true
98
99
  homepage: http://github.com/benhoskings/hammock