merb-admin 0.4.5 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
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