merb-admin 0.4.5 → 0.4.6

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.
data/README.markdown CHANGED
@@ -16,7 +16,7 @@ At the command prompt, type:
16
16
 
17
17
  In your app, add the following dependency to `config/dependencies.rb`:
18
18
 
19
- dependency "merb-admin", "0.4.5"
19
+ dependency "merb-admin", "0.4.6"
20
20
 
21
21
  Add the following route to `config/router.rb`:
22
22
 
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.5"
12
+ GEM_VERSION = "0.4.6"
13
13
 
14
14
  spec = Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "merb"
@@ -14,6 +14,7 @@ class MerbAdmin::Main < MerbAdmin::Application
14
14
  def list
15
15
  options = {}
16
16
  merge_query!(options)
17
+ merge_filter!(options)
17
18
  merge_sort!(options)
18
19
  merge_sort_reverse!(options)
19
20
 
@@ -128,15 +129,36 @@ class MerbAdmin::Main < MerbAdmin::Application
128
129
 
129
130
  def merge_query!(options)
130
131
  return unless params[:query]
131
- condition_statement = []
132
- conditions = []
132
+ statements = []
133
+ values = []
134
+ conditions = options[:conditions] || [""]
133
135
  @properties.each do |property|
134
136
  next unless property[:type] == :string
135
- condition_statement << "#{property[:name]} LIKE ?"
136
- conditions << "%#{params[:query]}%"
137
+ statements << "#{property[:name]} LIKE ?"
138
+ values << "%#{params[:query]}%"
137
139
  end
138
- conditions.unshift(condition_statement.join(' OR '))
139
- options.merge!(:conditions => conditions) unless conditions == ['']
140
+ conditions[0] += statements.join(" OR ")
141
+ conditions += values
142
+ options.merge!(:conditions => conditions) unless conditions == [""]
143
+ end
144
+
145
+ def merge_filter!(options)
146
+ return unless params[:filter]
147
+ statements = []
148
+ values = []
149
+ conditions = options[:conditions] || [""]
150
+ params[:filter].each_pair do |key, value|
151
+ @properties.each do |property|
152
+ next unless property[:name] == key.to_sym
153
+ next unless property[:type] == :boolean
154
+ statements << "#{key} = ?"
155
+ values << (value == "true")
156
+ end
157
+ end
158
+ conditions[0] += statements.join(" AND ")
159
+ conditions += values
160
+ options.merge!(:conditions => conditions) unless conditions == [""]
161
+ puts options.inspect
140
162
  end
141
163
 
142
164
  def merge_sort!(options)
@@ -22,7 +22,7 @@ module Merb
22
22
  if object.send(property_name) == true
23
23
  Builder::XmlMarkup.new.img(:src => image_path("icon-yes.gif"), :alt => "True")
24
24
  else
25
- Builder::XmlMarkup.new.img(:src => image_path("icon-on.gif"), :alt => "False")
25
+ Builder::XmlMarkup.new.img(:src => image_path("icon-no.gif"), :alt => "False")
26
26
  end
27
27
  when :date_time
28
28
  value = object.send(property_name)
@@ -1,18 +1,12 @@
1
1
  <%
2
- flag_map = property[:flag_map]
3
2
  property_name = property[:name]
3
+ length = property[:length]
4
4
  label = property[:pretty_name]
5
5
  required = !property[:nullable?] || property[:serial?]
6
6
  %>
7
7
  <div>
8
- <% if flag_map # Enum or Flag type %>
9
- <% collection = flag_map.map{|x| [x[1], x[1].to_s.capitalize.gsub('_', ' ')]}.sort{|a, b| a[1] <=> b[1]} %>
10
- <%= select(property_name, :collection => collection, :label => label) %>
11
- <% else %>
12
- <% length = property[:length] %>
13
8
  <%= text_field(property_name, :maxlength => length, :label => label) %>
14
9
  <p class="help">
15
10
  <%= required ? "Required." : "Optional." %>
16
11
  </p>
17
- <% end %>
18
12
  </div>
@@ -1,6 +1,7 @@
1
1
  <%
2
2
  params = request.params.except(:action, :controller, :model_name)
3
3
  query = params[:query]
4
+ filter = params[:filter]
4
5
  sort = params[:sort]
5
6
  sort_reverse = params[:sort_reverse]
6
7
  %>
@@ -10,20 +11,47 @@
10
11
  <%= link_to("Add #{@abstract_model.pretty_name.downcase}", url(:admin_new, :model_name => @abstract_model.singular_name), :class => "addlink") %>
11
12
  </li>
12
13
  </ul>
13
- <div class="module" id="changelist">
14
+ <div class="module filtered" id="changelist">
14
15
  <div id="toolbar">
15
16
  <form id="changelist-search" action="" method="get">
16
17
  <div>
17
18
  <label for="searchbar"><img src="<%= image_path("icon_searchbox.png") %>" alt="Search" /></label>
18
19
  <input type="text" size="40" name="query" value="" id="searchbar" />
19
20
  <input type="submit" value="Search" />
20
- <% if query %>
21
+ <% if query || filter %>
21
22
  <span class="small quiet"><%= @record_count %> <%= @record_count == 1 ? "result" : "results" %> (<a href="?"><%= @abstract_model.count %> total</a>)</span>
22
23
  <% end %>
24
+ <% if filter %>
25
+ <% filter.each do |name, value| %>
26
+ <input type="hidden" name="filter[<%= name %>]" value="<%= value %>"/>
27
+ <% end %>
28
+ <% end %>
23
29
  </div>
24
30
  </form>
25
31
  </div>
26
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
+ <% property_type = property[:type] %>
37
+ <% property_name = property[:name] %>
38
+ <% property_pretty_name = property[:pretty_name] %>
39
+ <% if property_type == :boolean %>
40
+ <h3>By <%= property_pretty_name %></h3>
41
+ <ul>
42
+ <li class="<%= filter.nil? || filter[property_name].blank? ? "selected" : nil %>">
43
+ <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).reject{|key, value| key.to_sym == property_name})) %>">All</a>
44
+ </li>
45
+ <li class="<%= filter && filter[property_name] == "true" ? "selected" : nil %>">
46
+ <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).merge({property_name => "true"}))) %>">Yes</a>
47
+ </li>
48
+ <li class="<%= filter && filter[property_name] == "false" ? "selected" : nil %>">
49
+ <a href="?<%= Merb::Parse.params_to_query_string(params.merge(:filter => (filter || {}).merge({property_name => "false"}))) %>">No</a>
50
+ </li>
51
+ </ul>
52
+ <% end %>
53
+ <% end %>
54
+ </div>
27
55
  <table cellspacing="0">
28
56
  <thead>
29
57
  <tr>
@@ -96,7 +96,6 @@ module MerbAdmin
96
96
  :length => property.limit,
97
97
  :nullable? => property.null,
98
98
  :serial? => property.primary,
99
- :flag_map => property.type.respond_to?(:flag_map) ? property.type.flag_map : nil,
100
99
  }
101
100
  end
102
101
  end
@@ -92,7 +92,6 @@ module MerbAdmin
92
92
  :length => property.length,
93
93
  :nullable? => property.nullable?,
94
94
  :serial? => property.serial?,
95
- :flag_map => property.type.respond_to?(:flag_map) ? property.type.flag_map : nil,
96
95
  }
97
96
  end
98
97
  end
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.5"
26
+ self.version = "0.4.6"
27
27
  self.author = "Erik Michaels-Ober"
28
28
 
29
29
  # Stub classes loaded hook - runs before LoadClasses BootLoader
@@ -4,11 +4,11 @@ class CreatePlayersMigration < ActiveRecord::Migration
4
4
  t.timestamps
5
5
  t.datetime :deleted_at
6
6
  t.integer :team_id
7
- t.string :name, :limit => 50, :null => false
7
+ t.string :name, :limit => 100, :null => false
8
+ t.string :position, :limit => 50
8
9
  t.integer :number
9
- t.integer :position
10
- t.integer :sex
11
10
  t.float :batting_average, :default => 0.0
11
+ t.boolean :all_star, :default => false
12
12
  t.boolean :injured, :default => false
13
13
  t.date :born_on
14
14
  t.timestamp :wake_at
@@ -5,7 +5,6 @@ class CreateTeamsMigration < ActiveRecord::Migration
5
5
  t.integer :league_id
6
6
  t.integer :division_id
7
7
  t.string :name, :limit => 50, :null => false
8
- t.integer :colors
9
8
  end
10
9
  add_index :teams, :division_id
11
10
  add_index :teams, :league_id
@@ -7,10 +7,10 @@ class Player
7
7
  property :deleted_at, ParanoidDateTime
8
8
  property :team_id, Integer, :nullable => false, :index => true
9
9
  property :name, String, :length => 100, :nullable => false
10
+ property :position, String
10
11
  property :number, Integer, :nullable => false
11
- property :position, Enum[:pitcher, :catcher, :first, :second, :third, :shortstop, :left, :center, :right]
12
- property :sex, Enum[:male, :female]
13
12
  property :batting_average, Float, :default => 0.0, :precision => 4, :scale => 3
13
+ property :all_star, Boolean, :default => false
14
14
  property :injured, Boolean, :default => false
15
15
  property :born_on, Date
16
16
  property :wake_at, Time
@@ -7,7 +7,6 @@ class Team
7
7
  property :league_id, Integer, :nullable => false, :index => true
8
8
  property :division_id, Integer, :nullable => false, :index => true
9
9
  property :name, String, :nullable => false, :index => true
10
- property :colors, Flag[:beige, :black, :blue, :bronze, :brown, :cool, :copper, :cream, :gold, :gray, :green, :khaki, :maroon, :midnight, :navy, :orange, :pink, :purple, :red, :silver, :tan, :turquoise, :violet, :white, :yellow]
11
10
 
12
11
  belongs_to :league
13
12
  belongs_to :division
@@ -1,7 +1,7 @@
1
1
  require File.join(File.dirname(__FILE__), '..', 'spec_helper.rb')
2
2
 
3
3
  given "a player exists" do
4
- @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player 1", :sex => :male, :position => :pitcher)
4
+ @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player 1")
5
5
  end
6
6
 
7
7
  given "a draft exists" do
@@ -11,7 +11,7 @@ end
11
11
  given "two players exist" do
12
12
  @players = []
13
13
  2.times do |i|
14
- @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player #{i}", :sex => :male, :position => :pitcher)
14
+ @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player #{i}")
15
15
  end
16
16
  end
17
17
 
@@ -23,12 +23,12 @@ given "three teams exist" do
23
23
  end
24
24
 
25
25
  given "a player exists and a draft exists" do
26
- @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player 1", :sex => :male, :position => :pitcher)
26
+ @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player 1")
27
27
  @draft = MerbAdmin::AbstractModel.new("Draft").create(:player_id => rand(99999), :team_id => rand(99999), :date => Date.today, :round => rand(50), :pick => rand(30), :overall => rand(1500))
28
28
  end
29
29
 
30
30
  given "a player exists and three teams exist" do
31
- @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player 1", :sex => :male, :position => :pitcher)
31
+ @player = MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player 1")
32
32
  @teams = []
33
33
  3.times do |i|
34
34
  @teams << MerbAdmin::AbstractModel.new("Team").create(:league_id => rand(99999), :division_id => rand(99999), :name => "Team #{i}")
@@ -46,7 +46,7 @@ end
46
46
  given "twenty players exist" do
47
47
  @players = []
48
48
  20.times do |i|
49
- @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player #{i}", :sex => :male, :position => :pitcher)
49
+ @players << MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => rand(99), :name => "Player #{i}")
50
50
  end
51
51
  end
52
52
 
@@ -91,8 +91,8 @@ describe "MerbAdmin" do
91
91
 
92
92
  describe "list with query" do
93
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)
94
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :position => "second")
95
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :position => "pitcher")
96
96
  @response = request(url(:admin_list, :model_name => "player"), :params => {:query => "Jackie Robinson"})
97
97
  end
98
98
 
@@ -111,8 +111,8 @@ describe "MerbAdmin" do
111
111
 
112
112
  describe "list with sort" do
113
113
  before(:each) do
114
- MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :sex => :male, :position => :second)
115
- MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :sex => :male, :position => :pitcher)
114
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :position => "second")
115
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :position => "pitcher")
116
116
  @response = request(url(:admin_list, :model_name => "player"), :params => {:sort => "name"})
117
117
  end
118
118
 
@@ -127,8 +127,8 @@ describe "MerbAdmin" do
127
127
 
128
128
  describe "list with reverse sort" do
129
129
  before(:each) do
130
- MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :sex => :male, :position => :second)
131
- MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :sex => :male, :position => :pitcher)
130
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 42, :name => "Jackie Robinson", :position => "second")
131
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 32, :name => "Sandy Koufax", :position => "pitcher")
132
132
  @response = request(url(:admin_list, :model_name => "player"), :params => {:sort => "name", :sort_reverse => "true"})
133
133
  end
134
134
 
@@ -141,6 +141,26 @@ describe "MerbAdmin" do
141
141
  end
142
142
  end
143
143
 
144
+ describe "list with boolean filter" do
145
+ before(:each) do
146
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 18, :name => "Moises Alou", :position => "left", :injured => true)
147
+ MerbAdmin::AbstractModel.new("Player").create(:team_id => rand(99999), :number => 5, :name => "David Wright", :position => "third", :injured => false)
148
+ @response = request(url(:admin_list, :model_name => "player"), :params => {:filter => {:injured => true}})
149
+ end
150
+
151
+ it "should respond sucessfully" do
152
+ @response.should be_successful
153
+ end
154
+
155
+ it "should contain a correct result" do
156
+ @response.body.should contain("Moises Alou")
157
+ end
158
+
159
+ it "should not contain an incorrect result" do
160
+ @response.body.should_not contain("David Wright")
161
+ end
162
+ end
163
+
144
164
  describe "list with 2 objects", :given => "two players exist" do
145
165
  before(:each) do
146
166
  MerbAdmin[:paginate] = true
@@ -298,7 +318,7 @@ describe "MerbAdmin" do
298
318
 
299
319
  describe "create" do
300
320
  before(:each) do
301
- @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}})
321
+ @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => "second"}})
302
322
  end
303
323
 
304
324
  it "should redirect to list" do
@@ -312,7 +332,7 @@ describe "MerbAdmin" do
312
332
 
313
333
  describe "create and edit" do
314
334
  before(:each) do
315
- @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}, :_continue => true})
335
+ @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => "second"}, :_continue => true})
316
336
  end
317
337
 
318
338
  it "should redirect to edit" do
@@ -326,7 +346,7 @@ describe "MerbAdmin" do
326
346
 
327
347
  describe "create and add another" do
328
348
  before(:each) do
329
- @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}, :_add_another => true})
349
+ @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => "second"}, :_add_another => true})
330
350
  end
331
351
 
332
352
  it "should redirect to new" do
@@ -340,7 +360,7 @@ describe "MerbAdmin" do
340
360
 
341
361
  describe "create with has-one association", :given => "a draft exists" do
342
362
  before(:each) do
343
- @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}, :associations => {:draft => @draft.id}})
363
+ @response = request(url(:admin_create, :model_name => "player"), :method => "post", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => "second"}, :associations => {:draft => @draft.id}})
344
364
  end
345
365
 
346
366
  it "should create a new object" do
@@ -383,7 +403,7 @@ describe "MerbAdmin" do
383
403
 
384
404
  describe "update", :given => "a player exists" do
385
405
  before(:each) do
386
- @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :sex => :male}})
406
+ @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1}})
387
407
  end
388
408
 
389
409
  it "should redirect to list" do
@@ -397,7 +417,7 @@ describe "MerbAdmin" do
397
417
 
398
418
  describe "update and edit", :given => "a player exists" do
399
419
  before(:each) do
400
- @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :sex => :male}, :_continue => true})
420
+ @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1}, :_continue => true})
401
421
  end
402
422
 
403
423
  it "should redirect to edit" do
@@ -411,7 +431,7 @@ describe "MerbAdmin" do
411
431
 
412
432
  describe "update and add another", :given => "a player exists" do
413
433
  before(:each) do
414
- @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :sex => :male}, :_add_another => true})
434
+ @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1}, :_add_another => true})
415
435
  end
416
436
 
417
437
  it "should redirect to new" do
@@ -425,7 +445,7 @@ describe "MerbAdmin" do
425
445
 
426
446
  describe "update with has-one association", :given => "a player exists and a draft exists" do
427
447
  before(:each) do
428
- @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => :second, :sex => :male}, :associations => {:draft => @draft.id}})
448
+ @response = request(url(:admin_update, :model_name => "player", :id => @player.id), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :position => "second"}, :associations => {:draft => @draft.id}})
429
449
  end
430
450
 
431
451
  it "should update an object that already exists" do
@@ -458,7 +478,7 @@ describe "MerbAdmin" do
458
478
 
459
479
  describe "update with missing object" do
460
480
  before(:each) do
461
- @response = request(url(:admin_update, :model_name => "player", :id => 1), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1, :sex => :male}})
481
+ @response = request(url(:admin_update, :model_name => "player", :id => 1), :method => "put", :params => {:player => {:name => "Jackie Robinson", :number => 42, :team_id => 1}})
462
482
  end
463
483
 
464
484
  it "should raise NotFound" do
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.5
4
+ version: 0.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Michaels-Ober