hobo 1.4.0.pre8 → 2.0.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/CHANGES-1.4.txt +87 -3
  2. data/TODO-1.4.txt +3 -11
  3. data/VERSION +1 -1
  4. data/app/helpers/hobo_route_helper.rb +61 -20
  5. data/lib/generators/hobo/admin_subsite/USAGE +3 -11
  6. data/lib/generators/hobo/admin_subsite/admin_subsite_generator.rb +4 -1
  7. data/lib/generators/hobo/admin_subsite/templates/{site.css.erb → site.scss.erb} +0 -0
  8. data/lib/generators/hobo/assets/assets_generator.rb +2 -2
  9. data/lib/generators/hobo/assets/templates/{application.css → application.scss} +0 -0
  10. data/lib/generators/hobo/assets/templates/{front.css → front.scss} +0 -0
  11. data/lib/generators/hobo/model/templates/model_injection.rb.erb +1 -0
  12. data/lib/generators/hobo/plugin.rb +3 -1
  13. data/lib/generators/hobo/routes/router.rb +115 -0
  14. data/lib/generators/hobo/routes/templates/hobo_routes.rb.erb +42 -3
  15. data/lib/generators/hobo/setup_wizard/setup_wizard_generator.rb +35 -2
  16. data/lib/generators/hobo/subsite.rb +1 -1
  17. data/lib/generators/hobo/subsite/USAGE +3 -11
  18. data/lib/generators/hobo/subsite/subsite_generator.rb +3 -0
  19. data/lib/generators/hobo/subsite/templates/{site.css.erb → site.scss.erb} +0 -0
  20. data/lib/generators/hobo/subsite_taglib/subsite_taglib_generator.rb +4 -1
  21. data/lib/generators/hobo/user_mailer/templates/activation.erb +1 -1
  22. data/lib/generators/hobo/user_mailer/templates/forgot_password.erb +1 -1
  23. data/lib/generators/hobo/user_mailer/templates/invite.erb +1 -1
  24. data/lib/generators/hobo/user_model/templates/model_injection.rb.erb +1 -0
  25. data/lib/hobo.rb +2 -2
  26. data/lib/hobo/controller.rb +3 -11
  27. data/lib/hobo/controller/model.rb +89 -89
  28. data/lib/hobo/engine.rb +12 -0
  29. data/lib/hobo/extensions/active_record/permissions.rb +15 -24
  30. data/lib/hobo/model.rb +3 -0
  31. data/lib/hobo/model/permissions.rb +1 -1
  32. data/lib/hobo/rapid/generators/rapid/cards.dryml.erb +10 -3
  33. data/lib/hobo/rapid/generators/rapid/forms.dryml.erb +9 -2
  34. data/lib/hobo/rapid/generators/rapid/pages.dryml.erb +11 -4
  35. data/lib/hobo/routes.rb +2 -0
  36. data/test/doctest/hobo/hobo_helper.rdoctest +23 -20
  37. data/test/doctest/hobo/lifecycles.rdoctest +1 -0
  38. data/test/doctest/hobo/model.rdoctest +4 -0
  39. data/test/doctest/hobo/multi_model_forms.rdoctest +2 -0
  40. data/test/doctest/hobo/scopes.rdoctest +18 -5
  41. data/test/doctest/prepare_testapp.rb +4 -2
  42. data/test/irt/generators/admin_subsite.irt +2 -6
  43. data/test/irt/generators/assets.irt +1 -7
  44. data/test/irt/generators/front_controller.irt +1 -3
  45. data/test/irt/generators/model.irt +1 -2
  46. data/test/irt/generators/partials/_account_user_model_tests.rb +1 -3
  47. data/test/irt/generators/partials/_accounts_users_controller_tests.rb +1 -3
  48. data/test/irt/generators/partials/_default_user_model_tests.rb +1 -3
  49. data/test/irt/generators/partials/_default_users_controller_tests.rb +1 -3
  50. data/test/irt/generators/partials/_house_controller_tests.rb +1 -3
  51. data/test/irt/generators/partials/_user_mailer_tests.rb +1 -3
  52. data/test/irt/generators/subsite.irt +5 -6
  53. data/test/irt/generators/user_mailer.irt +2 -0
  54. metadata +12 -18
  55. data/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/public/images/100-ACD3E6-DBE1E5-H.png +0 -0
  56. data/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/public/images/100-DBE1E5-FCFEF5-H.png +0 -0
  57. data/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/public/images/300-3B5F87-ACD3E6-H.png +0 -0
  58. data/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/public/images/spinner.gif +0 -0
  59. data/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/public/stylesheets/clean-sidemenu.css +0 -81
  60. data/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/views/clean-sidemenu.dryml +0 -30
@@ -6,18 +6,56 @@
6
6
  <% for subsite in subsites -%>
7
7
  <%- if subsite -%>
8
8
 
9
+ <%= "namespace :#{subsite} do" %>
10
+ <%- end -%>
11
+ <%- for controller in controllers_for(subsite) -%>
12
+ <%- router = router_for(subsite, controller) -%>
13
+
14
+
15
+ <%= " #{' ' if subsite}# Resource routes for controller #{controller.controller_path}" %>
16
+ <%= router.emit_hash(router.resources_hash, subsite ? " " : " ") -%>
17
+ <%- router.owner_actions.each do |owner_hash| -%>
18
+
19
+ <%= " #{' ' if subsite}# Owner routes for controller #{controller.controller_path}" %>
20
+ <%= router.emit_hash(owner_hash, subsite ? " " : " ") -%>
21
+ <%- end -%>
22
+ <%- unless (routes = router.user_routes).blank? -%>
23
+
24
+ <%= "#{' ' if subsite} # User routes for controller #{controller.controller_path}" %>
25
+ <%- for route in routes -%>
26
+ <%= "#{' ' if subsite} #{route}" %>
27
+ <%- end -%>
28
+ <%- end -%>
29
+ <%- end -%>
30
+ <%- if subsite -%>
31
+
32
+ end
33
+ <%- end -%>
34
+ <%- end -%>
35
+
36
+ <% unless Rails.configuration.hobo.dont_emit_deprecated_routes %>
37
+
38
+ # These are the Hobo 1.3 style routes. They've been included for backwards
39
+ # compatibility reasons because the names of some named routes have been changed.
40
+ # Please update your views to use the new named route names and then disable this
41
+ # section by setting config.hobo.dont_emit_deprecated_routes = true.
42
+
43
+
44
+ <% for subsite in subsites -%>
45
+ <%- if subsite -%>
46
+
9
47
  <%= "namespace :#{subsite} do" %>
10
48
  <%- end -%>
11
49
  <%- for controller in controllers_for(subsite) -%>
12
50
  <%- router = router_for(subsite, controller)
13
- groups = %w[ index_action lifecycle resource owner web_method show_action reorder user ] -%>
51
+ groups = %w[ index_action lifecycle owner web_method show_action reorder resource ] -%>
14
52
 
15
53
  <%- for group in groups -%>
16
54
  <%- gr = "#{group}_routes"
17
55
  routes = gr == 'lifecycle_routes' ? router.send(gr.to_sym, subsite) : router.send(gr.to_sym) -%>
18
56
  <%- unless routes.empty? -%>
19
57
 
20
- <%= " " if subsite %><%= %(# #{gr.humanize} for controller "#{controller.controller_path}") %>
58
+ <%= " " if subsite %><%= "# DEPRECATED #{gr.humanize} for controller #{controller.controller_path}" %>
21
59
  <%- end -%>
22
60
  <%- for route in routes -%>
23
61
  <%= " " if subsite %><%= route %>
@@ -28,6 +66,7 @@
28
66
 
29
67
  end
30
68
  <%- end -%>
31
- <%- end -%>
69
+ <%- end -%>
32
70
 
71
+ <%- end -%>
33
72
  end
@@ -25,12 +25,24 @@ module Hobo
25
25
  class_option :front_controller_name, :type => :string,
26
26
  :desc => "Front Controller Name", :default => 'front'
27
27
 
28
+ class_option :front_theme, :type => :string,
29
+ :desc => "Front Theme", :default => 'clean'
30
+
31
+ class_option :front_ui_theme, :type => :string,
32
+ :desc => "Front jQuery-UI Theme", :default => 'redmond'
33
+
28
34
  class_option :add_admin_subsite, :type => :boolean,
29
35
  :desc => "Add an Admin Subsite"
30
36
 
31
37
  class_option :admin_subsite_name, :type => :string,
32
38
  :desc => "Admin Subsite Name", :default => 'admin'
33
39
 
40
+ class_option :admin_theme, :type => :string,
41
+ :desc => "Admin Theme", :default => 'clean'
42
+
43
+ class_option :admin_ui_theme, :type => :string,
44
+ :desc => "Admin jQuery-UI Theme", :default => 'redmond'
45
+
34
46
  class_option :invite_only, :type => :boolean,
35
47
  :desc => "Require invitation to join site"
36
48
 
@@ -154,7 +166,19 @@ EOI
154
166
  end
155
167
 
156
168
  def install_default_plugins
157
- invoke 'hobo:install_default_plugins', [], {:subsite => 'front', :theme => 'hobo_clean', :ui_theme => 'redmond', :skip_gem => false}
169
+ if wizard?
170
+ say_title 'Front Theme'
171
+ say "The currently available themes are clean, clean_admin, clean_sidemenu and bootstrap."
172
+ @front_theme = ask("Choose a theme for the front site: [<enter>=clean|<custom_name>]", 'clean')
173
+
174
+ say_title 'Front jQuery-UI Theme'
175
+ say "The currently available jQuery-UI themes are listed here: https://github.com/fatdude/jquery-ui-themes-rails/blob/master/README.markdown"
176
+ @front_ui_theme = ask("Choose a jQuery-UI theme for the front site: [<enter>=redmond|<custom_name>]", 'redmond')
177
+ else
178
+ @front_theme = options[:front_theme]
179
+ @front_ui_theme = options[:front_ui_theme]
180
+ end
181
+ invoke 'hobo:install_default_plugins', [], {:subsite => 'front', :theme => "hobo_#{@front_theme}", :ui_theme => @front_ui_theme, :skip_gem => false}
158
182
  end
159
183
 
160
184
  def admin_subsite
@@ -162,10 +186,18 @@ EOI
162
186
  say_title 'Admin Subsite'
163
187
  if @invite_only || (@add_admin_subsite = yes_no?("Do you want an admin subsite?"))
164
188
  @admin_subsite_name = ask("Choose a name for the admin subsite: [<enter>=admin|<custom_name>]", 'admin')
189
+
190
+ say "The currently available themes are clean, clean_admin, clean_sidemenu and bootstrap."
191
+ @admin_theme = ask("Choose a theme for the #{@admin_subsite_name} site: [<enter>=clean_admin|<custom_name>]", 'clean_admin')
192
+
193
+ say "The currently available jQuery-UI themes are listed here: https://github.com/fatdude/jquery-ui-themes-rails/blob/master/README.markdown"
194
+ @admin_ui_theme = ask("Choose a jQuery-UI theme for the admin site: [<enter>=flick|<custom_name>]", 'flick')
165
195
  end
166
196
  else
167
197
  if @invite_only || (@add_admin_subsite = options[:add_admin_subsite])
168
198
  @admin_subsite_name = options[:admin_subsite_name]
199
+ @admin_theme = options[:front_theme]
200
+ @admin_ui_theme = options[:front_ui_theme]
169
201
  end
170
202
  end
171
203
  end
@@ -181,7 +213,8 @@ EOI
181
213
  invoke 'hobo:admin_subsite', [@admin_subsite_name],
182
214
  :user_resource_name => @user_resource_name,
183
215
  :invite_only => @invite_only,
184
- :make_front_site => false
216
+ :theme => @admin_theme,
217
+ :ui_theme => @admin_ui_theme
185
218
  end
186
219
  end
187
220
 
@@ -19,7 +19,7 @@ module Generators
19
19
  end
20
20
  end
21
21
 
22
- template "site.css.erb", File.join('app/assets/stylesheets', "#{file_name}.css")
22
+ template "site.scss.erb", File.join('app/assets/stylesheets', "#{file_name}.scss")
23
23
  copy_file "gitkeep", "app/assets/stylesheets/#{file_name}/.gitkeep"
24
24
  template "site.js.erb", File.join('app/assets/javascripts', "#{file_name}.js")
25
25
  copy_file "gitkeep", "app/assets/javascripts/#{file_name}/.gitkeep"
@@ -8,17 +8,9 @@ Description:
8
8
  and two different sets of views for the same model.
9
9
 
10
10
  The subsite will use app/views/taglibs/<subsite_name>_site.dryml
11
- as well as app/views/taglibs/application.dryml. This allows you
12
- to customize the look and feel of a portion of your site. The
13
- remaining views of your application that are not under a subsite
14
- load both application.dryml and front_site.dryml.
15
-
16
- It is thus recommended that you ensure that
17
- <subsite_name>_site.dryml and application.dryml do not repeat
18
- code, such as the inclusion of rapid or the setting of the theme.
19
- One easy way of ensuring this is to use the --make-front-site
20
- option. If you have already accounted for this, use
21
- --make-front-site=false.
11
+ for common tags. The assets that the subsite will load are
12
+ specified in app/assets/javascripts/<subsite_name>.js and
13
+ app/assets/stylesheets/<subsite_name>.[s]css
22
14
 
23
15
  The difference between hobo:admin_site and hobo:subsite is that
24
16
  hobo:admin_site limits the subsite to use by administrators only.
@@ -2,6 +2,9 @@ module Hobo
2
2
  class SubsiteGenerator < Rails::Generators::NamedBase
3
3
  source_root File.expand_path('../templates', __FILE__)
4
4
 
5
+ class_option :theme, :type => :string, :desc => "Theme", :default => 'clean_admin'
6
+ class_option :ui_theme, :type => :string, :desc => "jQuery-UI Theme", :default => 'flick'
7
+
5
8
  def self.banner
6
9
  "rails generate hobo:subsite NAME [options]"
7
10
  end
@@ -4,13 +4,16 @@ module Hobo
4
4
  include Generators::Hobo::InviteOnly
5
5
  include Generators::Hobo::Taglib
6
6
 
7
+ class_option :theme, :type => :string, :desc => "Theme", :default => 'clean_admin'
8
+ class_option :ui_theme, :type => :string, :desc => "jQuery-UI Theme", :default => 'flick'
9
+
7
10
  def self.banner
8
11
  "rails generate hobo:subsite_taglib NAME [options]"
9
12
  end
10
13
 
11
14
  def generate_taglib
12
15
  template "taglib.dryml.erb", File.join('app/views/taglibs', "#{file_name}_site.dryml")
13
- Rails::Generators.invoke('hobo:install_default_plugins', ["--subsite=#{file_name}", "--theme=hobo_clean_admin", "--ui_theme=flick"])
16
+ Rails::Generators.invoke('hobo:install_default_plugins', ["--subsite=#{file_name}", "--theme=hobo_#{options[:theme]}", "--ui_theme=#{options[:ui_theme]}"])
14
17
  end
15
18
 
16
19
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  To activate your account for <%%= @app_name %>, click on this link:
4
4
 
5
- <%%= <%= name.underscore -%>_activate_url :id => @<%= name.underscore -%>, :key => @key %>
5
+ <%%= activate_<%= name.underscore -%>_url :id => @<%= name.underscore -%>, :key => @key %>
6
6
 
7
7
  Thank you,
8
8
 
@@ -3,7 +3,7 @@
3
3
  If you have forgotten your password for <%%= @app_name %>, you can choose
4
4
  a new one by clicking on this link:
5
5
 
6
- <%%= <%= name.underscore -%>_reset_password_url :id => @<%= name.underscore -%>, :key => @key %>
6
+ <%%= reset_password_<%= name.underscore -%>_url :id => @<%= name.underscore -%>, :key => @key %>
7
7
 
8
8
  Thank you,
9
9
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  You have been invited to join <%%= @app_name %>. If you wish to accept, please click on the following link
4
4
 
5
- <%%= <%= name.underscore %>_accept_invitation_url :id => @<%= name.underscore %>, :key => @key %>
5
+ <%%= accept_invitation_<%= name.underscore %>_url :id => @<%= name.underscore %>, :key => @key %>
6
6
 
7
7
  Thank you,
8
8
 
@@ -7,6 +7,7 @@
7
7
  administrator :boolean, :default => false
8
8
  timestamps
9
9
  end
10
+ attr_accessible :name, :email_address, :password, :password_confirmation
10
11
 
11
12
  # This gives admin rights and an :active state to the first sign-up.
12
13
  # Just remove it if you don't want that
@@ -34,7 +34,7 @@ module Hobo
34
34
 
35
35
  def find_by_search(query, search_targets=[])
36
36
  if search_targets.empty?
37
- search_targets = Hobo::Routes.models_with(:show).select {|m| m.search_columns.any? }
37
+ search_targets = Hobo::Model.all_models.select {|m| m.search_columns.any? }
38
38
  end
39
39
 
40
40
  query_words = ActiveRecord::Base.connection.quote_string(query).split
@@ -44,7 +44,7 @@ module Hobo
44
44
  parameters = []
45
45
  like_operator = ActiveRecord::Base.connection.adapter_name =~ /postgres/i ? 'ILIKE' : 'LIKE'
46
46
  query_words.each do |word|
47
- column_queries = search_target.search_columns.map { |column| "#{column} #{like_operator} ?" }
47
+ column_queries = search_target.search_columns.map { |column| column == "id" ? "CAST(#{column} AS varchar) #{like_operator} ?" : "#{column} #{like_operator} ?" }
48
48
  conditions << "(" + column_queries.join(" or ") + ")"
49
49
  parameters.concat(["%#{word}%"] * column_queries.length)
50
50
  end
@@ -81,9 +81,9 @@ module Hobo
81
81
 
82
82
  headers["Content-Type"] = options['content_type'] if options['content_type']
83
83
 
84
- page = options[:preamble] || "var _update = typeof Hobo == 'undefined' ? Element.update : Hobo.updateElement;\n"
84
+ page = options[:preamble] || ""
85
85
  for spec in render_specs
86
- function = spec[:function] || "_update"
86
+ function = spec[:function] || "hjq.ajax.update"
87
87
  dom_id = spec[:id]
88
88
 
89
89
  if spec[:part_context]
@@ -97,6 +97,7 @@ module Hobo
97
97
  end
98
98
  end
99
99
  if renderer
100
+ options[:contexts_function] ||= "hjq.ajax.updatePartContexts" unless options[:no_contexts_function]
100
101
  if options[:contexts_function]
101
102
  storage = renderer.part_contexts_storage_uncoded
102
103
  page << "#{options[:contexts_function]}(#{storage.to_json});\n"
@@ -106,15 +107,6 @@ module Hobo
106
107
  render :js => page
107
108
  end
108
109
 
109
- # use this function to send arbitrary bits of javascript
110
- def ajax_response(response, options)
111
- page = options[:preamble] || "var _update = typeof Hobo == 'undefined' ? Element.update : Hobo.updateElement;\n"
112
- page << response
113
- page << options[:postamble] if options[:postamble]
114
- render :js => page
115
- end
116
-
117
-
118
110
  # dryml does not use layouts
119
111
  def action_has_layout?
120
112
  false
@@ -1,6 +1,6 @@
1
1
  module Hobo
2
2
  module Controller
3
- module Model
3
+ module Model
4
4
 
5
5
  include Hobo::Controller
6
6
 
@@ -32,10 +32,14 @@ module Hobo
32
32
  rescue_from Hobo::PermissionDeniedError, :with => :permission_denied
33
33
  rescue_from Hobo::Model::Lifecycles::LifecycleKeyError, :with => :permission_denied
34
34
 
35
+ respond_to :html
36
+
35
37
  alias_method_chain :render, :hobo_model
36
38
 
37
39
  end
38
40
  register_controller(base)
41
+ subsite = base.name.include?("::") ? base.name.split("::").first.underscore : nil
42
+ base.model.hobo_controller[subsite] = base
39
43
 
40
44
  Hobo::Controller.included_in_class(base)
41
45
  end
@@ -385,12 +389,25 @@ module Hobo
385
389
  end
386
390
 
387
391
 
388
- def destination_after_submit(record=this, destroyed=false)
392
+ def destination_after_submit(*args)
393
+ options = args.extract_options!
394
+ destroyed = args[1]
389
395
  after_submit = params[:after_submit]
390
396
 
391
397
  # The after_submit post parameter takes priority
392
398
  (after_submit == "stay-here" ? url_for_page_path : after_submit) ||
393
399
 
400
+ # Then try options[:redirect]
401
+ ((o=options[:redirect]) && begin
402
+ if o.is_a?(Symbol)
403
+ object_url(@this, o)
404
+ elsif o.is_a?(String) || o.is_a?(Hash)
405
+ o
406
+ else
407
+ object_url(*Array(o))
408
+ end
409
+ end) ||
410
+
394
411
  # Then try the record's show page
395
412
  (!destroyed && object_url(@this)) ||
396
413
 
@@ -410,24 +427,6 @@ module Hobo
410
427
  end
411
428
 
412
429
 
413
- def redirect_after_submit(*args)
414
- options = args.extract_options!
415
- o = options[:redirect]
416
- if o
417
- url = if o.is_a?(Symbol)
418
- object_url(this, o)
419
- elsif o.is_a?(String) || o.is_a?(Hash)
420
- o
421
- else
422
- object_url(*Array(o))
423
- end
424
- redirect_to url
425
- else
426
- redirect_to destination_after_submit(*args)
427
- end
428
- end
429
-
430
-
431
430
  def response_block(&b)
432
431
  if b
433
432
  respond_to do |format|
@@ -520,6 +519,8 @@ module Hobo
520
519
  if request.xhr? && params[:render]
521
520
  hobo_ajax_response
522
521
  render :nothing => true unless performed?
522
+ else
523
+ respond_with(self.this)
523
524
  end
524
525
  end
525
526
 
@@ -527,6 +528,8 @@ module Hobo
527
528
  if request.xhr? && params[:render]
528
529
  hobo_ajax_response(:page => :blah)
529
530
  render :nothing => true unless performed?
531
+ else
532
+ respond_with(self.this)
530
533
  end
531
534
  end
532
535
 
@@ -546,6 +549,7 @@ module Hobo
546
549
  self.this = new_for_create(attributes)
547
550
  this.user_save(current_user)
548
551
  end
552
+ flash_notice (ht( :"#{@this.class.to_s.underscore}.messages.create.success", :default=>["The #{@this.class.model_name.human} was created successfully"])) if valid?
549
553
  response_block(&b) || create_response(:new, options)
550
554
  end
551
555
 
@@ -560,6 +564,7 @@ module Hobo
560
564
  self.this = association.new(attributes)
561
565
  this.save
562
566
  end
567
+ flash_notice (ht( :"#{@this.class.to_s.underscore}.messages.create.success", :default=>["The #{@this.class.model_name.human} was created successfully"])) if valid?
563
568
  response_block(&b) || create_response(:"new_for_#{name_of_auto_action_for(owner_association)}", options)
564
569
  end
565
570
 
@@ -586,30 +591,31 @@ module Hobo
586
591
  end
587
592
 
588
593
 
589
- def create_response(new_action, options={}, &b)
590
- flash_notice (ht( :"#{@this.class.to_s.underscore}.messages.create.success", :default=>["The #{@this.class.model_name.human} was created successfully"])) if valid?
594
+ def create_response(new_action, options={})
595
+ valid = valid? # valid? can be expensive
596
+ if params[:render]
597
+ if (params[:render_options] && params[:render_options][:errors_ok]) || valid
598
+ hobo_ajax_response
591
599
 
592
- response_block(&b) or begin
593
- valid = valid? # valid? can be expensive
594
- if params[:render]
595
- if (params[:render_options] && params[:render_options][:errors_ok]) || valid
596
- hobo_ajax_response
597
-
598
- # Maybe no ajax requests were made
599
- render :nothing => true unless performed?
600
- else
601
- errors = @this.errors.full_messages.join('\n')
602
- message = ht( :"#{this.class.to_s.underscore}.messages.create.error", :errors=>errors,:default=>["Couldn't create the #{this.class.name.titleize.downcase}.\n #{errors}"])
603
- ajax_response("alert('#{message}');", params[:render_options])
604
- end
605
- else
606
- if valid
607
- redirect_after_submit options
608
- else
609
- re_render_form(new_action)
610
- end
611
- end
612
- end
600
+ # Maybe no ajax requests were made
601
+ render :nothing => true unless performed?
602
+ else
603
+ errors = @this.errors.full_messages.join('\n')
604
+ message = ht( :"#{this.class.to_s.underscore}.messages.create.error", :errors=>errors,:default=>["Couldn't create the #{this.class.name.titleize.downcase}.\n #{errors}"])
605
+ render :js => "alert(#{message.to_json});\n"
606
+ end
607
+ else
608
+ location = destination_after_submit(options)
609
+ respond_with(self.this, :location => location) do |format|
610
+ format.html do
611
+ if valid
612
+ redirect_to location
613
+ else
614
+ re_render_form(new_action)
615
+ end
616
+ end
617
+ end
618
+ end
613
619
  end
614
620
 
615
621
 
@@ -641,7 +647,7 @@ module Hobo
641
647
  #
642
648
  # parameters:
643
649
  # valid is a cache of valid?
644
- # options is passed through to redirect_after_submit
650
+ # options is passed through to destination_after_submit
645
651
  def update_response(valid=nil, options={})
646
652
  # valid? can be expensive, cache it
647
653
  valid = valid? if valid.nil?
@@ -655,15 +661,19 @@ module Hobo
655
661
  errors = @this.errors.full_messages.join('\n')
656
662
  message = ht(:"#{@this.class.to_s.underscore}.messages.update.error", :default=>["There was a problem with that change\\n#{errors}"], :errors=>errors)
657
663
 
658
- ajax_response("alert('#{message}');", params[:render_options])
664
+ render :js => "alert(#{message.to_json});\n"
659
665
  end
660
666
  else
661
- if valid
662
- flash_notice (ht(:"#{@this.class.to_s.underscore}.messages.update.success", :default=>["Changes to the #{@this.class.model_name.human} were saved"]))
663
-
664
- redirect_after_submit options
665
- else
666
- re_render_form(:edit)
667
+ location = destination_after_submit(options)
668
+ respond_with(self.this, :location => location) do |format|
669
+ format.html do
670
+ if valid
671
+ flash_notice (ht(:"#{@this.class.to_s.underscore}.messages.update.success", :default=>["Changes to the #{@this.class.model_name.human} were saved"]))
672
+ redirect_to location
673
+ else
674
+ re_render_form(:edit)
675
+ end
676
+ end
667
677
  end
668
678
  end
669
679
  end
@@ -673,16 +683,16 @@ module Hobo
673
683
  self.this ||= args.first || find_instance
674
684
  this.user_destroy(current_user)
675
685
  flash_notice ht( :"#{model.to_s.underscore}.messages.destroy.success", :default=>["The #{model.name.titleize.downcase} was deleted"])
676
- destroy_response(options, &b)
686
+ response_block(&b) || destroy_response(options, &b)
677
687
  end
678
688
 
679
689
 
680
- def destroy_response(options={}, &b)
681
- response_block(&b) or
682
- respond_to do |wants|
683
- wants.html { redirect_after_submit(this, true, options) }
684
- wants.js { hobo_ajax_response || render(:nothing => true) }
685
- end
690
+ def destroy_response(options={})
691
+ if params[:render]
692
+ hobo_ajax_response || render(:nothing => true)
693
+ else
694
+ respond_with(self.this, :location => destination_after_submit(this, true, options))
695
+ end
686
696
  end
687
697
 
688
698
 
@@ -700,26 +710,32 @@ module Hobo
700
710
  def do_creator_action(name, options={}, &b)
701
711
  @creator = model::Lifecycle.creator(name)
702
712
  self.this = @creator.run!(current_user, attribute_parameters)
703
- response_block(&b) or
704
- if valid?
705
- respond_to do |wants|
706
- wants.html { redirect_after_submit(options) }
707
- wants.js { hobo_ajax_response || render(:nothing => true) }
708
- end
713
+ response_block(&b) || do_creator_response(name, options)
714
+ end
715
+
716
+ def do_creator_response(name, options)
717
+ if valid?
718
+ if params[:render]
719
+ hobo_ajax_response || render(:nothing => true)
709
720
  else
710
- this.exempt_from_edit_checks = true
711
- respond_to do |wants|
712
- # errors is used by the translation helper, ht, below.
713
- errors = this.errors.full_messages.join("\n")
721
+ location = destination_after_submit(options)
722
+ respond_with(self.this, :location => location)
723
+ end
724
+ else
725
+ this.exempt_from_edit_checks = true
726
+ if params[:render] && params[:render_options] && params[:render_options][:errors_ok]
727
+ hobo_ajax_response
728
+ render :nothing => true unless performed?
729
+ else
730
+ # errors is used by the translation helper, ht, below.
731
+ errors = this.errors.full_messages.join("\n")
732
+ respond_with(self.this) do |wants|
714
733
  wants.html { re_render_form(name) }
715
- wants.js { render(:status => 500,
716
- :text => ht(:"#{@this.class.to_s.underscore}.messages.creator.error", :default=>["Couldn't do creator #{name}.\n#{errors}"], :name=>name, :errors=>errors)
717
- )}
718
734
  end
719
735
  end
736
+ end
720
737
  end
721
738
 
722
-
723
739
  def prepare_transition(name, options)
724
740
  key = options.delete(:key) || params[:key]
725
741
 
@@ -743,25 +759,9 @@ module Hobo
743
759
  options = args.extract_options!
744
760
  @transition = prepare_transition(name, options)
745
761
  @transition.run!(this, current_user, attribute_parameters)
746
- response_block(&b) or
747
- if valid?
748
- respond_to do |wants|
749
- wants.html { redirect_after_submit(options) }
750
- wants.js { hobo_ajax_response || render(:nothing => true) }
751
- end
752
- else
753
- respond_to do |wants|
754
- # errors is used by the translation helper, ht, below.
755
- errors = this.errors.full_messages.join("\n")
756
- wants.html { re_render_form(name) }
757
- wants.js { render(:status => 500,
758
- :text => ht(:"#{@this.class.to_s.underscore}.messages.transition.error", :default=>["Couldn't do transition #{name}.\n#{errors}"], :name=>name, :errors=>errors)
759
- )}
760
- end
761
- end
762
+ response_block(&b) || update_response(nil, options)
762
763
  end
763
764
 
764
-
765
765
  # --- Miscelaneous Actions --- #
766
766
 
767
767
  # Hobo 1.3's name one uses params[:query], jQuery-UI's autocomplete