sferik-merb-admin 0.3.6 → 0.4.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 (48) hide show
  1. data/README.markdown +3 -4
  2. data/Rakefile +1 -1
  3. data/app/controllers/main.rb +13 -51
  4. data/app/helpers/main_helper.rb +7 -1
  5. data/app/views/layout/form.html.erb +1 -1
  6. data/app/views/layout/list.html.erb +1 -1
  7. data/app/views/main/_belongs_to.html.erb +2 -2
  8. data/app/views/main/_big_decimal.html.erb +1 -1
  9. data/app/views/main/_boolean.html.erb +1 -1
  10. data/app/views/main/_date.html.erb +1 -1
  11. data/app/views/main/{_date_time.html.erb → _datetime.html.erb} +1 -1
  12. data/app/views/main/_float.html.erb +1 -1
  13. data/app/views/main/_has_many.html.erb +2 -2
  14. data/app/views/main/_has_one.html.erb +3 -3
  15. data/app/views/main/_integer.html.erb +1 -1
  16. data/app/views/main/_string.html.erb +1 -1
  17. data/app/views/main/_text.html.erb +1 -1
  18. data/app/views/main/_time.html.erb +1 -1
  19. data/app/views/main/_timestamp.html.erb +12 -0
  20. data/app/views/main/delete.html.erb +3 -3
  21. data/app/views/main/edit.html.erb +2 -2
  22. data/app/views/main/index.html.erb +4 -4
  23. data/app/views/main/list.html.erb +6 -63
  24. data/app/views/main/new.html.erb +1 -1
  25. data/lib/abstract_model.rb +27 -6
  26. data/lib/activerecord_support.rb +169 -0
  27. data/lib/datamapper_support.rb +55 -23
  28. data/lib/generic_support.rb +1 -1
  29. data/lib/merb-admin.rb +1 -1
  30. data/spec/models/activerecord/division.rb +8 -0
  31. data/spec/models/activerecord/draft.rb +16 -0
  32. data/spec/models/activerecord/league.rb +6 -0
  33. data/spec/models/activerecord/player.rb +10 -0
  34. data/spec/models/activerecord/team.rb +11 -0
  35. data/spec/models/{division.rb → datamapper/division.rb} +0 -0
  36. data/spec/models/{draft.rb → datamapper/draft.rb} +0 -0
  37. data/spec/models/{league.rb → datamapper/league.rb} +0 -0
  38. data/spec/models/{player.rb → datamapper/player.rb} +1 -2
  39. data/spec/models/{team.rb → datamapper/team.rb} +0 -0
  40. data/spec/requests/main_spec.rb +41 -136
  41. data/spec/spec_helper.rb +57 -21
  42. metadata +17 -15
  43. data/lib/metaid.rb +0 -19
  44. data/spec/fixtures/division_fixture.rb +0 -4
  45. data/spec/fixtures/draft_fixture.rb +0 -10
  46. data/spec/fixtures/league_fixture.rb +0 -3
  47. data/spec/fixtures/player_fixture.rb +0 -7
  48. data/spec/fixtures/team_fixture.rb +0 -5
data/README.markdown CHANGED
@@ -14,7 +14,7 @@ At the command prompt, type:
14
14
 
15
15
  In your app, add the following dependency to `config/dependencies.rb`:
16
16
 
17
- dependency "sferik-merb-admin", "0.3.6", :require_as => "merb-admin"
17
+ dependency "sferik-merb-admin", "0.4.0", :require_as => "merb-admin"
18
18
 
19
19
  Add the following route to `config/router.rb`:
20
20
 
@@ -26,7 +26,7 @@ Then, run the following rake task:
26
26
 
27
27
  ## Configure it (optional)
28
28
 
29
- You can configuring the merb-admin slice in a before_app_loads block:
29
+ If you're feeling crafty, you can set a couple configuration options in `config/init.rb`:
30
30
 
31
31
  Merb::BootLoader.before_app_loads do
32
32
  Merb::Slices::config[:merb_admin][:app_name] = "My App"
@@ -54,6 +54,5 @@ Many thanks to:
54
54
  * [Wilson Miner](http://www.wilsonminer.com) for contributing the stylesheets and javascripts from [Django](http://www.djangoproject.com)
55
55
  * [Aaron Wheeler](http://fightinjoe.com/) for contributing libraries from [Merb AutoScaffold](http://github.com/fightinjoe/merb-autoscaffold)
56
56
  * [Lori Holden](http://loriholden.com/) for contributing the [merb-pagination](http://github.com/lholden/merb-pagination) helper
57
- * [why the lucky stiff](http://whytheluckystiff.net/) for [metaid](http://whytheluckystiff.net/articles/seeingMetaclassesClearly.html)
58
57
 
59
- Also, thanks to [beer](http://www.anchorbrewing.com).
58
+ Also, thanks to [beer](http://www.21st-amendment.com).
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.3.6"
12
+ GEM_VERSION = "0.4.0"
13
13
 
14
14
  spec = Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "merb"
@@ -1,5 +1,4 @@
1
1
  require File.join( File.dirname(__FILE__), '..', '..', 'lib', 'abstract_model' )
2
- require File.join( File.dirname(__FILE__), '..', '..', 'lib', 'metaid' )
3
2
 
4
3
  class MerbAdmin::Main < MerbAdmin::Application
5
4
  include Merb::MerbAdmin::MainHelper
@@ -14,15 +13,12 @@ class MerbAdmin::Main < MerbAdmin::Application
14
13
 
15
14
  def list
16
15
  options = {}
17
- merge_filter(options)
18
- merge_query(options)
19
- merge_sort(options)
20
16
 
21
17
  if params[:all]
22
18
  options = {
23
19
  :limit => MerbAdmin[:per_page] * 2,
24
20
  }.merge(options)
25
- @objects = @abstract_model.find_all(options).reverse
21
+ @objects = @abstract_model.all(options).reverse
26
22
  else
27
23
  @current_page = (params[:page] || 1).to_i
28
24
  options = {
@@ -60,14 +56,14 @@ class MerbAdmin::Main < MerbAdmin::Application
60
56
  @object = @abstract_model.new(object)
61
57
  if @object.save && has_one_associations.each{|association, id| update_has_one_association(association, id)} && has_many_associations.each{|association, ids| update_has_many_association(association, ids)}
62
58
  if params[:_continue]
63
- redirect(slice_url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully created"})
59
+ redirect(url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name} was successfully created"})
64
60
  elsif params[:_add_another]
65
- redirect(slice_url(:admin_new, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully created"})
61
+ redirect(url(:admin_new, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name} was successfully created"})
66
62
  else
67
- redirect(slice_url(:admin_list, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully created"})
63
+ redirect(url(:admin_list, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name} was successfully created"})
68
64
  end
69
65
  else
70
- message[:error] = "#{@abstract_model.pretty_name.capitalize} failed to be created"
66
+ message[:error] = "#{@abstract_model.pretty_name} failed to be created"
71
67
  render(:new, :layout => 'form')
72
68
  end
73
69
  end
@@ -82,14 +78,14 @@ class MerbAdmin::Main < MerbAdmin::Application
82
78
  has_many_associations = @abstract_model.has_many_associations.map{|association| [association, (params[:associations] || {}).delete(association[:name])]}
83
79
  if @object.update_attributes(object) && has_one_associations.each{|association, id| update_has_one_association(association, id)} && has_many_associations.each{|association, ids| update_has_many_association(association, ids)}
84
80
  if params[:_continue]
85
- redirect(slice_url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully updated"})
81
+ redirect(url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id), :message => {:notice => "#{@abstract_model.pretty_name} was successfully updated"})
86
82
  elsif params[:_add_another]
87
- redirect(slice_url(:admin_new, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully updated"})
83
+ redirect(url(:admin_new, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name} was successfully updated"})
88
84
  else
89
- redirect(slice_url(:admin_list, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully updated"})
85
+ redirect(url(:admin_list, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name} was successfully updated"})
90
86
  end
91
87
  else
92
- message[:error] = "#{@abstract_model.pretty_name.capitalize} failed to be updated"
88
+ message[:error] = "#{@abstract_model.pretty_name} failed to be updated"
93
89
  render(:edit, :layout => 'form')
94
90
  end
95
91
  end
@@ -100,7 +96,7 @@ class MerbAdmin::Main < MerbAdmin::Application
100
96
 
101
97
  def destroy
102
98
  if @object.destroy
103
- redirect(slice_url(:admin_list, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name.capitalize} was successfully destroyed"})
99
+ redirect(url(:admin_list, :model_name => @abstract_model.singular_name), :message => {:notice => "#{@abstract_model.pretty_name} was successfully destroyed"})
104
100
  else
105
101
  raise BadRequest
106
102
  end
@@ -123,46 +119,13 @@ class MerbAdmin::Main < MerbAdmin::Application
123
119
  end
124
120
 
125
121
  def find_object
126
- @object = @abstract_model.find(params[:id])
122
+ @object = @abstract_model.get(params[:id])
127
123
  raise NotFound unless @object
128
124
  end
129
125
 
130
- def merge_filter(options)
131
- return unless params[:filter]
132
- params[:filter].each_pair do |key, value|
133
- @properties.each do |property|
134
- next unless property[:name] == key.to_sym
135
- if property[:type] == :boolean
136
- options.merge!(key.to_sym => (value == 'true'))
137
- elsif property[:type] == :integer && property[:flag_map]
138
- options.merge!(key.to_sym => value.to_sym)
139
- end
140
- end
141
- end
142
- end
143
-
144
- def merge_query(options)
145
- return unless params[:query]
146
- condition_statement = []
147
- conditions = []
148
- @properties.each do |property|
149
- next unless property[:type] == :string
150
- condition_statement << "#{property[:name]} LIKE ?"
151
- conditions << "%#{params[:query]}%"
152
- end
153
- conditions.unshift(condition_statement.join(' OR '))
154
- options.merge!(:conditions => conditions) unless conditions == ['']
155
- end
156
-
157
- def merge_sort(options)
158
- sort = params[:sort] || "id"
159
- order = params[:sort_reverse] == "true" ? :desc : :asc
160
- options.merge!(:order => [sort.to_sym.send(order)])
161
- end
162
-
163
126
  def update_has_one_association(association, id)
164
127
  model = MerbAdmin::AbstractModel.new(association[:child_model])
165
- if object = model.find(id)
128
+ if object = model.get(id)
166
129
  object.update_attributes(association[:child_key].first => @object.id)
167
130
  end
168
131
  end
@@ -172,9 +135,8 @@ class MerbAdmin::Main < MerbAdmin::Application
172
135
  relationship = @object.send(association[:name])
173
136
  @object.clear_association(relationship)
174
137
  # Add all of the objects to the relationship
175
- conditions = {association[:parent_key].first => ids}
176
138
  model = MerbAdmin::AbstractModel.new(association[:child_model])
177
- for object in model.find_all(conditions)
139
+ for object in model.all_in(ids)
178
140
  relationship << object
179
141
  end
180
142
  @object.save
@@ -3,7 +3,13 @@ module Merb
3
3
  module MerbAdmin
4
4
  module MainHelper
5
5
  def object_title(object)
6
- object.try(:name) || object.try(:title) || "#{object.class.to_s} ##{object.id}"
6
+ if object.respond_to?(:name)
7
+ object.name
8
+ elsif object.respond_to?(:title)
9
+ object.title
10
+ else
11
+ "#{object.class.to_s} ##{object.id}"
12
+ end
7
13
  end
8
14
 
9
15
  # Given a page count and the current page, we generate a set of pagination
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  slice_name = "MerbAdmin" + (MerbAdmin[:app_name].blank? ? "" : " for #{MerbAdmin[:app_name]}")
3
- page_name = action_name.capitalize + " " + @abstract_model.pretty_name
3
+ page_name = action_name.capitalize + " " + @abstract_model.pretty_name.downcase
4
4
  %>
5
5
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
6
6
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  slice_name = "MerbAdmin" + (MerbAdmin[:app_name].blank? ? "" : " for #{MerbAdmin[:app_name]}")
3
- page_name = "Select " + @abstract_model.pretty_name + " to edit"
3
+ page_name = "Select " + @abstract_model.pretty_name.downcase + " to edit"
4
4
  %>
5
5
  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
6
6
  <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
@@ -1,8 +1,8 @@
1
1
  <%
2
2
  child_key = association[:child_key].first
3
- collection = MerbAdmin::AbstractModel.new(association[:parent_model]).find_all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
3
+ collection = MerbAdmin::AbstractModel.new(association[:parent_model]).all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
4
4
  selected = @object.send(child_key)
5
- label = association[:pretty_name].capitalize
5
+ label = association[:pretty_name]
6
6
  required = false
7
7
  @properties.each do |property|
8
8
  next unless property[:name] == child_key
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  name = property[:name]
3
3
  length = property[:length]
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?] || property[:serial?]
6
6
  %>
7
7
  <div>
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  name = property[:name]
3
- label = property[:pretty_name].capitalize
3
+ label = property[:pretty_name]
4
4
  %>
5
5
  <div>
6
6
  <%= check_box(name, :label => label) %>
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  name = property[:name]
3
3
  value = @object.send(name)
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?]
6
6
  %>
7
7
  <div>
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  name = property[:name]
3
3
  value = @object.send(name)
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?]
6
6
  %>
7
7
  <div>
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  name = property[:name]
3
3
  length = property[:length]
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?] || property[:serial?]
6
6
  %>
7
7
  <div>
@@ -1,8 +1,8 @@
1
1
  <%
2
2
  name = association[:name]
3
- collection = MerbAdmin::AbstractModel.new(association[:child_model]).find_all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
3
+ collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
4
4
  selected = @object.send(name)
5
- label = association[:pretty_name].capitalize
5
+ label = association[:pretty_name]
6
6
  %>
7
7
  <fieldset class="module aligned">
8
8
  <h2><%= label %></h2>
@@ -1,9 +1,9 @@
1
1
  <%
2
2
  child_key = association[:child_key].first
3
3
  name = association[:name]
4
- collection = MerbAdmin::AbstractModel.new(association[:child_model]).find_all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
5
- selected = MerbAdmin::AbstractModel.new(association[:child_model]).find_all(child_key => @object.id).first
6
- label = association[:pretty_name].capitalize
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(association[:name])
6
+ label = association[:pretty_name]
7
7
  required = false
8
8
  @properties.each do |property|
9
9
  next unless property[:name] == child_key
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  flag_map = property[:flag_map]
3
3
  name = property[:name]
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?] || property[:serial?]
6
6
  %>
7
7
  <div>
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  name = property[:name]
3
3
  length = property[:length]
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?]
6
6
  %>
7
7
  <div>
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  name = property[:name]
3
- label = property[:pretty_name].capitalize
3
+ label = property[:pretty_name]
4
4
  required = property[:nullable?]
5
5
  %>
6
6
  <div>
@@ -1,7 +1,7 @@
1
1
  <%
2
2
  name = property[:name]
3
3
  value = @object.send(name)
4
- label = property[:pretty_name].capitalize
4
+ label = property[:pretty_name]
5
5
  required = !property[:nullable?]
6
6
  %>
7
7
  <div>
@@ -0,0 +1,12 @@
1
+ <%
2
+ name = property[:name]
3
+ value = @object.send(name)
4
+ label = property[:pretty_name]
5
+ required = !property[:nullable?]
6
+ %>
7
+ <div>
8
+ <%= text_field(name, :class => "vDateField", :value => value.respond_to?(:strftime) ? value.strftime("%Y-%m-%d %H:%M:%S") : nil, :label => label) %>
9
+ <p class="help">
10
+ <%= required ? "Required." : "Optional." %>
11
+ </p>
12
+ </div>
@@ -1,10 +1,10 @@
1
- <p>Are you sure you want to delete the <%= @abstract_model.pretty_name %>? All of the following related items will be deleted:</p>
1
+ <p>Are you sure you want to delete the <%= @abstract_model.pretty_name.downcase %>? All of the following related items will be deleted:</p>
2
2
  <ul>
3
3
  <li>
4
- <%= link_to(@model_name, slice_url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id))%>
4
+ <%= link_to(@model_name, url(:admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id))%>
5
5
  </li>
6
6
  </ul>
7
- <%= form_for(@object, :action => slice_url(:admin_destroy, :model_name => @abstract_model.singular_name, :id => @object.id), :method => :delete) do %>
7
+ <%= form_for(@object, :action => url(:admin_destroy, :model_name => @abstract_model.singular_name, :id => @object.id), :method => :delete) do %>
8
8
  <div>
9
9
  <%= submit "Yes, I'm sure" %>
10
10
  </div>
@@ -1,5 +1,5 @@
1
1
  <div id="content-main">
2
- <%= form_for(@object, :action => slice_url(:admin_update, :model_name => @abstract_model.singular_name, :id => @object.id)) do %>
2
+ <%= form_for(@object, :action => url(:admin_update, :model_name => @abstract_model.singular_name, :id => @object.id)) do %>
3
3
  <div>
4
4
  <%= partial('properties', :properties => @properties) -%>
5
5
  <% @abstract_model.belongs_to_associations.each do |association| %>
@@ -14,7 +14,7 @@
14
14
  <div class="submit-row" >
15
15
  <%= submit "Save", :class => "default", :name => "_save" %>
16
16
  <p class="deletelink-box">
17
- <%= link_to("Delete", slice_url(:admin_delete, :model_name => @abstract_model.singular_name, :id => @object.id), :class => "deletelink") %>
17
+ <%= link_to("Delete", url(:admin_delete, :model_name => @abstract_model.singular_name, :id => @object.id), :class => "deletelink") %>
18
18
  </p>
19
19
  <%= submit "Save and add another", :name => "_add_another" %>
20
20
  <%= submit "Save and continue editing", :name => "_continue" %>
@@ -2,18 +2,18 @@
2
2
  <div class="module">
3
3
  <table summary="Models available in the application.">
4
4
  <caption>
5
- <%= link_to("Models", slice_url(:admin_dashboard), :class => "section") %>
5
+ <%= link_to("Models", url(:admin_dashboard), :class => "section") %>
6
6
  </caption>
7
7
  <% @abstract_models.each do |abstract_model| %>
8
8
  <tr>
9
9
  <th scope="row">
10
- <%= link_to(abstract_model.plural_name.to_s.capitalize, slice_url(:admin_list, :model_name => abstract_model.singular_name)) %>
10
+ <%= link_to(abstract_model.plural_name.to_s.capitalize, url(:admin_list, :model_name => abstract_model.singular_name)) %>
11
11
  </th>
12
12
  <td>
13
- <%= link_to("Add", slice_url(:admin_new, :model_name => abstract_model.singular_name), :class => "addlink") %>
13
+ <%= link_to("Add", url(:admin_new, :model_name => abstract_model.singular_name), :class => "addlink") %>
14
14
  </td>
15
15
  <td>
16
- <%= link_to("Edit", slice_url(:admin_list, :model_name => abstract_model.singular_name), :class => "changelink") %>
16
+ <%= link_to("Edit", url(:admin_list, :model_name => abstract_model.singular_name), :class => "changelink") %>
17
17
  </td>
18
18
  </tr>
19
19
  <% end %>
@@ -1,78 +1,21 @@
1
1
  <%
2
2
  params = request.params.except(:action, :controller, :model_name)
3
- filter = params[:filter]
4
- query = params[:query]
5
- sort = params[:sort]
6
- sort_reverse = params[:sort_reverse]
7
3
  %>
8
4
  <div id="content-main">
9
5
  <ul class="object-tools">
10
6
  <li>
11
- <%= link_to("Add #{@abstract_model.pretty_name}", slice_url(:admin_new, :model_name => @abstract_model.singular_name), :class => "addlink") %>
7
+ <%= link_to("Add #{@abstract_model.pretty_name.downcase}", url(:admin_new, :model_name => @abstract_model.singular_name), :class => "addlink") %>
12
8
  </li>
13
9
  </ul>
14
- <div class="module filtered" id="changelist">
15
- <div id="toolbar">
16
- <form id="changelist-search" action="" method="get">
17
- <div>
18
- <label for="searchbar"><img src="<%= image_path("icon_searchbox.png") %>" alt="Search" /></label>
19
- <input type="text" size="40" name="query" value="" id="searchbar" />
20
- <input type="submit" value="Search" />
21
- <% if filter || query %>
22
- <span class="small quiet"><%= @record_count %> <%= @record_count == 1 ? "result" : "results" %> (<a href="?"><%= @abstract_model.count %> total</a>)</span>
23
- <% end %>
24
- <% if filter %>
25
- <% filter.each do |name, value| %>
26
- <input type="hidden" name="filter[<%= name %>]" value="<%= value %>"/>
27
- <% end %>
28
- <% end %>
29
- </div>
30
- </form>
31
- </div>
32
- <script type="text/javascript">document.getElementById("searchbar").focus();</script>
33
- <div id="changelist-filter">
34
- <h2>Filter</h2>
35
- <% @properties.each do |property| %>
36
- <% type = property[:type] %>
37
- <% name = property[:name] %>
38
- <% pretty_name = property[:pretty_name] %>
39
- <% flag_map = property[:flag_map] %>
40
- <% if type == :boolean %>
41
- <h3>By <%= pretty_name %></h3>
42
- <ul>
43
- <li class="<%= filter.nil? || filter[name].blank? ? "selected" : nil %>">
44
- <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).reject{|key, value| key.to_sym == name})) %>">All</a>
45
- </li>
46
- <li class="<%= filter && filter[name] == "true" ? "selected" : nil %>">
47
- <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).merge({name => "true"}))) %>">Yes</a>
48
- </li>
49
- <li class="<%= filter && filter[name] == "false" ? "selected" : nil %>">
50
- <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).merge({name => "false"}))) %>">No</a>
51
- </li>
52
- </ul>
53
- <% elsif type == :integer && flag_map %>
54
- <h3>By <%= pretty_name %></h3>
55
- <ul>
56
- <li class="<%= filter.nil? || filter[name].blank? ? "selected" : nil %>">
57
- <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).reject{|key, value| key.to_sym == name})) %>">All</a>
58
- </li>
59
- <% flag_map.values.map{|v| v.to_s}.sort.each do |value| %>
60
- <li class="<%= filter && filter[name] == value ? "selected" : nil %>">
61
- <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).merge({name => value}))) %>"><%= value.capitalize.gsub('_', ' ')%></a>
62
- </li>
63
- <% end %>
64
- </ul>
65
- <% end %>
66
- <% end %>
67
- </div>
10
+ <div class="module" id="changelist">
68
11
  <table cellspacing="0">
69
12
  <thead>
70
13
  <tr>
71
14
  <% @properties.each do |property| %>
72
15
  <% name = property[:name] %>
73
16
  <% pretty_name = property[:pretty_name] %>
74
- <th class="<%= sort == name.to_s ? sort_reverse ? 'sorted descending' : 'sorted ascending' : nil %>">
75
- <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:sort => name).reject{|key, value| key.to_sym == :sort_reverse}.merge(sort == name.to_s && sort_reverse != "true" ? {:sort_reverse => "true"} : {})) %>"><%= pretty_name.capitalize %></a>
17
+ <th>
18
+ <%= pretty_name %>
76
19
  </th>
77
20
  <% end %>
78
21
  </tr>
@@ -84,7 +27,7 @@
84
27
  <% type = property[:type] %>
85
28
  <% name = property[:name] %>
86
29
  <td>
87
- <a href="<%= slice_url(:admin_edit, :model_name => @abstract_model.singular_name, :id => object.id) %>">
30
+ <a href="<%= url(:admin_edit, :model_name => @abstract_model.singular_name, :id => object.id) %>">
88
31
  <% case type %>
89
32
  <% when :boolean %>
90
33
  <% if object.send(name) == true %>
@@ -119,7 +62,7 @@
119
62
  <% if @page_count.to_i > 1 %>
120
63
  <%= paginate(@current_page, @page_count, :url => '?' + Merb::Parse.params_to_query_string(params)) %>
121
64
  <% end %>
122
- <%= @record_count %> <%= @record_count == 1 ? @abstract_model.pretty_name : @abstract_model.pretty_name.pluralize %>
65
+ <%= @record_count %> <%= @record_count == 1 ? @abstract_model.pretty_name.downcase : @abstract_model.pretty_name.downcase.pluralize %>
123
66
  <% if @page_count.to_i == 2 %>
124
67
  <%= link_to("Show all", '?' + Merb::Parse.params_to_query_string(params.merge(:all => true)), :class => "showall") %>
125
68
  <% end %>
@@ -1,5 +1,5 @@
1
1
  <div id="content-main">
2
- <%= form_for(@object, :action => slice_url(:admin_create, :model_name => @abstract_model.singular_name)) do %>
2
+ <%= form_for(@object, :action => url(:admin_create, :model_name => @abstract_model.singular_name)) do %>
3
3
  <div>
4
4
  <%= partial('properties', :properties => @properties) -%>
5
5
  <% @abstract_model.belongs_to_associations.each do |association| %>
@@ -1,4 +1,5 @@
1
1
  require 'generic_support'
2
+ require 'activerecord_support'
2
3
  require 'datamapper_support'
3
4
 
4
5
  module MerbAdmin
@@ -8,6 +9,15 @@ module MerbAdmin
8
9
  return @models if @models
9
10
  @models ||= []
10
11
  case Merb.orm
12
+ when :activerecord
13
+ Dir.glob(Merb.dir_for(:model) / Merb.glob_for(:model)).each do |filename|
14
+ # FIXME: This heuristic for finding ActiveRecord models is too strict
15
+ File.read(filename).scan(/^class ([\w\d_\-:]+) < ActiveRecord::Base$/).flatten.each do |m|
16
+ model = lookup(m.to_s.to_sym)
17
+ @models << new(model) if model
18
+ end
19
+ end
20
+ @models.sort!{|a, b| a.model.to_s <=> b.model.to_s}
11
21
  when :datamapper
12
22
  DataMapper::Resource.descendants.each do |m|
13
23
  # Remove DataMapperSessionStore because it's included by default
@@ -17,29 +27,40 @@ module MerbAdmin
17
27
  end
18
28
  @models.sort!{|a, b| a.model.to_s <=> b.model.to_s}
19
29
  else
20
- raise "MerbAdmin does not currently support the #{Merb.orm} ORM"
30
+ raise "MerbAdmin does not support the #{Merb.orm} ORM"
21
31
  end
22
32
  end
23
33
 
24
34
  # Given a symbol +model_name+, finds the corresponding model class
25
35
  def self.lookup(model_name)
26
- model = const_get(model_name)
27
- raise "could not find model #{model_name}" if model.nil?
28
- return model if model.include?(DataMapper::Resource)
36
+ begin
37
+ model = const_get(model_name)
38
+ rescue NameError
39
+ raise "MerbAdmin could not find model #{model_name}"
40
+ end
41
+
42
+ case Merb.orm
43
+ when :activerecord
44
+ return model if model.superclass == ActiveRecord::Base
45
+ when :datamapper
46
+ return model if model.include?(DataMapper::Resource)
47
+ end
29
48
  nil
30
49
  end
31
50
 
32
51
  attr_accessor :model
33
52
 
34
53
  def initialize(model)
35
- model = self.class.lookup(model.camel_case.to_sym) unless model.is_a?(Class)
54
+ model = self.class.lookup(model.to_s.camel_case) unless model.is_a?(Class)
36
55
  @model = model
37
56
  self.extend(GenericSupport)
38
57
  case Merb.orm
58
+ when :activerecord
59
+ self.extend(ActiverecordSupport)
39
60
  when :datamapper
40
61
  self.extend(DatamapperSupport)
41
62
  else
42
- raise "MerbAdmin does not currently support the #{Merb.orm} ORM"
63
+ raise "MerbAdmin does not support the #{Merb.orm} ORM"
43
64
  end
44
65
  end
45
66
  end