right-rails 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.textile +50 -0
  3. data/Rakefile +23 -0
  4. data/generators/right_rails/right_rails_generator.rb +41 -0
  5. data/generators/right_rails/templates/iframed.html.erb +10 -0
  6. data/generators/right_scaffold/right_scaffold_generator.rb +53 -0
  7. data/generators/right_scaffold/templates/controller.rb +99 -0
  8. data/generators/right_scaffold/templates/helper.rb +2 -0
  9. data/generators/right_scaffold/templates/layout.html.erb +18 -0
  10. data/generators/right_scaffold/templates/style.css +54 -0
  11. data/generators/right_scaffold/templates/view__form.html.erb +16 -0
  12. data/generators/right_scaffold/templates/view__item.html.erb +13 -0
  13. data/generators/right_scaffold/templates/view_edit.html.erb +6 -0
  14. data/generators/right_scaffold/templates/view_index.html.erb +9 -0
  15. data/generators/right_scaffold/templates/view_new.html.erb +5 -0
  16. data/generators/right_scaffold/templates/view_show.html.erb +10 -0
  17. data/init.rb +12 -0
  18. data/javascripts/right-autocompleter-src.js +303 -0
  19. data/javascripts/right-autocompleter.js +9 -0
  20. data/javascripts/right-behavior-src.js +240 -0
  21. data/javascripts/right-behavior.js +8 -0
  22. data/javascripts/right-calendar-src.js +855 -0
  23. data/javascripts/right-calendar.js +9 -0
  24. data/javascripts/right-dnd-src.js +555 -0
  25. data/javascripts/right-dnd.js +9 -0
  26. data/javascripts/right-effects-src.js +425 -0
  27. data/javascripts/right-effects.js +6 -0
  28. data/javascripts/right-events-src.js +369 -0
  29. data/javascripts/right-events.js +6 -0
  30. data/javascripts/right-json-src.js +176 -0
  31. data/javascripts/right-json.js +6 -0
  32. data/javascripts/right-lightbox-src.js +597 -0
  33. data/javascripts/right-lightbox.js +9 -0
  34. data/javascripts/right-rails-src.js +269 -0
  35. data/javascripts/right-rails.js +9 -0
  36. data/javascripts/right-rater-src.js +248 -0
  37. data/javascripts/right-rater.js +9 -0
  38. data/javascripts/right-selectable-src.js +507 -0
  39. data/javascripts/right-selectable.js +7 -0
  40. data/javascripts/right-slider-src.js +291 -0
  41. data/javascripts/right-slider.js +7 -0
  42. data/javascripts/right-sortable-src.js +221 -0
  43. data/javascripts/right-sortable.js +9 -0
  44. data/javascripts/right-src.js +4939 -0
  45. data/javascripts/right-tabs-src.js +776 -0
  46. data/javascripts/right-tabs.js +6 -0
  47. data/javascripts/right-tooltips-src.js +130 -0
  48. data/javascripts/right-tooltips.js +9 -0
  49. data/javascripts/right-ui-i18n-de.js +29 -0
  50. data/javascripts/right-ui-i18n-en-us.js +11 -0
  51. data/javascripts/right-ui-i18n-es.js +29 -0
  52. data/javascripts/right-ui-i18n-fr.js +29 -0
  53. data/javascripts/right-ui-i18n-jp.js +33 -0
  54. data/javascripts/right-ui-i18n-ru.js +29 -0
  55. data/javascripts/right-ui-i18n-uk.js +29 -0
  56. data/javascripts/right.js +10 -0
  57. data/lib/right-rails.rb +11 -0
  58. data/lib/right_rails/controller_extensions.rb +85 -0
  59. data/lib/right_rails/helpers/basic.rb +111 -0
  60. data/lib/right_rails/helpers/forms.rb +239 -0
  61. data/lib/right_rails/helpers/misc.rb +164 -0
  62. data/lib/right_rails/helpers/rails.rb +166 -0
  63. data/lib/right_rails/helpers.rb +5 -0
  64. data/lib/right_rails/java_script_generator.rb +313 -0
  65. data/lib/right_rails.rb +6 -0
  66. data/spec/lib/right_rails/controller_extensions_spec.rb +60 -0
  67. data/spec/lib/right_rails/helpers/basic_spec.rb +74 -0
  68. data/spec/lib/right_rails/helpers/forms_spec.rb +51 -0
  69. data/spec/lib/right_rails/helpers/misc_spec.rb +120 -0
  70. data/spec/lib/right_rails/helpers/rails_spec.rb +149 -0
  71. data/spec/lib/right_rails/java_script_generator_spec.rb +317 -0
  72. data/spec/spec.opts +5 -0
  73. data/spec/spec_helper.rb +15 -0
  74. metadata +128 -0
@@ -0,0 +1,111 @@
1
+ #
2
+ # Basic RightRails feature helpers container
3
+ #
4
+ module RightRails::Helpers::Basic
5
+
6
+ #
7
+ # Automatically generates the javascript include tags
8
+ #
9
+ # USAGE:
10
+ # <%= rightjs_scripts %>
11
+ #
12
+ # you can also predefine the list of modules to load
13
+ #
14
+ # <%= rightjs_scripts 'lightbox', 'calendar' %>
15
+ #
16
+ def rightjs_scripts(*modules)
17
+ scripts = ['right']
18
+
19
+ # including the submodules
20
+ rightjs_include_module *modules
21
+ ((@_right_scripts || []) + ['rails']).each do |package|
22
+ scripts << "right/#{package}"
23
+ end
24
+
25
+ # use the sources in the development environment
26
+ if defined? RAILS_ENV && RAILS_ENV == 'development'
27
+ scripts.collect!{ |name| name + '-src' }
28
+ end
29
+
30
+ # include the localization script if available
31
+ if defined?(I18n) && defined?(RAILS_ROOT)
32
+ locale_file = "right/i18n/#{I18n.locale.to_s.downcase}"
33
+ scripts << locale_file if File.exists? "#{RAILS_ROOT}/public/javascripts/#{locale_file}.js"
34
+ end
35
+
36
+ javascript_include_tag *scripts
37
+ end
38
+
39
+ #
40
+ # The javascript generator access from the templates
41
+ #
42
+ # USAGE:
43
+ # Might be used both directly or with a block
44
+ #
45
+ # <%= link_to 'Delete', '#', :onclick => rjs[@record].hide('fade') %>
46
+ # <%= link_to 'Delete', '#', :onclick => rjs{|page| page[@record].hide('fade') }
47
+ #
48
+ def rjs(&block)
49
+ generator = RightRails::JavaScriptGenerator.new(self)
50
+ yield(generator) if block_given?
51
+ generator
52
+ end
53
+
54
+ #
55
+ # Same as the rjs method, but will wrap the generatated code
56
+ # in a <script></script> tag
57
+ #
58
+ # EXAMPLE:
59
+ # <%= rjs_tag do |page|
60
+ # page.alert 'boo'
61
+ # end %>
62
+ #
63
+ def rjs_tag(&block)
64
+ javascript_tag do
65
+ rjs(&block)
66
+ end
67
+ end
68
+
69
+ # protected
70
+
71
+ #
72
+ # Notifies the scripts collection that the user needs the module
73
+ #
74
+ def rightjs_include_module(*list)
75
+ @_right_scripts ||= []
76
+ list.each do |name|
77
+ @_right_scripts << name.to_s unless @_right_scripts.include?(name.to_s)
78
+ end
79
+ end
80
+
81
+ #
82
+ # Collects the RightJS unit options out of the given list of options
83
+ #
84
+ # NOTE: will nuke matching keys out of the original options object
85
+ #
86
+ # @param user's options
87
+ # @param allowed unit options keys
88
+ #
89
+ def rightjs_unit_options(options, unit_keys)
90
+ unit_options = []
91
+
92
+ options.dup.each do |key, value|
93
+ c_key = key.to_s.camelize.gsub!(/^[A-Z]/){ |m| m.downcase }
94
+
95
+ if unit_keys.include?(c_key)
96
+ value = options.delete key
97
+
98
+ value = case value.class.name.to_sym
99
+ when :NilClass then 'null'
100
+ when :Symbol then "#{value}"
101
+ when :String then "'#{value}'"
102
+ else value.inspect
103
+ end
104
+
105
+ unit_options << "#{c_key}:#{value}"
106
+ end
107
+ end
108
+
109
+ "{#{unit_options.sort.join(',')}}"
110
+ end
111
+ end
@@ -0,0 +1,239 @@
1
+ #
2
+ # RightJS specific form features module
3
+ #
4
+ module RightRails::Helpers::Forms
5
+ CALENDAR_OPTION_KEYS = %w{
6
+ format
7
+ showTime
8
+ twentyFourHour
9
+ timePeriod
10
+ showButtons
11
+ minDate
12
+ maxDate
13
+ firstDay
14
+ numberOfMonths
15
+ listYears
16
+ }
17
+
18
+ AUTOCOMPLETER_OPTION_KEYS = %w{
19
+ param
20
+ method
21
+ minLength
22
+ threshold
23
+ cache
24
+ local
25
+ fxName
26
+ fxDuration
27
+ spinner
28
+ }
29
+
30
+ SLIDER_OPTION_KEYS = %w{
31
+ min
32
+ max
33
+ snap
34
+ value
35
+ direction
36
+ update
37
+ round
38
+ }
39
+
40
+ RATER_OPTION_KEYS = %w{
41
+ size
42
+ value
43
+ update
44
+ disabled
45
+ disableOnVote
46
+ url
47
+ param
48
+ Xhr
49
+ }
50
+
51
+ #
52
+ # Generates the calendar field tag
53
+ #
54
+ # The options might contain the usual html options along with the RightJS Calendar options
55
+ #
56
+ def calendar_field_tag(name, value=nil, options={})
57
+ text_field_tag name, value, __add_calendar_field_options(options)
58
+ end
59
+
60
+ #
61
+ # The form_for level calendar field generator
62
+ #
63
+ def calendar_field(object_name, method, options={})
64
+ options = __add_calendar_field_options(options)
65
+ ActionView::Helpers::InstanceTag.new(object_name, method, self, options.delete(:object)).to_calendar_field_tag(options)
66
+ end
67
+
68
+ #
69
+ # Autocompletion field tag
70
+ #
71
+ # The options should contain an url or a list of local options
72
+ #
73
+ def autocomplete_field_tag(name, value, options)
74
+ text_field_tag name, value, __add_autocomplete_field_options(options)
75
+ end
76
+
77
+ #
78
+ # The form_for level autocomplete-field generator
79
+ #
80
+ def autocomplete_field(object_name, method, options)
81
+ options = __add_autocomplete_field_options(options)
82
+ ActionView::Helpers::InstanceTag.new(object_name, method, self, options.delete(:object)).to_autocomplete_field_tag(options)
83
+ end
84
+
85
+ #
86
+ # The slider widget generator
87
+ #
88
+ def slider_tag(name, value=nil, options={})
89
+ hidden_field_tag(name, value, __add_slider_options(options)) + "\n" + __slider_generator(options.merge(:value => value), name)
90
+ end
91
+
92
+ #
93
+ # The form_for level slider widget generator
94
+ #
95
+ def slider(object_name, method, options={})
96
+ ActionView::Helpers::InstanceTag.new(object_name, method, self,
97
+ options.delete(:object)).to_slider_tag(__add_slider_options(options)) +
98
+ "\n" + __slider_generator(options, object_name, method)
99
+ end
100
+
101
+ #
102
+ # The rater widget basic generator
103
+ #
104
+ def rater_tag(name, value, options={})
105
+ hidden_field_tag(name, value, __add_rater_options(options)) + "\n" + __rater_generator(options.merge(:value => value), name)
106
+ end
107
+
108
+ #
109
+ # The form level rater generator
110
+ #
111
+ def rater(object_name, method, options={})
112
+ ActionView::Helpers::InstanceTag.new(object_name, method, self,
113
+ options.delete(:object)).to_rater_tag(__add_rater_options(options)) +
114
+ "\n" + __rater_generator(options, object_name, method)
115
+ end
116
+
117
+ #
118
+ # Builds a dummy rater, just for displaying purposes
119
+ #
120
+ def rater_display(value, options={})
121
+ content_tag :div, (0...(options[:size] || 5)).to_a.collect{ |i|
122
+ content_tag :div, '★', :class => i < value ? 'right-rater-glow' : nil
123
+ }.join(''), :class => 'right-rater right-rater-disabled'
124
+ end
125
+
126
+ private
127
+
128
+ def __add_calendar_field_options(options={})
129
+ rightjs_include_module 'calendar'
130
+
131
+ options['rel'] = 'calendar'
132
+
133
+ calendar_options = rightjs_unit_options(options, CALENDAR_OPTION_KEYS)
134
+ options['data-calendar-options'] = calendar_options unless calendar_options == '{}'
135
+
136
+ options
137
+ end
138
+
139
+ def __add_autocomplete_field_options(options)
140
+ rightjs_include_module 'autocompleter'
141
+
142
+ options['rel'] = "autocompleter[#{escape_javascript(url_for(options.delete(:url)))}]"
143
+
144
+ autocompleter_options = rightjs_unit_options(options, AUTOCOMPLETER_OPTION_KEYS)
145
+ options['data-autocompleter-options'] = autocompleter_options unless autocompleter_options == '{}'
146
+ options['autocomplete'] = 'off'
147
+
148
+ options
149
+ end
150
+
151
+ def __add_slider_options(options)
152
+ rightjs_include_module 'dnd', 'slider'
153
+ options.reject { |key, value| SLIDER_OPTION_KEYS.include?(key.to_s) }
154
+ end
155
+
156
+ def __slider_generator(options, name, method=nil)
157
+ value = options[:value]
158
+ value ||= ActionView::Helpers::InstanceTag.value_before_type_cast(instance_variable_get("@#{name}"), method.to_s) if method
159
+ name = "#{name}[#{method}]" if method
160
+ id = options[:id] || sanitize_to_id(name)
161
+ options = rightjs_unit_options(options.merge(:value => value), SLIDER_OPTION_KEYS)
162
+ javascript_tag "new Slider(#{options}).insertTo('#{id}','after').assignTo('#{id}');"
163
+ end
164
+
165
+ def __add_rater_options(options)
166
+ rightjs_include_module 'rater'
167
+ options.reject { |key, value| RATER_OPTION_KEYS.include?(key.to_s) }
168
+ end
169
+
170
+ def __rater_generator(options, name, method=nil)
171
+ value = options[:value]
172
+ value ||= ActionView::Helpers::InstanceTag.value_before_type_cast(instance_variable_get("@#{name}"), method.to_s) if method
173
+ name = "#{name}[#{method}]" if method
174
+ id = options[:id] || sanitize_to_id(name)
175
+ options = rightjs_unit_options(options.merge(:value => value), RATER_OPTION_KEYS)
176
+ javascript_tag "new Rater(#{options}).insertTo('#{id}','after').assignTo('#{id}');"
177
+ end
178
+
179
+
180
+
181
+ ###################################################################################
182
+ #
183
+ # The ActiveView native form-builder extensions
184
+ #
185
+ ###################################################################################
186
+
187
+ module FormBuilderMethods
188
+ def calendar_field(name, options={})
189
+ @template.calendar_field(@object_name, name, objectify_options(options))
190
+ end
191
+
192
+ def autocomplete_field(name, options={})
193
+ @template.autocomplete_field(@object_name, name, objectify_options(options))
194
+ end
195
+
196
+ def slider(name, options={})
197
+ @template.slider(@object_name, name, objectify_options(options))
198
+ end
199
+
200
+ def rater(name, options={})
201
+ @template.rater(@object_name, name, objectify_options(options))
202
+ end
203
+ end
204
+
205
+ module InstanceTagMethods
206
+ def to_calendar_field_tag(options)
207
+ options = options.stringify_keys
208
+
209
+ # formatting the date/time value if the format is specified
210
+ if !options["value"] && options["data-calendar-options"]
211
+ format = options["data-calendar-options"].scan(/format:('|")(.+?)\1/)
212
+ time = value_before_type_cast(object)
213
+ if time && time.respond_to?(:to_time) && format.size == 1
214
+ options["value"] = time.to_time.strftime(format[0][1])
215
+ end
216
+ end
217
+
218
+ to_input_field_tag('text', options)
219
+ end
220
+
221
+ def to_autocomplete_field_tag(options)
222
+ to_input_field_tag('text', options)
223
+ end
224
+
225
+ def to_slider_tag(options)
226
+ to_input_field_tag('hidden', options)
227
+ end
228
+
229
+ def to_rater_tag(options)
230
+ to_input_field_tag('hidden', options)
231
+ end
232
+ end
233
+
234
+ def self.included(base)
235
+ ActionView::Helpers::FormBuilder.instance_eval{ include FormBuilderMethods }
236
+ ActionView::Helpers::InstanceTag.instance_eval{ include InstanceTagMethods }
237
+ end
238
+
239
+ end
@@ -0,0 +1,164 @@
1
+ #
2
+ # Misc view helpers for RightJS
3
+ #
4
+ module RightRails::Helpers::Misc
5
+ #
6
+ # Just a simple flashes generator, might be replaced in the application
7
+ #
8
+ def flashes
9
+ content_tag(:div, flash.collect{ |key, text|
10
+ content_tag(:div, text, :class => key)
11
+ }.sort, :id => :flashes, :style => (flash.empty? ? 'display: none' : nil))
12
+ end
13
+
14
+
15
+ #
16
+ # the autocompletion list result
17
+ #
18
+ # USAGE:
19
+ # it might work in several ways
20
+ #
21
+ # autocomplete_result(list_of_strings)
22
+ # autocomplete_result(list_of_strings, :highlight => 'search')
23
+ # autocomplete_result(list_of_strings, :highlight => 'search', :escape => false)
24
+ #
25
+ # autocomplete_result(list_of_objects, method)
26
+ # autocomplete_result(list_of_objects, method, :highlight => 'search')
27
+ #
28
+ def autocomplete_result(entries, *args)
29
+ return if entries.empty?
30
+
31
+ options = args.last.is_a?(Hash) ? args.pop : {}
32
+ highlight = options[:highlight]
33
+ escape = options[:escape].nil? ? true : options[:escape]
34
+ field = args.first
35
+
36
+ content_tag :ul, entries.collect{ |entry|
37
+ entry = entry.send(field) if field
38
+ content_tag :li, highlight ? highlight(entry, highlight) : escape ? h(entry) : entry
39
+ }
40
+ end
41
+
42
+
43
+ #
44
+ # Generates a link that whil load the refered address in a lightbox
45
+ #
46
+ # USAGE:
47
+ # Same as the #link_to method, plus you might specify the :roadtrip argument
48
+ # to make it a link to a lightbox roadtrip
49
+ #
50
+ # <%= link_to_lightbox image_tag('/image.thmb'), '/image.full', :roadtrip => true %>
51
+ #
52
+ def link_to_lightbox(name, url={}, html_options=nil, &block)
53
+ rightjs_include_module 'lightbox'
54
+
55
+ html_options ||= {}
56
+ html_options[:rel] = 'lightbox'
57
+ html_options[:rel] << "[roadtrip]" if html_options.delete(:roadtrip)
58
+
59
+ link_to name, url, html_options, &block
60
+ end
61
+
62
+ #
63
+ # Tabs container generator
64
+ #
65
+ # USAGE:
66
+ #
67
+ # <% tabs do %>
68
+ # <% tab "Tab 1", :id => :my-tab-1 do %>
69
+ # content for tab 1
70
+ # <% end -%>
71
+ # <% tab "Tab 2", :url => tab2_path %>
72
+ # <% end -%>
73
+ #
74
+ # You also can use the :type option with :carousel or :harmonica value
75
+ # and you can pass along any standard Tabs unit options along with it
76
+ #
77
+ # <% tabs :type => :carousel, :url => '/tabs/%{id}', :cache => true do %>
78
+ # <% tab image_tag(image1.thumb_url), :id => image1.id %>
79
+ # <% tab image_tag(image2.thumb_url), :id => image2.id %>
80
+ #
81
+ def tabs(options={}, &block)
82
+ rightjs_include_module 'tabs'
83
+ @__tabs = []
84
+ yield()
85
+
86
+ options.stringify_keys!
87
+
88
+ tabs_type = options.delete('type')
89
+ options['id'] = options.delete('id') || "tabs-#{rand.to_s.split('.').last}"
90
+
91
+ # checking for the carousel class
92
+ if tabs_type == :carousel
93
+ options['class'] ||= ''
94
+ options['class'] << (options['class'] == '' ? '' : ' ') + 'right-tabs-carousel'
95
+ end
96
+
97
+ tabs_options = rightjs_unit_options(options, TABS_OPTION_KEYS)
98
+ options['data-tabs-options'] = tabs_options unless tabs_options == '{}'
99
+
100
+ # extracting the tab id prefix option
101
+ tab_id_prefix = tabs_options.scan(/idPrefix:('|")(.+?)\1/)
102
+ tab_id_prefix = tab_id_prefix.size == 1 ? tab_id_prefix[0][1] : ''
103
+
104
+ # simple tabs and carousels generator
105
+ content = if tabs_type != :harmonica
106
+ content_tag(:ul,
107
+ # tabs list
108
+ content_tag(:ul,
109
+ @__tabs.collect{ |tab|
110
+ content_tag(:li, content_tag(:a, tab[:title],
111
+ :href => tab[:options][:id] ? "##{tab[:options][:id]}" : tab[:options][:url]
112
+ ))
113
+ }.join("\n")
114
+ ) + "\n"+
115
+
116
+ # contents list
117
+ @__tabs.collect{|tab|
118
+ tab[:content] ? content_tag(:li, tab[:content], :id => "#{tab_id_prefix}#{tab[:options][:id]}") + "\n" : ''
119
+ }.join(""),
120
+ options
121
+ )
122
+ else
123
+ # the harmonicas generator
124
+ content_tag(:dl,
125
+ @__tabs.collect{ |tab|
126
+ content_tag(:dt, content_tag(:a, tab[:title],
127
+ :href => tab[:options][:id] ? "##{tab[:options][:id]}" : tab[:options][:url]
128
+ )) + "\n" +
129
+ content_tag(:dd, tab[:content] || '', :id => tab[:options][:id] ? "#{tab_id_prefix}#{tab[:options][:id]}" : nil)
130
+ }.join("\n"),
131
+ options
132
+ )
133
+
134
+ end
135
+
136
+ concat(content + "\n" + javascript_tag("new Tabs('#{options['id']}');"))
137
+ end
138
+
139
+ def tab(title, options={}, &block)
140
+ options[:id] = "tab-#{rand.to_s.split('.').last}" if !options[:id] && !options[:url]
141
+
142
+ @__tabs << {
143
+ :title => title,
144
+ :options => options,
145
+ :content => block_given? ? capture(&block) : nil
146
+ }
147
+ end
148
+
149
+ TABS_OPTION_KEYS = %w{
150
+ idPrefix
151
+ resizeFx
152
+ resizeDuration
153
+ scrollTabs
154
+ scrollDuration
155
+ selected
156
+ disabled
157
+ closable
158
+ url
159
+ cache
160
+ Xhr
161
+ Cookie
162
+ }
163
+
164
+ end
@@ -0,0 +1,166 @@
1
+ #
2
+ # This module contains the ruby-on-rails native (Prototype) helper replacements
3
+ #
4
+ module RightRails::Helpers::Rails
5
+ #
6
+ # Replacing the prototype's javascript generator with our own javascript generator
7
+ # so that the #link_to_function method was working properly
8
+ #
9
+ def update_page(&block)
10
+ rjs(&block)
11
+ end
12
+
13
+ def remote_function(options)
14
+ cmd = build_xhr_request(options)
15
+
16
+ cmd = "#{options[:before]};#{cmd}" if options[:before]
17
+ cmd << ";#{options[:after]}" if options[:after]
18
+
19
+ cmd = "if(#{options[:condition]}){#{cmd}}" if options[:condition]
20
+ cmd = "if(confirm('#{escape_javascript(options[:confirm])}')){#{cmd}}" if options[:confirm]
21
+
22
+ cmd
23
+ end
24
+
25
+ def submit_to_remote(name, value, options = {})
26
+ options[:submit] ||= '$(this.form)'
27
+
28
+ html_options = options.delete(:html) || {}
29
+ html_options[:name] = name
30
+
31
+ button_to_remote(value, options, html_options)
32
+ end
33
+
34
+ def periodically_call_remote(options={})
35
+ frequency = options[:frequency] || 10 # every ten seconds by default
36
+ code = "function(){#{remote_function(options)}}.periodical(#{frequency * 1000})"
37
+ javascript_tag(code)
38
+ end
39
+
40
+ # stubbing the draggables generator to make our autoscripts stuff working
41
+ def draggable_element_js(*args)
42
+ rightjs_include_module 'dnd'
43
+
44
+ super *args
45
+ end
46
+
47
+ # stubbing the droppables generator
48
+ def drop_receiving_element_js(*args)
49
+ rightjs_include_module 'dnd'
50
+
51
+ super(*args).gsub!('Droppables.add', 'new Droppable'
52
+ ).gsub!('element.id', 'draggable.element.id'
53
+ ).gsub!('(element)', '(draggable)')
54
+ end
55
+
56
+ # catching the sortables generator
57
+ def sortable_element_js(id, options={})
58
+ rightjs_include_module 'dnd', 'sortable'
59
+
60
+ script = "new Sortable('#{id}'"
61
+
62
+ # processing the options
63
+ options[:url] = escape_javascript(url_for(options[:url])) if options[:url]
64
+ s_options = rightjs_unit_options(options, SORTABLE_OPTION_KEYS)
65
+ script << ",#{s_options}" unless s_options == '{}'
66
+
67
+ script << ")"
68
+ end
69
+
70
+ protected
71
+
72
+ SORTABLE_OPTION_KEYS = %w{
73
+ url
74
+ direction
75
+ tags
76
+ method
77
+ idParam
78
+ posParam
79
+ parseId
80
+ }
81
+
82
+ XHR_OPTION_KEYS = %w{
83
+ method
84
+ encoding
85
+ async
86
+ evalScripts
87
+ evalResponse
88
+ evalJSON
89
+ secureJSON
90
+ urlEncoded
91
+ spinner
92
+ spinnerFx
93
+ params
94
+ }
95
+
96
+ # builds the xhr request string
97
+ def build_xhr_request(options)
98
+ xhr = options[:submit] ? "new Xhr(" : "Xhr.load("
99
+
100
+ # assigning the url address
101
+ url = options[:url]
102
+ url = url.merge(:escape => false) if url.is_a?(Hash)
103
+ xhr << "'#{escape_javascript(url_for(url))}'"
104
+
105
+ # building the options
106
+ xhr_options = { :onSuccess => '', :onFailure => '', :onComplete => '' }
107
+
108
+ # grabbing the standard XHR options
109
+ options.each do |key, value|
110
+ if XHR_OPTION_KEYS.include?(key.to_s)
111
+ xhr_options[key] = case value.class.name.to_sym
112
+ when :NilClass then 'null'
113
+ when :Symbol then "#{value}"
114
+ when :String then "'#{value}'"
115
+ else value.inspect
116
+ end
117
+ end
118
+ end
119
+
120
+ # checking the parameters options
121
+ xhr_options[:params] = options[:with] if options[:with]
122
+
123
+ # checking the callbacks
124
+ xhr_options[:onSuccess] = "#{options[:success]};" if options[:success]
125
+ xhr_options[:onFailure] = "#{options[:failure]};" if options[:failure]
126
+ xhr_options[:onComplete] = "#{options[:complete]};" if options[:complete]
127
+
128
+ # checking the update option
129
+ if options[:update]
130
+ template = options[:position] ? "$('%s').insert(this.text,'%s')" : "$('%s').update(this.text)%s"
131
+
132
+ if options[:update].is_a?(Hash)
133
+ xhr_options[:onSuccess] << template % [options[:update][:success], options[:position]] if options[:update][:success]
134
+ xhr_options[:onFailure] << template % [options[:update][:failure], options[:position]] if options[:update][:failure]
135
+ else
136
+ xhr_options[:onComplete] << template % [options[:update], options[:position]]
137
+ end
138
+ end
139
+
140
+ # converting the callbacks
141
+ [:onSuccess, :onFailure, :onComplete].each do |key|
142
+ if xhr_options[key] == '' then xhr_options.delete key
143
+ else xhr_options[key] = "function(request){#{xhr_options[key]}}"
144
+ end
145
+ end
146
+
147
+ # ebbedding the xhr options
148
+ pairs = xhr_options.collect do |key, value|
149
+ if value == '' then nil
150
+ else
151
+ "#{key}:#{value}"
152
+ end
153
+ end.compact.sort
154
+
155
+ xhr << ",{#{pairs.join(',')}}" unless pairs.empty?
156
+
157
+ xhr << ')'
158
+
159
+ # forms sending adjustements
160
+ xhr << ".send(#{options[:submit]})" if options[:submit]
161
+ xhr.gsub! /^.+?,/, '$(this).send(' if options[:form]
162
+
163
+ xhr
164
+ end
165
+
166
+ end
@@ -0,0 +1,5 @@
1
+ #
2
+ # Just a namespace for the helpers
3
+ #
4
+ module RightRails::Helpers
5
+ end