hobo 0.8.10 → 0.9.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.
Files changed (52) hide show
  1. data/CHANGES.txt +126 -2
  2. data/Rakefile +4 -1
  3. data/bin/hobo +1 -1
  4. data/doctest/scopes.rdoctest +11 -4
  5. data/dryml_generators/rapid/cards.dryml.erb +8 -2
  6. data/dryml_generators/rapid/forms.dryml.erb +5 -4
  7. data/dryml_generators/rapid/pages.dryml.erb +150 -65
  8. data/lib/hobo.rb +1 -1
  9. data/lib/hobo/accessible_associations.rb +2 -0
  10. data/lib/hobo/authentication_support.rb +1 -1
  11. data/lib/hobo/controller.rb +11 -3
  12. data/lib/hobo/dryml/dryml_doc.rb +1 -1
  13. data/lib/hobo/fake_initializer.rb +14 -0
  14. data/lib/hobo/hobo_helper.rb +94 -6
  15. data/lib/hobo/lifecycles.rb +17 -2
  16. data/lib/hobo/lifecycles/lifecycle.rb +1 -1
  17. data/lib/hobo/lifecycles/transition.rb +12 -4
  18. data/lib/hobo/model.rb +25 -22
  19. data/lib/hobo/model_controller.rb +42 -37
  20. data/lib/hobo/model_router.rb +11 -7
  21. data/lib/hobo/permissions.rb +12 -10
  22. data/lib/hobo/permissions/associations.rb +1 -1
  23. data/lib/hobo/static_tags +21 -0
  24. data/lib/hobo/user.rb +7 -3
  25. data/lib/hobo/user_controller.rb +7 -7
  26. data/lib/hobo/view_hints.rb +10 -3
  27. data/rails_generators/hobo/USAGE +4 -0
  28. data/rails_generators/hobo_admin_site/USAGE +16 -0
  29. data/rails_generators/hobo_front_controller/hobo_front_controller_generator.rb +11 -2
  30. data/rails_generators/hobo_front_controller/templates/controller.rb +6 -0
  31. data/rails_generators/hobo_front_controller/templates/summary.dryml +103 -0
  32. data/rails_generators/hobo_model_resource/USAGE +38 -0
  33. data/rails_generators/hobo_rapid/USAGE +3 -0
  34. data/rails_generators/hobo_rapid/templates/hobo-rapid.js +7 -3
  35. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +4 -0
  36. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +5 -0
  37. data/rails_generators/hobo_subsite/USAGE +16 -0
  38. data/rails_generators/hobo_subsite/hobo_subsite_generator.rb +1 -1
  39. data/rails_generators/hobo_user_controller/templates/controller.rb +2 -2
  40. data/rails_generators/hobo_user_model/templates/model.rb +6 -1
  41. data/taglibs/rapid.dryml +1 -0
  42. data/taglibs/rapid_core.dryml +4 -4
  43. data/taglibs/rapid_forms.dryml +29 -21
  44. data/taglibs/rapid_generics.dryml +3 -1
  45. data/taglibs/rapid_lifecycles.dryml +14 -9
  46. data/taglibs/rapid_navigation.dryml +1 -1
  47. data/taglibs/rapid_plus.dryml +1 -0
  48. data/taglibs/rapid_summary.dryml +300 -0
  49. data/taglibs/rapid_support.dryml +1 -1
  50. data/taglibs/rapid_user_pages.dryml +21 -19
  51. data/test/permissions/test_permissions.rb +1 -1
  52. metadata +12 -4
@@ -1,4 +1,128 @@
1
- === Hobo 0.8.10 ==
1
+ === Upgrading to a new version of Hobo ===
2
+
3
+ Once you have installed a new version of Hobo, you may wish to run
4
+
5
+ rake hobo:run_standard_generators
6
+
7
+ This will run all of the standard generators, and pull in any bug
8
+ fixes or enhancements to generated code. Note that this is quite
9
+ likely to cause conflicts, so it is highly recommended that you have
10
+ your code backed up and in a change control system such as git or
11
+ subversion.
12
+
13
+ === Hobo 0.9.0 ===
14
+
15
+ Major enhancements:
16
+
17
+ - Internationalization! Through the hard work of soey and Spiralis,
18
+ we now have internationalization support in Hobo. The manual
19
+ page is on the
20
+ [cookbook](http://cookbook.hobocentral.net/manual/i18n). Locales
21
+ are available on
22
+ [github](http://github.com/Spiralis/hobo-i18n-locales).
23
+
24
+ - Index generation: Matt Jones' automatic index generation code has
25
+ been merged. The default Rails index names are very long, so this
26
+ is unlikely to work well on Oracle, which has a 30 character
27
+ limit. Testing against Postgres, Oracle, SQL Server and JDBC has
28
+ been extremely limited. To generate indices run script/generate
29
+ hobo_migration.
30
+
31
+ - New projects now have a summary page on /front/summary that
32
+ provides application information to the administrator. Current
33
+ projects may add this action by running the
34
+ `hobo_front_controller` generator.
35
+
36
+ - STI derived classes can add additional fields to their parent
37
+ class with the fields block. Note that the "can't generate a
38
+ migration for STI base and derived classes all at once" issue
39
+ still applies. In general, STI handling should now work much
40
+ better.
41
+
42
+ - [Bug 464](https://hobo.lighthouseapp.com/projects/8324/tickets/464-transition-buttons-should-have-a-option-to-link-to-forms-instead-for-transitions-that-take-parameters)
43
+ The transition-buttons tag now generates buttons that link to the
44
+ transition page for transitions that require parameters.
45
+
46
+ - [Bug 532](https://hobo.lighthouseapp.com/projects/8324/tickets/532)
47
+ In previous versions, you had to add the new HTML5 tags to
48
+ RAILS_ROOT/config/dryml_static_tags.txt. This version whitelists
49
+ all HTML5 tags except for aside, section, header and footer, which
50
+ conflict with existing Rapid tags.
51
+
52
+ Major bug fixes:
53
+
54
+ - [Bug 530](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/530)
55
+ is a critical bug for invite-only projects. To incorporate the
56
+ fix, you must rerun your generators or follow the instructions in
57
+ the [commit](http://github.com/tablatom/hobo/commit/17247eac8a78f8b36dcc3b9684a3e4ec8da32a23)
58
+
59
+ - [Bug
60
+ 480](https://hobo.lighthouseapp.com/projects/8324/tickets/480-find_owner_and_association-method-for-has_many-associations)
61
+ Owner actions now work with has_many associations
62
+
63
+ - [Bug 516](https://hobo.lighthouseapp.com/projects/8324/tickets/516-association-name-as-parameter-in-lifecycle-step-almost-works)
64
+ Specifying a belongs_to association as a lifecycle param works; it appears as a select-one on the generated page.
65
+
66
+ - [Bug 515](https://hobo.lighthouseapp.com/projects/8324/tickets/515-virtual-boolean-field-uninitialized-constant-hobobooleancolumn_type)
67
+ Virtual :boolean fields declared with attr_accessor now work
68
+
69
+ - [Bug 484](https://hobo.lighthouseapp.com/projects/8324/tickets/484-transition-actions-with-key-fail-if-model-isnt-visible-to-guests)
70
+ Transition actions that require a key no longer check if the model is visible to Guest
71
+
72
+ - [Bug 485](https://hobo.lighthouseapp.com/projects/8324/tickets/485-make-lifecycles-on-sti-subclasses-behave)
73
+ Lifecycle support on STI models works now. Note that derived classes DO NOT inherit any of the parent lifecycle implementation.
74
+
75
+ - [Bug 387](https://hobo.lighthouseapp.com/projects/8324/tickets/387-inheritance-sti-models-name-not-propagating)
76
+ STI derived classes now inherit settings like name_attribute correctly.
77
+
78
+ - [Bug 533](https://hobo.lighthouseapp.com/projects/8324/tickets/533-remove-id-from-hidden-field-for-check-box)
79
+ The hidden field generated with a checkbox input shouldn't have an ID.
80
+
81
+ - [Bug 526](https://hobo.lighthouseapp.com/projects/8324/tickets/526-routing-error-does-not-render-not-found-page)
82
+ Routing errors now render not-found-page, rather than the default Rails routing error message.
83
+
84
+ Minor Enhancements:
85
+
86
+ - Aside collections now have a new-link at the bottom (inside the
87
+ preview-with-more)
88
+ [#421](https://hobo.lighthouseapp.com/projects/8324/tickets/421-auto_actions_for-doesnt-create-add-button-in-sidebar)
89
+
90
+ - the manual now includes a Generators section, and a subsite
91
+ tutorial has been added.
92
+
93
+ - [Bug
94
+ 386](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/386)
95
+ and [Bug
96
+ 501](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/501)
97
+ have been fixed, reducing the number of extraneous migrations that
98
+ the hobo_migration generator creates. These are actually Rails
99
+ and/or database bugs we're working around. For instance, MySQL
100
+ does not allow default values for text columns, so Rails silently
101
+ ignores them. SQLite does not allow scale or precision settings on
102
+ decimal fields. These types of bugs are good reasons why you
103
+ should use the same type of database for development, testing and
104
+ production.
105
+
106
+ - A new view_hint, 'inline_booleans', controls whether boolean attributes are displayed in the header (default behavior
107
+ of Rapid show pages) or inline with the rest of the field-list. You can either pass a list of field names, or 'true'
108
+ (without quotes) to make all booleans inline.
109
+
110
+ - hobo_show now accepts a model instance as a first parameter. This restores symmetry with the other hobo_* actions.
111
+
112
+ - on Rails 2.3 and above, routes will be generated with the optional .:format suffix, and the formatted_* routes are skipped.
113
+
114
+ - non-required fields that are marked :unique will now allow nil
115
+ values.
116
+
117
+ Minor Bug Fixes
118
+
119
+ - [Bug 540](https://hobo.lighthouseapp.com/projects/8324-hobo/tickets/540)
120
+ Hobo::Permissions::Associations::HasManyThroughAssociations#create!
121
+ did not save as the "!" implied.
122
+
123
+ See the [github log](http://github.com/bryanlarsen/hobo/commits/v0.9.0)
124
+
125
+ === Hobo 0.8.10 ===
2
126
 
3
127
  This is a brown paper bag release. The fix for Bug 473 was not
4
128
  properly tested. Thanks Iain Beeston for quickly sending us a patch.
@@ -35,7 +159,7 @@ Major bug fixes:
35
159
 
36
160
  Minor bug fixes and enhancements:
37
161
 
38
- See the [github log](http://github.com/bryanlarsen/hobo/commits/v0.8.5)
162
+ See the [github log](http://github.com/bryanlarsen/hobo/commits/v0.8.9)
39
163
 
40
164
  === Hobo 0.8.8 ===
41
165
 
data/Rakefile CHANGED
@@ -9,6 +9,9 @@ $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), '/../hobofields/l
9
9
  $:.unshift File.join(File.expand_path(File.dirname(__FILE__)), '/../hobosupport/lib')
10
10
  require 'hobo'
11
11
 
12
+ RUBY = ENV['RUBY'] || (defined?(JRUBY_VERSION) ? 'jruby' : 'ruby')
13
+ RUBYDOCTEST = ENV['RUBYDOCTEST'] || "#{RUBY} `which rubydoctest`"
14
+
12
15
  desc "Default Task"
13
16
  task :default => [ :test ]
14
17
 
@@ -26,7 +29,7 @@ namespace "test" do
26
29
  desc "Run the doctests"
27
30
  task :doctest do |t|
28
31
  # note, tests in doctest/hobo/ are out of date
29
- exit(1) if !system("rubydoctest doctest/*.rdoctest")
32
+ exit(1) if !system("#{RUBYDOCTEST} doctest/*.rdoctest")
30
33
  end
31
34
  end
32
35
 
data/bin/hobo CHANGED
@@ -17,7 +17,7 @@ Options:
17
17
  -d | --database <database> # e.g. mysql, sqlite
18
18
  -r | --rails <version> # rails version to use
19
19
  -n | --no-rails # don't run 'rails'. Assumes app-path=='.'
20
- --invite-only # add features for an invite-ony website (admin site, no signup)
20
+ --invite-only # add features for an invite-only website (admin site, no signup)
21
21
  "
22
22
 
23
23
 
@@ -50,12 +50,17 @@ First off we need to configure ActiveSupport for auto-loading
50
50
  We also need to get ActiveRecord set up with a database connection
51
51
  {.hidden}
52
52
 
53
+ >> mysql_adapter = defined?(JRUBY_VERSION) ? 'jdbcmysql' : 'mysql'
54
+ >> mysql_user = 'root'; mysql_password = ''
55
+ >> mysql_login = "-u #{mysql_user} --password='#{mysql_password}'"
53
56
  >> mysql_database = "hobofields_doctest"
54
- >> system "mysqladmin --force drop #{mysql_database} 2> /dev/null"
55
- >> system("mysqladmin create #{mysql_database}") or raise "could not create database"
56
- >> ActiveRecord::Base.establish_connection(:adapter => "mysql",
57
+ >> system "mysqladmin #{mysql_login} --force drop #{mysql_database} 2> /dev/null"
58
+ >> system("mysqladmin #{mysql_login} create #{mysql_database}") or raise "could not create database"
59
+ >> ActiveRecord::Base.establish_connection(:adapter => mysql_adapter,
57
60
  :database => mysql_database,
58
- :host => "localhost")
61
+ :host => "localhost",
62
+ :username => mysql_user,
63
+ :password => mysql_password)
59
64
  {.hidden}
60
65
 
61
66
  Some load path manipulation:
@@ -69,6 +74,8 @@ Some load path manipulation:
69
74
  And we'll require hobo:
70
75
  {.hidden}
71
76
 
77
+ >> require 'will_paginate'
78
+ >> require 'will_paginate/finder'
72
79
  >> require 'hobosupport'
73
80
  >> require 'hobofields'
74
81
  >> require 'hobo'
@@ -18,6 +18,8 @@ has_actions = edit_link || delete_button
18
18
  has_body = (!show_link && description_attribute) || creator_link || creator_attribute || primary_collection
19
19
 
20
20
  show_title = !show_link && (name_attribute || !has_body)
21
+
22
+ model_key = model.name.pluralize.underscore
21
23
  -%>
22
24
  <def tag="card" for="<%= model.name %>">
23
25
  <card class="<%= model_name :dashed %>" param="default" merge>
@@ -29,7 +31,9 @@ show_title = !show_link && (name_attribute || !has_body)
29
31
  <% if has_actions -%>
30
32
  <div param="actions">
31
33
  <% if edit_link -%>
32
- <a action="edit" if="&can_edit?" param="edit-link">Edit</a>
34
+ <a action="edit" if="&can_edit?" param="edit-link">
35
+ <ht key="<%= model_key %>.actions.edit">Edit</ht>
36
+ </a>
33
37
  <% end -%>
34
38
  <% if delete_button -%>
35
39
  <delete-button label="X" param/>
@@ -49,7 +53,9 @@ show_title = !show_link && (name_attribute || !has_body)
49
53
  <view:<%= creator_attribute %> param="creator"/>
50
54
  <% end -%>
51
55
  <% if primary_collection -%>
52
- <count:<%= primary_collection%> param/>
56
+ <ht key="<%= primary_collection.to_s.pluralize.underscore %>.collection.count" count="&this.<%= primary_collection %>.size">
57
+ <count:<%= primary_collection%> param/>
58
+ </ht>
53
59
  <% end -%>
54
60
  </body:>
55
61
  <% end -%>
@@ -4,13 +4,14 @@ form_fields = standard_fields :belongs_to, :has_many
4
4
 
5
5
  cancel_to_show_page = linkable?(:show)
6
6
  cancel_to_index_page = !cancel_to_index_page && linkable?(:index)
7
+ model_key = model_name.pluralize.underscore
7
8
  -%>
8
9
  <def tag="form" for="<%= model.name %>">
9
10
  <form merge param="default">
10
11
  <error-messages param/>
11
12
  <field-list fields="<%= form_fields * ', ' %>" param/>
12
13
  <div param="actions">
13
- <submit label="Save" param/><or-cancel param="cancel"/>
14
+ <submit label="#{ht '<%= model_key %>.actions.save', :default=>['Save']}" param/><or-cancel param="cancel"/>
14
15
  </div>
15
16
  </form>
16
17
  </def>
@@ -22,7 +23,7 @@ cancel_to_index_page = !cancel_to_index_page && linkable?(:index)
22
23
  <error-messages param/>
23
24
  <field-list fields="<%= creator.parameters * ', ' %>" param/>
24
25
  <div param="actions">
25
- <submit label="<%= creator.name.to_s.titleize %>" param/><or-cancel param="cancel"/>
26
+ <submit label="#{ht '<%= model_key %>.actions.<%= creator.name.to_s %>', :default=>['<%= creator.name.to_s.titleize %>']}" param/><or-cancel param="cancel"/>
26
27
  </div>
27
28
  </form>
28
29
  </def>
@@ -36,10 +37,10 @@ cancel_to_index_page = !cancel_to_index_page && linkable?(:index)
36
37
  <input type="hidden" name="key" value="&this.lifecycle.provided_key" if="&this.lifecycle.provided_key"/>
37
38
  <field-list fields="<%= transition.parameters * ', ' %>" param/>
38
39
  <div param="actions">
39
- <submit label="<%= transition.name.to_s.titleize %>" param/><or-cancel param="cancel"/>
40
+ <submit label="#{ht '<%= model_key %>.actions.<%= transition.name.to_s %>', :default=>['<%= transition.name.to_s.titleize %>']}" param/><or-cancel param="cancel"/>
40
41
  </div>
41
42
  </form>
42
43
  </def>
43
44
  <% end -%>
44
45
 
45
- <% end # of each_model do -%>
46
+ <% end # of each_model do -%>
@@ -12,29 +12,38 @@
12
12
 
13
13
 
14
14
  <% each_controller do -%>
15
-
15
+
16
16
  <!-- ====== <%= model.name %> Pages ====== -->
17
17
  <%
18
18
  new_link = linkable?(:new)
19
19
  new_form = !new_link && linkable?(model, :create, :method => :post)
20
+ model_key = model_name.pluralize.underscore
20
21
  -%>
21
22
 
22
-
23
23
  <def tag="index-page" for="<%= model.name %>">
24
- <page merge title="<%= model_name :title, :plural %>">
24
+ <page merge title="#{ht '<%= model_key %>.index.title', :default=>['<%= model_name :title, :plural %>'] }">
25
25
  <body: class="index-page <%= model_class %>" param/>
26
-
26
+
27
27
  <content: param>
28
28
  <header param="content-header">
29
- <h2 param="heading"><%= model_name :title, :plural %></h2>
30
-
31
- <p param="count" if>There <count prefix="are"/></p>
29
+ <h2 param="heading">
30
+ <ht key="<%= model_key %>.index.heading">
31
+ <%= model_name :title, :plural %>
32
+ </ht>
33
+ </h2>
34
+
35
+ <p param="count" if>
36
+ <ht key="<%= model_key %>.collection.count" count="&this.size">
37
+ There <count prefix="are"/>
38
+ </ht>
39
+ </p>
32
40
  </header>
33
-
41
+
34
42
  <section param="content-body">
35
43
  <% if new_link -%>
36
-
37
- <a action="new" to="&model" param="new-link"/>
44
+ <a action="new" to="&model" param="new-link">
45
+ <ht key="<%= model_key %>.actions.new">New <%=model_name :title %></ht>
46
+ </a>
38
47
  <% end -%>
39
48
 
40
49
  <% if view_hints.paginate? -%>
@@ -54,7 +63,9 @@ new_form = !new_link && linkable?(model, :create, :method => :post)
54
63
 
55
64
  <% if new_form -%>
56
65
  <div param="new-form">
57
- <h3 param="new-form-heading">New <%= model_name :title %></h3>
66
+ <h3 param="new-form-heading">
67
+ <ht key="<%= model_key %>.form.new.heading">New <%= model_name :title %></ht>
68
+ </h3>
58
69
  <form with="&@invalid_record || new_for_current_user(<%= model %>)" param/>
59
70
  </div>
60
71
 
@@ -66,17 +77,21 @@ new_form = !new_link && linkable?(model, :create, :method => :post)
66
77
 
67
78
 
68
79
  <def tag="new-page" for="<%= model.name %>">
69
- <page merge title="New <%= model_name :title %>">
80
+ <page merge title="#{ht '<%= model_key %>.new.title', :default=>['New <%=model_name :title %>'] }">
70
81
  <body: class="new-page <%= model_class %>" param/>
71
-
82
+
72
83
  <content: param>
73
84
  <section param="content-header">
74
- <h2 param="heading">New <%= model_name :title %></h2>
85
+ <h2 param="heading">
86
+ <ht key="<%= model_key %>.new.heading">
87
+ New <%= model_name :title %>
88
+ </ht>
89
+ </h2>
75
90
  </section>
76
-
91
+
77
92
  <section param="content-body">
78
93
  <form param>
79
- <submit: label="Create <%= model_name :title %>"/>
94
+ <submit: label="#{ht '<%= model_key %>.actions.create', :default=>['Create <%= model_name :title %>']}"/>
80
95
  </form>
81
96
  </section>
82
97
  </content:>
@@ -86,7 +101,7 @@ new_form = !new_link && linkable?(model, :create, :method => :post)
86
101
 
87
102
  <%
88
103
  back_link = model.dependent_on.detect { |x| !(model.reflections[x].klass < Hobo::User) }
89
- boolean_fields = model.columns.select { |c| c.type == :boolean }.*.name
104
+ boolean_fields = model.columns.select { |c| c.type == :boolean }.*.name - model.view_hints.inline_booleans
90
105
  creator = model.creator_attribute
91
106
  creator_link = creator && model.reflections[creator] && linkable?(model.reflections[creator].klass, :show)
92
107
  edit_link = linkable?(:edit)
@@ -111,7 +126,7 @@ unless model.view_hints.secondary_children.empty?
111
126
  end
112
127
  -%>
113
128
  <def tag="show-page" for="<%= model.name %>">
114
- <page merge title="<%= model_name :title %>">
129
+ <page merge title="#{ht '<%=model_key %>.show.title', :default=>['<%=model_name :title %>'] }">
115
130
 
116
131
  <body: class="show-page <%= model_class %>" param/>
117
132
 
@@ -121,10 +136,14 @@ end
121
136
  <section param="main-content">
122
137
  <% end -%>
123
138
  <header param="content-header">
124
- <% if back_link -%>
125
- <a:<%= back_link %> param="parent-link">&laquo; <name/></a:<%= back_link %>>
139
+ <% if back_link -%>
140
+ <a:<%= back_link %> param="parent-link">&laquo; <ht key="<%= model_key %>.actions.back" to="<%= back_link %>"><name/></ht></a:<%= back_link %>>
126
141
  <% end -%>
127
- <h2 param="heading"><name/></h2>
142
+ <h2 param="heading">
143
+ <ht key="<%= model_key %>.show.heading" name="&this.respond_to?(:name) ? this.name : ''">
144
+ <name/>
145
+ </ht>
146
+ </h2>
128
147
  <% if boolean_fields -%>
129
148
 
130
149
  <record-flags fields="<%= boolean_fields * ', ' %>" param/>
@@ -132,16 +151,20 @@ end
132
151
  <% if creator_link -%>
133
152
 
134
153
  <a:<%= model.creator_attribute %> param="creator-link"/>
135
- <% elsif creator -%>
154
+ <% elsif creator -%>
136
155
 
137
156
  <view:get-creator param="creator-name"/>
138
157
  <% end -%>
139
158
  <% if edit_link -%>
140
159
 
141
- <a action="edit" if="&can_edit?" param="edit-link">Edit <%= model_name :title %></a>
160
+ <a action="edit" if="&can_edit?" param="edit-link">
161
+ <ht key="<%= model_key %>.actions.edit" name="&this.respond_to?(:name) ? this.name : ''">
162
+ Edit <%= model_name :title %>
163
+ </ht>
164
+ </a>
142
165
  <% end -%>
143
166
  </header>
144
-
167
+
145
168
  <section param="content-body"<%= ' with-flash-messages' if aside_collections %>>
146
169
  <% if main_content -%>
147
170
  <view:<%= main_content %> param="description"/>
@@ -151,8 +174,12 @@ end
151
174
  <% end -%>
152
175
  <% if collection -%>
153
176
  <section param="collection-section">
154
- <h3 param="collection-heading"><%= '<Your/>' if is_user_model %><%= collection.to_s.titleize %></h3>
155
-
177
+ <h3 param="collection-heading">
178
+ <ht key="<%= model_key %>.collection.heading.<%= (is_user_model ? 'your':'other') %>" >
179
+ <%= '<Your/>' if is_user_model %><%= collection.to_s.titleize %>
180
+ </ht>
181
+ </h3>
182
+
156
183
  <% if sortable_collection?(collection) -%>
157
184
  <sortable-collection:<%= collection %> param="collection"/>
158
185
  <% else -%>
@@ -160,14 +187,22 @@ end
160
187
  <% end -%>
161
188
  <% if add_link -%>
162
189
 
163
- <a:<%= collection %> action="new" if="&can_create?(@<%= model_name.underscore %>.<%= collection %>)" param="new-link">New <%= collection.to_s.singularize.titleize %></a:<%= collection %>>
190
+ <a:<%= collection %> action="new" if="&can_create?(@<%= model_name.underscore %>.<%= collection %>)" param="new-link">
191
+ <ht key="<%= collection.to_s.pluralize %>.actions.new">
192
+ New <%= collection.to_s.singularize.titleize %>
193
+ </ht>
194
+ </a:<%= collection %>>
164
195
  <% elsif add_form -%>
165
196
 
166
197
  <section param="add-to-collection" if="&can_create?(@<%= model_name.underscore %>.<%= collection %>)">
167
- <h3 param="add-form-heading">Add <%= a_or_an collection.to_s.singularize.titleize %></h3>
198
+ <h3 param="add-form-heading">
199
+ <ht key="<%= collection.to_s.pluralize %>.collection.add_form_heading">
200
+ Add <%= a_or_an collection.to_s.singularize.titleize %>
201
+ </ht>
202
+ </h3>
168
203
  <form with="&@<%= collection_class.name.underscore %> || new_for_current_user(@<%= model_name.underscore %>.<%= collection %>)" owner="<%= owner %>" without-cancel param>
169
204
  <field-list: skip="<%= owner %>"/>
170
- <submit: label="Add"/>
205
+ <submit: label="#{ht '<%= collection.to_s.pluralize %>.actions.add', :default=>['Add'] }"/>
171
206
  </form>
172
207
  </section>
173
208
  <% end -%>
@@ -176,19 +211,29 @@ end
176
211
  </section>
177
212
  <% if aside_collections -%>
178
213
  </section>
179
-
214
+
180
215
  <aside param>
181
216
  <% for refl, reverse_refl in aside_collections -%>
182
217
  <% if linkable?(refl.klass, :"index_for_#{reverse_refl.name}") -%>
183
218
  <preview-with-more:<%= refl.name %>.recent param="<%= refl.name %>-preview">
184
219
  <% if is_user_model -%>
185
- <heading:><Your with="&@<%= model_name.underscore %>"/> <%= refl.name.to_s.titleize %></heading:>
220
+ <heading:>
221
+ <ht key="hobo.undefined">
222
+ <Your with="&@<%= model_name.underscore %>"/> <%= refl.name.to_s.titleize %>
223
+ </ht>
224
+ </heading:>
186
225
  <% end -%>
187
- <more:>more</more:>
226
+ <more:>
227
+ <ht key="hobo.actions.more">more</ht>
228
+ </more:>
188
229
  </preview-with-more:<%= refl.name %>.recent>
189
230
  <% else -%>
190
231
  <section param="<%= refl.name %>-collection-section">
191
- <h3 param="<%= refl.name %>-collection-heading"><%= refl.name.to_s.titleize %></h3>
232
+ <h3 param="<%= refl.name %>-collection-heading">
233
+ <ht key="<%= refl.name.to_s.pluralize %>.collection.heading.other" >
234
+ <%= refl.name.to_s.titleize %>
235
+ </ht>
236
+ </h3>
192
237
  <collection:<%= refl.name %> param="<%= refl.name %>-collection"/>
193
238
  </section>
194
239
  <% end -%>
@@ -197,7 +242,7 @@ end
197
242
  </section-group>
198
243
  <% end -%>
199
244
  </content:>
200
-
245
+
201
246
  </page>
202
247
  </def>
203
248
 
@@ -206,21 +251,25 @@ end
206
251
  name_attribute = model.name_attribute
207
252
  -%>
208
253
  <def tag="edit-page" for="<%= model.name %>">
209
- <page merge title="Edit <%= model_name :title %>">
254
+ <page merge title="#{ht '<%= model_key %>.edit.title', :default=>['Edit <%=model_name :title %>'] }">
210
255
 
211
256
  <body: class="edit-page <%= model_class %>" param/>
212
257
 
213
258
  <content:>
214
259
  <section param="content-header">
215
- <h2 param="heading">Edit <type-name/></h2>
216
- <delete-button label="Remove This <%= model_name :title %>" param/>
260
+ <h2 param="heading">
261
+ <ht key="<%= model_key %>.edit.heading" name="&this.respond_to?(:name) ? this.name : ''">
262
+ Edit <type-name/>
263
+ </ht>
264
+ </h2>
265
+ <delete-button label="#{ht '<%= model_key %>.actions.delete', :default=>['Remove This <%= model_name :title %>']}" param/>
217
266
  </section>
218
267
 
219
268
  <section param="content-body">
220
269
  <form param/>
221
270
  </section>
222
271
  </content:>
223
-
272
+
224
273
  </page>
225
274
  </def>
226
275
 
@@ -241,33 +290,53 @@ new_link = :new.in?(actions)
241
290
  -%>
242
291
  <def tag="index-for-<%= owner.dasherize %>-page" polymorphic/>
243
292
  <def tag="index-for-<%= owner.dasherize %>-page" for="<%= model.name %>">
244
- <page merge title="<%= model_name :title, :plural %> for #{name :with => @<%= owner %>, :no_wrapper => true}">
293
+ <page merge title="#{ht '<%= model_key %>.index_for_owner.title', :default=>['<%=model_name :title, :plural %> for']} #{name :with => @<%= owner %>, :no_wrapper => true}">
245
294
  <body: class="index-for-owner-page <%= owner.dasherize %> <%= model_class %>" param/>
246
-
247
295
  <content: param>
248
296
  <header param="content-header">
249
297
  <% if linkable_owner -%>
250
- <div param="back-to">Back to <a with="&@<%= owner %>"/></div>
298
+ <div param="back-to">
299
+ <ht key="hobo.actions.back">Back to</ht> <a with="&@<%= owner %>"/>
300
+ </div>
251
301
  <% end -%>
252
302
  <% if owner_is_user %>
253
- <h2 param="heading"><Your with="&@<%= owner %>"/> <%= model_name :title, :plural %></h2>
303
+ <h2 param="heading">
304
+ <ht key="<%= model_key %>.index_for_owner.heading.your">
305
+ <Your with="&@<%= owner %>"/> <%= model_name :title, :plural %>
306
+ </ht>
307
+ </h2>
254
308
  <% else -%>
255
- <h2 param="heading"><%= model_name :title, :plural %></h2>
256
- <h3 param="subheading">For: <<%= owner_tag %> with="&@<%= owner %>"/></h3>
309
+ <h2 param="heading">
310
+ <ht key="<%= model_key %>.index_for_owner.heading.other">
311
+ <%= model_name :title, :plural %>
312
+ </ht>
313
+ </h2>
314
+ <h3 param="subheading">
315
+ <ht key="<%= model_key %>.index_for_owner.subheading">
316
+ For:
317
+ </ht>
318
+ <<%= owner_tag %> with="&@<%= owner %>"/>
319
+ </h3>
257
320
  <% end -%>
258
- <p param="count" if>There <count prefix="are"/></p>
321
+ <p param="count" if>
322
+ <ht key="<%= model_key %>.collection.count" count="&this.size">
323
+ There <count prefix="are"/>
324
+ </ht>
325
+ </p>
259
326
  </header>
260
-
327
+
261
328
  <section param="content-body">
262
329
  <% if new_link -%>
330
+ <a action="new" to="&model" param="new-link">
331
+ <ht key="<%= model_key %>.actions.new" >New <%=model_name :title %></ht>
332
+ </a>
263
333
 
264
- <a action="new" to="&model" param="new-link"/>
265
334
  <% end -%>
266
335
 
267
336
  <page-nav param="top-page-nav"/>
268
-
337
+
269
338
  <collection param/>
270
-
339
+
271
340
  <page-nav param="bottom-page-nav"/>
272
341
  </section>
273
342
  </content:>
@@ -279,20 +348,28 @@ new_link = :new.in?(actions)
279
348
  <% if :new.in? actions -%>
280
349
  <def tag="new-for-<%= owner.dasherize %>-page" polymorphic/>
281
350
  <def tag="new-for-<%= owner.dasherize %>-page" for="<%= model.name %>">
282
- <page merge title="New <%= model_name :title %> for #{name :with => @<%= owner %>}">
283
-
351
+ <page merge title="#{ht '<%=model_key %>.new_for_owner.title', :default=>['New <%=model_name :title %> for']} #{name :with => @<%= owner %>}">
284
352
  <body: class="new-for-owner-page <% owner.dasherize %> <%= model_class %>" param/>
285
-
353
+
286
354
  <content: param>
287
355
  <header param="content-header">
288
- <h2 param="heading">New <%= collection_name.singularize.titleize %></h2>
289
- <h3 param="subheading">For: <<%= owner_tag %> with="&@<%= owner %>"/></h3>
356
+ <h2 param="heading">
357
+ <ht key="<%= model_key %>.new_for_owner.heading">
358
+ New <%= collection_name.singularize.titleize %>
359
+ </ht>
360
+ </h2>
361
+ <h3 param="subheading">
362
+ <ht key="<%= model_key %>.new_for_owner.subheading">
363
+ For:
364
+ </ht>
365
+ <<%= owner_tag %> with="&@<%= owner %>"/>
366
+ </h3>
290
367
  </header>
291
-
368
+
292
369
  <section param="content-body">
293
370
  <form owner="<%= owner %>" method="post" param>
294
371
  <field-list: skip="<%= owner %>"/>
295
- <submit: label="Create <%= model_name :title %>"/>
372
+ <submit: label="#{ht '<%=model_key %>.actions.create', :default=>['Create <%= model_name :title %>']}"/>
296
373
  </form>
297
374
  </section>
298
375
  </content:>
@@ -305,14 +382,18 @@ new_link = :new.in?(actions)
305
382
  <% creator_names.each do |creator| -%>
306
383
  <def tag="<%= creator.dasherize %>-page" polymorphic/>
307
384
  <def tag="<%= creator.dasherize %>-page" for="<%= model.name %>">
308
-
309
- <page title="<%= creator.titleize %>" merge>
385
+
386
+ <page title="#{ht '<%=model_key %>.<%= creator.underscore %>.title', :default=>['<%= creator.titleize %>']}" merge>
310
387
 
311
388
  <body: class="lifecycle-start-page <%= creator.dasherize %>-page" param/>
312
389
 
313
390
  <content: param>
314
391
  <header param="content-header">
315
- <h2 param="heading"><%= creator.titleize %></h2>
392
+ <h2 param="heading">
393
+ <ht key="<%= model_key %>.<%= creator.underscore %>.heading">
394
+ <%= creator.titleize %>
395
+ </ht>
396
+ </h2>
316
397
  </header>
317
398
 
318
399
  <section param="content-body">
@@ -327,20 +408,24 @@ new_link = :new.in?(actions)
327
408
  <% transition_names.each do |transition| -%>
328
409
  <def tag="<%= transition.dasherize %>-page" polymorphic/>
329
410
  <def tag="<%= transition.dasherize %>-page" for="<%= model.name %>">
330
- <page title="<%= transition.titleize %>" merge>
331
-
411
+ <page title="#{ht '<%=model_key %>.<%= transition.underscore %>.title', :default=>['<%= transition.titleize %>']}" merge>
412
+
332
413
  <body: class="lifecycle-transition-page <%= transition.dasherize -%>-page" param/>
333
-
414
+
334
415
  <content:>
335
416
  <header param="content-header">
336
- <h2 param="heading"><%= transition.titleize %></h2>
417
+ <h2 param="heading">
418
+ <ht key="<%= model_key %>.<%= transition.underscore %>.heading">
419
+ <%= transition.titleize %>
420
+ </ht>
421
+ </h2>
337
422
  </header>
338
-
423
+
339
424
  <section param="content-body">
340
425
  <<%= transition.dasherize %>-form param="form"/>
341
426
  </section>
342
427
  </content:>
343
-
428
+
344
429
  </page>
345
430
  </def>
346
431