merb-admin 0.4.3 → 0.4.4
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +2 -2
- data/Rakefile +1 -1
- data/app/controllers/main.rb +14 -0
- data/app/helpers/main_helper.rb +38 -1
- data/app/views/main/_big_decimal.html.erb +2 -2
- data/app/views/main/_boolean.html.erb +2 -2
- data/app/views/main/_date.html.erb +3 -3
- data/app/views/main/_datetime.html.erb +3 -3
- data/app/views/main/_float.html.erb +2 -2
- data/app/views/main/_has_many.html.erb +4 -4
- data/app/views/main/_has_one.html.erb +3 -3
- data/app/views/main/_integer.html.erb +3 -3
- data/app/views/main/_properties.html.erb +8 -7
- data/app/views/main/_string.html.erb +2 -2
- data/app/views/main/_time.html.erb +3 -3
- data/app/views/main/_timestamp.html.erb +3 -3
- data/app/views/main/list.html.erb +7 -29
- data/lib/activerecord_support.rb +14 -6
- data/lib/datamapper_support.rb +15 -7
- data/lib/merb-admin.rb +1 -1
- data/spec/requests/main_spec.rb +32 -0
- metadata +2 -2
data/README.markdown
CHANGED
@@ -8,13 +8,13 @@ It currently offers the features listed [here](http://sferik.tadalist.com/lists/
|
|
8
8
|
|
9
9
|
At the command prompt, type:
|
10
10
|
|
11
|
-
sudo gem install
|
11
|
+
sudo gem install merb-admin -s http://gemcutter.org
|
12
12
|
|
13
13
|
## Install it
|
14
14
|
|
15
15
|
In your app, add the following dependency to `config/dependencies.rb`:
|
16
16
|
|
17
|
-
dependency "
|
17
|
+
dependency "merb-admin", "0.4.4"
|
18
18
|
|
19
19
|
Add the following route to `config/router.rb`:
|
20
20
|
|
data/Rakefile
CHANGED
@@ -9,7 +9,7 @@ AUTHOR = "Erik Michaels-Ober"
|
|
9
9
|
EMAIL = "sferik@gmail.com"
|
10
10
|
HOMEPAGE = "http://twitter.com/sferik"
|
11
11
|
SUMMARY = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
|
12
|
-
GEM_VERSION = "0.4.
|
12
|
+
GEM_VERSION = "0.4.4"
|
13
13
|
|
14
14
|
spec = Gem::Specification.new do |s|
|
15
15
|
s.rubyforge_project = "merb"
|
data/app/controllers/main.rb
CHANGED
@@ -13,6 +13,8 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
13
13
|
|
14
14
|
def list
|
15
15
|
options = {}
|
16
|
+
merge_sort!(options)
|
17
|
+
merge_sort_reverse!(options)
|
16
18
|
|
17
19
|
if params[:all]
|
18
20
|
options = {
|
@@ -123,6 +125,18 @@ class MerbAdmin::Main < MerbAdmin::Application
|
|
123
125
|
raise NotFound unless @object
|
124
126
|
end
|
125
127
|
|
128
|
+
def merge_sort!(options)
|
129
|
+
return unless params[:sort]
|
130
|
+
sort = params[:sort] || "id"
|
131
|
+
options.merge!(:sort => sort)
|
132
|
+
end
|
133
|
+
|
134
|
+
def merge_sort_reverse!(options)
|
135
|
+
return unless params[:sort_reverse]
|
136
|
+
reverse = params[:sort_reverse] == "true"
|
137
|
+
options.merge!(:sort_reverse => reverse)
|
138
|
+
end
|
139
|
+
|
126
140
|
def update_has_one_association(association, id)
|
127
141
|
model = MerbAdmin::AbstractModel.new(association[:child_model])
|
128
142
|
if object = model.get(id)
|
data/app/helpers/main_helper.rb
CHANGED
@@ -3,7 +3,9 @@ module Merb
|
|
3
3
|
module MerbAdmin
|
4
4
|
module MainHelper
|
5
5
|
def object_title(object)
|
6
|
-
if object.
|
6
|
+
if object.nil?
|
7
|
+
nil
|
8
|
+
elsif object.respond_to?(:name)
|
7
9
|
object.name
|
8
10
|
elsif object.respond_to?(:title)
|
9
11
|
object.title
|
@@ -12,6 +14,41 @@ module Merb
|
|
12
14
|
end
|
13
15
|
end
|
14
16
|
|
17
|
+
def object_property(object, property)
|
18
|
+
property_type = property[:type]
|
19
|
+
property_name = property[:name]
|
20
|
+
case property_type
|
21
|
+
when :boolean
|
22
|
+
if object.send(property_name) == true
|
23
|
+
Builder::XmlMarkup.new.img(:src => image_path("icon-yes.gif"), :alt => "True")
|
24
|
+
else
|
25
|
+
Builder::XmlMarkup.new.img(:src => image_path("icon-on.gif"), :alt => "False")
|
26
|
+
end
|
27
|
+
when :date_time
|
28
|
+
value = object.send(property_name)
|
29
|
+
value.respond_to?(:strftime) ? value.strftime("%b. %d, %Y, %I:%M%p") : nil
|
30
|
+
when :date
|
31
|
+
value = object.send(property_name)
|
32
|
+
value.respond_to?(:strftime) ? value.strftime("%b. %d, %Y") : nil
|
33
|
+
when :time
|
34
|
+
value = object.send(property_name)
|
35
|
+
value.respond_to?(:strftime) ? value.strftime("%I:%M%p") : nil
|
36
|
+
when :string
|
37
|
+
object.send(property_name).to_s.truncate(50)
|
38
|
+
when :text
|
39
|
+
object.send(property_name).to_s.truncate(50)
|
40
|
+
when :integer
|
41
|
+
association = @abstract_model.belongs_to_associations.select{|a| a[:child_key].first == property_name}.first
|
42
|
+
if association
|
43
|
+
object_title(object.send(association[:name]))
|
44
|
+
else
|
45
|
+
object.send(property_name)
|
46
|
+
end
|
47
|
+
else
|
48
|
+
object.send(property_name)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
15
52
|
# Given a page count and the current page, we generate a set of pagination
|
16
53
|
# links.
|
17
54
|
#
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
2
|
+
property_name = property[:name]
|
3
3
|
length = property[:length]
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?] || property[:serial?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :maxlength => length, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %>
|
11
11
|
</p>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
value = @object.send(
|
2
|
+
property_name = property[:name]
|
3
|
+
value = @object.send(property_name)
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :class => "vDateField", :value => value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d") : nil, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %>
|
11
11
|
</p>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
value = @object.send(
|
2
|
+
property_name = property[:name]
|
3
|
+
value = @object.send(property_name)
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :class => "vDateField", :value => value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d %H:%M:%S") : nil, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %>
|
11
11
|
</p>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
2
|
+
property_name = property[:name]
|
3
3
|
length = property[:length]
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?] || property[:serial?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :maxlength => length, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %>
|
11
11
|
</p>
|
@@ -1,15 +1,15 @@
|
|
1
1
|
<%
|
2
|
-
|
2
|
+
association_name = association[:name]
|
3
3
|
collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
|
4
|
-
selected = @object.send(
|
4
|
+
selected = @object.send(association_name)
|
5
5
|
label = association[:pretty_name]
|
6
6
|
%>
|
7
7
|
<fieldset class="module aligned">
|
8
8
|
<h2><%= label %></h2>
|
9
9
|
<div class="form-row">
|
10
10
|
<div>
|
11
|
-
<%= select(:name => "associations[#{
|
12
|
-
<script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("<%=
|
11
|
+
<%= select(:name => "associations[#{association_name}][]", :id => association_name, :collection => collection, :selected => selected.map{|o| o.id.to_s}, :label => label, :multiple => true) %>
|
12
|
+
<script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("<%= association_name %>", "<%= association_name %>", 0, "<%= image_path %>"); });</script>
|
13
13
|
<p class="help">Hold down "Control", or "Command" on a Mac, to select more than one.</p>
|
14
14
|
</div>
|
15
15
|
</div>
|
@@ -1,8 +1,8 @@
|
|
1
1
|
<%
|
2
2
|
child_key = association[:child_key].first
|
3
|
-
|
3
|
+
association_name = association[:name]
|
4
4
|
collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
|
5
|
-
selected = @object.send(
|
5
|
+
selected = @object.send(association_name)
|
6
6
|
label = association[:pretty_name]
|
7
7
|
required = false
|
8
8
|
@properties.each do |property|
|
@@ -21,7 +21,7 @@
|
|
21
21
|
</ul>
|
22
22
|
<% end %>
|
23
23
|
<div>
|
24
|
-
<%= select(:name => "associations[#{
|
24
|
+
<%= select(:name => "associations[#{association_name}][]", :id => association_name, :collection => collection, :include_blank => true, :selected => selected ? selected.id.to_s : nil, :label => label) %>
|
25
25
|
<p class="help">
|
26
26
|
<%= required ? "Required." : "Optional." %>
|
27
27
|
</p>
|
@@ -1,16 +1,16 @@
|
|
1
1
|
<%
|
2
2
|
flag_map = property[:flag_map]
|
3
|
-
|
3
|
+
property_name = property[:name]
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?] || property[:serial?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
8
|
<% if flag_map # Enum or Flag type %>
|
9
9
|
<% collection = flag_map.map{|x| [x[1], x[1].to_s.capitalize.gsub('_', ' ')]}.sort{|a, b| a[1] <=> b[1]} %>
|
10
|
-
<%= select(
|
10
|
+
<%= select(property_name, :collection => collection, :label => label) %>
|
11
11
|
<% else %>
|
12
12
|
<% length = property[:length] %>
|
13
|
-
<%= text_field(
|
13
|
+
<%= text_field(property_name, :maxlength => length, :label => label) %>
|
14
14
|
<p class="help">
|
15
15
|
<%= required ? "Required." : "Optional." %>
|
16
16
|
</p>
|
@@ -1,18 +1,19 @@
|
|
1
1
|
<fieldset class="module aligned">
|
2
2
|
<% belongs_to_keys = @abstract_model.belongs_to_associations.map{|b| b[:child_key].first} %>
|
3
3
|
<% properties.each do |property| %>
|
4
|
-
<%
|
5
|
-
<%
|
6
|
-
<% next if
|
7
|
-
|
8
|
-
|
4
|
+
<% property_name = property[:name] %>
|
5
|
+
<% property_type = property[:type] %>
|
6
|
+
<% next if [:id, :created_at, :created_on, :deleted_at, :updated_at, :updated_on, :deleted_on].include?(property_name) %>
|
7
|
+
<% next if belongs_to_keys.include?(property_name) %>
|
8
|
+
<div class="<%= @object.errors[property_name] ? "form-row errors" : "form-row" %>">
|
9
|
+
<% if @object.errors[property_name] %>
|
9
10
|
<ul class="errorlist">
|
10
|
-
<% @object.errors[
|
11
|
+
<% @object.errors[property_name].each do |error| %>
|
11
12
|
<li><%= error %></li>
|
12
13
|
<% end %>
|
13
14
|
</ul>
|
14
15
|
<% end %>
|
15
|
-
<%= partial(
|
16
|
+
<%= partial(property_type.to_s, :property => property) -%>
|
16
17
|
</div>
|
17
18
|
<% end %>
|
18
19
|
</fieldset>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
2
|
+
property_name = property[:name]
|
3
3
|
length = property[:length]
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :size => [50, length].min, :maxlength => length, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %> <%= length %> <%= length == 1 ? "character." : "characters or fewer." %>
|
11
11
|
</p>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
value = @object.send(
|
2
|
+
property_name = property[:name]
|
3
|
+
value = @object.send(property_name)
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :class => "vTimeField", :value => value.respond_to?(:strftime) ? value.strftime("%H:%M:%S") : nil, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %>
|
11
11
|
</p>
|
@@ -1,11 +1,11 @@
|
|
1
1
|
<%
|
2
|
-
|
3
|
-
value = @object.send(
|
2
|
+
property_name = property[:name]
|
3
|
+
value = @object.send(property_name)
|
4
4
|
label = property[:pretty_name]
|
5
5
|
required = !property[:nullable?]
|
6
6
|
%>
|
7
7
|
<div>
|
8
|
-
<%= text_field(
|
8
|
+
<%= text_field(property_name, :class => "vDateField", :value => value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d %H:%M:%S") : nil, :label => label) %>
|
9
9
|
<p class="help">
|
10
10
|
<%= required ? "Required." : "Optional." %>
|
11
11
|
</p>
|
@@ -1,5 +1,7 @@
|
|
1
1
|
<%
|
2
2
|
params = request.params.except(:action, :controller, :model_name)
|
3
|
+
sort = params[:sort]
|
4
|
+
sort_reverse = params[:sort_reverse]
|
3
5
|
%>
|
4
6
|
<div id="content-main">
|
5
7
|
<ul class="object-tools">
|
@@ -12,10 +14,10 @@
|
|
12
14
|
<thead>
|
13
15
|
<tr>
|
14
16
|
<% @properties.each do |property| %>
|
15
|
-
<%
|
16
|
-
<%
|
17
|
-
<th>
|
18
|
-
|
17
|
+
<% property_name = property[:name] %>
|
18
|
+
<% property_pretty_name = property[:pretty_name] %>
|
19
|
+
<th class="<%= sort == property_name.to_s ? sort_reverse ? 'sorted descending' : 'sorted ascending' : nil %>">
|
20
|
+
<a href="?<%= Merb::Parse.params_to_query_string(params.merge(:sort => property_name).reject{|key, value| key.to_sym == :sort_reverse}.merge(sort == property_name.to_s && sort_reverse != "true" ? {:sort_reverse => "true"} : {})) %>"><%= property_pretty_name %></a>
|
19
21
|
</th>
|
20
22
|
<% end %>
|
21
23
|
</tr>
|
@@ -24,33 +26,9 @@
|
|
24
26
|
<% @objects.each_with_index do |object, index| %>
|
25
27
|
<tr class="row<%= index % 2 == 0 ? '1' : '2' %>">
|
26
28
|
<% @properties.each do |property| %>
|
27
|
-
<% type = property[:type] %>
|
28
|
-
<% name = property[:name] %>
|
29
29
|
<td>
|
30
30
|
<a href="<%= url(:admin_edit, :model_name => @abstract_model.singular_name, :id => object.id) %>">
|
31
|
-
|
32
|
-
<% when :boolean %>
|
33
|
-
<% if object.send(name) == true %>
|
34
|
-
<img alt="True" src="<%= image_path("icon-yes.gif") %>"/>
|
35
|
-
<% else %>
|
36
|
-
<img alt="False" src="<%= image_path("icon-no.gif") %>"/>
|
37
|
-
<% end %>
|
38
|
-
<% when :date_time %>
|
39
|
-
<% value = object.send(name) %>
|
40
|
-
<%= value.respond_to?(:strftime) ? value.strftime("%b. %d, %Y, %I:%M%p") : nil %>
|
41
|
-
<% when :date %>
|
42
|
-
<% value = object.send(name) %>
|
43
|
-
<%= value.respond_to?(:strftime) ? value.strftime("%b. %d, %Y") : nil %>
|
44
|
-
<% when :time %>
|
45
|
-
<% value = object.send(name) %>
|
46
|
-
<%= value.respond_to?(:strftime) ? value.strftime("%I:%M%p") : nil %>
|
47
|
-
<% when :string %>
|
48
|
-
<%= object.send(name).to_s.truncate(50) %>
|
49
|
-
<% when :text %>
|
50
|
-
<%= object.send(name).to_s.truncate(50) %>
|
51
|
-
<% else %>
|
52
|
-
<%= object.send(name) %>
|
53
|
-
<% end %>
|
31
|
+
<%= object_property(object, property) %>
|
54
32
|
</a>
|
55
33
|
</td>
|
56
34
|
<% end %>
|
data/lib/activerecord_support.rb
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
module MerbAdmin
|
2
2
|
class AbstractModel
|
3
3
|
module ActiverecordSupport
|
4
|
-
def count(options = {})
|
5
|
-
model.count(options)
|
6
|
-
end
|
7
|
-
|
8
4
|
def get(id)
|
9
5
|
model.find(id).extend(InstanceMethods)
|
10
|
-
rescue
|
6
|
+
rescue ActiveRecord::RecordNotFound
|
11
7
|
nil
|
12
8
|
end
|
13
9
|
|
10
|
+
def count(options = {})
|
11
|
+
merge_order!(options)
|
12
|
+
model.count(options)
|
13
|
+
end
|
14
|
+
|
14
15
|
def first(options = {})
|
16
|
+
merge_order!(options)
|
15
17
|
model.first(options).extend(InstanceMethods)
|
16
18
|
end
|
17
19
|
|
18
20
|
def all(options = {})
|
21
|
+
merge_order!(options)
|
19
22
|
model.all(options)
|
20
23
|
end
|
21
24
|
|
@@ -93,7 +96,6 @@ module MerbAdmin
|
|
93
96
|
:length => property.limit,
|
94
97
|
:nullable? => property.null,
|
95
98
|
:serial? => property.primary,
|
96
|
-
:key? => property.primary,
|
97
99
|
:flag_map => property.type.respond_to?(:flag_map) ? property.type.flag_map : nil,
|
98
100
|
}
|
99
101
|
end
|
@@ -101,6 +103,12 @@ module MerbAdmin
|
|
101
103
|
|
102
104
|
private
|
103
105
|
|
106
|
+
def merge_order!(options)
|
107
|
+
@sort ||= options.delete(:sort) || "id"
|
108
|
+
@sort_order ||= options.delete(:sort_reverse) ? "desc" : "asc"
|
109
|
+
options.merge!(:order => ["#{@sort} #{@sort_order}"])
|
110
|
+
end
|
111
|
+
|
104
112
|
def association_parent_model_lookup(association)
|
105
113
|
case association.macro
|
106
114
|
when :belongs_to
|
data/lib/datamapper_support.rb
CHANGED
@@ -1,19 +1,22 @@
|
|
1
1
|
module MerbAdmin
|
2
2
|
class AbstractModel
|
3
3
|
module DatamapperSupport
|
4
|
-
def count(options = {})
|
5
|
-
model.count(options)
|
6
|
-
end
|
7
|
-
|
8
4
|
def get(id)
|
9
5
|
model.get(id).extend(InstanceMethods)
|
10
6
|
end
|
11
7
|
|
8
|
+
def count(options = {})
|
9
|
+
merge_order!(options)
|
10
|
+
model.count(options)
|
11
|
+
end
|
12
|
+
|
12
13
|
def first(options = {})
|
14
|
+
merge_order!(options)
|
13
15
|
model.first(options).extend(InstanceMethods)
|
14
16
|
end
|
15
17
|
|
16
18
|
def all(options = {})
|
19
|
+
merge_order!(options)
|
17
20
|
model.all(options)
|
18
21
|
end
|
19
22
|
|
@@ -70,7 +73,7 @@ module MerbAdmin
|
|
70
73
|
model.relationships.to_a.map do |name, association|
|
71
74
|
{
|
72
75
|
:name => name,
|
73
|
-
:pretty_name => name.to_s.gsub(
|
76
|
+
:pretty_name => name.to_s.gsub("_", " ").capitalize,
|
74
77
|
:type => association_type_lookup(association),
|
75
78
|
:parent_model => association.parent_model,
|
76
79
|
:parent_key => association.parent_key.map{|r| r.name},
|
@@ -84,12 +87,11 @@ module MerbAdmin
|
|
84
87
|
model.properties.map do |property|
|
85
88
|
{
|
86
89
|
:name => property.name,
|
87
|
-
:pretty_name => property.name.to_s.gsub(
|
90
|
+
:pretty_name => property.name.to_s.gsub(/_id$/, "").gsub("_", " ").capitalize,
|
88
91
|
:type => type_lookup(property),
|
89
92
|
:length => property.length,
|
90
93
|
:nullable? => property.nullable?,
|
91
94
|
:serial? => property.serial?,
|
92
|
-
:key? => property.key?,
|
93
95
|
:flag_map => property.type.respond_to?(:flag_map) ? property.type.flag_map : nil,
|
94
96
|
}
|
95
97
|
end
|
@@ -97,6 +99,12 @@ module MerbAdmin
|
|
97
99
|
|
98
100
|
private
|
99
101
|
|
102
|
+
def merge_order!(options)
|
103
|
+
@sort ||= options.delete(:sort) || :id
|
104
|
+
@sort_order ||= options.delete(:sort_reverse) ? :desc : :asc
|
105
|
+
options.merge!(:order => [@sort.to_sym.send(@sort_order)])
|
106
|
+
end
|
107
|
+
|
100
108
|
def association_type_lookup(association)
|
101
109
|
if self.model == association.parent_model
|
102
110
|
association.options[:max] > 1 ? :has_many : :has_one
|
data/lib/merb-admin.rb
CHANGED
@@ -23,7 +23,7 @@ if defined?(Merb::Plugins)
|
|
23
23
|
|
24
24
|
# Slice metadata
|
25
25
|
self.description = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
|
26
|
-
self.version = "0.4.
|
26
|
+
self.version = "0.4.4"
|
27
27
|
self.author = "Erik Michaels-Ober"
|
28
28
|
|
29
29
|
# Stub classes loaded hook - runs before LoadClasses BootLoader
|
data/spec/requests/main_spec.rb
CHANGED
@@ -89,6 +89,38 @@ describe "MerbAdmin" do
|
|
89
89
|
end
|
90
90
|
end
|
91
91
|
|
92
|
+
describe "list with sort" do
|
93
|
+
before(:each) do
|
94
|
+
MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :sex => :male, :position => :second)
|
95
|
+
MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :sex => :male, :position => :pitcher)
|
96
|
+
@response = request(url(:admin_list, :model_name => "player"), :params => {:sort => "name"})
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should respond sucessfully" do
|
100
|
+
@response.should be_successful
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should be sorted correctly" do
|
104
|
+
@response.body.should contain(/Jackie Robinson.*Sandy Koufax/m)
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
describe "list with reverse sort" do
|
109
|
+
before(:each) do
|
110
|
+
MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :sex => :male, :position => :second)
|
111
|
+
MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :sex => :male, :position => :pitcher)
|
112
|
+
@response = request(url(:admin_list, :model_name => "player"), :params => {:sort => "name", :sort_reverse => "true"})
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should respond sucessfully" do
|
116
|
+
@response.should be_successful
|
117
|
+
end
|
118
|
+
|
119
|
+
it "should be sorted correctly" do
|
120
|
+
@response.body.should contain(/Sandy Koufax.*Jackie Robinson/m)
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
92
124
|
describe "list with 2 objects", :given => "two players exist" do
|
93
125
|
before(:each) do
|
94
126
|
MerbAdmin[:paginate] = true
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: merb-admin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Erik Michaels-Ober
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-09-
|
12
|
+
date: 2009-09-29 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|