merb-admin 0.5.4 → 0.5.5

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
@@ -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 "merb-admin", "0.5.4"
17
+ dependency "merb-admin", "0.5.5"
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://github.com/sferik/merb-admin"
11
11
  SUMMARY = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
12
- GEM_VERSION = "0.5.4"
12
+ GEM_VERSION = "0.5.5"
13
13
 
14
14
  spec = Gem::Specification.new do |s|
15
15
  s.rubyforge_project = "merb"
@@ -2,7 +2,7 @@ require 'builder'
2
2
  module Merb
3
3
  module MerbAdmin
4
4
  module MainHelper
5
- def object_title(object)
5
+ def object_name(object)
6
6
  if object.nil?
7
7
  nil
8
8
  elsif object.respond_to?(:name)
@@ -24,7 +24,7 @@ module Merb
24
24
  else
25
25
  Builder::XmlMarkup.new.img(:src => image_path("icon-no.gif"), :alt => "False")
26
26
  end
27
- when :date_time
27
+ when :datetime
28
28
  value = object.send(property_name)
29
29
  value.respond_to?(:strftime) ? value.strftime("%b. %d, %Y, %I:%M%p") : nil
30
30
  when :date
@@ -34,13 +34,17 @@ module Merb
34
34
  value = object.send(property_name)
35
35
  value.respond_to?(:strftime) ? value.strftime("%I:%M%p") : nil
36
36
  when :string
37
- object.send(property_name).to_s.truncate(50)
37
+ if property_name.to_s =~ /(image|logo|photo|photograph|picture|thumb|thumbnail)_ur(i|l)/i
38
+ Builder::XmlMarkup.new.img(:src => object.send(property_name), :width => 10, :height => 10)
39
+ else
40
+ object.send(property_name).to_s.truncate(50)
41
+ end
38
42
  when :text
39
43
  object.send(property_name).to_s.truncate(50)
40
44
  when :integer
41
45
  association = @abstract_model.belongs_to_associations.select{|a| a[:child_key].first == property_name}.first
42
46
  if association
43
- object_title(object.send(association[:name]))
47
+ object_name(object.send(association[:name]))
44
48
  else
45
49
  object.send(property_name)
46
50
  end
@@ -1,9 +1,10 @@
1
1
  <%
2
2
  child_key = association[:child_key].first
3
- collection = MerbAdmin::AbstractModel.new(association[:parent_model]).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_name(o)]}.sort_by{|o| o[1]}
4
4
  selected = @object.send(child_key)
5
5
  label = association[:pretty_name]
6
6
  required = false
7
+ errors_exist = !(@object.errors[child_key].nil? || @object.errors[child_key].empty?)
7
8
  @properties.each do |property|
8
9
  next unless property[:name] == child_key
9
10
  required = true unless property[:nullable?]
@@ -11,8 +12,8 @@
11
12
  %>
12
13
  <fieldset class="module aligned">
13
14
  <h2><%= label %></h2>
14
- <div class="<%= @object.errors[child_key] ? "form-row errors" : "form-row"%>">
15
- <% if @object.errors[child_key] %>
15
+ <div class="<%= errors_exist ? "form-row errors" : "form-row"%>">
16
+ <% if errors_exist %>
16
17
  <ul class="errorlist">
17
18
  <% @object.errors[child_key].each do |error| %>
18
19
  <li><%= error %></li>
@@ -1,6 +1,6 @@
1
1
  <%
2
2
  association_name = association[:name]
3
- collection = MerbAdmin::AbstractModel.new(association[:child_model]).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_name(o)]}.sort_by{|o| o[1]}
4
4
  selected = @object.send(association_name)
5
5
  label = association[:pretty_name]
6
6
  %>
@@ -1,10 +1,11 @@
1
1
  <%
2
2
  child_key = association[:child_key].first
3
3
  association_name = association[:name]
4
- collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_title(o)]}.sort_by{|o| o[1]}
4
+ collection = MerbAdmin::AbstractModel.new(association[:child_model]).all.map{|o| [o.id, object_name(o)]}.sort_by{|o| o[1]}
5
5
  selected = @object.send(association_name)
6
6
  label = association[:pretty_name]
7
7
  required = false
8
+ errors_exist = !(@object.errors[child_key].nil? || @object.errors[child_key].empty?)
8
9
  @properties.each do |property|
9
10
  next unless property[:name] == child_key
10
11
  required = true unless property[:nullable?]
@@ -12,8 +13,8 @@
12
13
  %>
13
14
  <fieldset class="module aligned">
14
15
  <h2><%= label %></h2>
15
- <div class="<%= @object.errors[child_key] ? "form-row errors" : "form-row" %>">
16
- <% if @object.errors[child_key] %>
16
+ <div class="<%= errors_exist ? "form-row errors" : "form-row" %>">
17
+ <% if errors_exist %>
17
18
  <ul class="errorlist">
18
19
  <% @object.errors[child_key].each do |error| %>
19
20
  <li><%= error %></li>
@@ -3,10 +3,11 @@
3
3
  <% properties.each do |property| %>
4
4
  <% property_name = property[:name] %>
5
5
  <% property_type = property[:type] %>
6
+ <% errors_exist = !(@object.errors[property_name].nil? || @object.errors[property_name].empty?) %>
6
7
  <% next if [:id, :created_at, :created_on, :deleted_at, :updated_at, :updated_on, :deleted_on].include?(property_name) %>
7
8
  <% 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
+ <div class="<%= errors_exist ? "form-row errors" : "form-row" %>">
10
+ <% if errors_exist %>
10
11
  <ul class="errorlist">
11
12
  <% @object.errors[property_name].each do |error| %>
12
13
  <li><%= error %></li>
@@ -6,6 +6,9 @@
6
6
  %>
7
7
  <div>
8
8
  <%= text_field(property_name, :size => [50, length].min, :maxlength => length, :label => label) %>
9
+ <% if property_name.to_s =~ /(image|logo|photo|photograph|picture|thumb|thumbnail)_ur(i|l)/i %>
10
+ <img src="<%= @object.send(property_name) %>" width="10" height"10" />
11
+ <% end %>
9
12
  <p class="help">
10
13
  <%= required ? "Required." : "Optional." %> <%= length %> <%= length == 1 ? "character." : "characters or fewer." %>
11
14
  </p>
@@ -1,7 +1,24 @@
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>
1
+ <p>Are you sure you want to delete the <%= @abstract_model.pretty_name.downcase %> &ldquo;<%= object_name(@object) %>&rdquo;? All of the following related items will be deleted:</p>
2
2
  <ul>
3
3
  <li>
4
- <%= link_to(@model_name, url(:merb_admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id))%>
4
+ <%= @abstract_model.pretty_name %>: <%= link_to(object_name(@object), url(:merb_admin_edit, :model_name => @abstract_model.singular_name, :id => @object.id)) %>
5
+ <ul>
6
+ <% @abstract_model.has_many_associations.each do |association| %>
7
+ <% @object.send(association[:name]).each do |child| %>
8
+ <% next if child.nil? %>
9
+ <li>
10
+ One or more <%= @abstract_model.pretty_name.pluralize.downcase %> in <%= association[:pretty_name].downcase %>: <%= link_to(object_name(child), url(:merb_admin_edit, :model_name => association[:name].to_s.singularize.to_sym, :id => child.id)) %>
11
+ </li>
12
+ <% end %>
13
+ <% end %>
14
+ <% @abstract_model.has_one_associations.each do |association| %>
15
+ <% child = @object.send(association[:name]) %>
16
+ <% next if child.nil? %>
17
+ <li>
18
+ A <%= @abstract_model.pretty_name.downcase %> in <%= association[:pretty_name].downcase %>: <%= link_to(object_name(child), url(:merb_admin_edit, :model_name => association[:name], :id => child.id)) %>
19
+ </li>
20
+ <% end %>
21
+ </ul>
5
22
  </li>
6
23
  </ul>
7
24
  <%= form_for(@object, :action => url(:merb_admin_destroy, :model_name => @abstract_model.singular_name, :id => @object.id), :method => :delete) do %>
@@ -4,6 +4,7 @@
4
4
  filter = params[:filter]
5
5
  sort = params[:sort]
6
6
  sort_reverse = params[:sort_reverse]
7
+ filters_exist = !@properties.select{|property| property[:type] == :boolean}.empty?
7
8
  %>
8
9
  <div id="content-main">
9
10
  <ul class="object-tools">
@@ -11,7 +12,7 @@
11
12
  <%= link_to("Add #{@abstract_model.pretty_name.downcase}", url(:merb_admin_new, :model_name => @abstract_model.singular_name), :class => "addlink") %>
12
13
  </li>
13
14
  </ul>
14
- <div class="module filtered" id="changelist">
15
+ <div class="<%= filters_exist ? "module filtered" : "module" %>" id="changelist">
15
16
  <div id="toolbar">
16
17
  <form id="changelist-search" action="" method="get">
17
18
  <div>
@@ -30,6 +31,7 @@
30
31
  </form>
31
32
  </div>
32
33
  <script type="text/javascript">document.getElementById("searchbar").focus();</script>
34
+ <% if filters_exist %>
33
35
  <div id="changelist-filter">
34
36
  <h2>Filter</h2>
35
37
  <% @properties.each do |property| %>
@@ -52,13 +54,14 @@
52
54
  <% end %>
53
55
  <% end %>
54
56
  </div>
57
+ <% end %>
55
58
  <table cellspacing="0">
56
59
  <thead>
57
60
  <tr>
58
61
  <% @properties.each do |property| %>
59
62
  <% property_name = property[:name] %>
60
63
  <% property_pretty_name = property[:pretty_name] %>
61
- <th class="<%= sort == property_name.to_s ? sort_reverse ? 'sorted descending' : 'sorted ascending' : nil %>">
64
+ <th class="<%= sort == property_name.to_s ? sort_reverse ? "sorted descending" : "sorted ascending" : nil %>">
62
65
  <%= link_to(property_pretty_name, "?" + 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"} : {}))) %>
63
66
  </th>
64
67
  <% end %>
@@ -4,32 +4,6 @@ require 'mlb'
4
4
  namespace :slices do
5
5
  namespace :"merb-admin" do
6
6
 
7
- desc "Loads sample DataMapper models and data"
8
- task :load_sample => ["load_sample:datamapper"]
9
-
10
- namespace :load_sample do
11
-
12
- desc "Loads sample ActiveRecord models"
13
- task :activerecord do
14
- puts "Copying sample ActiveRecord models into host application - resolves any collisions"
15
- copy_models(:activerecord)
16
- puts "Copying sample ActiveRecord migrations into host application - resolves any collisions"
17
- copy_migrations
18
- Rake::Task["db:migrate"].reenable
19
- Rake::Task["db:migrate"].invoke
20
- load_data
21
- end
22
-
23
- desc "Loads sample DataMapper models"
24
- task :datamapper do
25
- puts "Copying sample DataMapper models into host application - resolves any collisions"
26
- copy_models(:datamapper)
27
- Rake::Task["db:automigrate"].reenable
28
- Rake::Task["db:automigrate"].invoke
29
- load_data
30
- end
31
- end
32
-
33
7
  # add your own merb-admin tasks here
34
8
 
35
9
  # # Uncomment the following lines and edit the pre defined tasks
@@ -45,6 +19,47 @@ namespace :slices do
45
19
  # task :migrate do
46
20
  # end
47
21
 
22
+ namespace :activerecord do
23
+
24
+ desc "Loads sample ActiveRecord models and data"
25
+ task :load_sample => ["load_sample:activerecord:models", "load_sample:activerecord:data"]
26
+ namespace :load_sample do
27
+ desc "Loads sample ActiveRecord models"
28
+ task :models do
29
+ copy_models(:activerecord)
30
+ copy_migrations(:activerecord)
31
+ end
32
+
33
+ desc "Loads sample ActiveRecord data"
34
+ task :data do
35
+ Rake::Task["db:migrate"].reenable
36
+ Rake::Task["db:migrate"].invoke
37
+ load_data
38
+ end
39
+ end
40
+
41
+ end
42
+
43
+ namespace :datamapper do
44
+
45
+ desc "Loads sample DataMapper models and data"
46
+ task :load_sample => ["load_sample:datamapper:models", "load_sample:datamapper:data"]
47
+ namespace :load_sample do
48
+ desc "Loads sample DataMapper models"
49
+ task :models do
50
+ copy_models(:datamapper)
51
+ end
52
+
53
+ desc "Loads sample DataMapper data"
54
+ task :data do
55
+ Rake::Task["db:automigrate"].reenable
56
+ Rake::Task["db:automigrate"].invoke
57
+ load_data
58
+ end
59
+ end
60
+
61
+ end
62
+
48
63
  end
49
64
  end
50
65
 
@@ -60,7 +75,7 @@ def load_data
60
75
  division = MerbAdmin::AbstractModel.new("Division").create(:name => mlb_team.division, :league => league)
61
76
  end
62
77
  unless team = MerbAdmin::AbstractModel.new("Team").first(:conditions => ["name = ?", mlb_team.name])
63
- team = MerbAdmin::AbstractModel.new("Team").create(:name => mlb_team.name, :logo_image_url => mlb_team.logo_url, :manager => mlb_team.manager, :ballpark => mlb_team.ballpark, :mascot => mlb_team.mascot, :founded => mlb_team.founded, :wins => mlb_team.wins, :losses => mlb_team.losses, :win_percentage => ("%.3f" % (mlb_team.wins.to_f / (mlb_team.wins + mlb_team.losses))).to_f, :division => division, :league => league)
78
+ team = MerbAdmin::AbstractModel.new("Team").create(:name => mlb_team.name, :logo_url => mlb_team.logo_url, :manager => mlb_team.manager, :ballpark => mlb_team.ballpark, :mascot => mlb_team.mascot, :founded => mlb_team.founded, :wins => mlb_team.wins, :losses => mlb_team.losses, :win_percentage => ("%.3f" % (mlb_team.wins.to_f / (mlb_team.wins + mlb_team.losses))).to_f, :division => division, :league => league)
64
79
  end
65
80
  mlb_team.players.each do |player|
66
81
  MerbAdmin::AbstractModel.new("Player").create(:name => player.name, :number => player.number, :position => player.position, :team => team)
@@ -70,6 +85,7 @@ end
70
85
 
71
86
  def copy_models(orm = nil)
72
87
  orm ||= set_orm
88
+ puts "Copying sample #{orm} models into host application - resolves any collisions"
73
89
  seen, copied, duplicated = [], [], []
74
90
  Dir.glob(File.dirname(__FILE__) / ".." / ".." / "spec" / "models" / orm.to_s.downcase / MerbAdmin.glob_for(:model)).each do |source_filename|
75
91
  destination_filename = Merb.dir_for(:model) / File.basename(source_filename)
@@ -81,7 +97,9 @@ def copy_models(orm = nil)
81
97
  duplicated.each { |f| puts "! duplicated override as #{f}" }
82
98
  end
83
99
 
84
- def copy_migrations
100
+ def copy_migrations(orm = nil)
101
+ orm ||= set_orm
102
+ puts "Copying sample #{orm} migrations into host application - resolves any collisions"
85
103
  seen, copied, duplicated = [], [], []
86
104
  Dir.glob(File.dirname(__FILE__) / ".." / ".." / "schema" / "migrations" / "*.rb").each do |source_filename|
87
105
  destination_filename = Merb.root / "schema" / "migrations" / File.basename(source_filename)
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.5.4"
26
+ self.version = "0.5.5"
27
27
  self.author = "Erik Michaels-Ober"
28
28
 
29
29
  # Stub classes loaded hook - runs before LoadClasses BootLoader
@@ -5,7 +5,7 @@ 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.string :logo_image_url, :limit => 255
8
+ t.string :logo_url, :limit => 255
9
9
  t.string :manager, :limit => 100, :null => false
10
10
  t.string :ballpark, :limit => 100
11
11
  t.string :mascot, :limit => 100
@@ -7,7 +7,7 @@ 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 :logo_image_url, String, :length => 255
10
+ property :logo_url, String, :length => 255
11
11
  property :manager, String, :length => 100, :nullable => false, :index => true
12
12
  property :ballpark, String, :length => 100, :index => true
13
13
  property :mascot, String, :length => 100, :index => 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.5.4
4
+ version: 0.5.5
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-10-07 00:00:00 -07:00
12
+ date: 2009-10-15 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency