From 427511291e153ca84706d0c7e9a26ed1dbc6768e Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Wed, 18 Feb 2015 10:34:14 -0600 Subject: [PATCH 01/18] Add toggable navigation menus --- .../javascripts/rails_admin/custom/ui.coffee | 25 ++++++++++++++++++- .../stylesheets/rails_admin/base/theming.scss | 19 ++++++++++++++ app/helpers/rails_admin/application_helper.rb | 2 +- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/app/assets/javascripts/rails_admin/custom/ui.coffee b/app/assets/javascripts/rails_admin/custom/ui.coffee index 28339364e5..b3afff6970 100644 --- a/app/assets/javascripts/rails_admin/custom/ui.coffee +++ b/app/assets/javascripts/rails_admin/custom/ui.coffee @@ -1 +1,24 @@ -#= override this file in your application to add custom behaviour \ No newline at end of file +$ -> + (-> + $children = $('[class*="child-of"]') + $children.each (i, child) -> + child_classes = $(child).attr('class').split(' ') + $(child_classes).each (i, child_class) -> + $child_class = $('.' + child_class) + if child_class.indexOf('child-of-') == 0 + parent_class = '.parent-' + child_class.split('-')[2] + $parent = $(parent_class) + $parent_container = $parent.parent('li') + $child_class.slideUp() + $parent_container.off('click').on 'click', (e) -> + $(this).find('a').toggleClass('up', 0) + $child_class.slideToggle() + return + $parent.addClass 'togglable' + return + return + $('.chevron').not('.togglable').removeClass 'chevron' + return + )() + return + diff --git a/app/assets/stylesheets/rails_admin/base/theming.scss b/app/assets/stylesheets/rails_admin/base/theming.scss index 53be7329e1..099c2a4260 100644 --- a/app/assets/stylesheets/rails_admin/base/theming.scss +++ b/app/assets/stylesheets/rails_admin/base/theming.scss @@ -183,6 +183,25 @@ body.rails_admin { /* nested nav */ .nav { + .chevron { + &::after { + border-style: solid; + border-width: 0.25em 0.25em 0 0; + content: ''; + display: inline-block; + height: 0.65em; + left: 0.5em; + position: relative; + top: 0.15em; + vertical-align: top; + width: 0.65em; + transform: rotate(135deg); + } + &.up:after { + transform: rotate(-45deg); + top: 8px; + } + } .nav-level-1 { padding-left:30px; } diff --git a/app/helpers/rails_admin/application_helper.rb b/app/helpers/rails_admin/application_helper.rb index 3f12a8e6c6..febf66e751 100644 --- a/app/helpers/rails_admin/application_helper.rb +++ b/app/helpers/rails_admin/application_helper.rb @@ -92,7 +92,7 @@ def navigation(nodes_stack, nodes, level = 0) nodes.collect do |node| model_param = node.abstract_model.to_param url = url_for(action: :index, controller: 'rails_admin/main', model_name: model_param) - level_class = " nav-level-#{level}" if level > 0 + level_class = level > 0 ? " nav-level-#{level} child-of-#{node.parent}" : " parent-#{node.abstract_model} chevron" nav_icon = node.navigation_icon ? %().html_safe : '' li = content_tag :li, 'data-model' => model_param do link_to nav_icon + capitalize_first_letter(node.label_plural), url, class: "pjax#{level_class}" From f668f75b2db9bb8c517613bed9a464c525588082 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Fri, 3 Apr 2015 01:05:00 -0600 Subject: [PATCH 02/18] Update readme and add loop index --- README.md | 5 +++++ app/views/rails_admin/main/index.html.haml | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d5385a8237..b5716bcc36 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,11 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data. + +## In this fork +* Collapsing of parent sections in the sidebar navigation +* addex @loop_index to the list index + ## Features * CRUD any data with ease * Custom actions diff --git a/app/views/rails_admin/main/index.html.haml b/app/views/rails_admin/main/index.html.haml index ab7c2bda4b..552b3a6f61 100644 --- a/app/views/rails_admin/main/index.html.haml +++ b/app/views/rails_admin/main/index.html.haml @@ -133,7 +133,8 @@ %th.other.right.shrink= "..." %th.last.shrink %tbody - - @objects.each do |object| + - @objects.each_with_index do |object,index| + - @loop_index = index %tr{class: "#{@abstract_model.param_key}_row"} %td = check_box_tag "bulk_ids[]", object.id, false From 8ec3713c5125af0c483137d62901248ff8eb6b7d Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Sat, 4 Apr 2015 19:33:47 -0600 Subject: [PATCH 03/18] Add search scope as an alternative filtering scope with queries --- README.md | 13 +++ .../javascripts/rails_admin/custom/ui.coffee | 24 ----- .../javascripts/rails_admin/ra.widgets.coffee | 26 +++++ lib/rails_admin/adapters/active_record.rb | 6 ++ lib/rails_admin/config/sections/list.rb | 6 ++ rails_admin.gemspec | 101 ++++++++++++------ 6 files changed, 120 insertions(+), 56 deletions(-) diff --git a/README.md b/README.md index b5716bcc36..47c3b2e92d 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,19 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing ## In this fork * Collapsing of parent sections in the sidebar navigation * addex @loop_index to the list index +* Added search_scope to list for custom scopes use it like so + +```ruby + list do + search_scope do + Proc.new do |scope, query| + scope.merge(status: 'paid').merge(datetime: Date.today).joins(:user).where('users.first_name = ?', query) + end + end + end + # Note, this won't work with existing filterable, searchable fields as merge will create an AND condition with the scope's WHERE s + # see https://gist.github.com/j-mcnally/250eaaceef234dd8971b if you want OR conditions +``` ## Features * CRUD any data with ease diff --git a/app/assets/javascripts/rails_admin/custom/ui.coffee b/app/assets/javascripts/rails_admin/custom/ui.coffee index b3afff6970..e69de29bb2 100644 --- a/app/assets/javascripts/rails_admin/custom/ui.coffee +++ b/app/assets/javascripts/rails_admin/custom/ui.coffee @@ -1,24 +0,0 @@ -$ -> - (-> - $children = $('[class*="child-of"]') - $children.each (i, child) -> - child_classes = $(child).attr('class').split(' ') - $(child_classes).each (i, child_class) -> - $child_class = $('.' + child_class) - if child_class.indexOf('child-of-') == 0 - parent_class = '.parent-' + child_class.split('-')[2] - $parent = $(parent_class) - $parent_container = $parent.parent('li') - $child_class.slideUp() - $parent_container.off('click').on 'click', (e) -> - $(this).find('a').toggleClass('up', 0) - $child_class.slideToggle() - return - $parent.addClass 'togglable' - return - return - $('.chevron').not('.togglable').removeClass 'chevron' - return - )() - return - diff --git a/app/assets/javascripts/rails_admin/ra.widgets.coffee b/app/assets/javascripts/rails_admin/ra.widgets.coffee index 65b8686f0e..1973b42a57 100644 --- a/app/assets/javascripts/rails_admin/ra.widgets.coffee +++ b/app/assets/javascripts/rails_admin/ra.widgets.coffee @@ -217,3 +217,29 @@ $(document).on 'rails_admin.dom_ready', (e, content) -> goBootstrapWysihtml5s(@array, config_options) else goBootstrapWysihtml5s(@array, config_options) + +$ -> + (-> + $children = $('[class*="child-of"]') + $children.each (i, child) -> + child_classes = $(child).attr('class').split(' ') + + $(child_classes).each (i, child_class) -> + $child_class = $('.' + child_class) + if child_class.indexOf('child-of-') == 0 + parent_class = '.parent-' + child_class.split('-')[2] + $parent = $(parent_class) + $parent_container = $parent.parent('li') + $child_class.slideUp(0) + $parent_container.off('click').on 'click', (e) -> + $(this).find('a').toggleClass('up', 0) + $child_class.slideToggle() + return + $parent.addClass 'togglable' + return + return + $('.chevron').not('.togglable').removeClass 'chevron' + return + )() + return + diff --git a/lib/rails_admin/adapters/active_record.rb b/lib/rails_admin/adapters/active_record.rb index 9d627096ca..3232e978e6 100644 --- a/lib/rails_admin/adapters/active_record.rb +++ b/lib/rails_admin/adapters/active_record.rb @@ -36,6 +36,7 @@ def all(options = {}, scope = nil) scope = scope.send(Kaminari.config.page_method_name, options[:page]).per(options[:per]) end scope = scope.reorder("#{options[:sort]} #{options[:sort_reverse] ? 'asc' : 'desc'}") if options[:sort] + scope = search_scope(scope, options[:query]) if options[:query] scope end @@ -119,6 +120,11 @@ def query_scope(scope, query, fields = config.list.fields.select(&:queryable?)) wb.build end + def search_scope(scope, query, filter = config.list.search_scope) + scope = filter.call(scope,query) + scope + end + # filters example => {"string_field"=>{"0055"=>{"o"=>"like", "v"=>"test_value"}}, ...} # "0055" is the filter index, no use here. o is the operator, v the value def filter_scope(scope, filters, fields = config.list.fields.select(&:filterable?)) diff --git a/lib/rails_admin/config/sections/list.rb b/lib/rails_admin/config/sections/list.rb index dbad27cd75..ebd91da5bc 100644 --- a/lib/rails_admin/config/sections/list.rb +++ b/lib/rails_admin/config/sections/list.rb @@ -25,6 +25,12 @@ class List < RailsAdmin::Config::Sections::Base register_instance_option :scopes do [] end + + register_instance_option :search_scope do + Proc.new do |scope, query| + scope + end + end end end end diff --git a/rails_admin.gemspec b/rails_admin.gemspec index 6cdb598350..c03f4ec8fb 100644 --- a/rails_admin.gemspec +++ b/rails_admin.gemspec @@ -1,34 +1,71 @@ -# coding: utf-8 -lib = File.expand_path('../lib', __FILE__) -$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib) -require 'rails_admin/version' +# -*- encoding: utf-8 -*- +# stub: rails_admin 0.6.6 ruby lib -Gem::Specification.new do |spec| - # If you add a dependency, please maintain alphabetical order - spec.add_dependency 'builder', '~> 3.1' - spec.add_dependency 'coffee-rails', '~> 4.0' - spec.add_dependency 'font-awesome-rails', ['>= 3.0', '< 5'] - spec.add_dependency 'haml', '~> 4.0' - spec.add_dependency 'jquery-rails', ['>= 3.0', '< 5'] - spec.add_dependency 'jquery-ui-rails', '~> 5.0' - spec.add_dependency 'kaminari', '~> 0.14' - spec.add_dependency 'nested_form', '~> 0.3' - spec.add_dependency 'rack-pjax', '~> 0.7' - spec.add_dependency 'rails', '~> 4.0' - spec.add_dependency 'remotipart', '~> 1.0' - spec.add_dependency 'safe_yaml', '~> 1.0' - spec.add_dependency 'sass-rails', ['>= 4.0', '< 6'] - spec.add_development_dependency 'bundler', '~> 1.0' - spec.authors = ['Erik Michaels-Ober', 'Bogdan Gaza', 'Petteri Kaapa', 'Benoit Benezech'] - spec.description = 'RailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data.' - spec.email = ['sferik@gmail.com', 'bogdan@cadmio.org', 'petteri.kaapa@gmail.com'] - spec.files = Dir['Gemfile', 'LICENSE.md', 'README.md', 'Rakefile', 'app/**/*', 'config/**/*', 'lib/**/*', 'public/**/*'] - spec.licenses = %w(MIT) - spec.homepage = 'https://github.com/sferik/rails_admin' - spec.name = 'rails_admin' - spec.require_paths = %w(lib) - spec.required_ruby_version = '>= 1.9.3' - spec.required_rubygems_version = '>= 1.8.11' - spec.summary = 'Admin for Rails' - spec.version = RailsAdmin::Version +Gem::Specification.new do |s| + s.name = "rails_admin" + s.version = "0.6.6" + + s.required_rubygems_version = Gem::Requirement.new(">= 1.8.11") if s.respond_to? :required_rubygems_version= + s.require_paths = ["lib"] + s.authors = ["Erik Michaels-Ober", "Bogdan Gaza", "Petteri Kaapa", "Benoit Benezech"] + s.date = "2015-04-03" + s.description = "RailsAdmin is a Rails engine that provides an easy-to-use interface for managing your data." + s.email = ["sferik@gmail.com", "bogdan@cadmio.org", "petteri.kaapa@gmail.com"] + s.files = ["Gemfile", "LICENSE.md", "README.md", "Rakefile", "app/assets", "app/assets/images", "app/assets/images/rails_admin", "app/assets/images/rails_admin/aristo", "app/assets/images/rails_admin/aristo/images", "app/assets/images/rails_admin/aristo/images/bg_fallback.png", "app/assets/images/rails_admin/aristo/images/icon_sprite.png", "app/assets/images/rails_admin/aristo/images/progress_bar.gif", "app/assets/images/rails_admin/aristo/images/slider_handles.png", "app/assets/images/rails_admin/aristo/images/ui-icons_222222_256x240.png", "app/assets/images/rails_admin/aristo/images/ui-icons_454545_256x240.png", "app/assets/images/rails_admin/bootstrap", "app/assets/images/rails_admin/bootstrap/glyphicons-halflings-white.png", "app/assets/images/rails_admin/bootstrap/glyphicons-halflings.png", "app/assets/images/rails_admin/bullet_black.png", "app/assets/images/rails_admin/bullet_white.png", "app/assets/images/rails_admin/calendar.png", "app/assets/images/rails_admin/clock.png", "app/assets/images/rails_admin/colorpicker", "app/assets/images/rails_admin/colorpicker/colorpicker_background.png", "app/assets/images/rails_admin/colorpicker/colorpicker_hex.png", "app/assets/images/rails_admin/colorpicker/colorpicker_hsb_b.png", "app/assets/images/rails_admin/colorpicker/colorpicker_hsb_h.png", "app/assets/images/rails_admin/colorpicker/colorpicker_hsb_s.png", "app/assets/images/rails_admin/colorpicker/colorpicker_indic.gif", "app/assets/images/rails_admin/colorpicker/colorpicker_overlay.png", "app/assets/images/rails_admin/colorpicker/colorpicker_rgb_b.png", "app/assets/images/rails_admin/colorpicker/colorpicker_rgb_g.png", "app/assets/images/rails_admin/colorpicker/colorpicker_rgb_r.png", "app/assets/images/rails_admin/colorpicker/colorpicker_select.gif", "app/assets/images/rails_admin/colorpicker/colorpicker_submit.png", "app/assets/images/rails_admin/colorpicker/custom_background.png", "app/assets/images/rails_admin/colorpicker/custom_hex.png", "app/assets/images/rails_admin/colorpicker/custom_hsb_b.png", "app/assets/images/rails_admin/colorpicker/custom_hsb_h.png", "app/assets/images/rails_admin/colorpicker/custom_hsb_s.png", "app/assets/images/rails_admin/colorpicker/custom_indic.gif", "app/assets/images/rails_admin/colorpicker/custom_rgb_b.png", "app/assets/images/rails_admin/colorpicker/custom_rgb_g.png", "app/assets/images/rails_admin/colorpicker/custom_rgb_r.png", "app/assets/images/rails_admin/colorpicker/custom_submit.png", "app/assets/images/rails_admin/colorpicker/select.png", "app/assets/images/rails_admin/colorpicker/select2.png", "app/assets/images/rails_admin/colorpicker/slider.png", "app/assets/images/rails_admin/logo.png", "app/assets/images/rails_admin/magnifier.png", "app/assets/images/rails_admin/multiselect", "app/assets/images/rails_admin/multiselect/icon_sprite.png", "app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-dark.png", "app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-n-light.png", "app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-dark.png", "app/assets/images/rails_admin/multiselect/ui-icon-circle-triangle-s-light.png", "app/assets/javascripts", "app/assets/javascripts/rails_admin", "app/assets/javascripts/rails_admin/bootstrap", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-affix.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-alert.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-button.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-carousel.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-collapse.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-dropdown.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-modal.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-popover.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-scrollspy.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-tab.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-tooltip.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-transition.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap-typeahead.js", "app/assets/javascripts/rails_admin/bootstrap/bootstrap.js", "app/assets/javascripts/rails_admin/custom", "app/assets/javascripts/rails_admin/custom/ui.coffee", "app/assets/javascripts/rails_admin/jquery.colorpicker.js", "app/assets/javascripts/rails_admin/jquery.pjax.js", "app/assets/javascripts/rails_admin/jquery.remotipart.fixed.js", "app/assets/javascripts/rails_admin/jquery.ui.timepicker.js", "app/assets/javascripts/rails_admin/ra.datetimepicker.js", "app/assets/javascripts/rails_admin/ra.filter-box.js", "app/assets/javascripts/rails_admin/ra.filtering-multiselect.js", "app/assets/javascripts/rails_admin/ra.filtering-select.js", "app/assets/javascripts/rails_admin/ra.i18n.coffee", "app/assets/javascripts/rails_admin/ra.nested-form-hooks.coffee", "app/assets/javascripts/rails_admin/ra.remote-form.js", "app/assets/javascripts/rails_admin/ra.widgets.coffee", "app/assets/javascripts/rails_admin/rails_admin.js", "app/assets/javascripts/rails_admin/ui.coffee", "app/assets/stylesheets", "app/assets/stylesheets/rails_admin", "app/assets/stylesheets/rails_admin/aristo", "app/assets/stylesheets/rails_admin/aristo/images", "app/assets/stylesheets/rails_admin/aristo/images/bg_fallback.png", "app/assets/stylesheets/rails_admin/aristo/images/icon_sprite.png", "app/assets/stylesheets/rails_admin/aristo/images/progress_bar.gif", "app/assets/stylesheets/rails_admin/aristo/images/slider_handles.png", "app/assets/stylesheets/rails_admin/aristo/images/ui-icons_222222_256x240.png", "app/assets/stylesheets/rails_admin/aristo/images/ui-icons_454545_256x240.png", "app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss", "app/assets/stylesheets/rails_admin/base", "app/assets/stylesheets/rails_admin/base/README.txt", "app/assets/stylesheets/rails_admin/base/font-awesome-4-compability.scss", "app/assets/stylesheets/rails_admin/base/mixins.scss", "app/assets/stylesheets/rails_admin/base/theming.scss", "app/assets/stylesheets/rails_admin/base/variables.scss", "app/assets/stylesheets/rails_admin/bootstrap", "app/assets/stylesheets/rails_admin/bootstrap/_alerts.scss", "app/assets/stylesheets/rails_admin/bootstrap/_badges.scss", "app/assets/stylesheets/rails_admin/bootstrap/_breadcrumbs.scss", "app/assets/stylesheets/rails_admin/bootstrap/_button-groups.scss", "app/assets/stylesheets/rails_admin/bootstrap/_buttons.scss", "app/assets/stylesheets/rails_admin/bootstrap/_carousel.scss", "app/assets/stylesheets/rails_admin/bootstrap/_close.scss", "app/assets/stylesheets/rails_admin/bootstrap/_code.scss", "app/assets/stylesheets/rails_admin/bootstrap/_component-animations.scss", "app/assets/stylesheets/rails_admin/bootstrap/_dropdowns.scss", "app/assets/stylesheets/rails_admin/bootstrap/_forms.scss", "app/assets/stylesheets/rails_admin/bootstrap/_glyphicons.scss", "app/assets/stylesheets/rails_admin/bootstrap/_grid.scss", "app/assets/stylesheets/rails_admin/bootstrap/_input-groups.scss", "app/assets/stylesheets/rails_admin/bootstrap/_jumbotron.scss", "app/assets/stylesheets/rails_admin/bootstrap/_labels.scss", "app/assets/stylesheets/rails_admin/bootstrap/_list-group.scss", "app/assets/stylesheets/rails_admin/bootstrap/_media.scss", "app/assets/stylesheets/rails_admin/bootstrap/_mixins.scss", "app/assets/stylesheets/rails_admin/bootstrap/_modals.scss", "app/assets/stylesheets/rails_admin/bootstrap/_navbar.scss", "app/assets/stylesheets/rails_admin/bootstrap/_navs.scss", "app/assets/stylesheets/rails_admin/bootstrap/_normalize.scss", "app/assets/stylesheets/rails_admin/bootstrap/_pager.scss", "app/assets/stylesheets/rails_admin/bootstrap/_pagination.scss", "app/assets/stylesheets/rails_admin/bootstrap/_panels.scss", "app/assets/stylesheets/rails_admin/bootstrap/_popovers.scss", "app/assets/stylesheets/rails_admin/bootstrap/_print.scss", "app/assets/stylesheets/rails_admin/bootstrap/_progress-bars.scss", "app/assets/stylesheets/rails_admin/bootstrap/_responsive-embed.scss", "app/assets/stylesheets/rails_admin/bootstrap/_responsive-utilities.scss", "app/assets/stylesheets/rails_admin/bootstrap/_scaffolding.scss", "app/assets/stylesheets/rails_admin/bootstrap/_tables.scss", "app/assets/stylesheets/rails_admin/bootstrap/_theme.scss", "app/assets/stylesheets/rails_admin/bootstrap/_thumbnails.scss", "app/assets/stylesheets/rails_admin/bootstrap/_tooltip.scss", "app/assets/stylesheets/rails_admin/bootstrap/_type.scss", "app/assets/stylesheets/rails_admin/bootstrap/_utilities.scss", "app/assets/stylesheets/rails_admin/bootstrap/_variables.scss", "app/assets/stylesheets/rails_admin/bootstrap/_wells.scss", "app/assets/stylesheets/rails_admin/bootstrap/bootstrap.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_alerts.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_background-variant.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_border-radius.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_buttons.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_center-block.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_clearfix.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_forms.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_gradients.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_grid-framework.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_grid.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_hide-text.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_image.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_labels.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_list-group.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_nav-divider.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_nav-vertical-align.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_opacity.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_pagination.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_panels.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_progress-bar.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_reset-filter.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_resize.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_responsive-visibility.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_size.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_tab-focus.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_table-row.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_text-emphasis.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_text-overflow.scss", "app/assets/stylesheets/rails_admin/bootstrap/mixins/_vendor-prefixes.scss", "app/assets/stylesheets/rails_admin/custom", "app/assets/stylesheets/rails_admin/custom/mixins.scss", "app/assets/stylesheets/rails_admin/custom/theming.scss", "app/assets/stylesheets/rails_admin/custom/variables.scss", "app/assets/stylesheets/rails_admin/jquery.colorpicker.scss", "app/assets/stylesheets/rails_admin/jquery.ui.timepicker.scss", "app/assets/stylesheets/rails_admin/ra.calendar-additions.scss", "app/assets/stylesheets/rails_admin/ra.filtering-multiselect.scss", "app/assets/stylesheets/rails_admin/ra.widgets.scss", "app/assets/stylesheets/rails_admin/rails_admin.scss.erb", "app/assets/stylesheets/rails_admin/themes", "app/assets/stylesheets/rails_admin/themes/cerulean", "app/assets/stylesheets/rails_admin/themes/cerulean/mixins.scss", "app/assets/stylesheets/rails_admin/themes/cerulean/theming.scss", "app/assets/stylesheets/rails_admin/themes/cerulean/variables.scss", "app/assets/stylesheets/rails_admin/themes/default", "app/assets/stylesheets/rails_admin/themes/default/mixins.scss", "app/assets/stylesheets/rails_admin/themes/default/theming.scss", "app/assets/stylesheets/rails_admin/themes/default/variables.scss", "app/controllers", "app/controllers/rails_admin", "app/controllers/rails_admin/application_controller.rb", "app/controllers/rails_admin/main_controller.rb", "app/helpers", "app/helpers/rails_admin", "app/helpers/rails_admin/application_helper.rb", "app/helpers/rails_admin/form_builder.rb", "app/helpers/rails_admin/main_helper.rb", "app/views", "app/views/kaminari", "app/views/kaminari/twitter-bootstrap", "app/views/kaminari/twitter-bootstrap/_gap.html.haml", "app/views/kaminari/twitter-bootstrap/_next_page.html.haml", "app/views/kaminari/twitter-bootstrap/_page.html.haml", "app/views/kaminari/twitter-bootstrap/_paginator.html.haml", "app/views/kaminari/twitter-bootstrap/_prev_page.html.haml", "app/views/layouts", "app/views/layouts/rails_admin", "app/views/layouts/rails_admin/_navigation.html.haml", "app/views/layouts/rails_admin/_secondary_navigation.html.haml", "app/views/layouts/rails_admin/application.html.haml", "app/views/layouts/rails_admin/pjax.html.haml", "app/views/rails_admin", "app/views/rails_admin/main", "app/views/rails_admin/main/_dashboard_history.html.haml", "app/views/rails_admin/main/_delete_notice.html.haml", "app/views/rails_admin/main/_form_ck_editor.html.haml", "app/views/rails_admin/main/_form_code_mirror.html.haml", "app/views/rails_admin/main/_form_colorpicker.html.haml", "app/views/rails_admin/main/_form_datetime.html.haml", "app/views/rails_admin/main/_form_enumeration.html.haml", "app/views/rails_admin/main/_form_field.html.haml", "app/views/rails_admin/main/_form_file_upload.html.haml", "app/views/rails_admin/main/_form_filtering_multiselect.html.haml", "app/views/rails_admin/main/_form_filtering_select.html.haml", "app/views/rails_admin/main/_form_nested_many.html.haml", "app/views/rails_admin/main/_form_nested_one.html.haml", "app/views/rails_admin/main/_form_polymorphic_association.html.haml", "app/views/rails_admin/main/_form_text.html.haml", "app/views/rails_admin/main/_form_wysihtml5.html.haml", "app/views/rails_admin/main/_submit_buttons.html.haml", "app/views/rails_admin/main/bulk_delete.html.haml", "app/views/rails_admin/main/dashboard.html.haml", "app/views/rails_admin/main/delete.html.haml", "app/views/rails_admin/main/edit.html.haml", "app/views/rails_admin/main/export.html.haml", "app/views/rails_admin/main/history.html.haml", "app/views/rails_admin/main/index.html.haml", "app/views/rails_admin/main/new.html.haml", "app/views/rails_admin/main/show.html.haml", "config/initializers", "config/initializers/active_record_extensions.rb", "config/initializers/devise_patch.rb", "config/initializers/haml.rb", "config/initializers/mongoid_extensions.rb", "config/locales", "config/locales/rails_admin.en.yml", "config/routes.rb", "lib/generators", "lib/generators/rails_admin", "lib/generators/rails_admin/install_generator.rb", "lib/generators/rails_admin/templates", "lib/generators/rails_admin/templates/initializer.erb", "lib/generators/rails_admin/utils.rb", "lib/rails_admin", "lib/rails_admin.rb", "lib/rails_admin/abstract_model.rb", "lib/rails_admin/adapters", "lib/rails_admin/adapters/active_record", "lib/rails_admin/adapters/active_record.rb", "lib/rails_admin/adapters/active_record/abstract_object.rb", "lib/rails_admin/adapters/active_record/association.rb", "lib/rails_admin/adapters/active_record/property.rb", "lib/rails_admin/adapters/mongoid", "lib/rails_admin/adapters/mongoid.rb", "lib/rails_admin/adapters/mongoid/abstract_object.rb", "lib/rails_admin/adapters/mongoid/association.rb", "lib/rails_admin/adapters/mongoid/extension.rb", "lib/rails_admin/adapters/mongoid/property.rb", "lib/rails_admin/bootstrap-sass", "lib/rails_admin/bootstrap-sass.rb", "lib/rails_admin/bootstrap-sass/compass_functions.rb", "lib/rails_admin/bootstrap-sass/sass_functions.rb", "lib/rails_admin/config", "lib/rails_admin/config.rb", "lib/rails_admin/config/actions", "lib/rails_admin/config/actions.rb", "lib/rails_admin/config/actions/base.rb", "lib/rails_admin/config/actions/bulk_delete.rb", "lib/rails_admin/config/actions/dashboard.rb", "lib/rails_admin/config/actions/delete.rb", "lib/rails_admin/config/actions/edit.rb", "lib/rails_admin/config/actions/export.rb", "lib/rails_admin/config/actions/history_index.rb", "lib/rails_admin/config/actions/history_show.rb", "lib/rails_admin/config/actions/index.rb", "lib/rails_admin/config/actions/new.rb", "lib/rails_admin/config/actions/show.rb", "lib/rails_admin/config/actions/show_in_app.rb", "lib/rails_admin/config/configurable.rb", "lib/rails_admin/config/fields", "lib/rails_admin/config/fields.rb", "lib/rails_admin/config/fields/association.rb", "lib/rails_admin/config/fields/base.rb", "lib/rails_admin/config/fields/factories", "lib/rails_admin/config/fields/factories/association.rb", "lib/rails_admin/config/fields/factories/carrierwave.rb", "lib/rails_admin/config/fields/factories/devise.rb", "lib/rails_admin/config/fields/factories/dragonfly.rb", "lib/rails_admin/config/fields/factories/enum.rb", "lib/rails_admin/config/fields/factories/paperclip.rb", "lib/rails_admin/config/fields/factories/password.rb", "lib/rails_admin/config/fields/group.rb", "lib/rails_admin/config/fields/types", "lib/rails_admin/config/fields/types.rb", "lib/rails_admin/config/fields/types/all.rb", "lib/rails_admin/config/fields/types/belongs_to_association.rb", "lib/rails_admin/config/fields/types/boolean.rb", "lib/rails_admin/config/fields/types/bson_object_id.rb", "lib/rails_admin/config/fields/types/carrierwave.rb", "lib/rails_admin/config/fields/types/ck_editor.rb", "lib/rails_admin/config/fields/types/code_mirror.rb", "lib/rails_admin/config/fields/types/color.rb", "lib/rails_admin/config/fields/types/date.rb", "lib/rails_admin/config/fields/types/datetime.rb", "lib/rails_admin/config/fields/types/decimal.rb", "lib/rails_admin/config/fields/types/dragonfly.rb", "lib/rails_admin/config/fields/types/enum.rb", "lib/rails_admin/config/fields/types/file_upload.rb", "lib/rails_admin/config/fields/types/float.rb", "lib/rails_admin/config/fields/types/has_and_belongs_to_many_association.rb", "lib/rails_admin/config/fields/types/has_many_association.rb", "lib/rails_admin/config/fields/types/has_one_association.rb", "lib/rails_admin/config/fields/types/hidden.rb", "lib/rails_admin/config/fields/types/inet.rb", "lib/rails_admin/config/fields/types/integer.rb", "lib/rails_admin/config/fields/types/json.rb", "lib/rails_admin/config/fields/types/paperclip.rb", "lib/rails_admin/config/fields/types/password.rb", "lib/rails_admin/config/fields/types/polymorphic_association.rb", "lib/rails_admin/config/fields/types/serialized.rb", "lib/rails_admin/config/fields/types/string.rb", "lib/rails_admin/config/fields/types/text.rb", "lib/rails_admin/config/fields/types/time.rb", "lib/rails_admin/config/fields/types/timestamp.rb", "lib/rails_admin/config/fields/types/wysihtml5.rb", "lib/rails_admin/config/groupable.rb", "lib/rails_admin/config/has_description.rb", "lib/rails_admin/config/has_fields.rb", "lib/rails_admin/config/has_groups.rb", "lib/rails_admin/config/hideable.rb", "lib/rails_admin/config/lazy_model.rb", "lib/rails_admin/config/model.rb", "lib/rails_admin/config/proxyable", "lib/rails_admin/config/proxyable.rb", "lib/rails_admin/config/proxyable/proxy.rb", "lib/rails_admin/config/sections", "lib/rails_admin/config/sections.rb", "lib/rails_admin/config/sections/base.rb", "lib/rails_admin/config/sections/create.rb", "lib/rails_admin/config/sections/edit.rb", "lib/rails_admin/config/sections/export.rb", "lib/rails_admin/config/sections/list.rb", "lib/rails_admin/config/sections/modal.rb", "lib/rails_admin/config/sections/nested.rb", "lib/rails_admin/config/sections/show.rb", "lib/rails_admin/config/sections/update.rb", "lib/rails_admin/engine.rb", "lib/rails_admin/extension.rb", "lib/rails_admin/extensions", "lib/rails_admin/extensions/cancan", "lib/rails_admin/extensions/cancan.rb", "lib/rails_admin/extensions/cancan/authorization_adapter.rb", "lib/rails_admin/extensions/cancancan", "lib/rails_admin/extensions/cancancan.rb", "lib/rails_admin/extensions/cancancan/authorization_adapter.rb", "lib/rails_admin/extensions/history", "lib/rails_admin/extensions/history.rb", "lib/rails_admin/extensions/history/auditing_adapter.rb", "lib/rails_admin/extensions/history/history.rb", "lib/rails_admin/extensions/paper_trail", "lib/rails_admin/extensions/paper_trail.rb", "lib/rails_admin/extensions/paper_trail/auditing_adapter.rb", "lib/rails_admin/i18n_support.rb", "lib/rails_admin/support", "lib/rails_admin/support/core_extensions.rb", "lib/rails_admin/support/csv_converter.rb", "lib/rails_admin/version.rb", "lib/tasks", "lib/tasks/rails_admin.rake"] + s.homepage = "https://github.com/sferik/rails_admin" + s.licenses = ["MIT"] + s.required_ruby_version = Gem::Requirement.new(">= 1.9.3") + s.rubygems_version = "2.4.3" + s.summary = "Admin for Rails" + + if s.respond_to? :specification_version then + s.specification_version = 4 + + if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then + s.add_runtime_dependency(%q, ["~> 3.1"]) + s.add_runtime_dependency(%q, ["~> 4.0"]) + s.add_runtime_dependency(%q, ["< 5", ">= 3.0"]) + s.add_runtime_dependency(%q, ["~> 4.0"]) + s.add_runtime_dependency(%q, ["< 5", ">= 3.0"]) + s.add_runtime_dependency(%q, ["~> 5.0"]) + s.add_runtime_dependency(%q, ["~> 0.14"]) + s.add_runtime_dependency(%q, ["~> 0.3"]) + s.add_runtime_dependency(%q, ["~> 0.7"]) + s.add_runtime_dependency(%q, ["~> 4.0"]) + s.add_runtime_dependency(%q, ["~> 1.0"]) + s.add_runtime_dependency(%q, ["~> 1.0"]) + s.add_runtime_dependency(%q, ["< 6", ">= 4.0"]) + s.add_development_dependency(%q, ["~> 1.0"]) + else + s.add_dependency(%q, ["~> 3.1"]) + s.add_dependency(%q, ["~> 4.0"]) + s.add_dependency(%q, ["< 5", ">= 3.0"]) + s.add_dependency(%q, ["~> 4.0"]) + s.add_dependency(%q, ["< 5", ">= 3.0"]) + s.add_dependency(%q, ["~> 5.0"]) + s.add_dependency(%q, ["~> 0.14"]) + s.add_dependency(%q, ["~> 0.3"]) + s.add_dependency(%q, ["~> 0.7"]) + s.add_dependency(%q, ["~> 4.0"]) + s.add_dependency(%q, ["~> 1.0"]) + s.add_dependency(%q, ["~> 1.0"]) + s.add_dependency(%q, ["< 6", ">= 4.0"]) + s.add_dependency(%q, ["~> 1.0"]) + end + else + s.add_dependency(%q, ["~> 3.1"]) + s.add_dependency(%q, ["~> 4.0"]) + s.add_dependency(%q, ["< 5", ">= 3.0"]) + s.add_dependency(%q, ["~> 4.0"]) + s.add_dependency(%q, ["< 5", ">= 3.0"]) + s.add_dependency(%q, ["~> 5.0"]) + s.add_dependency(%q, ["~> 0.14"]) + s.add_dependency(%q, ["~> 0.3"]) + s.add_dependency(%q, ["~> 0.7"]) + s.add_dependency(%q, ["~> 4.0"]) + s.add_dependency(%q, ["~> 1.0"]) + s.add_dependency(%q, ["~> 1.0"]) + s.add_dependency(%q, ["< 6", ">= 4.0"]) + s.add_dependency(%q, ["~> 1.0"]) + end end From 9455a8ead247c6c467bfc982f2163cbe57af83f8 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Tue, 21 Apr 2015 14:39:44 -0500 Subject: [PATCH 04/18] Add selection by drawing a box --- README.md | 2 + .../rails_admin/jquery-ui-selectable.js | 272 ++++++++++++++++++ .../javascripts/rails_admin/rails_admin.js | 2 + .../rails_admin/select-checkboxes.js | 19 ++ 4 files changed, 295 insertions(+) create mode 100755 app/assets/javascripts/rails_admin/jquery-ui-selectable.js create mode 100644 app/assets/javascripts/rails_admin/select-checkboxes.js diff --git a/README.md b/README.md index 47c3b2e92d..02f3075259 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing ## In this fork * Collapsing of parent sections in the sidebar navigation * addex @loop_index to the list index +* Draw selection boxes around checkboxes in the index view * Added search_scope to list for custom scopes use it like so ```ruby @@ -34,6 +35,7 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing # see https://gist.github.com/j-mcnally/250eaaceef234dd8971b if you want OR conditions ``` + ## Features * CRUD any data with ease * Custom actions diff --git a/app/assets/javascripts/rails_admin/jquery-ui-selectable.js b/app/assets/javascripts/rails_admin/jquery-ui-selectable.js new file mode 100755 index 0000000000..de3a23acae --- /dev/null +++ b/app/assets/javascripts/rails_admin/jquery-ui-selectable.js @@ -0,0 +1,272 @@ +/*! + * jQuery UI Selectable 1.11.4 + * http://jqueryui.com + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/selectable/ + */ + + +var selectable = $.widget("ui.selectable", $.ui.mouse, { + version: "1.11.4", + options: { + appendTo: "body", + autoRefresh: true, + distance: 0, + filter: "*", + tolerance: "touch", + + // callbacks + selected: null, + selecting: null, + start: null, + stop: null, + unselected: null, + unselecting: null + }, + _create: function() { + var selectees, + that = this; + + this.element.addClass("ui-selectable"); + + this.dragged = false; + + // cache selectee children based on filter + this.refresh = function() { + selectees = $(that.options.filter, that.element[0]); + selectees.addClass("ui-selectee"); + selectees.each(function() { + var $this = $(this), + pos = $this.offset(); + $.data(this, "selectable-item", { + element: this, + $element: $this, + left: pos.left, + top: pos.top, + right: pos.left + $this.outerWidth(), + bottom: pos.top + $this.outerHeight(), + startselected: false, + selected: $this.hasClass("ui-selected"), + selecting: $this.hasClass("ui-selecting"), + unselecting: $this.hasClass("ui-unselecting") + }); + }); + }; + this.refresh(); + + this.selectees = selectees.addClass("ui-selectee"); + + this._mouseInit(); + + this.helper = $("
"); + }, + + _destroy: function() { + this.selectees + .removeClass("ui-selectee") + .removeData("selectable-item"); + this.element + .removeClass("ui-selectable ui-selectable-disabled"); + this._mouseDestroy(); + }, + + _mouseStart: function(event) { + var that = this, + options = this.options; + + this.opos = [ event.pageX, event.pageY ]; + + if (this.options.disabled) { + return; + } + + this.selectees = $(options.filter, this.element[0]); + + this._trigger("start", event); + + $(options.appendTo).append(this.helper); + // position helper (lasso) + this.helper.css({ + "left": event.pageX, + "top": event.pageY, + "width": 0, + "height": 0 + }); + + if (options.autoRefresh) { + this.refresh(); + } + + this.selectees.filter(".ui-selected").each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.startselected = true; + if (!event.metaKey && !event.ctrlKey) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + }); + + $(event.target).parents().addBack().each(function() { + var doSelect, + selectee = $.data(this, "selectable-item"); + if (selectee) { + doSelect = (!event.metaKey && !event.ctrlKey) || !selectee.$element.hasClass("ui-selected"); + selectee.$element + .removeClass(doSelect ? "ui-unselecting" : "ui-selected") + .addClass(doSelect ? "ui-selecting" : "ui-unselecting"); + selectee.unselecting = !doSelect; + selectee.selecting = doSelect; + selectee.selected = doSelect; + // selectable (UN)SELECTING callback + if (doSelect) { + that._trigger("selecting", event, { + selecting: selectee.element + }); + } else { + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + return false; + } + }); + + }, + + _mouseDrag: function(event) { + + this.dragged = true; + + if (this.options.disabled) { + return; + } + + var tmp, + that = this, + options = this.options, + x1 = this.opos[0], + y1 = this.opos[1], + x2 = event.pageX, + y2 = event.pageY; + + if (x1 > x2) { tmp = x2; x2 = x1; x1 = tmp; } + if (y1 > y2) { tmp = y2; y2 = y1; y1 = tmp; } + this.helper.css({ left: x1, top: y1, width: x2 - x1, height: y2 - y1 }); + + this.selectees.each(function() { + var selectee = $.data(this, "selectable-item"), + hit = false; + + //prevent helper from being selected if appendTo: selectable + if (!selectee || selectee.element === that.element[0]) { + return; + } + + if (options.tolerance === "touch") { + hit = ( !(selectee.left > x2 || selectee.right < x1 || selectee.top > y2 || selectee.bottom < y1) ); + } else if (options.tolerance === "fit") { + hit = (selectee.left > x1 && selectee.right < x2 && selectee.top > y1 && selectee.bottom < y2); + } + + if (hit) { + // SELECT + if (selectee.selected) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + } + if (selectee.unselecting) { + selectee.$element.removeClass("ui-unselecting"); + selectee.unselecting = false; + } + if (!selectee.selecting) { + selectee.$element.addClass("ui-selecting"); + selectee.selecting = true; + // selectable SELECTING callback + that._trigger("selecting", event, { + selecting: selectee.element + }); + } + } else { + // UNSELECT + if (selectee.selecting) { + if ((event.metaKey || event.ctrlKey) && selectee.startselected) { + selectee.$element.removeClass("ui-selecting"); + selectee.selecting = false; + selectee.$element.addClass("ui-selected"); + selectee.selected = true; + } else { + selectee.$element.removeClass("ui-selecting"); + selectee.selecting = false; + if (selectee.startselected) { + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + } + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + if (selectee.selected) { + if (!event.metaKey && !event.ctrlKey && !selectee.startselected) { + selectee.$element.removeClass("ui-selected"); + selectee.selected = false; + + selectee.$element.addClass("ui-unselecting"); + selectee.unselecting = true; + // selectable UNSELECTING callback + that._trigger("unselecting", event, { + unselecting: selectee.element + }); + } + } + } + }); + + return false; + }, + + _mouseStop: function(event) { + var that = this; + + this.dragged = false; + + $(".ui-unselecting", this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass("ui-unselecting"); + selectee.unselecting = false; + selectee.startselected = false; + that._trigger("unselected", event, { + unselected: selectee.element + }); + }); + $(".ui-selecting", this.element[0]).each(function() { + var selectee = $.data(this, "selectable-item"); + selectee.$element.removeClass("ui-selecting").addClass("ui-selected"); + selectee.selecting = false; + selectee.selected = true; + selectee.startselected = true; + that._trigger("selected", event, { + selected: selectee.element + }); + }); + this._trigger("stop", event); + + this.helper.remove(); + + return false; + } + +}); + + diff --git a/app/assets/javascripts/rails_admin/rails_admin.js b/app/assets/javascripts/rails_admin/rails_admin.js index 7060898478..e9d4080f85 100644 --- a/app/assets/javascripts/rails_admin/rails_admin.js +++ b/app/assets/javascripts/rails_admin/rails_admin.js @@ -20,3 +20,5 @@ //= require 'rails_admin/ra.widgets' //= require 'rails_admin/ui' //= require 'rails_admin/custom/ui' +//= require 'rails_admin/jquery-ui-selectable' +//= require 'rails_admin/select-checkboxes' diff --git a/app/assets/javascripts/rails_admin/select-checkboxes.js b/app/assets/javascripts/rails_admin/select-checkboxes.js new file mode 100644 index 0000000000..615f41d3ff --- /dev/null +++ b/app/assets/javascripts/rails_admin/select-checkboxes.js @@ -0,0 +1,19 @@ +$(function() { + bind_selectable = function() { + $('tbody').selectable({ + filter: 'input', + distance: 1, + selected: function(event, ui) { + $element = $(ui.selected) + + if ($element.is(':checkbox')) { + $element.click(); + } + return true; + } + }); + } + bind_selectable() + + $(document).on('pjax:end', bind_selectable) +}); From 7ebc53fe38779c599aa0bc02f7b1ad01194fe75b Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Fri, 24 Apr 2015 16:24:58 -0500 Subject: [PATCH 05/18] Only allow drawing a box near the checkboxes --- .../javascripts/rails_admin/select-checkboxes.js | 1 + .../stylesheets/rails_admin/bootstrap/_tables.scss | 3 +++ app/views/rails_admin/main/index.html.haml | 11 ++++++----- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/assets/javascripts/rails_admin/select-checkboxes.js b/app/assets/javascripts/rails_admin/select-checkboxes.js index 615f41d3ff..f07201e79a 100644 --- a/app/assets/javascripts/rails_admin/select-checkboxes.js +++ b/app/assets/javascripts/rails_admin/select-checkboxes.js @@ -1,6 +1,7 @@ $(function() { bind_selectable = function() { $('tbody').selectable({ + cancel: '.not-checkbox', filter: 'input', distance: 1, selected: function(event, ui) { diff --git a/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss b/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss index 7c5d5bbf54..27c330ccd1 100644 --- a/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss +++ b/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss @@ -56,6 +56,9 @@ th { .table { background-color: $body-bg; } + .checkbox-container { + width: 110%; + } } diff --git a/app/views/rails_admin/main/index.html.haml b/app/views/rails_admin/main/index.html.haml index 552b3a6f61..d4f575c7bf 100644 --- a/app/views/rails_admin/main/index.html.haml +++ b/app/views/rails_admin/main/index.html.haml @@ -136,16 +136,16 @@ - @objects.each_with_index do |object,index| - @loop_index = index %tr{class: "#{@abstract_model.param_key}_row"} - %td + %td.checkbox-container = check_box_tag "bulk_ids[]", object.id, false - if @other_left_link ||= other_left && index_path(params.except('set').merge(params[:set].to_i != 1 ? {set: (params[:set].to_i - 1)} : {})) - %td.other.left= link_to "...", @other_left_link, class: 'pjax' + %td.not-checkbox.other.left= link_to "...", @other_left_link, class: 'pjax' - properties.map{ |property| property.bind(:object, object) }.each do |property| - value = property.pretty_value - %td{class: "#{property.css_class} #{property.type_css_class}", title: strip_tags(value.to_s)}= value + %td.not-checkbox{class: "#{property.css_class} #{property.type_css_class}", title: strip_tags(value.to_s)}= value - if @other_right_link ||= other_right && index_path(params.merge(set: (params[:set].to_i + 1))) - %td.other.right= link_to "...", @other_right_link, class: 'pjax' - %td.last.links + %td.not-checkbox.other.right= link_to "...", @other_right_link, class: 'pjax' + %td.not-checkbox.last.links %ul.inline.list-inline= menu_for :member, @abstract_model, object, true - if @objects.respond_to?(:total_count) - total_count = @objects.total_count.to_i @@ -156,3 +156,4 @@ .clearfix.total-count= "#{total_count} #{@model_config.pluralize(total_count).downcase}" - else .clearfix.total-count= "#{@objects.size} #{@model_config.pluralize(@objects.size).downcase}" + From b5cc89a62c9ac3c97539c45876a844e0d94bf57c Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Fri, 24 Apr 2015 16:55:05 -0500 Subject: [PATCH 06/18] Fix checkbox padding --- app/assets/stylesheets/rails_admin/bootstrap/_tables.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss b/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss index 27c330ccd1..e4eb503d5a 100644 --- a/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss +++ b/app/assets/stylesheets/rails_admin/bootstrap/_tables.scss @@ -57,7 +57,7 @@ th { background-color: $body-bg; } .checkbox-container { - width: 110%; + width: 40px; } } From 50f68effc910bf5868e27ec2aa5644ea13a6bf54 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Mon, 29 Jun 2015 20:36:15 -0500 Subject: [PATCH 07/18] Fix binding selectable on pjax end --- app/assets/javascripts/rails_admin/select-checkboxes.js | 1 - 1 file changed, 1 deletion(-) diff --git a/app/assets/javascripts/rails_admin/select-checkboxes.js b/app/assets/javascripts/rails_admin/select-checkboxes.js index f07201e79a..b551b38e85 100644 --- a/app/assets/javascripts/rails_admin/select-checkboxes.js +++ b/app/assets/javascripts/rails_admin/select-checkboxes.js @@ -14,7 +14,6 @@ $(function() { } }); } - bind_selectable() $(document).on('pjax:end', bind_selectable) }); From 3d12d3abe30a060444bab8dcc445f0d1fc9c28b0 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Wed, 1 Jul 2015 13:53:16 -0500 Subject: [PATCH 08/18] Add set edited_in_rails_admin to true to objects that define it --- README.md | 2 ++ app/controllers/rails_admin/application_controller.rb | 4 ++++ app/controllers/rails_admin/main_controller.rb | 1 + 3 files changed, 7 insertions(+) diff --git a/README.md b/README.md index 02f3075259..e7f79eb167 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,8 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing # Note, this won't work with existing filterable, searchable fields as merge will create an AND condition with the scope's WHERE s # see https://gist.github.com/j-mcnally/250eaaceef234dd8971b if you want OR conditions ``` +* If a model defines an attribute edited_in_rails_admin (virtual or real): rails admin will set it to true to objects edited throught its UI. + ## Features diff --git a/app/controllers/rails_admin/application_controller.rb b/app/controllers/rails_admin/application_controller.rb index 2022f466ac..6c49d5c2e2 100644 --- a/app/controllers/rails_admin/application_controller.rb +++ b/app/controllers/rails_admin/application_controller.rb @@ -32,6 +32,10 @@ def get_object fail(RailsAdmin::ObjectNotFound) unless (@object = @abstract_model.get(params[:id])) end + def set_edited_in_rails_admin + @object.edited_in_rails_admin = true if @object && @object.respond_to?( :edited_in_rails_admin ) + end + def to_model_name(param) param.split('~').collect(&:camelize).join('::') end diff --git a/app/controllers/rails_admin/main_controller.rb b/app/controllers/rails_admin/main_controller.rb index 16c056429d..c62e126d28 100644 --- a/app/controllers/rails_admin/main_controller.rb +++ b/app/controllers/rails_admin/main_controller.rb @@ -9,6 +9,7 @@ class MainController < RailsAdmin::ApplicationController before_filter :get_model, except: RailsAdmin::Config::Actions.all(:root).collect(&:action_name) before_filter :get_object, only: RailsAdmin::Config::Actions.all(:member).collect(&:action_name) before_filter :check_for_cancel + before_filter :set_edited_in_rails_admin RailsAdmin::Config::Actions.all.each do |action| class_eval <<-EOS, __FILE__, __LINE__ + 1 From 46b0198e212eadd04922a78e020c9e7eee2f6081 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Thu, 2 Jul 2015 11:29:00 -0500 Subject: [PATCH 09/18] Bind without ajax --- app/assets/javascripts/rails_admin/select-checkboxes.js | 1 + 1 file changed, 1 insertion(+) diff --git a/app/assets/javascripts/rails_admin/select-checkboxes.js b/app/assets/javascripts/rails_admin/select-checkboxes.js index b551b38e85..f07201e79a 100644 --- a/app/assets/javascripts/rails_admin/select-checkboxes.js +++ b/app/assets/javascripts/rails_admin/select-checkboxes.js @@ -14,6 +14,7 @@ $(function() { } }); } + bind_selectable() $(document).on('pjax:end', bind_selectable) }); From 3a249187bbd9655f032946df0acc35eb31155154 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Thu, 9 Jul 2015 18:41:04 -0500 Subject: [PATCH 10/18] Add possibility to add class to each row in the list view --- README.md | 13 ++++++++++++- app/views/rails_admin/main/index.html.haml | 2 +- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e7f79eb167..95417123ce 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,18 @@ RailsAdmin is a Rails engine that provides an easy-to-use interface for managing # Note, this won't work with existing filterable, searchable fields as merge will create an AND condition with the scope's WHERE s # see https://gist.github.com/j-mcnally/250eaaceef234dd8971b if you want OR conditions ``` -* If a model defines an attribute edited_in_rails_admin (virtual or real): rails admin will set it to true to objects edited throught its UI. +* If a model defines an attribute(or method) edited_in_rails_admin (virtual or real): rails admin will set it to true to objects edited throught its UI. +* If a model defines an attribute(or method) rails_admin_row_class (virtual or real): rails admin will add to each row in the list view the string returned from this method in a class. Use it this way +```css +.service_row + &.notice + td + background: $light_yellow !important + &.error + td, td > tr:nth-child(odd) > td + background: tint($light_error, 80) !important +``` + diff --git a/app/views/rails_admin/main/index.html.haml b/app/views/rails_admin/main/index.html.haml index d4f575c7bf..b05ab2fe7c 100644 --- a/app/views/rails_admin/main/index.html.haml +++ b/app/views/rails_admin/main/index.html.haml @@ -135,7 +135,7 @@ %tbody - @objects.each_with_index do |object,index| - @loop_index = index - %tr{class: "#{@abstract_model.param_key}_row"} + %tr{class: "#{@abstract_model.param_key}_row #{object.rails_admin_row_class if object.respond_to?(:rails_admin_row_class)}"} %td.checkbox-container = check_box_tag "bulk_ids[]", object.id, false - if @other_left_link ||= other_left && index_path(params.except('set').merge(params[:set].to_i != 1 ? {set: (params[:set].to_i - 1)} : {})) From cc9884a42eb42fd2ff3f1de8d34fe01f3f883e3f Mon Sep 17 00:00:00 2001 From: Orlando Del Aguila Date: Tue, 14 Jul 2015 14:52:47 -0500 Subject: [PATCH 11/18] fixing invalid linear grandient direction to make it work with autoprefixer --- .../rails_admin/aristo/jquery-ui-1.8.7.custom.scss | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss b/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss index 3dce16de5f..495265d18d 100644 --- a/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss +++ b/app/assets/stylesheets/rails_admin/aristo/jquery-ui-1.8.7.custom.scss @@ -69,7 +69,7 @@ background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */ - background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */ + background: linear-gradient(to bottom, #ededed 0%,#c4c4c4 100%); /* W3C */ } .ui-widget-header a { color: #4F4F4F; } @@ -83,7 +83,7 @@ background: -webkit-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* IE10+ */ - background: linear-gradient(top, #ededed 0%,#c4c4c4 100%); /* W3C */ + background: linear-gradient(to bottom, #ededed 0%,#c4c4c4 100%); /* W3C */ -webkit-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset; -moz-box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset; box-shadow: 0 1px 0 rgba(255,255,255,0.6) inset; @@ -100,7 +100,7 @@ background: -webkit-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* IE10+ */ - background: linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* W3C */ + background: linear-gradient(to bottom, #b9e0f5 0%,#92bdd6 100%); /* W3C */ -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; @@ -481,7 +481,7 @@ button.ui-button-icons-only { width: 3.7em; } background: -webkit-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* IE10+ */ - background: linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* W3C */ + background: linear-gradient(to bottom, #b9e0f5 0%,#92bdd6 100%); /* W3C */ -moz-box-shadow: 0 0 8px rgba(0, 0, 0, 0.15), 0 1px 0 rgba(255,255,255,0.8) inset; -webkit-box-shadow: 0 0 8px rgba(0, 0, 0, 0.15), 0 1px 0 rgba(255,255,255,0.8) inset; box-shadow: 0 0 8px rgba(0, 0, 0, 0.15), 0 1px 0 rgba(255,255,255,0.8) inset; @@ -527,7 +527,7 @@ input.ui-button::-moz-focus-inner { background: -webkit-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* Opera11.10+ */ background: -ms-linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* IE10+ */ - background: linear-gradient(top, #b9e0f5 0%,#92bdd6 100%); /* W3C */ + background: linear-gradient(to bottom, #b9e0f5 0%,#92bdd6 100%); /* W3C */ -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; From 1991be80c5046fdd116e1848415574b8e71f3e46 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Thu, 17 Sep 2015 12:59:05 -0500 Subject: [PATCH 12/18] Edited in rails admin works when creating a new object --- app/controllers/rails_admin/application_controller.rb | 6 ++++++ app/controllers/rails_admin/main_controller.rb | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/app/controllers/rails_admin/application_controller.rb b/app/controllers/rails_admin/application_controller.rb index 6c49d5c2e2..c4770bd1c7 100644 --- a/app/controllers/rails_admin/application_controller.rb +++ b/app/controllers/rails_admin/application_controller.rb @@ -33,7 +33,13 @@ def get_object end def set_edited_in_rails_admin + # For existing models @object.edited_in_rails_admin = true if @object && @object.respond_to?( :edited_in_rails_admin ) + + # For new models + if 'new' == params[:action] && request.method == 'POST' + params[params[:model_name]][:edited_in_rails_admin] = true + end end def to_model_name(param) diff --git a/app/controllers/rails_admin/main_controller.rb b/app/controllers/rails_admin/main_controller.rb index c62e126d28..1c8544c868 100644 --- a/app/controllers/rails_admin/main_controller.rb +++ b/app/controllers/rails_admin/main_controller.rb @@ -92,7 +92,7 @@ def redirect_to_on_success def sanitize_params_for!(action, model_config = @model_config, target_params = params[@abstract_model.param_key]) return unless target_params.present? fields = model_config.send(action).with(controller: self, view: view_context, object: @object).visible_fields - allowed_methods = fields.collect(&:allowed_methods).flatten.uniq.collect(&:to_s) << 'id' << '_destroy' + allowed_methods = fields.collect(&:allowed_methods).flatten.uniq.collect(&:to_s) << 'id' << '_destroy' << 'edited_in_rails_admin' fields.each { |f| f.parse_input(target_params) } target_params.slice!(*allowed_methods) target_params.permit! if target_params.respond_to?(:permit!) From 5b3da7f069e5714a3fa1495a0c184d8f60e0ece9 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Thu, 17 Sep 2015 13:44:31 -0500 Subject: [PATCH 13/18] Set edited_in_rails_admin only for objects supporting the attr --- app/controllers/rails_admin/main_controller.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/controllers/rails_admin/main_controller.rb b/app/controllers/rails_admin/main_controller.rb index 1c8544c868..a365f71189 100644 --- a/app/controllers/rails_admin/main_controller.rb +++ b/app/controllers/rails_admin/main_controller.rb @@ -92,7 +92,8 @@ def redirect_to_on_success def sanitize_params_for!(action, model_config = @model_config, target_params = params[@abstract_model.param_key]) return unless target_params.present? fields = model_config.send(action).with(controller: self, view: view_context, object: @object).visible_fields - allowed_methods = fields.collect(&:allowed_methods).flatten.uniq.collect(&:to_s) << 'id' << '_destroy' << 'edited_in_rails_admin' + allowed_methods = fields.collect(&:allowed_methods).flatten.uniq.collect(&:to_s) << 'id' << '_destroy' + allowed_methods << 'edited_in_rails_admin' if @object.respond_to? :edited_in_rails_admin fields.each { |f| f.parse_input(target_params) } target_params.slice!(*allowed_methods) target_params.permit! if target_params.respond_to?(:permit!) From 658a078e904a185077fdba34a25219bcb3906a91 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Mon, 15 Feb 2016 19:17:42 -0600 Subject: [PATCH 14/18] Remove collapser, fix lazo for history --- .../javascripts/rails_admin/ra.widgets.coffee | 26 ------------------- .../stylesheets/rails_admin/base/theming.scss | 19 -------------- app/views/rails_admin/main/history.html.haml | 2 +- rails_admin.gemspec | 2 +- 4 files changed, 2 insertions(+), 47 deletions(-) diff --git a/app/assets/javascripts/rails_admin/ra.widgets.coffee b/app/assets/javascripts/rails_admin/ra.widgets.coffee index 1973b42a57..65b8686f0e 100644 --- a/app/assets/javascripts/rails_admin/ra.widgets.coffee +++ b/app/assets/javascripts/rails_admin/ra.widgets.coffee @@ -217,29 +217,3 @@ $(document).on 'rails_admin.dom_ready', (e, content) -> goBootstrapWysihtml5s(@array, config_options) else goBootstrapWysihtml5s(@array, config_options) - -$ -> - (-> - $children = $('[class*="child-of"]') - $children.each (i, child) -> - child_classes = $(child).attr('class').split(' ') - - $(child_classes).each (i, child_class) -> - $child_class = $('.' + child_class) - if child_class.indexOf('child-of-') == 0 - parent_class = '.parent-' + child_class.split('-')[2] - $parent = $(parent_class) - $parent_container = $parent.parent('li') - $child_class.slideUp(0) - $parent_container.off('click').on 'click', (e) -> - $(this).find('a').toggleClass('up', 0) - $child_class.slideToggle() - return - $parent.addClass 'togglable' - return - return - $('.chevron').not('.togglable').removeClass 'chevron' - return - )() - return - diff --git a/app/assets/stylesheets/rails_admin/base/theming.scss b/app/assets/stylesheets/rails_admin/base/theming.scss index 099c2a4260..53be7329e1 100644 --- a/app/assets/stylesheets/rails_admin/base/theming.scss +++ b/app/assets/stylesheets/rails_admin/base/theming.scss @@ -183,25 +183,6 @@ body.rails_admin { /* nested nav */ .nav { - .chevron { - &::after { - border-style: solid; - border-width: 0.25em 0.25em 0 0; - content: ''; - display: inline-block; - height: 0.65em; - left: 0.5em; - position: relative; - top: 0.15em; - vertical-align: top; - width: 0.65em; - transform: rotate(135deg); - } - &.up:after { - transform: rotate(-45deg); - top: 8px; - } - } .nav-level-1 { padding-left:30px; } diff --git a/app/views/rails_admin/main/history.html.haml b/app/views/rails_admin/main/history.html.haml index dafc5407c6..6fbf48b6f5 100644 --- a/app/views/rails_admin/main/history.html.haml +++ b/app/views/rails_admin/main/history.html.haml @@ -13,7 +13,7 @@ %button.btn.btn-primary{type: "submit", :'data-disable-with' => " ".html_safe + t("admin.misc.refresh")} %i.icon-white.icon-refresh = t("admin.misc.refresh") -%table#history.table.table-striped.table-condensed +%table#history.table.table-striped.table-condensed.not-checkbox %thead %tr - columns = [] diff --git a/rails_admin.gemspec b/rails_admin.gemspec index c03f4ec8fb..6d90751d6b 100644 --- a/rails_admin.gemspec +++ b/rails_admin.gemspec @@ -15,7 +15,7 @@ Gem::Specification.new do |s| s.homepage = "https://github.com/sferik/rails_admin" s.licenses = ["MIT"] s.required_ruby_version = Gem::Requirement.new(">= 1.9.3") - s.rubygems_version = "2.4.3" + s.rubygems_version = "2.4.5.1" s.summary = "Admin for Rails" if s.respond_to? :specification_version then From 527670bb5120cc4598b244fc2acb2d6c25719e50 Mon Sep 17 00:00:00 2001 From: Guillermo Siliceo Date: Wed, 11 May 2016 19:37:47 -0500 Subject: [PATCH 15/18] Fix history for polymorphic STI tables When paper trail saves a model it uses the base class to avoid a known rails problem with single table inheritance and polymorphic associations, the history adapter was not using the base class. --- lib/rails_admin/extensions/paper_trail/auditing_adapter.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb b/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb index 61a31917b9..6be09ed91b 100644 --- a/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb +++ b/lib/rails_admin/extensions/paper_trail/auditing_adapter.rb @@ -88,7 +88,7 @@ def listing_for_model_or_object(model, object, query, sort, sort_reverse, all, p sort_reverse = 'true' end - model_name = model.model.name + model_name = model.model.base_class.name current_page = page.presence || '1' From 573e90ce2727150b388b3ac02e7740e95d35f106 Mon Sep 17 00:00:00 2001 From: Luis Alfredo Lorenzo Date: Wed, 14 Sep 2016 18:35:37 -0500 Subject: [PATCH 16/18] Replaces the TrailingComma with the TrailingCommaInLiteral property --- .rubocop.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.rubocop.yml b/.rubocop.yml index d0effcefa8..750b7c14f8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -73,5 +73,5 @@ Style/RaiseArgs: Style/SpaceInsideHashLiteralBraces: EnforcedStyle: no_space -Style/TrailingComma: +Style/TrailingCommaInLiteral: EnforcedStyleForMultiline: 'comma' From 5093732a34eaee7b407df605c77d9f0b99763d49 Mon Sep 17 00:00:00 2001 From: Luis Alfredo Lorenzo Date: Wed, 14 Sep 2016 18:37:33 -0500 Subject: [PATCH 17/18] Creates the ExportMailer class The export mailer sends exported data as an attachement. --- app/mailer/export_mailer.rb | 6 ++++++ app/views/export_mailer/results_email.html.haml | 0 2 files changed, 6 insertions(+) create mode 100644 app/mailer/export_mailer.rb create mode 100644 app/views/export_mailer/results_email.html.haml diff --git a/app/mailer/export_mailer.rb b/app/mailer/export_mailer.rb new file mode 100644 index 0000000000..4105781ca5 --- /dev/null +++ b/app/mailer/export_mailer.rb @@ -0,0 +1,6 @@ +class ExportMailer < ApplicationMailer + def results_email(user, attachment_filename, attachment_data) + attachments[attachment_filename] = attachment_data + mail(to: user.email, subject: 'Export Results') + end +end diff --git a/app/views/export_mailer/results_email.html.haml b/app/views/export_mailer/results_email.html.haml new file mode 100644 index 0000000000..e69de29bb2 From 82f0ec437cb652847ee4d71b8989882b6868686c Mon Sep 17 00:00:00 2001 From: Luis Alfredo Lorenzo Date: Wed, 14 Sep 2016 18:39:56 -0500 Subject: [PATCH 18/18] Exports the model data in a child process and sends the report by email --- lib/rails_admin/config/actions/export.rb | 32 ++++++++++++++++---- lib/rails_admin/config/actions/index.rb | 37 ------------------------ 2 files changed, 27 insertions(+), 42 deletions(-) diff --git a/lib/rails_admin/config/actions/export.rb b/lib/rails_admin/config/actions/export.rb index 9930f1ab4d..058cb00bb7 100644 --- a/lib/rails_admin/config/actions/export.rb +++ b/lib/rails_admin/config/actions/export.rb @@ -14,11 +14,33 @@ class Export < RailsAdmin::Config::Actions::Base register_instance_option :controller do proc do - if format = params[:json] && :json || params[:csv] && :csv || params[:xml] && :xml - request.format = format - @schema = params[:schema].symbolize if params[:schema] # to_json and to_xml expect symbols for keys AND values. - @objects = list_entries(@model_config, :export) - index + if (format = params[:json] && :json || params[:csv] && :csv || params[:xml] && :xml) + config = ActiveRecord::Base.remove_connection + pid = fork do + begin + ActiveRecord::Base.establish_connection(config) + @schema = params[:schema].symbolize if params[:schema] # to_json and to_xml expect symbols for keys AND values. + @objects = list_entries(@model_config, :export) + + case format + when :json + attachment_data = @objects.to_json(@schema) + when :xml + attachment_data = @objects.to_xml(@schema) + when :csv + _, _, attachment_data = CSVConverter.new(@objects, @schema).to_csv(params[:csv_options]) + end + + attachment_filename = "#{params[:model_name]}_#{DateTime.now.strftime('%Y-%m-%d_%Hh%Mm%S')}.#{format}" + ExportMailer.results_email(current_user, attachment_filename, attachment_data).deliver_now + ensure + ActiveRecord::Base.remove_connection + Process.exit!(0) + end + end + Process.detach(pid) + ActiveRecord::Base.establish_connection(config) + redirect_to index_path else render @action.template_name end diff --git a/lib/rails_admin/config/actions/index.rb b/lib/rails_admin/config/actions/index.rb index 9ee2dae199..d55ad0a69b 100644 --- a/lib/rails_admin/config/actions/index.rb +++ b/lib/rails_admin/config/actions/index.rb @@ -43,43 +43,6 @@ class Index < RailsAdmin::Config::Actions::Base format.html do render @action.template_name, status: (flash[:error].present? ? :not_found : 200) end - - format.json do - output = begin - if params[:compact] - primary_key_method = @association ? @association.associated_primary_key : @model_config.abstract_model.primary_key - label_method = @model_config.object_label_method - @objects.collect { |o| {id: o.send(primary_key_method).to_s, label: o.send(label_method).to_s} } - else - @objects.to_json(@schema) - end - end - if params[:send_data] - send_data output, filename: "#{params[:model_name]}_#{DateTime.now.strftime('%Y-%m-%d_%Hh%Mm%S')}.json" - else - render json: output, root: false - end - end - - format.xml do - output = @objects.to_xml(@schema) - if params[:send_data] - send_data output, filename: "#{params[:model_name]}_#{DateTime.now.strftime('%Y-%m-%d_%Hh%Mm%S')}.xml" - else - render xml: output - end - end - - format.csv do - header, encoding, output = CSVConverter.new(@objects, @schema).to_csv(params[:csv_options]) - if params[:send_data] - send_data output, - type: "text/csv; charset=#{encoding}; #{'header=present' if header}", - disposition: "attachment; filename=#{params[:model_name]}_#{DateTime.now.strftime('%Y-%m-%d_%Hh%Mm%S')}.csv" - else - render text: output - end - end end end end