merb-admin 0.8.1 → 0.8.3

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 (109) hide show
  1. data/.gitignore +29 -27
  2. data/Gemfile +24 -22
  3. data/Gemfile.lock +86 -0
  4. data/LICENSE +20 -20
  5. data/README.rdoc +54 -58
  6. data/Rakefile +11 -44
  7. data/app/controllers/application.rb +6 -6
  8. data/app/controllers/main.rb +191 -191
  9. data/app/helpers/application_helper.rb +64 -64
  10. data/app/helpers/main_helper.rb +167 -167
  11. data/app/models/.gitkeep +0 -0
  12. data/app/views/layout/_message.html.erb +10 -10
  13. data/app/views/layout/dashboard.html.erb +34 -34
  14. data/app/views/layout/form.html.erb +48 -48
  15. data/app/views/layout/list.html.erb +42 -42
  16. data/app/views/main/_belongs_to.html.erb +29 -29
  17. data/app/views/main/_big_decimal.html.erb +12 -12
  18. data/app/views/main/_boolean.html.erb +7 -7
  19. data/app/views/main/_date.html.erb +12 -12
  20. data/app/views/main/_datetime.html.erb +12 -12
  21. data/app/views/main/_float.html.erb +12 -12
  22. data/app/views/main/_has_many.html.erb +16 -16
  23. data/app/views/main/_has_one.html.erb +30 -30
  24. data/app/views/main/_integer.html.erb +12 -12
  25. data/app/views/main/_properties.html.erb +18 -18
  26. data/app/views/main/_string.html.erb +15 -15
  27. data/app/views/main/_text.html.erb +11 -11
  28. data/app/views/main/_time.html.erb +12 -12
  29. data/app/views/main/_timestamp.html.erb +12 -12
  30. data/app/views/main/delete.html.erb +28 -28
  31. data/app/views/main/edit.html.erb +19 -19
  32. data/app/views/main/index.html.erb +22 -22
  33. data/app/views/main/list.html.erb +93 -93
  34. data/app/views/main/new.html.erb +16 -16
  35. data/config/init.rb +30 -0
  36. data/config/router.rb +4 -0
  37. data/lib/abstract_model.rb +84 -86
  38. data/lib/active_record_support.rb +147 -147
  39. data/lib/datamapper_support.rb +139 -140
  40. data/lib/generic_support.rb +13 -13
  41. data/lib/merb-admin.rb +99 -99
  42. data/lib/merb-admin/merbtasks.rb +103 -103
  43. data/lib/merb-admin/slicetasks.rb +174 -174
  44. data/lib/merb-admin/spectasks.rb +55 -55
  45. data/lib/merb-admin/version.rb +3 -0
  46. data/lib/sequel_support.rb +275 -275
  47. data/merb-admin.gemspec +42 -232
  48. data/public/javascripts/CollapsedFieldsets.js +85 -85
  49. data/public/javascripts/DateTimeShortcuts.js +255 -255
  50. data/public/javascripts/RelatedObjectLookups.js +96 -96
  51. data/public/javascripts/SelectBox.js +111 -111
  52. data/public/javascripts/SelectFilter2.js +113 -113
  53. data/public/javascripts/actions.js +39 -39
  54. data/public/javascripts/calendar.js +143 -143
  55. data/public/javascripts/core.js +176 -176
  56. data/public/javascripts/dateparse.js +233 -233
  57. data/public/javascripts/getElementsBySelector.js +167 -167
  58. data/public/javascripts/i18n.js +33 -33
  59. data/public/javascripts/ordering.js +137 -137
  60. data/public/javascripts/timeparse.js +94 -94
  61. data/public/javascripts/urlify.js +140 -140
  62. data/public/stylesheets/base.css +746 -746
  63. data/public/stylesheets/changelists.css +269 -269
  64. data/public/stylesheets/dashboard.css +24 -24
  65. data/public/stylesheets/forms.css +327 -327
  66. data/public/stylesheets/global.css +142 -142
  67. data/public/stylesheets/ie.css +50 -50
  68. data/public/stylesheets/layout.css +29 -29
  69. data/public/stylesheets/login.css +54 -54
  70. data/public/stylesheets/master.css +1 -1
  71. data/public/stylesheets/patch-iewin.css +7 -7
  72. data/public/stylesheets/rtl.css +206 -206
  73. data/public/stylesheets/widgets.css +506 -506
  74. data/screenshots/create.png +0 -0
  75. data/screenshots/delete.png +0 -0
  76. data/screenshots/edit.png +0 -0
  77. data/screenshots/index.png +0 -0
  78. data/screenshots/list.png +0 -0
  79. data/screenshots/new.png +0 -0
  80. data/spec/controllers/main_spec.rb +25 -25
  81. data/spec/migrations/activerecord/001_create_divisions_migration.rb +13 -13
  82. data/spec/migrations/activerecord/002_create_drafts_migration.rb +19 -19
  83. data/spec/migrations/activerecord/003_create_leagues_migration.rb +12 -12
  84. data/spec/migrations/activerecord/004_create_players_migration.rb +19 -20
  85. data/spec/migrations/activerecord/005_create_teams_migration.rb +22 -22
  86. data/spec/migrations/sequel/001_create_divisions_migration.rb +15 -15
  87. data/spec/migrations/sequel/002_create_drafts_migration.rb +21 -21
  88. data/spec/migrations/sequel/003_create_leagues_migration.rb +14 -14
  89. data/spec/migrations/sequel/004_create_players_migration.rb +21 -22
  90. data/spec/migrations/sequel/005_create_teams_migration.rb +24 -24
  91. data/spec/models/activerecord/division.rb +7 -7
  92. data/spec/models/activerecord/draft.rb +11 -11
  93. data/spec/models/activerecord/league.rb +6 -6
  94. data/spec/models/activerecord/player.rb +8 -8
  95. data/spec/models/activerecord/team.rb +13 -13
  96. data/spec/models/datamapper/division.rb +12 -12
  97. data/spec/models/datamapper/draft.rb +18 -18
  98. data/spec/models/datamapper/league.rb +11 -11
  99. data/spec/models/datamapper/player.rb +20 -21
  100. data/spec/models/datamapper/team.rb +22 -22
  101. data/spec/models/sequel/division.rb +15 -15
  102. data/spec/models/sequel/draft.rb +19 -19
  103. data/spec/models/sequel/league.rb +14 -14
  104. data/spec/models/sequel/player.rb +18 -18
  105. data/spec/models/sequel/team.rb +21 -21
  106. data/spec/requests/main_spec.rb +763 -763
  107. data/spec/spec_helper.rb +113 -112
  108. metadata +247 -41
  109. data/VERSION +0 -1
@@ -1,16 +1,16 @@
1
- <div id="content-main">
2
- <%= form_for(@object, :action => url(:merb_admin_create, :model_name => @abstract_model.to_param)) do %>
3
- <div>
4
- <%= partial('properties', :properties => @properties) -%>
5
- <%= partial('belongs_to', :with => @abstract_model.belongs_to_associations, :as => :association) -%>
6
- <%= partial('has_one', :with => @abstract_model.has_one_associations, :as => :association) -%>
7
- <%= partial('has_many', :with => @abstract_model.has_many_associations, :as => :association) -%>
8
- <div class="submit-row" >
9
- <%= submit "Save", :class => "default", :name => "_save" %>
10
- <%= submit "Save and add another", :name => "_add_another" %>
11
- <%= submit "Save and continue editing", :name => "_continue" %>
12
- </div>
13
- </div>
14
- <% end =%>
15
-
16
- </div>
1
+ <div id="content-main">
2
+ <%= form_for(@object, :action => url(:merb_admin_create, :model_name => @abstract_model.to_param)) do %>
3
+ <div>
4
+ <%= partial('properties', :properties => @properties) -%>
5
+ <%= partial('belongs_to', :with => @abstract_model.belongs_to_associations, :as => :association) -%>
6
+ <%= partial('has_one', :with => @abstract_model.has_one_associations, :as => :association) -%>
7
+ <%= partial('has_many', :with => @abstract_model.has_many_associations, :as => :association) -%>
8
+ <div class="submit-row" >
9
+ <%= submit "Save", :class => "default", :name => "_save" %>
10
+ <%= submit "Save and add another", :name => "_add_another" %>
11
+ <%= submit "Save and continue editing", :name => "_continue" %>
12
+ </div>
13
+ </div>
14
+ <% end =%>
15
+
16
+ </div>
data/config/init.rb ADDED
@@ -0,0 +1,30 @@
1
+ #
2
+ # ==== Standalone MerbAdmin configuration
3
+ #
4
+ # This configuration/environment file is only loaded by bin/slice, which can be
5
+ # used during development of the slice. It has no effect on this slice being
6
+ # loaded in a host application. To run your slice in standalone mode, just
7
+ # run 'slice' from its directory. The 'slice' command is very similar to
8
+ # the 'merb' command, and takes all the same options, including -i to drop
9
+ # into an irb session for example.
10
+ #
11
+ # The usual Merb configuration directives and init.rb setup methods apply,
12
+ # including use_orm and before_app_loads/after_app_loads.
13
+ #
14
+ # If you need need different configurations for different environments you can
15
+ # even create the specific environment file in config/environments/ just like
16
+ # in a regular Merb application.
17
+ #
18
+ # In fact, a slice is no different from a normal # Merb application - it only
19
+ # differs by the fact that seamlessly integrates into a so called 'host'
20
+ # application, which in turn can override or finetune the slice implementation
21
+ # code and views.
22
+
23
+ use_test :rspec
24
+ use_template_engine :erb
25
+
26
+ Merb::Config.use do |c|
27
+ c[:exception_details] = true
28
+ c[:reload_templates] = true
29
+ c[:reload_classes] = true
30
+ end
data/config/router.rb ADDED
@@ -0,0 +1,4 @@
1
+ # This file is here so slice can be testing as a stand alone application.
2
+
3
+ Merb::Router.prepare do
4
+ end
@@ -1,86 +1,84 @@
1
- require 'generic_support'
2
-
3
- module MerbAdmin
4
- class AbstractModel
5
- # Returns all models for a given Merb app
6
- def self.all
7
- @models = []
8
- orm = Merb.orm
9
- case orm
10
- when :activerecord, :sequel
11
- Dir.glob(Merb.dir_for(:model) / Merb.glob_for(:model)).each do |filename|
12
- File.read(filename).scan(/class ([\w\d_\-:]+)/).flatten.each do |model_name|
13
- add_model(model_name)
14
- end
15
- end
16
- when :datamapper
17
- DataMapper::Model.descendants.each do |model|
18
- add_model(model.to_s)
19
- end
20
- else
21
- raise "MerbAdmin does not support the #{orm} ORM"
22
- end
23
- @models.sort!{|x, y| x.model.to_s <=> y.model.to_s}
24
- end
25
-
26
- def self.add_model(model_name)
27
- model = lookup(model_name)
28
- @models << new(model) if model
29
- end
30
-
31
- # Given a string +model_name+, finds the corresponding model class
32
- def self.lookup(model_name)
33
- return nil if MerbAdmin[:excluded_models].include?(model_name)
34
- begin
35
- model = Object.full_const_get(model_name)
36
- rescue NameError
37
- raise "MerbAdmin could not find model #{model_name}"
38
- end
39
-
40
- case Merb.orm
41
- when :activerecord
42
- model if superclasses(model).include?(ActiveRecord::Base)
43
- when :datamapper
44
- model if model.include?(DataMapper::Resource)
45
- when :sequel
46
- model if superclasses(model).include?(Sequel::Model)
47
- else
48
- nil
49
- end
50
- end
51
-
52
- attr_accessor :model
53
-
54
- def initialize(model)
55
- model = self.class.lookup(model.to_s.camel_case) unless model.is_a?(Class)
56
- orm = Merb.orm
57
- @model = model
58
- self.extend(GenericSupport)
59
- case orm
60
- when :activerecord
61
- require 'active_record_support'
62
- self.extend(ActiverecordSupport)
63
- when :datamapper
64
- require 'datamapper_support'
65
- self.extend(DatamapperSupport)
66
- when :sequel
67
- require 'sequel_support'
68
- self.extend(SequelSupport)
69
- else
70
- raise "MerbAdmin does not support the #{orm} ORM"
71
- end
72
- end
73
-
74
- private
75
-
76
- def self.superclasses(klass)
77
- superclasses = []
78
- while klass
79
- superclasses << klass.superclass if klass && klass.superclass
80
- klass = klass.superclass
81
- end
82
- superclasses
83
- end
84
-
85
- end
86
- end
1
+ require 'generic_support'
2
+
3
+ module MerbAdmin
4
+ class AbstractModel
5
+ # Returns all models for a given Merb app
6
+ def self.all
7
+ @models = []
8
+ orm = Merb.orm
9
+ case orm
10
+ when :activerecord, :sequel
11
+ Dir.glob(Merb.dir_for(:model) / Merb.glob_for(:model)).each do |filename|
12
+ File.read(filename).scan(/class ([\w\d_\-:]+)/).flatten.each do |model_name|
13
+ add_model(model_name)
14
+ end
15
+ end
16
+ when :datamapper
17
+ DataMapper::Model.descendants.each do |model|
18
+ add_model(model.to_s)
19
+ end
20
+ else
21
+ raise "MerbAdmin does not support the #{orm} ORM"
22
+ end
23
+ @models.sort!{|x, y| x.model.to_s <=> y.model.to_s}
24
+ end
25
+
26
+ def self.add_model(model_name)
27
+ model = lookup(model_name)
28
+ @models << new(model) if model
29
+ end
30
+
31
+ # Given a string +model_name+, finds the corresponding model class
32
+ def self.lookup(model_name)
33
+ return nil if MerbAdmin[:excluded_models].include?(model_name)
34
+ begin
35
+ model = Object.full_const_get(model_name)
36
+ rescue NameError
37
+ raise "MerbAdmin could not find model #{model_name}"
38
+ end
39
+
40
+ case Merb.orm
41
+ when :activerecord
42
+ model if superclasses(model).include?(ActiveRecord::Base)
43
+ when :sequel
44
+ model if superclasses(model).include?(Sequel::Model)
45
+ else
46
+ model
47
+ end
48
+ end
49
+
50
+ attr_accessor :model
51
+
52
+ def initialize(model)
53
+ model = self.class.lookup(model.to_s.camel_case) unless model.is_a?(Class)
54
+ orm = Merb.orm
55
+ @model = model
56
+ self.extend(GenericSupport)
57
+ case orm
58
+ when :activerecord
59
+ require 'active_record_support'
60
+ self.extend(ActiverecordSupport)
61
+ when :datamapper
62
+ require 'datamapper_support'
63
+ self.extend(DatamapperSupport)
64
+ when :sequel
65
+ require 'sequel_support'
66
+ self.extend(SequelSupport)
67
+ else
68
+ raise "MerbAdmin does not support the #{orm} ORM"
69
+ end
70
+ end
71
+
72
+ private
73
+
74
+ def self.superclasses(klass)
75
+ superclasses = []
76
+ while klass
77
+ superclasses << klass.superclass if klass && klass.superclass
78
+ klass = klass.superclass
79
+ end
80
+ superclasses
81
+ end
82
+
83
+ end
84
+ end
@@ -1,147 +1,147 @@
1
- require 'active_record'
2
-
3
- module MerbAdmin
4
- class AbstractModel
5
- module ActiverecordSupport
6
- def get(id)
7
- model.find_by_id(id).extend(InstanceMethods)
8
- rescue ActiveRecord::RecordNotFound
9
- nil
10
- end
11
-
12
- def count(options = {})
13
- model.count(options.reject{|key, value| [:sort, :sort_reverse].include?(key)})
14
- end
15
-
16
- def first(options = {})
17
- model.first(merge_order(options)).extend(InstanceMethods)
18
- end
19
-
20
- def all(options = {})
21
- model.all(merge_order(options))
22
- end
23
-
24
- def paginated(options = {})
25
- page = options.delete(:page) || 1
26
- per_page = options.delete(:per_page) || MerbAdmin[:per_page]
27
-
28
- page_count = (count(options).to_f / per_page).ceil
29
-
30
- options.merge!({
31
- :limit => per_page,
32
- :offset => (page - 1) * per_page
33
- })
34
-
35
- [page_count, all(options)]
36
- end
37
-
38
- def create(params = {})
39
- model.create(params).extend(InstanceMethods)
40
- end
41
-
42
- def new(params = {})
43
- model.new(params).extend(InstanceMethods)
44
- end
45
-
46
- def destroy_all!
47
- model.all.each do |object|
48
- object.destroy
49
- end
50
- end
51
-
52
- def has_many_associations
53
- associations.select do |association|
54
- association[:type] == :has_many
55
- end
56
- end
57
-
58
- def has_one_associations
59
- associations.select do |association|
60
- association[:type] == :has_one
61
- end
62
- end
63
-
64
- def belongs_to_associations
65
- associations.select do |association|
66
- association[:type] == :belongs_to
67
- end
68
- end
69
-
70
- def associations
71
- model.reflect_on_all_associations.map do |association|
72
- {
73
- :name => association.name,
74
- :pretty_name => association.name.to_s.gsub('_', ' ').capitalize,
75
- :type => association.macro,
76
- :parent_model => association_parent_model_lookup(association),
77
- :parent_key => association_parent_key_lookup(association),
78
- :child_model => association_child_model_lookup(association),
79
- :child_key => association_child_key_lookup(association),
80
- }
81
- end
82
- end
83
-
84
- def properties
85
- model.columns.map do |property|
86
- {
87
- :name => property.name.to_sym,
88
- :pretty_name => property.human_name,
89
- :type => property.type,
90
- :length => property.limit,
91
- :nullable? => property.null,
92
- :serial? => property.primary,
93
- }
94
- end
95
- end
96
-
97
- private
98
-
99
- def merge_order(options)
100
- @sort ||= options.delete(:sort) || "id"
101
- @sort_order ||= options.delete(:sort_reverse) ? "desc" : "asc"
102
- options.merge(:order => ["#{@sort} #{@sort_order}"])
103
- end
104
-
105
- def association_parent_model_lookup(association)
106
- case association.macro
107
- when :belongs_to
108
- association.klass
109
- when :has_one, :has_many
110
- association.active_record
111
- else
112
- raise "Unknown association type"
113
- end
114
- end
115
-
116
- def association_parent_key_lookup(association)
117
- [:id]
118
- end
119
-
120
- def association_child_model_lookup(association)
121
- case association.macro
122
- when :belongs_to
123
- association.active_record
124
- when :has_one, :has_many
125
- association.klass
126
- else
127
- raise "Unknown association type"
128
- end
129
- end
130
-
131
- def association_child_key_lookup(association)
132
- case association.macro
133
- when :belongs_to
134
- ["#{association.class_name.snake_case}_id".to_sym]
135
- when :has_one, :has_many
136
- [association.primary_key_name.to_sym]
137
- else
138
- raise "Unknown association type"
139
- end
140
- end
141
-
142
- module InstanceMethods
143
- end
144
-
145
- end
146
- end
147
- end
1
+ require 'active_record'
2
+
3
+ module MerbAdmin
4
+ class AbstractModel
5
+ module ActiverecordSupport
6
+ def get(id)
7
+ model.find_by_id(id).extend(InstanceMethods)
8
+ rescue ActiveRecord::RecordNotFound
9
+ nil
10
+ end
11
+
12
+ def count(options = {})
13
+ model.count(options.reject{|key, value| [:sort, :sort_reverse].include?(key)})
14
+ end
15
+
16
+ def first(options = {})
17
+ model.first(merge_order(options)).extend(InstanceMethods)
18
+ end
19
+
20
+ def all(options = {})
21
+ model.all(merge_order(options))
22
+ end
23
+
24
+ def paginated(options = {})
25
+ page = options.delete(:page) || 1
26
+ per_page = options.delete(:per_page) || MerbAdmin[:per_page]
27
+
28
+ page_count = (count(options).to_f / per_page).ceil
29
+
30
+ options.merge!({
31
+ :limit => per_page,
32
+ :offset => (page - 1) * per_page
33
+ })
34
+
35
+ [page_count, all(options)]
36
+ end
37
+
38
+ def create(params = {})
39
+ model.create(params).extend(InstanceMethods)
40
+ end
41
+
42
+ def new(params = {})
43
+ model.new(params).extend(InstanceMethods)
44
+ end
45
+
46
+ def destroy_all!
47
+ model.all.each do |object|
48
+ object.destroy
49
+ end
50
+ end
51
+
52
+ def has_many_associations
53
+ associations.select do |association|
54
+ association[:type] == :has_many
55
+ end
56
+ end
57
+
58
+ def has_one_associations
59
+ associations.select do |association|
60
+ association[:type] == :has_one
61
+ end
62
+ end
63
+
64
+ def belongs_to_associations
65
+ associations.select do |association|
66
+ association[:type] == :belongs_to
67
+ end
68
+ end
69
+
70
+ def associations
71
+ model.reflect_on_all_associations.map do |association|
72
+ {
73
+ :name => association.name,
74
+ :pretty_name => association.name.to_s.gsub('_', ' ').capitalize,
75
+ :type => association.macro,
76
+ :parent_model => association_parent_model_lookup(association),
77
+ :parent_key => association_parent_key_lookup(association),
78
+ :child_model => association_child_model_lookup(association),
79
+ :child_key => association_child_key_lookup(association),
80
+ }
81
+ end
82
+ end
83
+
84
+ def properties
85
+ model.columns.map do |property|
86
+ {
87
+ :name => property.name.to_sym,
88
+ :pretty_name => property.human_name,
89
+ :type => property.type,
90
+ :length => property.limit,
91
+ :nullable? => property.null,
92
+ :serial? => property.primary,
93
+ }
94
+ end
95
+ end
96
+
97
+ private
98
+
99
+ def merge_order(options)
100
+ @sort ||= options.delete(:sort) || "id"
101
+ @sort_order ||= options.delete(:sort_reverse) ? "desc" : "asc"
102
+ options.merge(:order => ["#{@sort} #{@sort_order}"])
103
+ end
104
+
105
+ def association_parent_model_lookup(association)
106
+ case association.macro
107
+ when :belongs_to
108
+ association.klass
109
+ when :has_one, :has_many
110
+ association.active_record
111
+ else
112
+ raise "Unknown association type"
113
+ end
114
+ end
115
+
116
+ def association_parent_key_lookup(association)
117
+ [:id]
118
+ end
119
+
120
+ def association_child_model_lookup(association)
121
+ case association.macro
122
+ when :belongs_to
123
+ association.active_record
124
+ when :has_one, :has_many
125
+ association.klass
126
+ else
127
+ raise "Unknown association type"
128
+ end
129
+ end
130
+
131
+ def association_child_key_lookup(association)
132
+ case association.macro
133
+ when :belongs_to
134
+ ["#{association.class_name.snake_case}_id".to_sym]
135
+ when :has_one, :has_many
136
+ [association.primary_key_name.to_sym]
137
+ else
138
+ raise "Unknown association type"
139
+ end
140
+ end
141
+
142
+ module InstanceMethods
143
+ end
144
+
145
+ end
146
+ end
147
+ end