diff --git a/Gemfile b/Gemfile index a10d800673..c9cce1e266 100644 --- a/Gemfile +++ b/Gemfile @@ -7,6 +7,8 @@ group :mongoid do gem 'mongoid', '~> 4.0.0' gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip' gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid' + + gem 'refile-mongoid', '>= 0.0.1' if RUBY_VERSION >= '2.1.0' end group :active_record do @@ -51,6 +53,11 @@ group :test do gem 'rubocop', '~> 0.31.0' gem 'simplecov', '>= 0.9', require: false gem 'timecop', '>= 0.5' + + if RUBY_VERSION >= '2.1.0' + gem 'refile', '~> 0.5', require: 'refile/rails' + gem 'refile-mini_magick', '>= 0.1.0' + end end gemspec diff --git a/gemfiles/rails_4.0.gemfile b/gemfiles/rails_4.0.gemfile index 91d602ccad..bef2e484bd 100644 --- a/gemfiles/rails_4.0.gemfile +++ b/gemfiles/rails_4.0.gemfile @@ -5,12 +5,15 @@ source "https://rubygems.org" gem "appraisal", ">= 2.0" gem "devise", ">= 3.2" gem "rails", "~> 4.0.0" +gem "sass-rails", "~> 5.0" gem "test-unit" group :mongoid do gem "mongoid", "~> 4.0.0" gem "mongoid-paperclip", ">= 0.0.8", :require => "mongoid_paperclip" gem "carrierwave-mongoid", ">= 0.6.3", :require => "carrierwave/mongoid" + + gem "refile-mongoid", ">= 0.0.1" if RUBY_VERSION >= "2.1.0" end group :active_record do @@ -55,6 +58,11 @@ group :test do gem "rubocop", "~> 0.31.0" gem "simplecov", ">= 0.9", :require => false gem "timecop", ">= 0.5" + + if RUBY_VERSION >= "2.1.0" + gem "refile", "~> 0.5", :require => "refile/rails" + gem "refile-mini_magick", ">= 0.1.0" + end end gemspec :path => "../" diff --git a/gemfiles/rails_4.1.gemfile b/gemfiles/rails_4.1.gemfile index b765b2362e..a0b2847eb6 100644 --- a/gemfiles/rails_4.1.gemfile +++ b/gemfiles/rails_4.1.gemfile @@ -5,11 +5,14 @@ source "https://rubygems.org" gem "appraisal", ">= 2.0" gem "devise", ">= 3.2" gem "rails", "~> 4.1.0" +gem "sass-rails", "~> 5.0" group :mongoid do gem "mongoid", "~> 4.0.0" gem "mongoid-paperclip", ">= 0.0.8", :require => "mongoid_paperclip" gem "carrierwave-mongoid", ">= 0.6.3", :require => "carrierwave/mongoid" + + gem "refile-mongoid", ">= 0.0.1" if RUBY_VERSION >= "2.1.0" end group :active_record do @@ -54,6 +57,11 @@ group :test do gem "rubocop", "~> 0.31.0" gem "simplecov", ">= 0.9", :require => false gem "timecop", ">= 0.5" + + if RUBY_VERSION >= "2.1.0" + gem "refile", "~> 0.5", :require => "refile/rails" + gem "refile-mini_magick", ">= 0.1.0" + end end gemspec :path => "../" diff --git a/gemfiles/rails_4.2.gemfile b/gemfiles/rails_4.2.gemfile index f8f9563a8e..8e330fba4b 100644 --- a/gemfiles/rails_4.2.gemfile +++ b/gemfiles/rails_4.2.gemfile @@ -11,6 +11,8 @@ group :mongoid do gem "mongoid", "~> 4.0.0" gem "mongoid-paperclip", ">= 0.0.8", :require => "mongoid_paperclip" gem "carrierwave-mongoid", ">= 0.6.3", :require => "carrierwave/mongoid" + + gem "refile-mongoid", ">= 0.0.1" if RUBY_VERSION >= "2.1.0" end group :active_record do @@ -55,6 +57,11 @@ group :test do gem "rubocop", "~> 0.31.0" gem "simplecov", ">= 0.9", :require => false gem "timecop", ">= 0.5" + + if RUBY_VERSION >= "2.1.0" + gem "refile", "~> 0.5", :require => "refile/rails" + gem "refile-mini_magick", ">= 0.1.0" + end end gemspec :path => "../" diff --git a/lib/rails_admin/config/fields.rb b/lib/rails_admin/config/fields.rb index 1efb4d34f5..b3b6e4a73f 100644 --- a/lib/rails_admin/config/fields.rb +++ b/lib/rails_admin/config/fields.rb @@ -82,4 +82,5 @@ def self.register_factory(&block) require 'rails_admin/config/fields/factories/paperclip' require 'rails_admin/config/fields/factories/dragonfly' require 'rails_admin/config/fields/factories/carrierwave' +require 'rails_admin/config/fields/factories/refile' if RUBY_VERSION >= '2.1.0' require 'rails_admin/config/fields/factories/association' diff --git a/lib/rails_admin/config/fields/factories/refile.rb b/lib/rails_admin/config/fields/factories/refile.rb new file mode 100644 index 0000000000..c669250bb5 --- /dev/null +++ b/lib/rails_admin/config/fields/factories/refile.rb @@ -0,0 +1,25 @@ +require 'rails_admin/config/fields' +require 'rails_admin/config/fields/types' +require 'rails_admin/config/fields/types/file_upload' + +RailsAdmin::Config::Fields.register_factory do |parent, properties, fields| + extensions = [:id, :filename, :size, :content_type] + model = parent.abstract_model.model + if (properties.name.to_s =~ /^(.+)_id$/) && defined?(::Refile) && model.ancestors.map(&:to_s).include?("Refile::Attachment(#{attachment_name = Regexp.last_match[1].to_sym})") + field = RailsAdmin::Config::Fields::Types.load(:refile).new(parent, attachment_name, properties) + children_fields = [] + extensions.each do |ext| + children_column_name = "#{attachment_name}_#{ext}".to_sym + next unless child_properties = parent.abstract_model.properties.detect { |p| p.name.to_s == children_column_name.to_s } + children_field = fields.detect { |f| f.name == children_column_name } || RailsAdmin::Config::Fields.default_factory.call(parent, child_properties, fields) + children_field.hide + children_field.filterable(false) + children_fields << children_field.name + end + field.children_fields(children_fields) + fields << field + true + else + false + end +end diff --git a/lib/rails_admin/config/fields/types/all.rb b/lib/rails_admin/config/fields/types/all.rb index 9ca0e19293..57ae785c79 100644 --- a/lib/rails_admin/config/fields/types/all.rb +++ b/lib/rails_admin/config/fields/types/all.rb @@ -9,6 +9,7 @@ require 'rails_admin/config/fields/types/file_upload' require 'rails_admin/config/fields/types/paperclip' require 'rails_admin/config/fields/types/carrierwave' +require 'rails_admin/config/fields/types/refile' if RUBY_VERSION >= '2.1.0' require 'rails_admin/config/fields/types/float' require 'rails_admin/config/fields/types/has_and_belongs_to_many_association' require 'rails_admin/config/fields/types/has_many_association' diff --git a/lib/rails_admin/config/fields/types/refile.rb b/lib/rails_admin/config/fields/types/refile.rb new file mode 100644 index 0000000000..82548eab52 --- /dev/null +++ b/lib/rails_admin/config/fields/types/refile.rb @@ -0,0 +1,27 @@ +require 'rails_admin/config/fields/base' +require 'rails_admin/config/fields/types/file_upload' + +module RailsAdmin + module Config + module Fields + module Types + class Refile < RailsAdmin::Config::Fields::Types::FileUpload + RailsAdmin::Config::Fields::Types.register(self) + + register_instance_option :thumb_method do + [:limit, 100, 100] + end + + register_instance_option :delete_method do + "remove_#{name}" + end + + def resource_url(thumb = []) + return nil unless value + Object.const_get(:Refile).attachment_url(bindings[:object], name, *thumb) + end + end + end + end + end +end diff --git a/spec/controllers/rails_admin/main_controller_spec.rb b/spec/controllers/rails_admin/main_controller_spec.rb index dd9c046938..b0610fa823 100644 --- a/spec/controllers/rails_admin/main_controller_spec.rb +++ b/spec/controllers/rails_admin/main_controller_spec.rb @@ -325,6 +325,7 @@ class TeamWithNumberedPlayers < Team field :paperclip_asset do delete_method :delete_paperclip_asset end + field :refile_asset if RUBY_VERSION >= '2.1.0' end controller.params = HashWithIndifferentAccess.new( 'field_test' => { @@ -337,7 +338,7 @@ class TeamWithNumberedPlayers < Team 'paperclip_asset' => 'test', 'delete_paperclip_asset' => 'test', 'should_not_be_here' => 'test', - }, + }.merge(RUBY_VERSION >= '2.1.0' ? {'refile_asset' => 'test', 'remove_refile_asset' => 'test'} : {}), ) controller.send(:sanitize_params_for!, :create, RailsAdmin.config(FieldTest), controller.params['field_test']) @@ -351,7 +352,7 @@ class TeamWithNumberedPlayers < Team 'retained_dragonfly_asset' => 'test', 'paperclip_asset' => 'test', 'delete_paperclip_asset' => 'test', - }) + }.merge(RUBY_VERSION >= '2.1.0' ? {'refile_asset' => 'test', 'remove_refile_asset' => 'test'} : {})) end it 'allows for polymorphic associations parameters' do diff --git a/spec/dummy_app/Gemfile b/spec/dummy_app/Gemfile index e3063b72f4..1a7111e3ff 100644 --- a/spec/dummy_app/Gemfile +++ b/spec/dummy_app/Gemfile @@ -36,6 +36,8 @@ group :mongoid do gem 'mongoid', '~> 4.0.0.beta1' gem 'mongoid-paperclip', '>= 0.0.8', require: 'mongoid_paperclip' gem 'carrierwave-mongoid', '>= 0.6.3', require: 'carrierwave/mongoid' + + gem 'refile-mongoid', '>= 0.0.1' if RUBY_VERSION >= '2.1.0' end gem 'carrierwave', '>= 0.8' @@ -46,6 +48,11 @@ gem 'mlb', '>= 0.7' gem 'paperclip', '>= 3.4' gem 'rails_admin', path: '../../' +if RUBY_VERSION >= '2.1.0' + gem 'refile', '~> 0.5', require: 'refile/rails' + gem 'refile-mini_magick', '>= 0.1.0' +end + # Gems used only for assets and not required # in production environments by default. group :assets do diff --git a/spec/dummy_app/app/active_record/field_test.rb b/spec/dummy_app/app/active_record/field_test.rb index 4e7030c15f..1c6ef8eb74 100644 --- a/spec/dummy_app/app/active_record/field_test.rb +++ b/spec/dummy_app/app/active_record/field_test.rb @@ -11,4 +11,6 @@ class FieldTest < ActiveRecord::Base dragonfly_accessor :dragonfly_asset mount_uploader :carrierwave_asset, CarrierwaveUploader + + attachment :refile_asset if RUBY_VERSION >= '2.1.0' end diff --git a/spec/dummy_app/app/mongoid/field_test.rb b/spec/dummy_app/app/mongoid/field_test.rb index 7ebb4e1779..51e1e121f5 100644 --- a/spec/dummy_app/app/mongoid/field_test.rb +++ b/spec/dummy_app/app/mongoid/field_test.rb @@ -51,5 +51,14 @@ class FieldTest dragonfly_accessor :dragonfly_asset mount_uploader :carrierwave_asset, CarrierwaveUploader + if RUBY_VERSION >= '2.1.0' + extend Refile::Mongoid::Attachment + + field :refile_asset_filename + field :refile_asset_size + field :refile_asset_content_type + attachment :refile_asset + end + validates :short_text, length: {maximum: 255} end diff --git a/spec/dummy_app/db/migrate/20150815102450_add_refile_to_field_tests.rb b/spec/dummy_app/db/migrate/20150815102450_add_refile_to_field_tests.rb new file mode 100644 index 0000000000..cdbc60c28c --- /dev/null +++ b/spec/dummy_app/db/migrate/20150815102450_add_refile_to_field_tests.rb @@ -0,0 +1,8 @@ +class AddRefileToFieldTests < ActiveRecord::Migration + def change + add_column :field_tests, :refile_asset_id, :string + add_column :field_tests, :refile_asset_filename, :string + add_column :field_tests, :refile_asset_size, :string + add_column :field_tests, :refile_asset_content_type, :string + end +end diff --git a/spec/rails_admin/config/fields/base_spec.rb b/spec/rails_admin/config/fields/base_spec.rb index 5d0b09a169..370ad9c26e 100644 --- a/spec/rails_admin/config/fields/base_spec.rb +++ b/spec/rails_admin/config/fields/base_spec.rb @@ -91,6 +91,14 @@ class CommentReversed < Tableless expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :carrierwave_asset }.hidden?).to be_falsey end end + + if RUBY_VERSION >= '2.1.0' + context 'of a Refile installation' do + it 'is a _id field' do + expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :refile_asset }.children_fields).to eq([:refile_asset_id, :refile_asset_filename, :refile_asset_size, :refile_asset_content_type]) + end + end + end end describe '#form_default_value' do @@ -257,6 +265,12 @@ class CommentReversed < Tableless it 'of carrierwave should find the underlying column on the base table' do expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :carrierwave_asset }.searchable_columns.collect { |c| c[:column] }).to eq(['field_tests.carrierwave_asset']) end + + if RUBY_VERSION >= '2.1.0' + it 'of refile should find the underlying column on the base table' do + expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :refile_asset }.searchable_columns.collect { |c| c[:column] }).to eq(['field_tests.refile_asset_id']) + end + end end end @@ -288,6 +302,13 @@ class CommentReversed < Tableless expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :carrierwave_asset }.searchable).to eq(:carrierwave_asset) expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :carrierwave_asset }.sortable).to eq(:carrierwave_asset) end + + if RUBY_VERSION >= '2.1.0' + it 'of refile should target the first children field' do + expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :refile_asset }.searchable).to eq(:refile_asset_id) + expect(RailsAdmin.config(FieldTest).fields.detect { |f| f.name == :refile_asset }.sortable).to eq(:refile_asset_id) + end + end end end diff --git a/spec/rails_admin/config/fields/types/file_upload_spec.rb b/spec/rails_admin/config/fields/types/file_upload_spec.rb index 2efdce9d2d..3aa051e324 100644 --- a/spec/rails_admin/config/fields/types/file_upload_spec.rb +++ b/spec/rails_admin/config/fields/types/file_upload_spec.rb @@ -12,11 +12,13 @@ field :paperclip_asset do delete_method :delete_paperclip_asset end + field :refile_asset end end expect(RailsAdmin.config(FieldTest).field(:carrierwave_asset).allowed_methods.collect(&:to_s)).to eq %w(carrierwave_asset remove_carrierwave_asset carrierwave_asset_cache) expect(RailsAdmin.config(FieldTest).field(:dragonfly_asset).allowed_methods.collect(&:to_s)).to eq %w(dragonfly_asset remove_dragonfly_asset retained_dragonfly_asset) expect(RailsAdmin.config(FieldTest).field(:paperclip_asset).allowed_methods.collect(&:to_s)).to eq %w(paperclip_asset delete_paperclip_asset) + expect(RailsAdmin.config(FieldTest).field(:refile_asset).allowed_methods.collect(&:to_s)).to eq %w(refile_asset remove_refile_asset) if RUBY_VERSION >= '2.1.0' end end