hobo 0.5.3

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 (125) hide show
  1. data/LICENSE.txt +22 -0
  2. data/README.txt +18 -0
  3. data/bin/hobo +81 -0
  4. data/hobo_files/plugin/CHANGES.txt +963 -0
  5. data/hobo_files/plugin/LICENSE.txt +22 -0
  6. data/hobo_files/plugin/README +4 -0
  7. data/hobo_files/plugin/Rakefile +11 -0
  8. data/hobo_files/plugin/generators/hobo/hobo_generator.rb +37 -0
  9. data/hobo_files/plugin/generators/hobo/templates/application.dryml +2 -0
  10. data/hobo_files/plugin/generators/hobo/templates/guest.rb +31 -0
  11. data/hobo_files/plugin/generators/hobo_front_controller/USAGE +11 -0
  12. data/hobo_files/plugin/generators/hobo_front_controller/hobo_front_controller_generator.rb +90 -0
  13. data/hobo_files/plugin/generators/hobo_front_controller/templates/controller.rb +51 -0
  14. data/hobo_files/plugin/generators/hobo_front_controller/templates/functional_test.rb +18 -0
  15. data/hobo_files/plugin/generators/hobo_front_controller/templates/helper.rb +2 -0
  16. data/hobo_files/plugin/generators/hobo_front_controller/templates/index.dryml +43 -0
  17. data/hobo_files/plugin/generators/hobo_front_controller/templates/login.dryml +44 -0
  18. data/hobo_files/plugin/generators/hobo_front_controller/templates/search.dryml +18 -0
  19. data/hobo_files/plugin/generators/hobo_front_controller/templates/signup.dryml +45 -0
  20. data/hobo_files/plugin/generators/hobo_model/USAGE +26 -0
  21. data/hobo_files/plugin/generators/hobo_model/hobo_model_generator.rb +38 -0
  22. data/hobo_files/plugin/generators/hobo_model/templates/fixtures.yml +11 -0
  23. data/hobo_files/plugin/generators/hobo_model/templates/migration.rb +13 -0
  24. data/hobo_files/plugin/generators/hobo_model/templates/model.rb +24 -0
  25. data/hobo_files/plugin/generators/hobo_model/templates/unit_test.rb +10 -0
  26. data/hobo_files/plugin/generators/hobo_model_controller/USAGE +30 -0
  27. data/hobo_files/plugin/generators/hobo_model_controller/hobo_model_controller_generator.rb +43 -0
  28. data/hobo_files/plugin/generators/hobo_model_controller/templates/controller.rb +5 -0
  29. data/hobo_files/plugin/generators/hobo_model_controller/templates/functional_test.rb +18 -0
  30. data/hobo_files/plugin/generators/hobo_model_controller/templates/helper.rb +2 -0
  31. data/hobo_files/plugin/generators/hobo_model_controller/templates/view.rhtml +2 -0
  32. data/hobo_files/plugin/generators/hobo_rapid/hobo_rapid_generator.rb +51 -0
  33. data/hobo_files/plugin/generators/hobo_rapid/templates/hobo_rapid.js +436 -0
  34. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/default_mapping.rb +11 -0
  35. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/banner.gif +0 -0
  36. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_bodytop.gif +0 -0
  37. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_01.gif +0 -0
  38. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_02.gif +0 -0
  39. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_03.gif +0 -0
  40. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_corner_04.gif +0 -0
  41. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_bottom.gif +0 -0
  42. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_left.gif +0 -0
  43. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_right.gif +0 -0
  44. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/bkg_shadow_top.gif +0 -0
  45. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_blue.gif +0 -0
  46. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_dblue.gif +0 -0
  47. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_green.gif +0 -0
  48. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_purple.gif +0 -0
  49. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/header_red.gif +0 -0
  50. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/logo.gif +0 -0
  51. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/spinner.gif +0 -0
  52. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_dblue.gif +0 -0
  53. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_green.gif +0 -0
  54. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_purple.gif +0 -0
  55. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/txt_list_img_red.gif +0 -0
  56. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_01.gif +0 -0
  57. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_02.gif +0 -0
  58. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_03.gif +0 -0
  59. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_corner_04.gif +0 -0
  60. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_bottom.gif +0 -0
  61. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_left.gif +0 -0
  62. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_right.gif +0 -0
  63. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/images/window_shadow_top.gif +0 -0
  64. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/public/stylesheets/application.css +390 -0
  65. data/hobo_files/plugin/generators/hobo_rapid/templates/themes/default/views/application.dryml +104 -0
  66. data/hobo_files/plugin/generators/hobo_user_model/USAGE +26 -0
  67. data/hobo_files/plugin/generators/hobo_user_model/hobo_user_model_generator.rb +38 -0
  68. data/hobo_files/plugin/generators/hobo_user_model/templates/fixtures.yml +11 -0
  69. data/hobo_files/plugin/generators/hobo_user_model/templates/migration.rb +15 -0
  70. data/hobo_files/plugin/generators/hobo_user_model/templates/model.rb +58 -0
  71. data/hobo_files/plugin/generators/hobo_user_model/templates/unit_test.rb +10 -0
  72. data/hobo_files/plugin/init.rb +44 -0
  73. data/hobo_files/plugin/lib/action_view_extensions/base.rb +14 -0
  74. data/hobo_files/plugin/lib/active_record/has_many_association.rb +54 -0
  75. data/hobo_files/plugin/lib/active_record/has_many_through_association.rb +22 -0
  76. data/hobo_files/plugin/lib/active_record/table_definition.rb +34 -0
  77. data/hobo_files/plugin/lib/extensions.rb +245 -0
  78. data/hobo_files/plugin/lib/extensions/test_case.rb +130 -0
  79. data/hobo_files/plugin/lib/hobo.rb +353 -0
  80. data/hobo_files/plugin/lib/hobo/HtmlString +3 -0
  81. data/hobo_files/plugin/lib/hobo/authenticated_user.rb +106 -0
  82. data/hobo_files/plugin/lib/hobo/authentication_support.rb +108 -0
  83. data/hobo_files/plugin/lib/hobo/composite_model.rb +66 -0
  84. data/hobo_files/plugin/lib/hobo/controller.rb +134 -0
  85. data/hobo_files/plugin/lib/hobo/controller_helpers.rb +135 -0
  86. data/hobo_files/plugin/lib/hobo/core.rb +475 -0
  87. data/hobo_files/plugin/lib/hobo/define_tags.rb +56 -0
  88. data/hobo_files/plugin/lib/hobo/dryml.rb +161 -0
  89. data/hobo_files/plugin/lib/hobo/dryml/dryml_builder.rb +126 -0
  90. data/hobo_files/plugin/lib/hobo/dryml/tag_module.rb +9 -0
  91. data/hobo_files/plugin/lib/hobo/dryml/taglib.rb +57 -0
  92. data/hobo_files/plugin/lib/hobo/dryml/template.rb +586 -0
  93. data/hobo_files/plugin/lib/hobo/dryml/template_environment.rb +302 -0
  94. data/hobo_files/plugin/lib/hobo/dryml/template_handler.rb +19 -0
  95. data/hobo_files/plugin/lib/hobo/generator.rb +25 -0
  96. data/hobo_files/plugin/lib/hobo/html_string.rb +3 -0
  97. data/hobo_files/plugin/lib/hobo/lazy_hash.rb +28 -0
  98. data/hobo_files/plugin/lib/hobo/mapping_tags.rb +262 -0
  99. data/hobo_files/plugin/lib/hobo/markdown_string.rb +7 -0
  100. data/hobo_files/plugin/lib/hobo/model.rb +391 -0
  101. data/hobo_files/plugin/lib/hobo/model_controller.rb +676 -0
  102. data/hobo_files/plugin/lib/hobo/model_queries.rb +92 -0
  103. data/hobo_files/plugin/lib/hobo/model_support.rb +44 -0
  104. data/hobo_files/plugin/lib/hobo/password_string.rb +3 -0
  105. data/hobo_files/plugin/lib/hobo/predicate_dispatch.rb +78 -0
  106. data/hobo_files/plugin/lib/hobo/proc_binding.rb +32 -0
  107. data/hobo_files/plugin/lib/hobo/rapid.rb +447 -0
  108. data/hobo_files/plugin/lib/hobo/static_tags +92 -0
  109. data/hobo_files/plugin/lib/hobo/text.rb +3 -0
  110. data/hobo_files/plugin/lib/hobo/textile_string.rb +13 -0
  111. data/hobo_files/plugin/lib/hobo/undefined.rb +41 -0
  112. data/hobo_files/plugin/lib/hobo/undefined_access_error.rb +5 -0
  113. data/hobo_files/plugin/lib/hobo/where_fragment.rb +23 -0
  114. data/hobo_files/plugin/lib/rexml.rb +345 -0
  115. data/hobo_files/plugin/tags/core.dryml +6 -0
  116. data/hobo_files/plugin/tags/rapid.dryml +177 -0
  117. data/hobo_files/plugin/tags/rapid_editing.dryml +168 -0
  118. data/hobo_files/plugin/tags/rapid_navigation.dryml +95 -0
  119. data/hobo_files/plugin/tags/rapid_pages.dryml +175 -0
  120. data/hobo_files/plugin/tasks/environments.rake +19 -0
  121. data/hobo_files/plugin/tasks/hobo_tasks.rake +4 -0
  122. data/hobo_files/plugin/test/hobo_dryml_template_test.rb +7 -0
  123. data/hobo_files/plugin/test/hobo_test.rb +7 -0
  124. data/hobo_files/plugin/uninstall.rb +1 -0
  125. metadata +206 -0
@@ -0,0 +1,6 @@
1
+ <taglib module="Hobo::Core"/>
2
+
3
+ <def tag="theme_stylesheet">
4
+ <link href="<%= urlb %>/hobothemes/<%= Hobo.current_theme %>/stylesheets/application.css"
5
+ media="screen" rel="Stylesheet" type="text/css" />
6
+ </def>
@@ -0,0 +1,177 @@
1
+ <taglib module="Hobo::Rapid"/>
2
+
3
+ <taglib src="rapid_pages"/>
4
+ <taglib src="rapid_editing"/>
5
+ <taglib src="rapid_navigation"/>
6
+
7
+ <def tag="clearer"><div class='clearer'>&nbsp;</div></def>
8
+
9
+ <def tag="object_table" attrs="fields, skip, associations">
10
+ <% field_inner_tag_options, options = options.partition_hash {|k,v| k.to_s =~ /_label$|_editor$/ }
11
+ inner_tag_options.merge!(field_inner_tag_options)
12
+ fields = if fields.nil?
13
+ this.class.content_columns.every(:name) - %w{created_at updated_at}
14
+ else
15
+ comma_split(fields)
16
+ end
17
+ fields -= comma_split(skip) if skip
18
+ associations = if associations == '*'
19
+ this.class.reflections.values.every(:name)
20
+ elsif associations == 'belongs_to'
21
+ this.class.reflections.values.oselect{macro == :belongs_to}.every(:name)
22
+ else
23
+ comma_split(associations)
24
+ end
25
+ associations -= comma_split(skip) if skip
26
+ options = add_classes(options, "object_table", ("new_record" if this.new_record?))
27
+ # force load
28
+ Hobo.models
29
+ %>
30
+ <table xattrs="">
31
+ <if q="#this.new_record? && 'type'.in?(this.class.column_names) && !this.class.send(:subclasses).empty?">
32
+ <tr>
33
+ <td class="field_label">Type:</td>
34
+ <td><sti_type_field/></td>
35
+ </tr>
36
+ </if>
37
+
38
+
39
+ <% for field in fields.select{|f| can_view?(this, f)} %>
40
+ <tr>
41
+ <td class="field_label" content_option="#field + '_label'"><%= no_break(field.titleize) %>:</td>
42
+ <td><edit attr="#field" replace_option="#field + '_editor'"/></td>
43
+ </tr>
44
+ <% end %>
45
+
46
+ <% for field in associations.select{|f| can_view?(this, f)} %>
47
+ <tr>
48
+ <td class="field_label" content_option="#field.to_s + '_label'"><%= no_break(field.to_s.titleize) %>:</td>
49
+ <td><edit attr="#field" replace_option="#field.to_s + '_editor'"/></td>
50
+ </tr>
51
+ <% end %>
52
+
53
+ <tagbody/>
54
+
55
+ </table>
56
+ </def>
57
+
58
+
59
+ <def tag="has_many_table" attrs="part_id, delete_buttons, headings, id">
60
+ <table_for headings="#headings" xattrs="">
61
+ <:empty>
62
+ <p>There are no <%= this_type.klass.name.titleize.pluralize.downcase %></p>
63
+ </:empty>
64
+
65
+ <tagbody/>
66
+
67
+ <if q="#delete_buttons != false and can_delete?(this)">
68
+ <td><delete_button/></td>
69
+ </if>
70
+ </table_for>
71
+ <div>
72
+ <create_button update="#id || part_id"/>
73
+ </div>
74
+ </def>
75
+
76
+
77
+ <def tag="ul_for" attrs="else">
78
+ <if q="#this.empty? and else_">
79
+ <%= else_ %>
80
+ </if>
81
+ <else>
82
+ <ul xattrs="">
83
+ <% even_odd = "odd" %>
84
+ <repeat>
85
+ <if_can_view>
86
+ <li class="<%= even_odd %> <%= this_type.name.underscore %>" hobo_model_id="<%= dom_id this %>">
87
+ <%= tagbody.nil? ? object_link : tagbody.call %>
88
+ </li>
89
+ </if_can_view>
90
+ <% even_odd = even_odd == "even" ? "odd" : "even" %>
91
+ </repeat>
92
+ </ul>
93
+ </else>
94
+ </def>
95
+
96
+
97
+ <def tag="table_for" attrs="headings, row_class, footer, else">
98
+ <if q="#this.empty? and else_">
99
+ <%= else_ %>
100
+ </if>
101
+ <else>
102
+ <table xattrs="">
103
+ <if q="#headings"><tr><%= headings %></tr></if>
104
+ <% even_odd = "odd" %>
105
+ <repeat>
106
+ <if_can_view>
107
+ <tr class="<%= even_odd %> <%= row_class %> <%= this_type.name.underscore %>"
108
+ hobo_model_id="<%= dom_id(this) %>">
109
+ <%= tagbody && tagbody.call %>
110
+ </tr>
111
+ <% even_odd = even_odd == "even" ? "odd" : "even" %>
112
+ </if_can_view>
113
+ </repeat>
114
+ <%= footer %>
115
+ </table>
116
+ </else>
117
+ </def>
118
+
119
+
120
+ <def tag="add_by_name" attrs="action_name, add_text, update, part_id">
121
+ <% add_to = this
122
+ refl = this_type
123
+ joins = this_parent.send(refl.through_reflection.name)
124
+ add_name = refl.klass.name.titleize
125
+ action_name ||= "Add #{add_name}"
126
+ add_text ||= "To #{action_name.downcase} #{a_or_an add_name.downcase}, " +
127
+ "enter its name"
128
+ source = refl.source_reflection.name
129
+ %>
130
+ <tagbody obj="#joins"/>
131
+ <with obj="#joins.new_without_appending">
132
+ <if_can_create>
133
+ <object_form update="#[update, part_id]" message="#action_name" hidden_fields="*">
134
+ <p>
135
+ <%= add_text %>:
136
+ <belongs_to_autocompleting_field attr="#source" where_not_in="#dom_id(add_to)" class="autosubmit"/>
137
+ </p>
138
+ </object_form>
139
+ </if_can_create>
140
+ </with>
141
+ </def>
142
+
143
+
144
+ <def tag="spinner">
145
+ <img src="<%= urlb %>/hobothemes/<%= Hobo.current_theme %>/images/spinner.gif" class="hidden" xattrs=""/>
146
+ </def>
147
+
148
+
149
+ <def tag="image" attrs="src">
150
+ <img src="<%= urlb %>/images/<%= src %>" xattrs=""/>
151
+ </def>
152
+
153
+
154
+ <def tag="theme_img" attrs="src">
155
+ <img src="<%= theme_asset('images/' + src)%>" xattrs=""/>
156
+ </def>
157
+
158
+
159
+ <def tag="search_result">
160
+ <div class='search_result'>
161
+ <human_type/>: <object_link/>
162
+ </div>
163
+ </def>
164
+
165
+
166
+ <def tag="object_card">
167
+ <div class="object_card">
168
+ <object_link/>
169
+ </div>
170
+ </def>
171
+
172
+
173
+ <def tag="section_if">
174
+ <% body = tagbody.call %>
175
+ <%= body.blank? ? "" : section{body} %>
176
+ </def>
177
+
@@ -0,0 +1,168 @@
1
+
2
+ <def tag="submit" attrs="label">
3
+ <input type="submit" value="<%= label %>" xattrs="" class="button_input submit_button"/>
4
+ </def>
5
+
6
+
7
+ <def tag="autocompleter" attrs="completer_model, completer_attr, id, filter, name, value">
8
+ <% refl = this_type
9
+ if refl.respond_to?(:macro) && refl.macro == :belongs_to
10
+ completer_model ||= refl.klass
11
+ completer_attr ||= refl.klass.id_name_column
12
+ else
13
+ completer_model = completer_model.constantize if completer_model.is_a? String
14
+ end
15
+ id ||= this_field_dom_id + "_completer"
16
+ url = object_url(completer_model, "completions",
17
+ { :for => completer_attr },
18
+ options.select_hash {|k,v| k.to_s.starts_with? "where_"})
19
+ %>
20
+ <input type="text" name="<%= name %>" id="<%= id %>" class="autocomplete_bhv"
21
+ autocomplete_url="<%= url %>" value="<%= value %>"
22
+ xattrs=""/>
23
+ <div id="<%= id %>_completions" class="completions_popup" style="display:none"></div>
24
+ </def>
25
+
26
+
27
+ <def tag="belongs_to_menu_field"><%
28
+ raise HoboError.new("Not allowed to edit") unless can_edit_this?
29
+ #Todo: switch to autocompleter for id_name when too many records, and id_name supported
30
+ select_options = this_type.klass.find(:all).select {|x| can_view?(x)}.map { |x|
31
+ [ display_name(:obj => x, :no_span => true), x.id ]
32
+ }
33
+ select_options.insert(0, ["(No #{this_type.name.to_s.titleize})", ""]) if this.nil?
34
+ %>
35
+ <select name="<%= param_name_for_this(true) %>">
36
+ <%= options_for_select(select_options.sort, this ? this.id : "") %>
37
+ </select>
38
+ </def>
39
+
40
+
41
+ <def tag="belongs_to_menu_editor"><%
42
+ raise HoboError.new("Not allowed to edit") unless can_edit_this?
43
+ link_id = "#{this_field_dom_id}_editor" %>
44
+ <span id="#link_id" part_id="rapid_belongs_to_edit">
45
+ <% select_options = this_type.klass.find(:all).select {|x| can_view?(x)}.map {|x|
46
+ [ display_name(:obj => x, :no_span => true), x.id ]
47
+ }
48
+ select_options.insert(0, ["(No #{this_type.name.to_s.titleize})", ""]) if this.nil?
49
+ link_id = "#{this_field_dom_id}_editor"
50
+ f = ajax_updater(object_url(this_parent),
51
+ "Change #{this_field.to_s.titleize}", [link_id],
52
+ :method => "put",
53
+ :params => { this_parent.class.name.underscore => {
54
+ this_type.primary_key_name => Hobo.raw_js('this.value')
55
+ } })
56
+ %>
57
+ <select onchange="<%= f %>" id="#link_id">
58
+ <%= options_for_select(select_options.sort, this ? this.id : "") %>
59
+ </select>
60
+ <if_this><object_link>View</object_link></if_this>
61
+ </span>
62
+ </def>
63
+
64
+
65
+ <def tag="belongs_to_autocompleting_field">
66
+ <% refl = this_type
67
+ completer_model ||= refl.klass
68
+ completer_attr ||= refl.klass.id_name_column
69
+ id ||= this_field_dom_id + "_completer"
70
+ where_options = options.select_hash {|k,v| k.to_s.starts_with? "where_"}
71
+ url = object_url(completer_model, :completions, { :for => completer_attr }.update(where_options))
72
+ %>
73
+
74
+ <input type="text" id="<%= id %>" class="autocomplete_bhv" autocomplete_url="<%= url %>"
75
+ name="<%= param_name_for_this %>" xattrs=""/>
76
+ <div id="<%= id %>_completions" class="completions_popup" style="display:none"></div>
77
+ </def>
78
+
79
+
80
+ <def tag="belongs_to_autocompleting_editor" attrs="update">
81
+ <if_can_edit><%
82
+ return object_link unless can_edit_this?
83
+
84
+ id ||= this_field_dom_id + "_completer"
85
+ f = ajax_updater(object_url(this_parent),
86
+ "Change #{this_field.to_s.titleize}", update,
87
+ :method => "put",
88
+ :params => { this_parent.class.name.underscore => {
89
+ this_field => Hobo.raw_js("$('#{id}').value")
90
+ } })
91
+ refl = this_type
92
+ completer_model ||= refl.klass
93
+ completer_attr ||= refl.klass.id_name_column
94
+ url = object_url(completer_model, "completions",
95
+ { :for => completer_attr },
96
+ options.select_hash {|k,v| k.to_s.starts_with? "where_"})
97
+ %>
98
+ <form onsubmit="<%= f %>; $('<%= id %>').blur(); return false">
99
+ <input type="text" class="autocomplete_bhv autosubmit" id="<%= id %>" autocomplete_url="<%= url %>"
100
+ value="<%= this && this.id_name %>" xattrs="" />
101
+ <div id="<%= id %>_completions" class="completions_popup" style="display:none"></div>
102
+ </form>
103
+ </if_can_edit>
104
+ <else>
105
+ <object_link/>
106
+ </else>
107
+ </def>
108
+
109
+
110
+ <def tag="boolean_checkbox_editor" attrs="update"><%
111
+ raise HoboError.new("Not allowed to edit") unless can_edit_this?
112
+ f = ajax_updater(object_url(this_parent),
113
+ "Change #{this_field.to_s.titleize}", update,
114
+ :method => "put",
115
+ :params => { this_parent.class.name.underscore => {
116
+ this_field => Hobo.raw_js('this.checked')
117
+ } })
118
+ options = add_classes(options, editor_class)
119
+ %>
120
+ <input type="checkbox" value="1" onchange="<%= f %>"
121
+ xattrs="# this ? options.merge(:checked => 'checked') : options" />
122
+ </def>
123
+
124
+
125
+ <def tag="sti_type_field">
126
+ <select name="<%= param_name_for(form_this, form_field_path + ['type']) %>">
127
+ <%= options_for_select(this.class.send(:subclasses).omap{[name.titleize, name]}, this.class.name) %>
128
+ </select>
129
+ </def>
130
+
131
+
132
+ <def tag="sti_type_editor" attrs="update">
133
+ <% base_class = this.class
134
+ base_class = base_class.superclass while base_class.superclass != ActiveRecord::Base
135
+ f = ajax_updater("#{urlb}/#{controller_for base_class}/#{this.id}",
136
+ "Change #{this_field.to_s.titleize}", update,
137
+ :method => "put",
138
+ :params => { base_class.name.underscore => {
139
+ "type" => Hobo.raw_js('this.value')
140
+ } })
141
+ %>
142
+
143
+ <select onchange="<%= f %>">
144
+ <if q="#tagbody">
145
+ <tagbody/>
146
+ </if>
147
+ <else>
148
+ <%= options_for_select(base_class.send(:subclasses).omap{[name.titleize, name]}, this.class.name) %>
149
+ </else>
150
+ </select>
151
+ </def>
152
+
153
+
154
+ <def tag="integer_select_editor" attrs="min, max, update, nil_option, message">
155
+ <select class="number_editor_bhv" hobo_update="<%= update %>"
156
+ hobo_model_id="<%= this_field_dom_id %>"
157
+ xattrs="#message ? options.merge(:hobo_message => message) : options">
158
+ <if q="#this.nil?"><option value=""><%= nil_option || "Choose a value" %></option></if>
159
+ <%= options_for_select((min.to_i..max.to_i).to_a, this) %>
160
+ </select>
161
+ </def>
162
+
163
+
164
+ <def tag="select_field">
165
+ <select name="<%= param_name_for_this %>">
166
+ <tagbody/>
167
+ </select>
168
+ </def>
@@ -0,0 +1,95 @@
1
+ <!-- Navigation
2
+ Main nav bar, account nav bar (login, signup...), page nav
3
+ -->
4
+
5
+
6
+ <def tag="navigation" attrs="current, item, link_current">
7
+ <nav_container xattrs="">
8
+ <repeat obj="#item">
9
+ <% c = this[:content]; klass = c == current ? "current" : "" %>
10
+ <if q="#!link_current && c == current">
11
+ <nav_item class="#klass" content_option="li"><%= c %></nav_item>
12
+ </if>
13
+ <else>
14
+ <nav_item content_option="item_el" class="#klass">
15
+ <a href="#this[:href]" content_option="link"><%= c %></a>
16
+ </nav_item>
17
+ </else>
18
+ </repeat>
19
+ <tagbody/>
20
+ </nav_container>
21
+ </def>
22
+
23
+
24
+ <def tag="nav_container"><ul xattrs=""><tagbody/></ul></def>
25
+
26
+
27
+ <def tag="nav_item"><li xattrs=""><tagbody/></li></def>
28
+
29
+
30
+ <def tag="application_account_nav">
31
+ <if q="#logged_in?">
32
+ <div class='nav_item'>Logged in as <%= h current_user.login %></div>
33
+ <div class='nav_item'><a href="<%= logout_url%>">Log out</a></div>
34
+ </if>
35
+ <else>
36
+ <div class='nav_item'><a href="<%= login_url%>">Log in</a></div>
37
+ <if q="#signup_url"> <div class='nav_item'><a href="<%= signup_url%>">Sign up</a></div> </if>
38
+ </else>
39
+ </def>
40
+
41
+
42
+ <def tag="previous_page_link" attrs="query_params">
43
+ <% opts = { :page => @pages.current.previous }.merge(query_params || {}) %>
44
+ <%= link_to(tagbody ? tagbody.call : '&laquo; Previous page', opts) if @pages and @pages.current.previous %>
45
+ </def>
46
+
47
+
48
+ <def tag="next_page_link" attrs="query_params">
49
+ <% opts = { :page => @pages.current.next }.merge(query_params || {}) %>
50
+ <%= link_to(tagbody ? tagbody.call : 'Next page &raquo;', opts) if @pages and @pages.current.next %>
51
+ </def>
52
+
53
+
54
+ <def tag="first_page_link" attrs="query_params">
55
+ <% opts = { :page => @pages.first }.merge(query_params || {}) %>
56
+ <%= link_to(tagbody ? tagbody.call : '&laquo; First page', opts) if @pages and @pages.current != @pages.first %>
57
+ </def>
58
+
59
+
60
+ <def tag="last_page_link" attrs="query_params">
61
+ <% opts = { :page => @pages.last }.merge(query_params || {}) %>
62
+ <%= link_to(tagbody ? tagbody.call : '&laquo; Last page', opts) if @pages and @pages.current != @pages.last %>
63
+ </def>
64
+
65
+
66
+ <def tag="page_n_of_count">
67
+ Page <%= @pages.current_page.number %> of <%= @pages.length %>
68
+ </def>
69
+
70
+
71
+ <def tag="page_nav" attrs="query_params">
72
+ <if q="#@pages.length > 1">
73
+ <p>
74
+ <page_n_of_count/> -
75
+ <first_page_link query_params="#query_params">|&lt;</first_page_link>
76
+ <previous_page_link query_params="#query_params">Previous</previous_page_link>
77
+ <next_page_link query_params="#query_params">Next</next_page_link>
78
+ <last_page_link query_params="#query_params">&gt|</last_page_link>
79
+ </p>
80
+ </if>
81
+ </def>
82
+
83
+ <def tag="link_to_resource" attrs="type">
84
+ <%= link_to type, self.send("formatted_#{model.to_s.downcase}_url", this, type.downcase) %>
85
+ </def>
86
+
87
+ <def tag="link_to_resources" attrs="types">
88
+ <ul class="resource_list">
89
+ <% comma_split(types).each do |t| %>
90
+ <li class="<%= t.downcase %>_resource">
91
+ <link_to_resource type="#t" />
92
+ </li>
93
+ <% end %>
94
+ </ul>
95
+ </def>
@@ -0,0 +1,175 @@
1
+ <def tag="page" attrs="title_prefix, title">
2
+ <%= '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">' %>
3
+ <html>
4
+ <head>
5
+ <title><%= title_prefix %><%= title || human_type + ": " + display_name %></title>
6
+ <%= stylesheet_link_tag 'application' %>
7
+ <%= javascript_include_tag :defaults %>
8
+ <hobo_rapid_javascripts replace_option="rapid_javascripts" tiny_mce="#true"/>
9
+ </head>
10
+ <body onload="Hobo.applyEvents();" content_option="body">
11
+ <div content_option="header"/>
12
+ <div content_option="intro"/>
13
+ <div content_option="main"/>
14
+ <div content_option="footer"/>
15
+ </body>
16
+ </html>
17
+ </def>
18
+
19
+
20
+ <def tag="index_page">
21
+ <% model_name = @model.name.titleize %>
22
+ <page title="All #{model_name.pluralize}" xattrs="">
23
+
24
+ <:intro>
25
+ <h1><%= model_name.pluralize %></h1>
26
+ </:intro>
27
+
28
+ <:main>
29
+ <panel replace_option="main_panel">
30
+ <h2 replace_option="panel_heading"><count label="#model_name"/></h2>
31
+ <section>
32
+ <table_for replace_option="table">
33
+ <td><object_link/></td><td><delete_button class='text'/></td>
34
+ </table_for>
35
+ </section>
36
+
37
+ <if q="#@pages.length > 1">
38
+ <section replace_option="page_nav">
39
+ <div class="page_links">
40
+ <page_nav/>
41
+ </div>
42
+ </section>
43
+ </if>
44
+
45
+ <section_if replace_option="new_link">
46
+ <p><new_object_link for="#@model"/></p>
47
+ </section_if>
48
+ </panel>
49
+ </:main>
50
+ </page>
51
+ </def>
52
+
53
+
54
+ <def tag="new_page">
55
+ <page title="New #{human_type}" xattrs="">
56
+ <:intro>
57
+ <h1>New <human_type/></h1>
58
+ </:intro>
59
+
60
+ <:main>
61
+ <panel replace_option="main_panel">
62
+ <h2 replace_option="pannel_heading">Details</h2>
63
+ <section>
64
+ <div class="error_messages" replace_option="error_messages">
65
+ <%= error_messages_for 'this' %>
66
+ </div>
67
+
68
+ <object_form hidden_fields="*">
69
+ <object_table associations="belongs_to" replace_option="fields"/>
70
+ <submit label="Create" class="create_button" replace_option="submit_button"/>
71
+ </object_form>
72
+ </section>
73
+ </panel>
74
+ </:main>
75
+
76
+ </page>
77
+ </def>
78
+
79
+
80
+ <def tag="show_page">
81
+ <% has_many_assocs = this.class.reflections.values.map do |refl|
82
+ this.send(refl.name) if Hobo.simple_has_many_association?(refl)
83
+ end.compact
84
+ %>
85
+ <page xattrs="">
86
+
87
+ <:intro>
88
+ <h1><human_type/><if q="#this.respond_to? :name">: <edit attr="name"/></if></h1>
89
+ <p><delete_button ajax="#false"/></p>
90
+ </:intro>
91
+
92
+ <:main>
93
+ <panel replace_option="main_panel">
94
+ <h2 replace_option="panel_heading">Details</h2>
95
+ <section>
96
+ <object_table associations="*" skip_fields="name" replace_option="fields"/>
97
+ </section>
98
+
99
+ <section_if replace_option="new_links">
100
+ <repeat obj="#has_many_assocs">
101
+ <p><new_object_link/></p>
102
+ </repeat>
103
+ </section_if>
104
+ </panel>
105
+ </:main>
106
+
107
+ </page>
108
+ </def>
109
+
110
+
111
+ <def tag="new_in_collection_page">
112
+ <page title="New #{human_type}" xattrs="">
113
+
114
+ <:intro>
115
+ <h1>New <human_type/></h1>
116
+ <h2>For: <object_link obj="#@owner" /></h2>
117
+ </:intro>
118
+
119
+ <:main>
120
+ <panel replace_option="main_panel">
121
+ <h2 replace_option="panel_heading">Details</h2>
122
+ <section>
123
+ <div class="error_messages" replace_option="error_messages">
124
+ <%= error_messages_for 'this' %>
125
+ </div>
126
+
127
+ <object_form hidden_fields="*">
128
+ <object_table associations="belongs_to" replace_option="fields"/>
129
+ <submit label='#"Add to #{display_name(:obj => @owner, :no_span => true)}"'
130
+ replace_option="submit_button"/>
131
+ </object_form>
132
+ </section>
133
+
134
+ </panel>
135
+ </:main>
136
+
137
+ </page>
138
+ </def>
139
+
140
+
141
+ <def tag="show_collection_page">
142
+ <% title = "#{@reflection.name.to_s.titleize} for #{display_name(:obj => @owner, :no_span => true)}" %>
143
+ <page title="#title" xattrs="">
144
+
145
+ <:intro>
146
+ <h1><%= title %></h1>
147
+ <h2>Back to <object_link obj="#@owner"/></h2>
148
+ </:intro>
149
+
150
+ <:main>
151
+ <panel replace_option="main_panel">
152
+ <h2 replace_option="panel_heading"><count label="#@reflection.klass.name.titleize"/></h2>
153
+ <section>
154
+ <table_for replace_option="table">
155
+ <if_can_view><td><object_link/></td><td><delete_button class='text'/></td></if_can_view>
156
+ </table_for>
157
+ </section>
158
+
159
+ <if q="#@pages.length > 1">
160
+ <section replace_option="page_nav">
161
+ <div class="page_links">
162
+ <page_nav/>
163
+ </div>
164
+ </section>
165
+ </if>
166
+
167
+ <if q="#Hobo.simple_has_many_association?(@association)">
168
+ <section replace_option="new_link">
169
+ <new_object_link for="#@association"/>
170
+ </section>
171
+ </if>
172
+ </panel>
173
+ </:main>
174
+ </page>
175
+ </def>