merb-admin 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. data/Gemfile +21 -23
  2. data/Gemfile.lock +107 -89
  3. data/LICENSE +20 -20
  4. data/README.rdoc +54 -54
  5. data/Rakefile +11 -11
  6. data/app/controllers/application.rb +6 -6
  7. data/app/controllers/main.rb +191 -191
  8. data/app/helpers/application_helper.rb +64 -64
  9. data/app/helpers/main_helper.rb +167 -167
  10. data/app/views/layout/_message.html.erb +10 -10
  11. data/app/views/layout/dashboard.html.erb +34 -34
  12. data/app/views/layout/form.html.erb +48 -48
  13. data/app/views/layout/list.html.erb +42 -42
  14. data/app/views/main/_belongs_to.html.erb +29 -29
  15. data/app/views/main/_big_decimal.html.erb +12 -12
  16. data/app/views/main/_boolean.html.erb +7 -7
  17. data/app/views/main/_date.html.erb +12 -12
  18. data/app/views/main/_datetime.html.erb +12 -12
  19. data/app/views/main/_float.html.erb +12 -12
  20. data/app/views/main/_has_many.html.erb +16 -16
  21. data/app/views/main/_has_one.html.erb +30 -30
  22. data/app/views/main/_integer.html.erb +12 -12
  23. data/app/views/main/_properties.html.erb +18 -18
  24. data/app/views/main/_string.html.erb +15 -15
  25. data/app/views/main/_text.html.erb +11 -11
  26. data/app/views/main/_time.html.erb +12 -12
  27. data/app/views/main/_timestamp.html.erb +12 -12
  28. data/app/views/main/delete.html.erb +28 -28
  29. data/app/views/main/edit.html.erb +19 -19
  30. data/app/views/main/index.html.erb +22 -22
  31. data/app/views/main/list.html.erb +93 -93
  32. data/app/views/main/new.html.erb +16 -16
  33. data/config/init.rb +31 -30
  34. data/config/router.rb +4 -4
  35. data/lib/abstract_model.rb +84 -84
  36. data/lib/active_record_support.rb +151 -147
  37. data/lib/datamapper_support.rb +145 -141
  38. data/lib/generic_support.rb +13 -13
  39. data/lib/merb-admin.rb +100 -100
  40. data/lib/merb-admin/merbtasks.rb +103 -103
  41. data/lib/merb-admin/slicetasks.rb +168 -174
  42. data/lib/merb-admin/spectasks.rb +55 -55
  43. data/lib/merb-admin/version.rb +3 -3
  44. data/lib/sequel_support.rb +282 -275
  45. data/merb-admin.gemspec +42 -41
  46. data/public/javascripts/CollapsedFieldsets.js +85 -85
  47. data/public/javascripts/DateTimeShortcuts.js +255 -255
  48. data/public/javascripts/RelatedObjectLookups.js +96 -96
  49. data/public/javascripts/SelectBox.js +111 -111
  50. data/public/javascripts/SelectFilter2.js +113 -113
  51. data/public/javascripts/actions.js +39 -39
  52. data/public/javascripts/calendar.js +143 -143
  53. data/public/javascripts/core.js +176 -176
  54. data/public/javascripts/dateparse.js +233 -233
  55. data/public/javascripts/getElementsBySelector.js +167 -167
  56. data/public/javascripts/i18n.js +33 -33
  57. data/public/javascripts/ordering.js +137 -137
  58. data/public/javascripts/timeparse.js +94 -94
  59. data/public/javascripts/urlify.js +140 -140
  60. data/public/stylesheets/base.css +746 -746
  61. data/public/stylesheets/changelists.css +269 -269
  62. data/public/stylesheets/dashboard.css +24 -24
  63. data/public/stylesheets/forms.css +327 -327
  64. data/public/stylesheets/global.css +142 -142
  65. data/public/stylesheets/ie.css +50 -50
  66. data/public/stylesheets/layout.css +29 -29
  67. data/public/stylesheets/login.css +54 -54
  68. data/public/stylesheets/master.css +1 -1
  69. data/public/stylesheets/patch-iewin.css +7 -7
  70. data/public/stylesheets/rtl.css +206 -206
  71. data/public/stylesheets/widgets.css +506 -506
  72. data/spec/controllers/main_spec.rb +25 -25
  73. data/spec/migrations/activerecord/001_create_divisions_migration.rb +13 -13
  74. data/spec/migrations/activerecord/002_create_drafts_migration.rb +19 -19
  75. data/spec/migrations/activerecord/003_create_leagues_migration.rb +12 -12
  76. data/spec/migrations/activerecord/004_create_players_migration.rb +19 -19
  77. data/spec/migrations/activerecord/005_create_teams_migration.rb +22 -22
  78. data/spec/migrations/sequel/001_create_divisions_migration.rb +15 -15
  79. data/spec/migrations/sequel/002_create_drafts_migration.rb +21 -21
  80. data/spec/migrations/sequel/003_create_leagues_migration.rb +14 -14
  81. data/spec/migrations/sequel/004_create_players_migration.rb +21 -21
  82. data/spec/migrations/sequel/005_create_teams_migration.rb +24 -24
  83. data/spec/models/activerecord/division.rb +7 -7
  84. data/spec/models/activerecord/draft.rb +11 -11
  85. data/spec/models/activerecord/league.rb +6 -6
  86. data/spec/models/activerecord/player.rb +8 -8
  87. data/spec/models/activerecord/team.rb +13 -13
  88. data/spec/models/datamapper/division.rb +12 -12
  89. data/spec/models/datamapper/draft.rb +18 -18
  90. data/spec/models/datamapper/league.rb +11 -11
  91. data/spec/models/datamapper/player.rb +20 -20
  92. data/spec/models/datamapper/team.rb +22 -22
  93. data/spec/models/sequel/division.rb +15 -15
  94. data/spec/models/sequel/draft.rb +19 -19
  95. data/spec/models/sequel/league.rb +14 -14
  96. data/spec/models/sequel/player.rb +18 -18
  97. data/spec/models/sequel/team.rb +21 -21
  98. data/spec/requests/main_spec.rb +873 -763
  99. data/spec/spec_helper.rb +111 -113
  100. metadata +40 -26
@@ -1,141 +1,145 @@
1
- require 'dm-core'
2
- require 'dm-aggregates'
3
- require 'dm-types'
4
- require 'dm-validations'
5
-
6
- module MerbAdmin
7
- class AbstractModel
8
- module DatamapperSupport
9
- def get(id)
10
- model.get(id).extend(InstanceMethods)
11
- end
12
-
13
- def count(options = {})
14
- model.count(options.reject{|key, value| [:sort, :sort_reverse].include?(key)})
15
- end
16
-
17
- def first(options = {})
18
- model.first(merge_order(options)).extend(InstanceMethods)
19
- end
20
-
21
- def all(options = {})
22
- model.all(merge_order(options))
23
- end
24
-
25
- def paginated(options = {})
26
- page = options.delete(:page) || 1
27
- per_page = options.delete(:per_page) || MerbAdmin[:per_page]
28
-
29
- page_count = (count(options).to_f / per_page).ceil
30
-
31
- options.merge!({
32
- :limit => per_page,
33
- :offset => (page - 1) * per_page
34
- })
35
-
36
- [page_count, all(options)]
37
- end
38
-
39
- def create(params = {})
40
- model.create(params).extend(InstanceMethods)
41
- end
42
-
43
- def new(params = {})
44
- model.new(params).extend(InstanceMethods)
45
- end
46
-
47
- def destroy_all!
48
- model.all.destroy!
49
- end
50
-
51
- def has_many_associations
52
- associations.select do |association|
53
- association[:type] == :has_many
54
- end
55
- end
56
-
57
- def has_one_associations
58
- associations.select do |association|
59
- association[:type] == :has_one
60
- end
61
- end
62
-
63
- def belongs_to_associations
64
- associations.select do |association|
65
- association[:type] == :belongs_to
66
- end
67
- end
68
-
69
- def associations
70
- model.relationships.to_a.map do |name, association|
71
- {
72
- :name => name,
73
- :pretty_name => name.to_s.gsub("_", " ").capitalize,
74
- :type => association_type_lookup(association),
75
- :parent_model => association.parent_model,
76
- :parent_key => association.parent_key.map{|r| r.name},
77
- :child_model => association.child_model,
78
- :child_key => association.child_key.map{|r| r.name},
79
- }
80
- end
81
- end
82
-
83
- def properties
84
- model.properties.map do |property|
85
- {
86
- :name => property.name,
87
- :pretty_name => property.name.to_s.gsub(/_id$/, "").gsub("_", " ").capitalize,
88
- :type => type_lookup(property),
89
- :length => property.respond_to?(:length) ? property.length : nil,
90
- :nullable? => property.allow_nil?,
91
- :serial? => property.serial?,
92
- }
93
- end
94
- end
95
-
96
- private
97
-
98
- def merge_order(options)
99
- @sort ||= options.delete(:sort) || :id
100
- @sort_order ||= options.delete(:sort_reverse) ? :desc : :asc
101
- options.merge(:order => [@sort.to_sym.send(@sort_order)])
102
- end
103
-
104
- def association_type_lookup(association)
105
- if self.model == association.parent_model
106
- association.options[:max] > 1 ? :has_many : :has_one
107
- elsif self.model == association.child_model
108
- :belongs_to
109
- else
110
- raise "Unknown association type"
111
- end
112
- end
113
-
114
- def type_lookup(property)
115
- type = {
116
- BigDecimal => :big_decimal,
117
- DataMapper::Types::Boolean => :boolean,
118
- DataMapper::Types::Serial => :integer,
119
- DataMapper::Types::Text => :text,
120
- Date => :date,
121
- DateTime => :datetime,
122
- FalseClass => :boolean,
123
- Fixnum => :integer,
124
- Float => :float,
125
- Integer => :integer,
126
- String => :string,
127
- Time => :time,
128
- TrueClass => :boolean,
129
- }
130
- type[property.type] || type[property.primitive]
131
- end
132
-
133
- module InstanceMethods
134
- def update_attributes(attributes)
135
- update(attributes)
136
- end
137
- end
138
-
139
- end
140
- end
141
- end
1
+ require 'dm-core'
2
+ require 'dm-aggregates'
3
+ require 'dm-types'
4
+ require 'dm-validations'
5
+
6
+ module MerbAdmin
7
+ class AbstractModel
8
+ module DatamapperSupport
9
+ def get(id)
10
+ model.get(id).extend(InstanceMethods)
11
+ end
12
+
13
+ def count(options = {})
14
+ model.count(options.reject{|key, value| [:sort, :sort_reverse].include?(key)})
15
+ end
16
+
17
+ def first(options = {})
18
+ model.first(merge_order(options)).extend(InstanceMethods)
19
+ end
20
+
21
+ def last(options = {})
22
+ model.last(merge_order(options)).extend(InstanceMethods)
23
+ end
24
+
25
+ def all(options = {})
26
+ model.all(merge_order(options))
27
+ end
28
+
29
+ def paginated(options = {})
30
+ page = options.delete(:page) || 1
31
+ per_page = options.delete(:per_page) || MerbAdmin[:per_page]
32
+
33
+ page_count = (count(options).to_f / per_page).ceil
34
+
35
+ options.merge!({
36
+ :limit => per_page,
37
+ :offset => (page - 1) * per_page
38
+ })
39
+
40
+ [page_count, all(options)]
41
+ end
42
+
43
+ def create(params = {})
44
+ model.create(params).extend(InstanceMethods)
45
+ end
46
+
47
+ def new(params = {})
48
+ model.new(params).extend(InstanceMethods)
49
+ end
50
+
51
+ def destroy_all!
52
+ model.all.destroy!
53
+ end
54
+
55
+ def has_many_associations
56
+ associations.select do |association|
57
+ association[:type] == :has_many
58
+ end
59
+ end
60
+
61
+ def has_one_associations
62
+ associations.select do |association|
63
+ association[:type] == :has_one
64
+ end
65
+ end
66
+
67
+ def belongs_to_associations
68
+ associations.select do |association|
69
+ association[:type] == :belongs_to
70
+ end
71
+ end
72
+
73
+ def associations
74
+ model.relationships.to_a.map do |name, association|
75
+ {
76
+ :name => name,
77
+ :pretty_name => name.to_s.gsub("_", " ").capitalize,
78
+ :type => association_type_lookup(association),
79
+ :parent_model => association.parent_model,
80
+ :parent_key => association.parent_key.map{|r| r.name},
81
+ :child_model => association.child_model,
82
+ :child_key => association.child_key.map{|r| r.name},
83
+ }
84
+ end
85
+ end
86
+
87
+ def properties
88
+ model.properties.map do |property|
89
+ {
90
+ :name => property.name,
91
+ :pretty_name => property.name.to_s.gsub(/_id$/, "").gsub("_", " ").capitalize,
92
+ :type => type_lookup(property),
93
+ :length => property.respond_to?(:length) ? property.length : nil,
94
+ :nullable? => property.allow_nil?,
95
+ :serial? => property.serial?,
96
+ }
97
+ end
98
+ end
99
+
100
+ private
101
+
102
+ def merge_order(options)
103
+ @sort ||= options.delete(:sort) || :id
104
+ @sort_order ||= options.delete(:sort_reverse) ? :desc : :asc
105
+ options.merge(:order => [@sort.to_sym.send(@sort_order)])
106
+ end
107
+
108
+ def association_type_lookup(association)
109
+ if self.model == association.parent_model
110
+ association.options[:max] > 1 ? :has_many : :has_one
111
+ elsif self.model == association.child_model
112
+ :belongs_to
113
+ else
114
+ raise "Unknown association type"
115
+ end
116
+ end
117
+
118
+ def type_lookup(property)
119
+ type = {
120
+ BigDecimal => :big_decimal,
121
+ DataMapper::Types::Boolean => :boolean,
122
+ DataMapper::Types::Serial => :integer,
123
+ DataMapper::Types::Text => :text,
124
+ Date => :date,
125
+ DateTime => :datetime,
126
+ FalseClass => :boolean,
127
+ Fixnum => :integer,
128
+ Float => :float,
129
+ Integer => :integer,
130
+ String => :string,
131
+ Time => :time,
132
+ TrueClass => :boolean,
133
+ }
134
+ type[property.type] || type[property.primitive]
135
+ end
136
+
137
+ module InstanceMethods
138
+ def update_attributes(attributes)
139
+ update(attributes)
140
+ end
141
+ end
142
+
143
+ end
144
+ end
145
+ end
@@ -1,13 +1,13 @@
1
- module MerbAdmin
2
- class AbstractModel
3
- module GenericSupport
4
- def to_param
5
- model.to_s.snake_case
6
- end
7
-
8
- def pretty_name
9
- model.to_s.snake_case.gsub('_', ' ').capitalize
10
- end
11
- end
12
- end
13
- end
1
+ module MerbAdmin
2
+ class AbstractModel
3
+ module GenericSupport
4
+ def to_param
5
+ model.to_s.snake_case
6
+ end
7
+
8
+ def pretty_name
9
+ model.to_s.snake_case.gsub('_', ' ').capitalize
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,100 +1,100 @@
1
- if defined?(Merb::Plugins)
2
-
3
- $:.unshift File.dirname(__FILE__)
4
-
5
- require 'merb-slices'
6
- Merb::Plugins.add_rakefiles "merb-admin/merbtasks", "merb-admin/slicetasks", "merb-admin/spectasks"
7
-
8
- # Register the Slice for the current host application
9
- Merb::Slices::register(__FILE__)
10
-
11
- # Slice configuration - set this in a before_app_loads callback.
12
- # By default a Slice uses its own layout, so you can swicht to
13
- # the main application layout or no layout at all if needed.
14
- #
15
- # Configuration options:
16
- # :layout - the layout to use; defaults to :merb-admin
17
- # :mirror - which path component types to use on copy operations; defaults to all
18
- Merb::Slices::config[:merb_admin][:layout] ||= :merb_admin
19
- Merb::Slices::config[:merb_admin][:per_page] ||= 100
20
- Merb::Slices::config[:merb_admin][:excluded_models] ||= []
21
-
22
- # All Slice code is expected to be namespaced inside a module
23
- module MerbAdmin
24
-
25
- # Slice metadata
26
- self.description = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
27
- self.version = "0.8.5"
28
- self.author = "Erik Michaels-Ober"
29
-
30
- # Stub classes loaded hook - runs before LoadClasses BootLoader
31
- # right after a slice's classes have been loaded internally.
32
- def self.loaded
33
- end
34
-
35
- # Initialization hook - runs before AfterAppLoads BootLoader
36
- def self.init
37
- end
38
-
39
- # Activation hook - runs after AfterAppLoads BootLoader
40
- def self.activate
41
- end
42
-
43
- # Deactivation hook - triggered by Merb::Slices.deactivate(MerbAdmin)
44
- def self.deactivate
45
- end
46
-
47
- def self.setup_router(scope)
48
- scope.match("/", :method => :get).
49
- to(:controller => "main", :action => "index").
50
- name(:dashboard)
51
-
52
- scope.match("/:model_name", :method => :get).
53
- to(:controller => "main", :action => "list").
54
- name(:list)
55
-
56
- scope.match("/:model_name/new", :method => :get).
57
- to(:controller => "main", :action => "new").
58
- name(:new)
59
-
60
- scope.match("/:model_name/:id/edit", :method => :get).
61
- to(:controller => "main", :action => "edit").
62
- name(:edit)
63
-
64
- scope.match("/:model_name", :method => :post).
65
- to(:controller => "main", :action => "create").
66
- name(:create)
67
-
68
- scope.match("/:model_name/:id", :method => :put).
69
- to(:controller => "main", :action => "update").
70
- name(:update)
71
-
72
- scope.match("/:model_name/:id/delete", :method => :get).
73
- to(:controller => "main", :action => "delete").
74
- name(:delete)
75
-
76
- scope.match("/:model_name/:id(.:format)", :method => :delete).
77
- to(:controller => "main", :action => "destroy").
78
- name(:destroy)
79
- end
80
-
81
- end
82
-
83
- # Setup the slice layout for MerbAdmin
84
- #
85
- # Use MerbAdmin.push_path and MerbAdmin.push_app_path
86
- # to set paths to merb-admin-level and app-level paths. Example:
87
- #
88
- # MerbAdmin.push_path(:application, MerbAdmin.root)
89
- # MerbAdmin.push_app_path(:application, Merb.root / 'slices' / 'merb-admin')
90
- # ...
91
- #
92
- # Any component path that hasn't been set will default to MerbAdmin.root
93
- #
94
- # Or just call setup_default_structure! to setup a basic Merb MVC structure.
95
- MerbAdmin.setup_default_structure!
96
-
97
- # Add dependencies for other MerbAdmin classes below. Example:
98
- # dependency "merb-admin/other"
99
-
100
- end
1
+ if defined?(Merb::Plugins)
2
+
3
+ $:.unshift File.dirname(__FILE__)
4
+
5
+ require 'merb-slices'
6
+ Merb::Plugins.add_rakefiles "merb-admin/merbtasks", "merb-admin/slicetasks", "merb-admin/spectasks"
7
+
8
+ # Register the Slice for the current host application
9
+ Merb::Slices::register(__FILE__)
10
+
11
+ # Slice configuration - set this in a before_app_loads callback.
12
+ # By default a Slice uses its own layout, so you can swicht to
13
+ # the main application layout or no layout at all if needed.
14
+ #
15
+ # Configuration options:
16
+ # :layout - the layout to use; defaults to :merb-admin
17
+ # :mirror - which path component types to use on copy operations; defaults to all
18
+ Merb::Slices::config[:merb_admin][:layout] ||= :merb_admin
19
+ Merb::Slices::config[:merb_admin][:per_page] ||= 100
20
+ Merb::Slices::config[:merb_admin][:excluded_models] ||= []
21
+
22
+ # All Slice code is expected to be namespaced inside a module
23
+ module MerbAdmin
24
+
25
+ # Slice metadata
26
+ self.description = "MerbAdmin is a Merb plugin that provides an easy-to-use interface for managing your data."
27
+ self.version = "0.8.6"
28
+ self.author = "Erik Michaels-Ober"
29
+
30
+ # Stub classes loaded hook - runs before LoadClasses BootLoader
31
+ # right after a slice's classes have been loaded internally.
32
+ def self.loaded
33
+ end
34
+
35
+ # Initialization hook - runs before AfterAppLoads BootLoader
36
+ def self.init
37
+ end
38
+
39
+ # Activation hook - runs after AfterAppLoads BootLoader
40
+ def self.activate
41
+ end
42
+
43
+ # Deactivation hook - triggered by Merb::Slices.deactivate(MerbAdmin)
44
+ def self.deactivate
45
+ end
46
+
47
+ def self.setup_router(scope)
48
+ scope.match("/", :method => :get).
49
+ to(:controller => "main", :action => "index").
50
+ name(:dashboard)
51
+
52
+ scope.match("/:model_name", :method => :get).
53
+ to(:controller => "main", :action => "list").
54
+ name(:list)
55
+
56
+ scope.match("/:model_name/new", :method => :get).
57
+ to(:controller => "main", :action => "new").
58
+ name(:new)
59
+
60
+ scope.match("/:model_name/:id/edit", :method => :get).
61
+ to(:controller => "main", :action => "edit").
62
+ name(:edit)
63
+
64
+ scope.match("/:model_name", :method => :post).
65
+ to(:controller => "main", :action => "create").
66
+ name(:create)
67
+
68
+ scope.match("/:model_name/:id", :method => :put).
69
+ to(:controller => "main", :action => "update").
70
+ name(:update)
71
+
72
+ scope.match("/:model_name/:id/delete", :method => :get).
73
+ to(:controller => "main", :action => "delete").
74
+ name(:delete)
75
+
76
+ scope.match("/:model_name/:id(.:format)", :method => :delete).
77
+ to(:controller => "main", :action => "destroy").
78
+ name(:destroy)
79
+ end
80
+
81
+ end
82
+
83
+ # Setup the slice layout for MerbAdmin
84
+ #
85
+ # Use MerbAdmin.push_path and MerbAdmin.push_app_path
86
+ # to set paths to merb-admin-level and app-level paths. Example:
87
+ #
88
+ # MerbAdmin.push_path(:application, MerbAdmin.root)
89
+ # MerbAdmin.push_app_path(:application, Merb.root / 'slices' / 'merb-admin')
90
+ # ...
91
+ #
92
+ # Any component path that hasn't been set will default to MerbAdmin.root
93
+ #
94
+ # Or just call setup_default_structure! to setup a basic Merb MVC structure.
95
+ MerbAdmin.setup_default_structure!
96
+
97
+ # Add dependencies for other MerbAdmin classes below. Example:
98
+ # dependency "merb-admin/other"
99
+
100
+ end