rails_admin 0.0.5 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rails_admin might be problematic. Click here for more details.
- data/Gemfile +5 -30
- data/README.md +20 -2
- data/app/assets/javascripts/rails_admin/ra.filtering-select.js +2 -2
- data/app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee +1 -1
- data/app/assets/javascripts/rails_admin/ra.remote-form.js +1 -1
- data/app/assets/javascripts/rails_admin/ra.widgets.coffee +43 -3
- data/app/assets/javascripts/rails_admin/ui.js.coffee +2 -0
- data/app/assets/stylesheets/rails_admin/imports.css.scss.erb +3 -0
- data/app/assets/stylesheets/rails_admin/ra.widgets.css.scss +8 -0
- data/app/controllers/rails_admin/main_controller.rb +3 -3
- data/app/helpers/rails_admin/application_helper.rb +15 -4
- data/app/helpers/rails_admin/form_builder.rb +35 -35
- data/app/views/layouts/rails_admin/application.html.haml +2 -1
- data/app/views/rails_admin/main/_delete_notice.html.haml +9 -8
- data/app/views/rails_admin/main/_form_datetime.html.haml +1 -1
- data/app/views/rails_admin/main/_form_enumeration.html.haml +18 -1
- data/app/views/rails_admin/main/_form_file_upload.html.haml +2 -2
- data/app/views/rails_admin/main/_form_text.html.haml +7 -1
- data/app/views/rails_admin/main/dashboard.html.haml +26 -25
- data/app/views/rails_admin/main/index.html.haml +1 -1
- data/config/initializers/active_record_extensions.rb +2 -2
- data/config/locales/rails_admin.en.yml +1 -0
- data/lib/generators/rails_admin/install_generator.rb +1 -1
- data/lib/generators/rails_admin/templates/initializer.erb +66 -67
- data/lib/rails_admin/abstract_model.rb +7 -7
- data/lib/rails_admin/adapters/active_record.rb +17 -8
- data/lib/rails_admin/adapters/mongoid.rb +38 -42
- data/lib/rails_admin/adapters/mongoid/extension.rb +1 -1
- data/lib/rails_admin/config.rb +15 -1
- data/lib/rails_admin/config/actions/base.rb +16 -2
- data/lib/rails_admin/config/actions/dashboard.rb +17 -11
- data/lib/rails_admin/config/fields.rb +0 -1
- data/lib/rails_admin/config/fields/association.rb +2 -3
- data/lib/rails_admin/config/fields/base.rb +18 -6
- data/lib/rails_admin/config/fields/types/enum.rb +4 -0
- data/lib/rails_admin/config/fields/types/string.rb +6 -4
- data/lib/rails_admin/config/fields/types/text.rb +19 -2
- data/lib/rails_admin/config/model.rb +17 -0
- data/lib/rails_admin/config/sections/base.rb +17 -0
- data/lib/rails_admin/engine.rb +4 -0
- data/lib/rails_admin/extensions/history/auditing_adapter.rb +1 -1
- data/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +4 -4
- data/lib/rails_admin/support/csv_converter.rb +3 -3
- data/lib/rails_admin/version.rb +2 -2
- data/lib/tasks/rails_admin.rake +36 -6
- data/spec/controllers/main_controller_spec.rb +52 -9
- data/spec/dummy_app/Gemfile +7 -16
- data/spec/dummy_app/app/active_record/another_field_test.rb +4 -0
- data/spec/dummy_app/app/active_record/ball.rb +1 -1
- data/spec/dummy_app/app/active_record/nested_field_test.rb +2 -1
- data/spec/dummy_app/app/active_record/team.rb +3 -2
- data/spec/dummy_app/app/active_record/user.rb +6 -2
- data/spec/dummy_app/app/mongoid/another_field_test.rb +6 -0
- data/spec/dummy_app/app/mongoid/ball.rb +1 -1
- data/spec/dummy_app/app/mongoid/nested_field_test.rb +2 -1
- data/spec/dummy_app/app/mongoid/team.rb +1 -1
- data/spec/dummy_app/config/environments/development.rb +2 -2
- data/spec/dummy_app/db/migrate/20120720075608_create_another_field_tests.rb +8 -0
- data/spec/dummy_app/db/seeds.rb +3 -3
- data/spec/dummy_app/db/test.sqlite3 +0 -0
- data/spec/dummy_app/log/test.log +53792 -0
- data/spec/helpers/application_helper_spec.rb +37 -0
- data/spec/helpers/form_builder_spec.rb +17 -0
- data/spec/integration/authorization/cancan_spec.rb +21 -13
- data/spec/integration/basic/create/rails_admin_namespaced_model_create_spec.rb +1 -8
- data/spec/integration/basic/delete/rails_admin_basic_delete_spec.rb +15 -4
- data/spec/integration/basic/list/rails_admin_basic_list_spec.rb +9 -12
- data/spec/integration/basic/show/rails_admin_basic_show_spec.rb +2 -10
- data/spec/integration/basic/update/rails_admin_basic_update_spec.rb +6 -0
- data/spec/integration/config/edit/rails_admin_config_edit_spec.rb +241 -300
- data/spec/integration/config/list/rails_admin_config_list_spec.rb +3 -81
- data/spec/integration/config/show/rails_admin_config_show_spec.rb +2 -2
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/active_record_extension_spec.rb +16 -0
- data/spec/unit/adapters/active_record_spec.rb +11 -9
- data/spec/unit/adapters/mongoid_spec.rb +4 -4
- data/spec/unit/config/actions/base_spec.rb +32 -0
- data/spec/unit/config/fields/base_spec.rb +56 -0
- data/spec/unit/config/fields/date_spec.rb +53 -0
- data/spec/unit/config/fields/datetime_spec.rb +55 -0
- data/spec/unit/config/fields/time_spec.rb +39 -0
- data/spec/unit/config/fields/timestamp_spec.rb +20 -0
- data/spec/unit/config_spec.rb +1 -1
- data/spec/unit/support/csv_converter_spec.rb +16 -0
- metadata +44 -35
- data/lib/rails_admin/config/fields/factories/serialized.rb +0 -17
- data/lib/tasks/prepare_ci_env.rake +0 -27
@@ -21,6 +21,7 @@
|
|
21
21
|
.span3
|
22
22
|
.well.sidebar-nav
|
23
23
|
%ul.nav.nav-list= main_navigation
|
24
|
+
%ul.nav.nav-list= static_navigation
|
24
25
|
.span9
|
25
26
|
.row-fluid
|
26
|
-
.content{:'data-pjax-container' => true}= render :template => 'layouts/rails_admin/pjax'
|
27
|
+
.content{:'data-pjax-container' => true}= render :template => 'layouts/rails_admin/pjax'
|
@@ -1,18 +1,19 @@
|
|
1
1
|
- object = delete_notice
|
2
|
-
- show_enabled = RailsAdmin::Config::Actions.all.map(&:key).include?(:show)
|
3
2
|
|
4
3
|
%li{:style => 'display:block; margin-top:10px'}
|
5
4
|
%span.label= @abstract_model.pretty_name
|
6
|
-
-
|
7
|
-
|
5
|
+
- wording = object.send(@model_config.object_label_method)
|
6
|
+
- if show_action = action(:show, @abstract_model, object)
|
7
|
+
= link_to(wording, url_for(:action => show_action.action_name, :model_name => @abstract_model.to_param, :id => object.id), :class => 'pjax')
|
8
8
|
- else
|
9
|
-
=
|
9
|
+
= wording
|
10
10
|
%ul
|
11
11
|
- @abstract_model.each_associated_children(object) do |association, child|
|
12
12
|
%li
|
13
13
|
- child_config = RailsAdmin.config(child)
|
14
|
-
= association[:
|
15
|
-
-
|
16
|
-
|
14
|
+
= @abstract_model.model.human_attribute_name association[:name]
|
15
|
+
- wording = child.send(child_config.object_label_method)
|
16
|
+
- if child.id && (show_action = action(:show, child_config.abstract_model, child))
|
17
|
+
= link_to(wording, url_for(:action => show_action.action_name, :model_name => child_config.abstract_model.to_param, :id => child.id), :class => 'pjax')
|
17
18
|
- else
|
18
|
-
=
|
19
|
+
= wording
|
@@ -1 +1 @@
|
|
1
|
-
= form.send field.view_helper, field.method_name, field.html_attributes.reverse_merge({ :data => { :datetimepicker => true, :options => field.js_plugin_options.to_json } })
|
1
|
+
= form.send field.view_helper, field.method_name, field.html_attributes.merge({:value => (field.value.present? ? field.value : field.html_default_value)}).reverse_merge({ :data => { :datetimepicker => true, :options => field.js_plugin_options.to_json } })
|
@@ -1 +1,18 @@
|
|
1
|
-
|
1
|
+
- unless field.multiple?
|
2
|
+
= form.select field.method_name, field.enum, { :include_blank => true }.reverse_merge((hdv = field.html_default_value).nil? ? {} : { :selected => hdv }), field.html_attributes.reverse_merge({ :data => { :enumeration => true }, :placeholder => t('admin.misc.search') })
|
3
|
+
- else
|
4
|
+
:ruby
|
5
|
+
js_data = {
|
6
|
+
:xhr => false,
|
7
|
+
:sortable => false,
|
8
|
+
:cacheAll => true,
|
9
|
+
:regional => {
|
10
|
+
:chooseAll => t("admin.misc.chose_all"),
|
11
|
+
:chosen => t("admin.misc.chosen", :name => config.label_plural),
|
12
|
+
:clearAll => t("admin.misc.clear_all"),
|
13
|
+
:search => t("admin.misc.search"),
|
14
|
+
:up => t("admin.misc.up"),
|
15
|
+
:down => t("admin.misc.down")
|
16
|
+
}
|
17
|
+
}
|
18
|
+
= form.select field.method_name, field.enum, { :selected => field.value, :object => form.object }, field.html_attributes.reverse_merge({:data => { :filteringmultiselect => true, :options => js_data.to_json }, :multiple => true})
|
@@ -3,11 +3,11 @@
|
|
3
3
|
.toggle{:style => ('display:none;' if file && field.delete_method && form.object.send(field.delete_method) == '1')}
|
4
4
|
- if value = field.pretty_value
|
5
5
|
= value
|
6
|
-
= form.file_field(field.name, field.html_attributes.reverse_merge({ :data => { :fileupload => true }
|
6
|
+
= form.file_field(field.name, field.html_attributes.reverse_merge({ :data => { :fileupload => true }}))
|
7
7
|
- if field.optional? && field.errors.blank? && file && field.delete_method
|
8
8
|
%a.btn.btn-info{:href => '#', :'data-toggle' => 'button', :onclick => "$(this).siblings('[type=checkbox]').click(); $(this).siblings('.toggle').toggle('slow'); jQuery(this).toggleClass('btn-danger btn-info'); return false"}
|
9
9
|
%i.icon-white.icon-trash
|
10
|
-
= I18n.t('admin.actions.delete.menu').capitalize + " #{field.
|
10
|
+
= I18n.t('admin.actions.delete.menu').capitalize + " #{field.label.downcase}"
|
11
11
|
= form.check_box(field.delete_method, :style => 'display:none;' )
|
12
12
|
- if field.cache_method
|
13
13
|
= form.hidden_field(field.cache_method)
|
@@ -4,7 +4,7 @@
|
|
4
4
|
js_data = {
|
5
5
|
:jspath => field.ckeditor_location ? field.ckeditor_location : field.ckeditor_base_location + "ckeditor.js",
|
6
6
|
:base_location => field.ckeditor_base_location,
|
7
|
-
:options => {
|
7
|
+
:options => {
|
8
8
|
:customConfig => field.ckeditor_config_js ? field.ckeditor_config_js : field.ckeditor_base_location + "config.js"
|
9
9
|
}
|
10
10
|
}
|
@@ -16,6 +16,12 @@
|
|
16
16
|
:options => field.codemirror_config,
|
17
17
|
:locations => field.codemirror_assets
|
18
18
|
}
|
19
|
+
elsif field.bootstrap_wysihtml5
|
20
|
+
richtext = 'bootstrap-wysihtml5'
|
21
|
+
js_data = {
|
22
|
+
:csspath => field.bootstrap_wysihtml5_css_location,
|
23
|
+
:jspath => field.bootstrap_wysihtml5_js_location
|
24
|
+
}
|
19
25
|
else
|
20
26
|
richtext = false
|
21
27
|
js_data = {}
|
@@ -1,29 +1,30 @@
|
|
1
|
-
|
2
|
-
%
|
3
|
-
%
|
4
|
-
%
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
-
|
11
|
-
-
|
12
|
-
|
1
|
+
- if @abstract_models
|
2
|
+
%table.table.table-condensed.table-striped
|
3
|
+
%thead
|
4
|
+
%tr
|
5
|
+
%th.shrink.model-name= t "admin.table_headers.model_name"
|
6
|
+
%th.shrink.last-used= t "admin.table_headers.last_used"
|
7
|
+
%th.records= t "admin.table_headers.records"
|
8
|
+
%th.shrink.controls
|
9
|
+
%tbody
|
10
|
+
- @abstract_models.each do |abstract_model|
|
11
|
+
- if authorized? :index, abstract_model
|
12
|
+
- index_path = index_path(:model_name => abstract_model.to_param)
|
13
|
+
- row_class = "#{cycle("odd", "even")}#{" link" if index_path}"
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
15
|
+
%tr{:class => row_class, :"data-link" => index_path}
|
16
|
+
%td
|
17
|
+
%span.show= link_to abstract_model.config.label_plural, index_path, :class => 'pjax'
|
18
|
+
%td
|
19
|
+
- if (last_used = @most_recent_changes[abstract_model.pretty_name])
|
20
|
+
= time_ago_in_words last_used
|
21
|
+
= t "admin.misc.ago"
|
22
|
+
%td
|
23
|
+
- count = @count[abstract_model.pretty_name]
|
24
|
+
- percent = count > 0 ? (@max < 2.0 ? count : ((Math.log(count) * 100.0) / Math.log(@max))) : -1
|
25
|
+
.label.animate-width-to{:class => 'label-'+get_indicator(percent), :'data-animate-length' => ([1.0, percent].max.to_i * 20), :'data-animate-width-to' => "#{[2.0, percent - 1].max.to_i}%", :style => "width:2%"}= @count[abstract_model.pretty_name]
|
26
|
+
%td.links
|
27
|
+
%ul.inline= menu_for :collection, abstract_model, nil, true
|
27
28
|
- if @auditing_adapter && authorized?(:history)
|
28
29
|
#block-tables.block
|
29
30
|
.content
|
@@ -113,7 +113,7 @@
|
|
113
113
|
- if property.sortable
|
114
114
|
- sort_location = index_path params.except('sort_reverse').except('page').merge(:sort => property.name).merge(selected && sort_reverse != "true" ? {:sort_reverse => "true"} : {})
|
115
115
|
- sort_direction = selected ? (sort_reverse == 'true' ? "headerSortUp" : "headerSortDown") : nil
|
116
|
-
%th{:class => "#{property.sortable && "header pjax" || nil} #{property.sortable && sort_direction ? sort_direction : nil} #{property.css_class} #{property.type_css_class}", :'data-href' => (property.sortable && sort_location)}= property.label
|
116
|
+
%th{:class => "#{property.sortable && "header pjax" || nil} #{property.sortable && sort_direction ? sort_direction : nil} #{property.css_class} #{property.type_css_class}", :'data-href' => (property.sortable && sort_location), :rel => "tooltip", :title => "#{property.hint}"}= property.label
|
117
117
|
- if other_right
|
118
118
|
%th.other.right.shrink= "..."
|
119
119
|
%th.last.shrink
|
@@ -1,7 +1,7 @@
|
|
1
1
|
if defined?(::ActiveRecord)
|
2
2
|
class ActiveRecord::Base
|
3
3
|
def self.rails_admin(&block)
|
4
|
-
RailsAdmin
|
4
|
+
RailsAdmin.config(self, &block)
|
5
5
|
end
|
6
6
|
|
7
7
|
def rails_admin_default_object_label_method
|
@@ -9,7 +9,7 @@ if defined?(::ActiveRecord)
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def safe_send(value)
|
12
|
-
if self.
|
12
|
+
if self.has_attribute?(value)
|
13
13
|
self.read_attribute(value)
|
14
14
|
else
|
15
15
|
self.send(value)
|
@@ -43,7 +43,7 @@ module RailsAdmin
|
|
43
43
|
generate "devise", model_name
|
44
44
|
else
|
45
45
|
display "And you already set it up, good! We just need to know about your user model name..."
|
46
|
-
guess = routes.match(/devise_for
|
46
|
+
guess = routes.match(/devise_for +:(\w+)/)[1].try(:singularize)
|
47
47
|
display("We found '#{guess}' (should be one of 'user', 'admin', etc.)")
|
48
48
|
model_name = ask_for("Correct Devise model name if needed.", guess, _model_name)
|
49
49
|
unless guess == model_name
|
@@ -3,99 +3,98 @@
|
|
3
3
|
|
4
4
|
RailsAdmin.config do |config|
|
5
5
|
|
6
|
-
# If your default_local is different from :en, uncomment the following 2 lines and set your default locale here:
|
7
|
-
# require 'i18n'
|
8
|
-
# I18n.default_locale = :de
|
9
6
|
|
7
|
+
################ Global configuration ################
|
8
|
+
|
9
|
+
# Set the admin name here (optional second array element will appear in red). For example:
|
10
|
+
config.main_app_name = ['<%= Rails.application.engine_name.titleize.chomp(' Application') %>', 'Admin']
|
11
|
+
# or for a more dynamic name:
|
12
|
+
# config.main_app_name = Proc.new { |controller| [Rails.application.engine_name.titleize, controller.params['action'].titleize] }
|
13
|
+
|
14
|
+
# RailsAdmin may need a way to know who the current user is]
|
10
15
|
config.current_user_method { current_<%= @model_name.underscore %> } # auto-generated
|
11
16
|
|
12
17
|
# If you want to track changes on your models:
|
13
|
-
# config.audit_with :history, <%= @model_name.classify %>
|
18
|
+
# config.audit_with :history, '<%= @model_name.classify %>'
|
14
19
|
|
15
20
|
# Or with a PaperTrail: (you need to install it first)
|
16
|
-
# config.audit_with :paper_trail, <%= @model_name.classify %>
|
17
|
-
|
18
|
-
# Set the admin name here (optional second array element will appear in a beautiful RailsAdmin red ©)
|
19
|
-
config.main_app_name = ['<%= Rails.application.engine_name.titleize.chomp(' Application') %>', 'Admin']
|
20
|
-
# or for a dynamic name:
|
21
|
-
# config.main_app_name = Proc.new { |controller| [Rails.application.engine_name.titleize, controller.params['action'].titleize] }
|
22
|
-
|
21
|
+
# config.audit_with :paper_trail, '<%= @model_name.classify %>'
|
23
22
|
|
24
|
-
#
|
25
|
-
# Display empty fields in show views
|
23
|
+
# Display empty fields in show views:
|
26
24
|
# config.compact_show_view = false
|
27
25
|
|
28
|
-
# ==> Global list view settings
|
29
26
|
# Number of default rows per-page:
|
30
27
|
# config.default_items_per_page = 20
|
31
28
|
|
32
|
-
#
|
33
|
-
#
|
34
|
-
# config.excluded_models = [<%= RailsAdmin::AbstractModel.all.map{|am| am.model.to_s }.join(', ') %>]
|
29
|
+
# Exclude specific models (keep the others):
|
30
|
+
# config.excluded_models = [<%= RailsAdmin::AbstractModel.all.map{|am| "'#{am.model}'" }.join(', ') %>]
|
35
31
|
|
36
|
-
#
|
37
|
-
# config.included_models = [<%= RailsAdmin::AbstractModel.all.map{|am| am.model
|
32
|
+
# Include specific models (exclude the others):
|
33
|
+
# config.included_models = [<%= RailsAdmin::AbstractModel.all.map{|am| "'#{am.model}'" }.join(', ') %>]
|
38
34
|
|
39
|
-
#
|
35
|
+
# Label methods for model instances:
|
40
36
|
# config.label_methods << :description # Default is [:name, :title]
|
41
37
|
|
42
|
-
# ==> Global models configuration
|
43
|
-
# config.models do
|
44
|
-
# # Configuration here will affect all included models in all scopes, handle with care!
|
45
|
-
#
|
46
|
-
# list do
|
47
|
-
# # Configuration here will affect all included models in list sections (same for show, export, edit, update, create)
|
48
|
-
#
|
49
|
-
# fields_of_type :date do
|
50
|
-
# # Configuration here will affect all date fields, in the list section, for all included models. See README for a comprehensive type list.
|
51
|
-
# end
|
52
|
-
# end
|
53
|
-
# end
|
54
|
-
#
|
55
|
-
# ==> Model specific configuration
|
56
|
-
# Keep in mind that *all* configuration blocks are optional.
|
57
|
-
# RailsAdmin will try his best to provide the best defaults for each section, for each field.
|
58
|
-
# Try to override as few things as possible, in the most generic way. Try to avoid setting labels for models and attributes, use ActiveRecord I18n API instead.
|
59
|
-
# Less code is better code!
|
60
|
-
# config.model MyModel do
|
61
|
-
# # Cross-section field configuration
|
62
|
-
# object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
|
63
|
-
# label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
|
64
|
-
# label_plural 'My models' # Same, plural
|
65
|
-
# weight -1 # Navigation priority. Bigger is higher.
|
66
|
-
# parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
|
67
|
-
# navigation_label # Sets dropdown entry's name in navigation. Only for parents!
|
68
|
-
# # Section specific configuration:
|
69
|
-
# list do
|
70
|
-
# filters [:id, :name] # Array of field names which filters should be shown by default in the table header
|
71
|
-
# items_per_page 100 # Override default_items_per_page
|
72
|
-
# sort_by :id # Sort column (default is primary key)
|
73
|
-
# sort_reverse true # Sort direction (default is true for primary key, last created first)
|
74
|
-
# # Here goes the fields configuration for the list view
|
75
|
-
# end
|
76
|
-
# end
|
77
38
|
|
78
|
-
|
39
|
+
################ Model configuration ################
|
79
40
|
|
80
|
-
#
|
41
|
+
# Each model configuration can alternatively:
|
42
|
+
# - stay here in a `config.model 'ModelName' do ... end` block
|
43
|
+
# - go in the model definition file in a `rails_admin do ... end` block
|
44
|
+
|
45
|
+
# This is your choice to make:
|
46
|
+
# - This initializer is loaded once at startup (modifications will show up when restarting the application) but all RailsAdmin configuration would stay in one place.
|
47
|
+
# - Models are reloaded at each request in development mode (when modified), which may smooth your RailsAdmin development workflow.
|
48
|
+
|
49
|
+
|
50
|
+
# Now you probably need to tour the wiki a bit: https://github.com/sferik/rails_admin/wiki
|
51
|
+
# Anyway, here is how RailsAdmin saw your application's models when you ran the initializer:
|
81
52
|
|
82
53
|
<% RailsAdmin::AbstractModel.all.map do |abstract_model| -%>
|
83
|
-
|
54
|
+
|
55
|
+
|
56
|
+
### <%= abstract_model.model.model_name %> ###
|
57
|
+
|
58
|
+
# config.model '<%= abstract_model.model.model_name %>' do
|
59
|
+
|
60
|
+
# # You can copy this to a 'rails_admin do ... end' block inside your <%= abstract_model.model.model_name.underscore %>.rb model definition
|
61
|
+
|
84
62
|
# # Found associations:
|
63
|
+
|
85
64
|
<%= abstract_model.config.export.fields.select{|f| f.association?}.map do |field|
|
86
65
|
%{ # configure #{field.name.inspect}, #{field.type.inspect}#{" # Hidden" unless field.visible?} }
|
87
|
-
end.join("\n")
|
66
|
+
end.join("\n") %>
|
67
|
+
|
88
68
|
# # Found columns:
|
69
|
+
|
89
70
|
<%= abstract_model.config.export.fields.select{|f| !f.association?}.map do |field|
|
90
71
|
%{ # configure #{field.name.inspect}, #{field.type.inspect}#{" # Hidden" unless field.visible?} }
|
91
|
-
end.join("\n")
|
92
|
-
|
93
|
-
#
|
94
|
-
|
95
|
-
#
|
96
|
-
#
|
97
|
-
#
|
98
|
-
#
|
72
|
+
end.join("\n") %>
|
73
|
+
|
74
|
+
# # Cross-section configuration:
|
75
|
+
|
76
|
+
# # object_label_method :name # Name of the method called for pretty printing an *instance* of ModelName
|
77
|
+
# # label 'My model' # Name of ModelName (smartly defaults to ActiveRecord's I18n API)
|
78
|
+
# # label_plural 'My models' # Same, plural
|
79
|
+
# # weight 0 # Navigation priority. Bigger is higher.
|
80
|
+
# # parent OtherModel # Set parent model for navigation. MyModel will be nested below. OtherModel will be on first position of the dropdown
|
81
|
+
# # navigation_label # Sets dropdown entry's name in navigation. Only for parents!
|
82
|
+
|
83
|
+
# # Section specific configuration:
|
84
|
+
|
85
|
+
# list do
|
86
|
+
# # filters [:id, :name] # Array of field names which filters should be shown by default in the table header
|
87
|
+
# # items_per_page 100 # Override default_items_per_page
|
88
|
+
# # sort_by :id # Sort column (default is primary key)
|
89
|
+
# # sort_reverse true # Sort direction (default is true for primary key, last created first)
|
90
|
+
# end
|
91
|
+
# show do; end
|
92
|
+
# edit do; end
|
93
|
+
# export do; end
|
94
|
+
# # also see the create, update, modal and nested sections, which override edit in specific cases (resp. when creating, updating, modifying from another model in a popup modal or modifying from another model nested form)
|
95
|
+
# # you can override a cross-section field configuration in any section with the same syntax `configure :field_name do ... end`
|
96
|
+
# # using `field` instead of `configure` will exclude all other fields and force the ordering
|
99
97
|
# end
|
100
98
|
<%- end -%>
|
99
|
+
|
101
100
|
end
|
@@ -40,14 +40,14 @@ module RailsAdmin
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def initialize(
|
44
|
-
@model_name =
|
45
|
-
if
|
43
|
+
def initialize(model_or_model_name)
|
44
|
+
@model_name = model_or_model_name.to_s
|
45
|
+
if model.ancestors.map(&:to_s).include?('ActiveRecord::Base') && !model.abstract_class?
|
46
46
|
# ActiveRecord
|
47
47
|
@adapter = :active_record
|
48
48
|
require 'rails_admin/adapters/active_record'
|
49
49
|
extend Adapters::ActiveRecord
|
50
|
-
elsif
|
50
|
+
elsif model.ancestors.map(&:to_s).include?('Mongoid::Document')
|
51
51
|
# Mongoid
|
52
52
|
@adapter = :mongoid
|
53
53
|
require 'rails_admin/adapters/mongoid'
|
@@ -57,7 +57,7 @@ module RailsAdmin
|
|
57
57
|
|
58
58
|
# do not store a reference to the model, does not play well with ActiveReload/Rails3.2
|
59
59
|
def model
|
60
|
-
@model_name.
|
60
|
+
@model_name.constantize
|
61
61
|
end
|
62
62
|
|
63
63
|
def config
|
@@ -65,11 +65,11 @@ module RailsAdmin
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def to_param
|
68
|
-
|
68
|
+
@model_name.split("::").map(&:underscore).join("~")
|
69
69
|
end
|
70
70
|
|
71
71
|
def param_key
|
72
|
-
|
72
|
+
@model_name.split("::").map(&:underscore).join("_")
|
73
73
|
end
|
74
74
|
|
75
75
|
def pretty_name
|
@@ -4,7 +4,8 @@ require 'rails_admin/adapters/active_record/abstract_object'
|
|
4
4
|
module RailsAdmin
|
5
5
|
module Adapters
|
6
6
|
module ActiveRecord
|
7
|
-
DISABLED_COLUMN_TYPES = [:tsvector, :blob, :binary, :spatial, :hstore]
|
7
|
+
DISABLED_COLUMN_TYPES = [:tsvector, :blob, :binary, :spatial, :hstore, :geometry]
|
8
|
+
DISABLED_COLUMN_MATCHERS = [/_array$/]
|
8
9
|
|
9
10
|
def ar_adapter
|
10
11
|
Rails.configuration.database_configuration[Rails.env]['adapter']
|
@@ -80,16 +81,17 @@ module RailsAdmin
|
|
80
81
|
end
|
81
82
|
|
82
83
|
def properties
|
83
|
-
columns = model.columns.reject
|
84
|
+
columns = model.columns.reject do |c|
|
85
|
+
c.type.blank? || DISABLED_COLUMN_TYPES.include?(c.type.to_sym) || DISABLED_COLUMN_MATCHERS.any? {|matcher| matcher.match(c.type.to_s)}
|
86
|
+
end
|
84
87
|
columns.map do |property|
|
85
88
|
{
|
86
89
|
:name => property.name.to_sym,
|
87
90
|
:pretty_name => property.name.to_s.tr('_', ' ').capitalize,
|
88
|
-
:type => property.type,
|
89
91
|
:length => property.limit,
|
90
92
|
:nullable? => property.null,
|
91
93
|
:serial? => property.primary,
|
92
|
-
}
|
94
|
+
}.merge(type_lookup(property))
|
93
95
|
end
|
94
96
|
end
|
95
97
|
|
@@ -97,10 +99,6 @@ module RailsAdmin
|
|
97
99
|
model.table_name
|
98
100
|
end
|
99
101
|
|
100
|
-
def serialized_attributes
|
101
|
-
model.serialized_attributes.keys
|
102
|
-
end
|
103
|
-
|
104
102
|
def encoding
|
105
103
|
Rails.configuration.database_configuration[Rails.env]['encoding']
|
106
104
|
end
|
@@ -173,6 +171,9 @@ module RailsAdmin
|
|
173
171
|
when :boolean
|
174
172
|
return ["(#{column} IS NULL OR #{column} = ?)", false] if ['false', 'f', '0'].include?(value)
|
175
173
|
return ["(#{column} = ?)", true] if ['true', 't', '1'].include?(value)
|
174
|
+
when :decimal
|
175
|
+
return if value.blank?
|
176
|
+
["(#{column} = ?)", value.to_f] if value.to_f.to_s == value
|
176
177
|
when :integer, :belongs_to_association
|
177
178
|
return if value.blank?
|
178
179
|
["(#{column} = ?)", value.to_i] if value.to_i.to_s == value
|
@@ -217,6 +218,14 @@ module RailsAdmin
|
|
217
218
|
end
|
218
219
|
end
|
219
220
|
|
221
|
+
def type_lookup(property)
|
222
|
+
if model.serialized_attributes[property.name.to_s]
|
223
|
+
{:type => :serialized}
|
224
|
+
else
|
225
|
+
{:type => property.type}
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
220
229
|
def association_model_lookup(association)
|
221
230
|
if association.options[:polymorphic]
|
222
231
|
RailsAdmin::AbstractModel.polymorphic_parents(:active_record, association.name) || []
|