hobo 0.8.5 → 0.8.6
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +41 -0
- data/Manifest +1 -5
- data/Rakefile +10 -3
- data/bin/hobo +38 -15
- data/dryml_generators/rapid/cards.dryml.erb +7 -7
- data/dryml_generators/rapid/pages.dryml.erb +52 -24
- data/hobo.gemspec +42 -322
- data/init.rb +0 -7
- data/lib/active_record/association_collection.rb +9 -0
- data/lib/hobo.rb +13 -14
- data/lib/hobo/accessible_associations.rb +32 -7
- data/lib/hobo/authentication_support.rb +1 -1
- data/lib/hobo/controller.rb +5 -7
- data/lib/hobo/dryml.rb +9 -2
- data/lib/hobo/dryml/dryml_builder.rb +11 -12
- data/lib/hobo/dryml/dryml_doc.rb +22 -24
- data/lib/hobo/dryml/dryml_generator.rb +41 -4
- data/lib/hobo/dryml/part_context.rb +5 -3
- data/lib/hobo/dryml/template.rb +7 -7
- data/lib/hobo/dryml/template_environment.rb +11 -22
- data/lib/hobo/dryml/template_handler.rb +94 -25
- data/lib/hobo/find_for.rb +2 -2
- data/lib/hobo/hobo_helper.rb +21 -21
- data/lib/hobo/include_in_save.rb +9 -5
- data/lib/hobo/lifecycles/transition.rb +2 -2
- data/lib/hobo/model.rb +11 -61
- data/lib/hobo/model_controller.rb +28 -29
- data/lib/hobo/model_router.rb +12 -13
- data/lib/hobo/permissions.rb +47 -37
- data/lib/hobo/permissions/associations.rb +1 -1
- data/lib/hobo/scopes/association_proxy_extensions.rb +5 -6
- data/lib/hobo/scopes/automatic_scopes.rb +7 -4
- data/lib/hobo/tasks/rails.rb +4 -0
- data/lib/hobo/user.rb +0 -1
- data/lib/hobo/user_controller.rb +3 -1
- data/lib/hobo/view_hints.rb +17 -3
- data/rails_generators/hobo/hobo_generator.rb +1 -0
- data/rails_generators/hobo_front_controller/templates/functional_test.rb +1 -11
- data/rails_generators/hobo_front_controller/templates/index.dryml +1 -6
- data/rails_generators/hobo_rapid/hobo_rapid_generator.rb +1 -0
- data/rails_generators/hobo_rapid/templates/hobo-rapid.css +3 -2
- data/rails_generators/hobo_rapid/templates/hobo-rapid.js +24 -15
- data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +17 -12
- data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +6 -2
- data/rails_generators/hobo_rapid/templates/themes/clean/views/clean.dryml +2 -2
- data/rails_generators/hobo_user_model/templates/forgot_password.erb +2 -2
- data/rails_generators/hobo_user_model/templates/model.rb +2 -2
- data/taglibs/rapid.dryml +3 -2
- data/taglibs/rapid_core.dryml +21 -16
- data/taglibs/rapid_document_tags.dryml +1 -1
- data/taglibs/rapid_editing.dryml +7 -10
- data/taglibs/rapid_forms.dryml +115 -26
- data/taglibs/rapid_generics.dryml +13 -3
- data/taglibs/rapid_lifecycles.dryml +18 -1
- data/taglibs/rapid_navigation.dryml +50 -61
- data/taglibs/rapid_pages.dryml +103 -19
- data/taglibs/rapid_plus.dryml +54 -6
- data/taglibs/rapid_support.dryml +38 -1
- data/taglibs/rapid_user_pages.dryml +17 -5
- data/test/permissions/models/models.rb +24 -12
- data/test/permissions/models/test.sqlite3 +0 -0
- metadata +6 -15
- data/lib/extensions/test_case.rb +0 -129
- data/lib/hobo/composite_model.rb +0 -73
- data/lib/hobo/model_support.rb +0 -44
- data/tasks/fix_dryml.rake +0 -143
- data/tasks/generate_tag_reference.rake +0 -192
- data/test/dryml/complilation_test.rb +0 -261
@@ -1,10 +1,22 @@
|
|
1
|
+
<!-- Contains view-layer support for Hobo's lifecycles. Note that lifecycle forms are generated automatically in `app/views/taglibs/auto/rapid/forms.dryml` - this library contains only lifecycle push-buttons. -->
|
2
|
+
|
3
|
+
<!-- A push-button to invoke a lifecycle transition either as a page-reload or as an ajax call.
|
4
|
+
|
5
|
+
### Attributes
|
6
|
+
|
7
|
+
- `transition` - the name of the transition to invoke. Required
|
8
|
+
- `update` - one or more DOM IDs of ajax parts to update after the transition
|
9
|
+
- `label` - the label on the button. Defaults to the name of the transition
|
10
|
+
|
11
|
+
All of the [standard ajax attributes](/api_taglibs/rapid_forms) are also supported.
|
12
|
+
-->
|
1
13
|
<def tag="transition-button" attrs="transition, update, label"><%=
|
2
14
|
transition = transition.name unless transition.is_a?(String)
|
3
15
|
ajax_attributes, html_attributes = attributes.partition_hash(Hobo::RapidHelper::AJAX_ATTRS)
|
4
16
|
|
5
17
|
url = object_url(this, transition, :method => :put)
|
6
18
|
add_classes!(html_attributes, "transition-button #{transition}-button")
|
7
|
-
label ||= transition.titleize
|
19
|
+
label ||= transition.to_s.titleize
|
8
20
|
if update || !ajax_attributes.empty?
|
9
21
|
ajax_attributes[:message] ||= label
|
10
22
|
func = ajax_updater(url, update, ajax_attributes)
|
@@ -16,6 +28,11 @@
|
|
16
28
|
%>
|
17
29
|
</def>
|
18
30
|
|
31
|
+
|
32
|
+
<!-- Renders a div containing transition buttons for every transition available to the current user.
|
33
|
+
|
34
|
+
For example, you could use this on a `Friendship` card: the person invited to have friendship would automatically see 'Accept' and 'Decline' buttons, while the person initiating the invite would see 'Retract'.
|
35
|
+
-->
|
19
36
|
<def tag="transition-buttons">
|
20
37
|
<div class="transitions">
|
21
38
|
<% this.lifecycle.available_transitions_for(current_user).each do |t| %>
|
@@ -1,10 +1,32 @@
|
|
1
|
-
<!--
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
1
|
+
<!-- Support for navigation links, account navigation (log in, out etc.) and pagination navigation. -->
|
2
|
+
|
3
|
+
<!-- General purpose navigation bar. Renders a `<ul class="navigation">`. This tag is intended to be used in conunction with `<nav-item>`. The main feature of this pair of tags (over, say, just using a plain `<ul>` list), is that it's easy to have a 'current' CSS class added to the appropriate nav item (so you can highlight the page/section the user is)
|
4
|
+
|
5
|
+
The main navigation in the default hobo app is implemented with `<navigation>` but this tag is also appropriate for any sub-navigation.
|
6
|
+
|
7
|
+
### Attributes
|
8
|
+
|
9
|
+
- `current` - the textual content of the nav item that should have the 'current' CSS class added (see example)
|
10
|
+
|
11
|
+
### Example
|
12
|
+
|
13
|
+
The normal usage is to define your own navigation tag that calls `<navigation>`.
|
14
|
+
|
15
|
+
<def tag="sub-nav">
|
16
|
+
<navigation merge>
|
17
|
+
<nav-item>Red</nav-item>
|
18
|
+
<nav-item>Green</nav-item>
|
19
|
+
<nav-item>Blue</nav-item>
|
20
|
+
</navigation>
|
21
|
+
</def>
|
22
|
+
|
23
|
+
Then in your pages you can call the tag like this
|
24
|
+
|
25
|
+
- On the 'red' page: `<sub-nav current="red"/>`
|
26
|
+
- On the 'green' page: `<sub-nav current="green"/>`
|
27
|
+
- and so on.
|
28
|
+
|
29
|
+
-->
|
8
30
|
<def tag="navigation" attrs="current">
|
9
31
|
<ul class="navigation" merge-attrs>
|
10
32
|
<set-scoped current-navigation="¤t">
|
@@ -13,6 +35,8 @@
|
|
13
35
|
</ul>
|
14
36
|
</def>
|
15
37
|
|
38
|
+
|
39
|
+
<!-- Renders a single item in a `<navigation>` menu. See [`<navigation`>](/api_tag_defs/navigation). -->
|
16
40
|
<def tag="nav-item">
|
17
41
|
<% body = parameters.default
|
18
42
|
body = h(this.to_s) if body.blank? -%>
|
@@ -23,76 +47,41 @@
|
|
23
47
|
</def>
|
24
48
|
|
25
49
|
|
26
|
-
|
50
|
+
<!-- Account Navigation (log in / out / signup)
|
51
|
+
|
52
|
+
When logged in, this renders:
|
53
|
+
|
54
|
+
- "Logged in as ..."
|
55
|
+
- Link to account page
|
56
|
+
- Log out link
|
57
|
+
|
58
|
+
When not logged in, renders:
|
59
|
+
|
60
|
+
- Log in link
|
61
|
+
- Sign up link
|
62
|
+
|
63
|
+
This is a simple tag - just look at the source if you need to know more detail.
|
27
64
|
|
65
|
+
-->
|
28
66
|
<def tag="account-nav">
|
29
|
-
<dev-user-changer/>
|
30
67
|
<do with="¤t_user">
|
31
68
|
<ul class="navigation account-nav" param>
|
69
|
+
<li if="&RAILS_ENV == 'development'"><dev-user-changer/></li>
|
32
70
|
<if test="&logged_in?">
|
33
71
|
<li class='nav-item' param="logged-in-as"><a to="¤t_user">Logged in as <name/></a></li>
|
34
72
|
<li class='nav-item' param="account"><a action="account">Account</a></li>
|
35
73
|
<li class='nav-item' param="log-out"><a href="&logout_url">Log out</a></li>
|
36
74
|
</if>
|
37
75
|
<else>
|
38
|
-
<
|
39
|
-
<li class=
|
40
|
-
<li if="&signup_url(user)" class="nav-item" param="sign-up"><a href="&signup_url(user)">Sign up</a></li>
|
76
|
+
<li class='nav-item' param="log-in"><a href="&login_url">Log in</a></li>
|
77
|
+
<li if="&signup_url" class="nav-item" param="sign-up"><a href="&signup_url">Sign up</a></li>
|
41
78
|
</else>
|
42
79
|
</ul>
|
43
80
|
</do>
|
44
81
|
</def>
|
45
82
|
|
46
83
|
|
47
|
-
<!---
|
48
|
-
|
84
|
+
<!--- A simple wrapper around the `will_paginate` helper. All options to `will_paginate` are available as attributes -->
|
49
85
|
<def tag="page-nav">
|
50
86
|
<%= will_paginate this, attributes.symbolize_keys.reverse_merge(:inner_window => 2, :prev_label => "« Prev") %>
|
51
87
|
</def>
|
52
|
-
|
53
|
-
|
54
|
-
<def tag="page-n-of-count">
|
55
|
-
Page <%= this.current_page %> of <%= this.page_count %>
|
56
|
-
</def>
|
57
|
-
|
58
|
-
|
59
|
-
<def tag="previous-page-link">
|
60
|
-
<a if="&this.try.previous_page"
|
61
|
-
href="&url_for(params.merge(:page => this.previous_page))">
|
62
|
-
<do param="default">« Previous page</do>
|
63
|
-
</a>
|
64
|
-
</def>
|
65
|
-
|
66
|
-
|
67
|
-
<def tag="next-page-link">
|
68
|
-
<a if="&this.try.next_page"
|
69
|
-
href="&url_for(params.merge(:page => this.next_page))">
|
70
|
-
<do param="default">Next page &raqou;</do>
|
71
|
-
</a>
|
72
|
-
</def>
|
73
|
-
|
74
|
-
|
75
|
-
<def tag="first-page-link">
|
76
|
-
<a if="&this.try.current_page && this.current_page != 1"
|
77
|
-
href="&url_for(params.merge(:page => 1))">
|
78
|
-
<do param="default">« First page</do>
|
79
|
-
</a>
|
80
|
-
</def>
|
81
|
-
|
82
|
-
|
83
|
-
<def tag="last-page-link">
|
84
|
-
<a if="&this.try.current_page && this.current_page != this.page_count"
|
85
|
-
href="&url_for(params.merge(:page => this.page_count))">
|
86
|
-
<do param="default">Last page »</do>
|
87
|
-
</a>
|
88
|
-
</def>
|
89
|
-
|
90
|
-
|
91
|
-
<def tag="dev-user-changer">
|
92
|
-
<set user="&Hobo::User.default_user_model"/>
|
93
|
-
<select-menu if="&user && RAILS_ENV == 'development'"
|
94
|
-
first-option="Guest" options="&user.all(:limit => 10).*.login"
|
95
|
-
onchange="location.href = '/dev/set_current_user?login=' + this.options[this.selectedIndex].value"
|
96
|
-
selected="#{current_user.login}"
|
97
|
-
class="dev-user-changer"/>
|
98
|
-
</def>
|
data/taglibs/rapid_pages.dryml
CHANGED
@@ -1,17 +1,34 @@
|
|
1
|
+
<!-- Rapid-Pages provides tags for working with entire pages. It includes the main `<page>` tag which is the starting point for all pages in Rapid, various supporting tags for things such as stylesheet and javascript includes. Also defines the standard error pages for permission-denied and not-found.
|
2
|
+
-->
|
3
|
+
|
4
|
+
<!-- The basic page structure for all the pages in a Hobo Rapid application. Providing the doctype, page title, standard stylesheet javascript includes, the ajax progress spinner, default header with app-name, account navigation, main navigation, and live search, empty section for the page content, flash message (if any) and an empty page footer.
|
5
|
+
|
6
|
+
The easiest way to see what this tag does is to look at the source.
|
7
|
+
|
8
|
+
### Attributes
|
9
|
+
|
10
|
+
- `title` - the page title, will have ": `<app-name>`" appended
|
11
|
+
- `full-title` - the full page title. Set this if you do not want the app name suffix.
|
12
|
+
|
13
|
+
-->
|
1
14
|
<def tag="page" attrs="title, full-title">
|
2
15
|
<% full_title ||= "#{title} : #{app_name}" %>
|
3
16
|
<html merge-attrs>
|
4
17
|
<head param>
|
5
18
|
<title param><%= strip_tags full_title %></title>
|
6
19
|
<do param="stylesheets">
|
20
|
+
<!-- note that this is probably overridden in your app/views/taglibs/themes/xxx/xxx.dryml -->
|
7
21
|
<stylesheet name="reset, hobo-rapid"/>
|
8
|
-
<theme-stylesheet/>
|
22
|
+
<theme-stylesheet />
|
9
23
|
<stylesheet name="application" param="app-stylesheet"/>
|
10
24
|
</do>
|
11
25
|
|
12
26
|
<do param="scripts">
|
13
27
|
<javascript param name="prototype, effects, dragdrop, controls, lowpro, hobo-rapid"/>
|
14
|
-
<if-ie version="lt IE 7" param="fix-ie6"
|
28
|
+
<if-ie version="lt IE 7" param="fix-ie6">
|
29
|
+
<javascript name="IE7"/>
|
30
|
+
<javascript name="ie7-recalc"/>
|
31
|
+
</if-ie>
|
15
32
|
<do param="custom-scripts"/>
|
16
33
|
<javascript param="application-javascript" name="application"/>
|
17
34
|
</do>
|
@@ -21,9 +38,9 @@
|
|
21
38
|
<set-scoped flash-rendered="&false">
|
22
39
|
<ajax-progress param/>
|
23
40
|
<header class="page-header" param>
|
41
|
+
<account-nav if="&login_url(Hobo::User.default_user_model)" param/>
|
24
42
|
<h1 param="app-name"><a href="#{base_url}/"><app-name/></a></h1>
|
25
43
|
<live-search param if="&defined_route? :site_search"/>
|
26
|
-
<account-nav if="&login_url(Hobo::User.default_user_model)" param/>
|
27
44
|
<main-nav current="&title" param/>
|
28
45
|
</header>
|
29
46
|
<section with-flash-messages param="content"/>
|
@@ -35,7 +52,7 @@
|
|
35
52
|
</def>
|
36
53
|
|
37
54
|
|
38
|
-
|
55
|
+
<!-- Renderes dynamically generated JavaScript required by `hobo-rapid.js`, including the information required to perform automatic part updates -->
|
39
56
|
<def tag="page-scripts">
|
40
57
|
<script type="text/javascript" param="default">
|
41
58
|
<hobo-rapid-javascripts/>
|
@@ -44,12 +61,22 @@
|
|
44
61
|
</def>
|
45
62
|
|
46
63
|
|
64
|
+
<!-- nodoc. -->
|
47
65
|
<def tag="index-page" polymorphic/>
|
66
|
+
<!-- nodoc. -->
|
48
67
|
<def tag="new-page" polymorphic/>
|
68
|
+
<!-- nodoc. -->
|
49
69
|
<def tag="show-page" polymorphic/>
|
70
|
+
<!-- nodoc. -->
|
50
71
|
<def tag="edit-page" polymorphic/>
|
51
72
|
|
73
|
+
<!-- The page rendered by default in the case of a permission-denied error
|
74
|
+
|
75
|
+
### Attributes
|
52
76
|
|
77
|
+
- `message` - The main message to display. Defaults to "That operation is not allowed"
|
78
|
+
|
79
|
+
-->
|
53
80
|
<def tag="permission-denied-page" attrs="message">
|
54
81
|
<% message ||= "That operation is not allowed" %>
|
55
82
|
<page merge>
|
@@ -57,12 +84,25 @@
|
|
57
84
|
<content: param>
|
58
85
|
<header param="content-header">
|
59
86
|
<h2 param="heading"><message/></h2>
|
87
|
+
<div class="debug" if="&Rails.env.development?">
|
88
|
+
<h3>Exception:</h3>
|
89
|
+
<pre><%= h @permission_error.pretty_inspect %></pre>
|
90
|
+
<h3>params:</h3>
|
91
|
+
<pre><%= h params.pretty_inspect %></pre>
|
92
|
+
</div>
|
60
93
|
</header>
|
61
94
|
</content:>
|
62
95
|
</page>
|
63
96
|
</def>
|
64
97
|
|
65
98
|
|
99
|
+
<!-- The page rendered by default in the case of a not-found error
|
100
|
+
|
101
|
+
### Attributes
|
102
|
+
|
103
|
+
- `message` - The main message to display. Defaults to "The page you were looking for could not be found"
|
104
|
+
|
105
|
+
-->
|
66
106
|
<def tag="not-found-page" attrs="message">
|
67
107
|
<% message ||= "The page you were looking for could not be found" %>
|
68
108
|
<page merge>
|
@@ -76,6 +116,20 @@
|
|
76
116
|
</def>
|
77
117
|
|
78
118
|
|
119
|
+
<!-- Renders one of five HTML DOCTYPE declarations, according to the `version` attribute.
|
120
|
+
|
121
|
+
### Attributes
|
122
|
+
- 'version' - the doctype version, must be one of:
|
123
|
+
|
124
|
+
- HTML 4.01 STRICT
|
125
|
+
- HTML 4.01 TRANSITIONAL
|
126
|
+
- XHTML 1.0 STRICT
|
127
|
+
- XHTML 1.0 TRANSITIONAL
|
128
|
+
- XHTML 1.1
|
129
|
+
|
130
|
+
See the source for the actual output
|
131
|
+
|
132
|
+
-->
|
79
133
|
<def tag="doctype" attrs="version"><%=
|
80
134
|
case version.upcase
|
81
135
|
when "HTML 4.01 STRICT"
|
@@ -96,6 +150,13 @@
|
|
96
150
|
end
|
97
151
|
%></def>
|
98
152
|
|
153
|
+
|
154
|
+
<!-- Renders an `<html>` tag along with the DOCTYPE specified in the `doctype` attribute.
|
155
|
+
|
156
|
+
### Attributes
|
157
|
+
|
158
|
+
- `doctype` - the version of the DOCTYPE required. See the `version` attribute to `<doctype>`
|
159
|
+
-->
|
99
160
|
<def tag="html" attrs="doctype">
|
100
161
|
<% doctype ||= 'XHTML 1.0 TRANSITIONAL' -%>
|
101
162
|
<doctype version="&doctype"/>
|
@@ -106,27 +167,51 @@
|
|
106
167
|
</def>
|
107
168
|
|
108
169
|
<!-- empty tags should be written as <br> in HTML and <br /> in XHTML -->
|
170
|
+
<!-- nodoc. -->
|
109
171
|
<def tag="empty-tag" attrs="tag-name"><%= element(tag_name, attributes, nil, true, true) %></def>
|
172
|
+
<!-- nodoc. -->
|
110
173
|
<def tag="base"><empty-tag tag-name="base" merge/></def>
|
174
|
+
<!-- nodoc. -->
|
111
175
|
<def tag="meta"><empty-tag tag-name="meta" merge/></def>
|
176
|
+
<!-- nodoc. -->
|
112
177
|
<def tag="link"><empty-tag tag-name="link" merge/></def>
|
178
|
+
<!-- nodoc. -->
|
113
179
|
<def tag="img"><empty-tag tag-name="img" merge/></def>
|
180
|
+
<!-- nodoc. -->
|
114
181
|
<def tag="br"><empty-tag tag-name="br" merge/></def>
|
182
|
+
<!-- nodoc. -->
|
115
183
|
<def tag="hr"><empty-tag tag-name="hr" merge/></def>
|
184
|
+
<!-- nodoc. -->
|
116
185
|
<def tag="frame"><empty-tag tag-name="frame" merge/></def>
|
186
|
+
<!-- nodoc. -->
|
117
187
|
<def tag="area"><empty-tag tag-name="area" merge/></def>
|
188
|
+
<!-- nodoc. -->
|
118
189
|
<def tag="param"><empty-tag tag-name="param" merge/></def>
|
190
|
+
<!-- nodoc. -->
|
119
191
|
<def tag="col"><empty-tag tag-name="col" merge/></def>
|
120
192
|
|
193
|
+
|
194
|
+
<!-- Renders a conditional comment in order to have some content ignored by all browsers other than Internet Explorer
|
195
|
+
|
196
|
+
### Example
|
197
|
+
|
198
|
+
|
199
|
+
<if-ie version="lt IE 7"> ... </if-ie>
|
200
|
+
|
201
|
+
-->
|
121
202
|
<def tag="if-ie" attrs="version">
|
122
203
|
<%= "<!--[if #{version || 'IE'}]>" %><do param="default"/><%= "<![endif]-->" %>
|
123
204
|
</def>
|
124
205
|
|
206
|
+
<!-- Simple wrapper for the `stylesheet_link_tag` helper. The `name` attribute can be a comma-separated list of stylesheet names.
|
207
|
+
-->
|
125
208
|
<def tag="stylesheet" attrs="name">
|
126
209
|
<%= stylesheet_link_tag *(comma_split(name) + [attributes]) %>
|
127
210
|
</def>
|
128
211
|
|
129
212
|
|
213
|
+
<!-- Simple wrapper for the `javascript_include_tag` helper. The `name` attribute can be a comma-separated list of script file names.
|
214
|
+
-->
|
130
215
|
<def tag="javascript" attrs="name">
|
131
216
|
<if test="&name.is_a?(Symbol)">
|
132
217
|
<%= javascript_include_tag name %>
|
@@ -139,36 +224,35 @@
|
|
139
224
|
</def>
|
140
225
|
|
141
226
|
|
227
|
+
<!-- Renders a Rails flash message wrapped in a `<div>` tag
|
228
|
+
|
229
|
+
### Attributes
|
230
|
+
|
231
|
+
- `type` - which flash message to display. Defaults to `:notice`
|
232
|
+
|
233
|
+
### CSS Classes
|
234
|
+
|
235
|
+
The flash is output in a `<div class="flash notice">`, where `notice` is the `type` specified.
|
236
|
+
|
237
|
+
-->
|
142
238
|
<def tag="flash-message" attrs="type">
|
143
239
|
<% type = type ? type.to_sym : :notice -%>
|
144
240
|
<div class="flash #{type}" if="&flash[type]" merge-attrs><%= flash[type] %></div>
|
145
241
|
</def>
|
146
242
|
|
147
243
|
|
244
|
+
<!-- Renders `<flash-message>` for every flash type given in the `names` attribute (comma separated), or for all flash messages that have been set if `names` is not given -->
|
148
245
|
<def tag="flash-messages" attrs="names"><%=
|
149
246
|
scope.flash_rendered = true
|
150
247
|
names = names.nil? ? flash.keys : comma_split(names)
|
151
248
|
names.map { |name| flash_message :type => name }
|
152
249
|
%></def>
|
153
250
|
|
251
|
+
<!-- Renders `<div id="ajax-progress"><div><span id="ajax-progress-text"></span></div></div>`. The theme will style this as an ajax progress 'spinner' -->
|
154
252
|
<def tag="ajax-progress">
|
155
|
-
<div id="ajax-progress">
|
253
|
+
<div id="ajax-progress" merge-attrs>
|
156
254
|
<div>
|
157
255
|
<span id="ajax-progress-text"></span>
|
158
256
|
</div>
|
159
257
|
</div>
|
160
258
|
</def>
|
161
|
-
|
162
|
-
|
163
|
-
<def tag="default-page-title"><%= t = this.to_s; ; "#{t.blank? ? '' : t + ' - '}#{app_name}" %></def>
|
164
|
-
|
165
|
-
|
166
|
-
<def tag="with-primary-collection" attrs="name"><%
|
167
|
-
ivar = "@#{this.class.name.underscore}_#{name}"
|
168
|
-
|
169
|
-
if (collection = instance_variable_get(ivar))
|
170
|
-
%><do with="&collection" param="default"/><%
|
171
|
-
else
|
172
|
-
%><do field="&name" param="default"/><%
|
173
|
-
end
|
174
|
-
%></def>
|
data/taglibs/rapid_plus.dryml
CHANGED
@@ -1,6 +1,15 @@
|
|
1
|
+
<!-- Tags that define higher level interactive 'widgets' -->
|
2
|
+
|
3
|
+
<!-- An enhanced version of Rapid's `<table>` that has support for column sorting, searching and pagination.
|
4
|
+
|
5
|
+
This tag calls `<table merge-params>`, so the parameters for `<table>` are also available.
|
6
|
+
|
7
|
+
An [worked example](/tutorials/agility#improve_the_project_page_with_a_searchable_sortable_table) of this tag is available in the [Agility Tutorial](/tutorials/agility)
|
8
|
+
|
9
|
+
-->
|
1
10
|
<def tag="table-plus" attrs="sort-field, sort-direction, sort-columns" >
|
2
11
|
<% sort_field ||= @sort_field; sort_direction ||= @sort_direction; sort_columns ||= {} %>
|
3
|
-
<% sort_columns['this'] ||= this.member_class.name_attribute %>
|
12
|
+
<% sort_columns['this'] ||= this.member_class.try.name_attribute %>
|
4
13
|
<div class="table-plus" merge-attrs="&attributes - attrs_for(:with_fields) - attrs_for(:table)">
|
5
14
|
<div class="header" param="header">
|
6
15
|
<div class="search">
|
@@ -41,15 +50,34 @@
|
|
41
50
|
</def>
|
42
51
|
|
43
52
|
|
53
|
+
<!-- An enhanced version of Rapid's `<collection>` tag that supports drag-and-drop re-ordering.
|
54
|
+
|
55
|
+
Each item in the collection has a `<div class="ordering-handle" param="handle">` added, which can be used to drag the item up and down.
|
56
|
+
|
57
|
+
### Attributes
|
58
|
+
|
59
|
+
- `sortable-options` - a hash of options to pass to the `sortable_elemnt` helper. Default are:
|
60
|
+
|
61
|
+
{ :constraint => :vertical,
|
62
|
+
:overlap => :vertical,
|
63
|
+
:scroll => :window,
|
64
|
+
:handle => 'ordering-handle',
|
65
|
+
:complete => [visual_effect(:highlight, attributes[:id])] }
|
66
|
+
|
67
|
+
### Controller support
|
68
|
+
|
69
|
+
This tag assumes the controller has a `reorder` action. This action is added automatically by Hobo's model-controller if the model declares `acts_as_list`. See also [Drag and Drop Reordering](/manual/controllers#drag_and_drop_reordering) in the [Controllers and Routing](/manual/controllers) chapter of the manual.
|
70
|
+
-->
|
44
71
|
<def tag="sortable-collection" attrs="sortable-options"><%
|
45
72
|
singular_name = this.member_class.name.underscore
|
46
73
|
attributes[:id] ||= "#{singular_name}_ordering"
|
47
|
-
|
74
|
+
route_method = subsite ? "#{subsite}_reorder_#{singular_name.pluralize}_url" : "reorder_#{singular_name.pluralize}_url"
|
75
|
+
reorder_url = send(route_method)
|
48
76
|
%>
|
49
77
|
<collection class="sortable" merge>
|
50
78
|
<item: id="#{singular_name}_#{this.id}" param>
|
51
79
|
<div class="ordering-handle" param="handle">↑<br/>↓</div>
|
52
|
-
<card param
|
80
|
+
<do param="default"><card param/></do>
|
53
81
|
</item:>
|
54
82
|
</collection>
|
55
83
|
<%= if Hobo::Dryml.last_if
|
@@ -67,6 +95,7 @@
|
|
67
95
|
</def>
|
68
96
|
|
69
97
|
|
98
|
+
<!-- Captures the common pattern of a list of "the first few" cards, along with a link to the rest. -->
|
70
99
|
<def tag="preview-with-more" attrs="name">
|
71
100
|
<% name ||= collection_name.pluralize -%>
|
72
101
|
<section class="#{name.gsub(' ', '-').dasherize} preview-with-more" param="default">
|
@@ -77,12 +106,21 @@
|
|
77
106
|
</def>
|
78
107
|
|
79
108
|
|
109
|
+
<!-- Renders a gravatar (see [gravatar.com](http://gravatar.com)) image in side a link to `this`. Requires `this` to have an `email_address` field. Normally called with a user record in context.
|
110
|
+
|
111
|
+
### Attributes
|
112
|
+
|
113
|
+
- `size` - Size in pixels of the image. Defaults to 80.
|
114
|
+
- `rating` - The rating allowed. Defaults to 'g'. See [gravatar.com](http://gravatar.com) for information on ratings.
|
115
|
+
|
116
|
+
-->
|
80
117
|
<def tag="gravatar" attrs="size, rating">
|
81
118
|
<% size ||= 80; rating ||= 'g'; digest = Digest::MD5.hexdigest(this.email_address) -%>
|
82
119
|
<a class="gravatar"><img class="gravatar" src="http://www.gravatar.com/avatar/#{digest}?s=#{size}&r=#{rating}" merge-attrs/></a>
|
83
120
|
</def>
|
84
121
|
|
85
122
|
|
123
|
+
<!-- Provides an ajax-powered *find-as-you-type* live search field which is hooked up to Hobo's site-side search feature. At the moment this tag is not very flexible. It is not easy to use if for anything other than Hobo's site-wide search. -->
|
86
124
|
<def tag="live-search">
|
87
125
|
<div class="search">
|
88
126
|
<label for="search-field">Search</label><input type="search" class="live-search"/>
|
@@ -94,12 +132,22 @@
|
|
94
132
|
</section>
|
95
133
|
</def>
|
96
134
|
|
135
|
+
<!-- A `<select>` menu intended to act as a filter for index pages.
|
136
|
+
|
137
|
+
See [Filtering stories by status](/tutorials/agility#filtering_stories_by_status) in the [Agility Tutorial](/tutorials/agility) for an example.
|
138
|
+
|
139
|
+
### Attributes
|
97
140
|
|
98
|
-
|
141
|
+
- `param-name` - the name of the HTTP parameter to use for the filter
|
142
|
+
- `options` - an array of options for the menu.
|
143
|
+
- `no-filter` - The text of the first option which indicates no filter is in effect. Defaults to 'All'
|
144
|
+
-->
|
145
|
+
<def tag="filter-menu" attrs="param-name, options, no-filter, id">
|
99
146
|
<% no_filter ||= "All" %>
|
100
|
-
<form action="&request.request_uri" method="get" class="filter-menu">
|
147
|
+
<form action="&request.request_uri" method="get" class="filter-menu" merge-attrs="id">
|
101
148
|
<div>
|
102
|
-
|
149
|
+
<% selected = options.detect {|o| o.to_s==params[param_name.gsub('-', '_')] } %>
|
150
|
+
<select-menu name="¶m_name" options="&options" selected="&selected"
|
103
151
|
first-option="&no_filter" merge-params/>
|
104
152
|
</div>
|
105
153
|
</form>
|