effective_assets 1.10.1 → 1.11.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: ff3438f4d766dbf9a2056efc8dda66a2e9886020
4
- data.tar.gz: 20e9db275e13ee015cc259f6e8d320c39eb85c54
2
+ SHA256:
3
+ metadata.gz: 91867f057c8237f0c9b602989b2c75b9805c898b799c83d4de6c96e3cbca2c60
4
+ data.tar.gz: 6272d43a0d8e24bd9c270a8a7f808d2804477f13057663328e3823bca416ddb0
5
5
  SHA512:
6
- metadata.gz: 85b474c79b5611b8a13d11cb64437b46567b0e6fb05429c4b08625d097b302a7f9861bbcfc97b9144510ad279f8e39883abfa8caf18e5573f009c94376c23027
7
- data.tar.gz: 62cbcd5938962816f1cdd6bcbba9a437a969babebef7183203e24e42b5a145d371518057b7d284a445ce1a30ef533350bfa0d5feee1adea7360f888c2c74435d
6
+ metadata.gz: 1243fc18c744665d68bad27d273e98a451eb78e1c212c62fd7aa2e095996ae2677e856f76614fdb3aefdf2f24419ef092291666891f52b0391a47ad8e3b8e5f5
7
+ data.tar.gz: 5ea43c65ffcad79c5f2a16bd7266e6529bb37f71d68d23f8a7f3332bef777c543face50148888d7b1f3740b1d8392f20f74e0907cada172772492d8315425a0d
data/MIT-LICENSE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2017 Code and Effect Inc.
1
+ Copyright 2020 Code and Effect Inc.
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
@@ -0,0 +1,2 @@
1
+ //= link_directory ../images/mime-types
2
+ //= link_directory ../images/effective_assets
@@ -11,7 +11,7 @@ CKEDITOR.dialog.add 'effective_asset', (editor) ->
11
11
  {
12
12
  id: 'iframe-insert',
13
13
  type: 'html',
14
- html: "<div><p id='iframe-insert-loading' style='text-align: center;'><br><br><br><br><br><br><img src='<%= asset_path('effective_assets/spinner.gif') %>' /><br><br>&nbsp;&nbsp;&nbsp;Loading...</p><iframe class='effective_assets_iframe' style='width: 100%; height: 100%; min-height: 500px;' src='/effective/assets?only=nonimages'></iframe></div>"
14
+ html: "<div><p id='iframe-insert-loading' style='text-align: center;'><br><br><br><br><br><br><br><br>&nbsp;&nbsp;&nbsp;Loading...</p><iframe class='effective_assets_iframe' style='width: 100%; height: 100%; min-height: 500px;' src='/effective/assets?only=nonimages'></iframe></div>"
15
15
  onLoad: (evt) ->
16
16
  dialog = evt.sender # This is the CKEditor.dialog
17
17
  iframe = $('#' + dialog.getContentElement('upload', 'iframe-insert').domId).children('iframe').first()
@@ -8,8 +8,7 @@ module Effective
8
8
  def index # This is the IFRAME modal dialog that is read by CKEDITOR
9
9
  EffectiveAssets.authorized?(self, :index, Effective::Asset.new(:user_id => current_user.try(:id)))
10
10
 
11
- effective_iframe_uploads = Effective::Attachment.where(box: EffectiveAssets::IFRAME_UPLOADS).pluck(:asset_id)
12
- @assets = Effective::Asset.where(id: effective_iframe_uploads)
11
+ @assets = Effective::Asset.where(user_id: current_user.id)
13
12
 
14
13
  if params[:only] == 'images'
15
14
  @assets = @assets.images
@@ -21,9 +20,9 @@ module Effective
21
20
  @aws_acl = EffectiveAssets.aws_acl
22
21
  end
23
22
 
24
- @user_uploads = IframeUploads.new(@assets)
23
+ @user_uploads = IframeUpload.new(@assets)
25
24
 
26
- render :file => 'effective/assets/iframe'
25
+ render 'effective/assets/iframe'
27
26
  end
28
27
 
29
28
  def destroy
@@ -0,0 +1,13 @@
1
+ # This is a class used for the IFrame views
2
+
3
+ module Effective
4
+ class IframeUpload < ActiveRecord::Base
5
+ acts_as_asset_box :uploads
6
+
7
+ def initialize(items = nil)
8
+ super()
9
+ add_to_asset_box(:uploads, items)
10
+ end
11
+
12
+ end
13
+ end
@@ -2,10 +2,14 @@ if defined?(EffectiveRegions)
2
2
  module Effective
3
3
  module Snippets
4
4
  class EffectiveAsset < Snippet
5
- attribute :asset_id, Integer
6
- attribute :html_class, String
7
- attribute :link_title, String
8
- attribute :private_url, Boolean
5
+ # attr_accessor :asset_id #, Integer
6
+ # attr_accessor :html_class #, String
7
+ # attr_accessor :link_title #, String
8
+ # attr_accessor :private_url # , Boolean
9
+
10
+ def snippet_attributes
11
+ super + [:asset_id, :html_class, :link_title, :private_url]
12
+ end
9
13
 
10
14
  def asset
11
15
  @asset ||= (Effective::Asset.where(:id => asset_id).first if asset_id)
@@ -20,7 +24,7 @@ if defined?(EffectiveRegions)
20
24
  end
21
25
 
22
26
  def is_private?
23
- private_url == true
27
+ [true, 'true', '1'].include?(private_url)
24
28
  end
25
29
 
26
30
  def aws_private?
@@ -1,6 +1,7 @@
1
1
  EffectiveAssets.setup do |config|
2
2
  config.assets_table_name = :assets
3
3
  config.attachments_table_name = :attachments
4
+ config.iframe_uploads_table_name = :iframe_uploads
4
5
 
5
6
  config.uploader = 'AssetUploader' # Must extend from EffectiveAssetsUploader
6
7
 
@@ -31,6 +31,10 @@ class CreateEffectiveAssets < ActiveRecord::Migration[4.2]
31
31
  t.string :box
32
32
  end
33
33
 
34
+ create_table <%= @iframe_uploads_table_name %> do |t|
35
+ t.timestamps
36
+ end
37
+
34
38
  add_index <%= @attachments_table_name %>, :asset_id
35
39
  add_index <%= @attachments_table_name %>, [:attachable_type, :attachable_id]
36
40
  add_index <%= @attachments_table_name %>, :attachable_id
@@ -11,6 +11,7 @@ module EffectiveAssets
11
11
  # The following are all valid config keys
12
12
  mattr_accessor :assets_table_name
13
13
  mattr_accessor :attachments_table_name
14
+ mattr_accessor :iframe_uploads_table_name
14
15
 
15
16
  mattr_accessor :uploader
16
17
  mattr_accessor :async
@@ -2,7 +2,9 @@ module EffectiveAssets
2
2
  class Engine < ::Rails::Engine
3
3
  engine_name 'effective_assets'
4
4
 
5
- config.autoload_paths += Dir["#{config.root}/app/models/**/", "#{config.root}/app/jobs/**/"]
5
+ config.autoload_paths += Dir["#{config.root}/lib/validators/", "#{config.root}/lib/inputs/"]
6
+
7
+ config.eager_load_paths += Dir["#{config.root}/lib/validators/", "#{config.root}/lib/inputs/"]
6
8
 
7
9
  # Include acts_as_addressable concern and allow any ActiveRecord object to call it
8
10
  initializer 'effective_assets.active_record' do |app|
@@ -13,7 +15,7 @@ module EffectiveAssets
13
15
 
14
16
  initializer 'effective_assets.action_view' do |app|
15
17
  ActiveSupport.on_load :action_view do
16
- ActionView::Helpers::FormBuilder.send(:include, Inputs::AssetBoxFormInput)
18
+ ActionView::Helpers::FormBuilder.send(:include, AssetBoxFormInput)
17
19
  end
18
20
  end
19
21
 
@@ -23,7 +25,10 @@ module EffectiveAssets
23
25
  end
24
26
 
25
27
  initializer "effective_assets.append_precompiled_assets" do |app|
26
- Rails.application.config.assets.precompile += ['effective_assets.js', 'effective_assets_iframe.js', 'effective_assets_iframe.css', 'effective_assets/*', 'mime-types/*']
28
+ Rails.application.config.assets.precompile += [
29
+ 'effective_assets_manifest.js', 'effective_assets.js', 'effective_assets_iframe.js', 'effective_assets_iframe.css',
30
+ 'effective_assets/*', 'mime-types/*'
31
+ ]
27
32
  end
28
33
 
29
34
  # ActiveAdmin (optional)
@@ -1,3 +1,3 @@
1
1
  module EffectiveAssets
2
- VERSION = '1.10.1'.freeze
2
+ VERSION = '1.11.4'.freeze
3
3
  end
@@ -0,0 +1,210 @@
1
+ class AssetBox
2
+ delegate :content_tag, :render, :current_user, :to => :@template
3
+
4
+ def initialize(object, object_name, template, method, opts)
5
+ @object = object
6
+ @object_name = object_name
7
+ @template = template
8
+ @options = initialize_options(method, opts)
9
+ end
10
+
11
+ def to_html
12
+ output = ''
13
+ output += header_html
14
+
15
+ if @options[:uploader] == :top
16
+ output += uploader_html
17
+ output += attachments_html
18
+ output += dialog_html if @options[:dialog]
19
+ else
20
+ output += attachments_html
21
+ output += dialog_html if @options[:dialog]
22
+ output += uploader_html if @options[:uploader]
23
+ end
24
+
25
+ output += footer_html
26
+
27
+ output.html_safe
28
+ end
29
+
30
+ private
31
+
32
+ def header_html
33
+ "<div id='asset-box-input-#{@options[:uid]}'
34
+ class='asset-box-input #{@options[:box]}'
35
+ data-box='#{@options[:box]}'
36
+ data-uploader='s3_#{@options[:uid]}'
37
+ data-limit='#{@options[:limit]}'
38
+ data-attachable-id='#{@options[:attachable_id]}'
39
+ data-attachable-type='#{@options[:attachable_type]}'
40
+ data-attachable-object-name='#{@object_name}'
41
+ data-attachment-style='#{@options[:attachment_style]}'
42
+ data-attachment-add-to='#{@options[:attachment_add_to]}'
43
+ data-attachment-actions='#{@options[:attachment_actions].to_json()}'
44
+ data-attachment-count='#{attachments.length}'
45
+ data-attachment-links='#{@options[:attachment_links]}'
46
+ data-over-limit-alerted='false'
47
+ data-aws-acl='#{@options[:aws_acl]}'
48
+ >".html_safe
49
+ end
50
+
51
+ def attachments_html
52
+ if @options[:attachment_style] == :table
53
+ attachments_table_html
54
+ elsif @options[:attachment_style] == :list
55
+ content_tag(:ul, build_values_html, :class => 'attachments')
56
+ else
57
+ content_tag(:div, build_values_html, :class => 'row attachments thumbnails')
58
+ end
59
+ end
60
+
61
+ def attachments_table_html
62
+ content_tag(:table, :class => 'table') do
63
+ head = attachments_table_head_html if @options[:table_filter_bar]
64
+ body = content_tag(:tbody, build_values_html, :class => 'attachments')
65
+ head ? head + body : body
66
+ end
67
+ end
68
+
69
+ def attachments_table_head_html
70
+ content_tag(:thead) do
71
+ content_tag(:tr) do
72
+ content_tag(:th, filter_bar_html, :colspan => 4)
73
+ end
74
+ end
75
+ end
76
+
77
+ def dialog_html
78
+ render(
79
+ :partial => 'asset_box_input/dialog',
80
+ :locals => {
81
+ :dialog_url => @options[:dialog_url]
82
+ }
83
+ ).html_safe
84
+ end
85
+
86
+ def uploader_html
87
+ # Check that we have permission to upload.
88
+ asset = Effective::Asset.new(user_id: ((current_user.try(:id) || 1) rescue 1), upload_file: 'placeholder')
89
+
90
+ unless (EffectiveAssets.authorized?(@template.controller, :create, asset) rescue false)
91
+ @options[:btn_title] = 'Unable to upload. (cannot :create Effective::Asset)'
92
+ @options[:disabled] = true
93
+ end
94
+
95
+ html_class = [
96
+ ('drop-files' if @options[:uploader_drop_files]),
97
+ ((@options[:uploader_html] || {})[:class])
98
+ ].compact.join(' ')
99
+
100
+ render(
101
+ :partial => 'asset_box_input/uploader',
102
+ :locals => {
103
+ :uid => @options[:uid],
104
+ :click_submit => @options[:click_submit],
105
+ :html_class => html_class,
106
+ :limit => @options[:limit],
107
+ :disabled => @options[:disabled],
108
+ :required => (@options[:required] == true && attachments.length == 0),
109
+ :file_types => @options[:file_types],
110
+ :progress_bar_partial => @options[:progress_bar_partial],
111
+ :drop_files => @options[:uploader_drop_files],
112
+ :drop_files_help_text => @options[:drop_files_help_text],
113
+ :aws_acl => @options[:aws_acl],
114
+ :btn_label => @options[:btn_label],
115
+ :btn_title => @options[:btn_title]
116
+ }
117
+ ).html_safe
118
+ end
119
+
120
+ def filter_bar_html
121
+ "<input type='text' class='form-control filter-attachments' placeholder='Filter by title'>".html_safe
122
+ end
123
+
124
+ def build_values_html
125
+ attachment_partial =
126
+ case @options[:attachment_style]
127
+ when :table
128
+ 'attachment_as_table'
129
+ when :list
130
+ 'attachment_as_list'
131
+ when :thumbnail
132
+ 'attachment_as_thumbnail'
133
+ when nil
134
+ 'attachment_as_thumbnail'
135
+ else
136
+ raise "unknown AssetBox attachment_style: #{@options[:attachment_style]}. Valid options are :thumbnail, :list and :table"
137
+ end
138
+
139
+ render(
140
+ :partial => "asset_box_input/#{attachment_partial}",
141
+ :collection => attachments.reject { |attachment| attachment.marked_for_destruction? },
142
+ :as => :attachment,
143
+ :locals => {
144
+ :attachment_actions => @options[:attachment_actions].map { |action| action.to_s },
145
+ :attachment_links => @options[:attachment_links],
146
+ :limit => @options[:limit],
147
+ :disabled => @options[:disabled],
148
+ :attachable_object_name => @object_name
149
+ }
150
+ )
151
+ end
152
+
153
+ def footer_html
154
+ "</div>".html_safe
155
+ end
156
+
157
+ def attachments
158
+ @object.attachments.select { |attachment| attachment.box == @options[:box] }
159
+ end
160
+
161
+ def initialize_options(method, opts)
162
+ {
163
+ :uploader => true, # :top, :bottom, true or false
164
+ :uploader_drop_files => false,
165
+ :drop_files_help_text => 'Drop files here',
166
+ :progress_bar_partial => 'asset_box_input/progress_bar_template',
167
+ :attachment_style => :thumbnail, # :thumbnail, :table, or :list
168
+ :attachment_links => true,
169
+ :attachment_add_to => :bottom, # :bottom or :top (of attachments div)
170
+ :attachment_actions => [:remove], # or :insert, :delete, :remove
171
+ :table_filter_bar => false,
172
+ :dialog => false,
173
+ :dialog_url => @template.effective_assets.effective_assets_path,
174
+ :disabled => false,
175
+ :file_types => [:any],
176
+ :btn_label => 'Upload...',
177
+ :btn_title => 'Click or drag & drop to upload a file'
178
+ }.merge(opts).tap do |options|
179
+ options[:method] = method.to_s
180
+ options[:box] = method.to_s.pluralize
181
+ options[:attachable_id] ||= (@object.try(:id) rescue nil)
182
+ options[:attachable_type] ||= @object.class.name.titleize.gsub(" ", "_").gsub('/', '_').downcase
183
+
184
+ # The logic for the AWS ACL is such that:
185
+ # 1.) If the :private or :aws_acl keys are set on the asset_box input, use those values
186
+ # 2.) If the :private or :public keys are set on the acts_as_asset_box declaration, use those values
187
+ # 3.) Fall back to default EffectiveAssets.aws_acl as per config file
188
+
189
+ uploader_private = (opts[:private] == true || opts[:public] == false || opts[:aws_acl] == EffectiveAssets::AWS_PRIVATE)
190
+ uploader_public = (opts[:private] == false || opts[:public] == true || opts[:aws_acl] == EffectiveAssets::AWS_PUBLIC)
191
+ object_private = ((@object.asset_boxes[method] == :private || @object.asset_boxes[method].first[:private] == true || @object.asset_boxes[method].first[:public] == false) rescue false)
192
+ object_public = ((@object.asset_boxes[method] == :public || @object.asset_boxes[method].first[:public] == true || @object.asset_boxes[method].first[:private] == false) rescue false)
193
+
194
+ if uploader_private
195
+ options[:aws_acl] = EffectiveAssets::AWS_PRIVATE
196
+ elsif uploader_public
197
+ options[:aws_acl] = EffectiveAssets::AWS_PUBLIC
198
+ elsif object_private
199
+ options[:aws_acl] = EffectiveAssets::AWS_PRIVATE
200
+ elsif object_public
201
+ options[:aws_acl] = EffectiveAssets::AWS_PUBLIC
202
+ else
203
+ options[:aws_acl] = EffectiveAssets.aws_acl
204
+ end
205
+
206
+ options[:uid] = "#{options[:attachable_type]}-#{options[:attachable_id]}-#{options[:method]}-#{Time.zone.now.to_f}".parameterize
207
+ options[:limit] = (options[:method] == options[:box] ? (options[:limit] || 10000) : 1)
208
+ end
209
+ end
210
+ end
@@ -0,0 +1,5 @@
1
+ module AssetBoxFormInput
2
+ def asset_box_input(method, opts = {})
3
+ AssetBox.new(@object, @object_name, @template, method, opts).to_html
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AssetBoxFormtasticInput < defined?(Formtastic) ? Formtastic::Inputs::FileInput : Object
2
+ def to_html
3
+ input_wrapping do
4
+ label_html << AssetBox.new(@object, @object_name, @template, @method, @options).to_html
5
+ end
6
+ end
7
+ end
@@ -4,15 +4,21 @@
4
4
  if defined?(SimpleForm)
5
5
  class AssetBoxInput < SimpleForm::Inputs::FileInput
6
6
  def input(wrapper_options = nil)
7
- Inputs::AssetBox.new(object, object_name, template, attribute_name, options).to_html
7
+ AssetBox.new(object, object_name, template, attribute_name, options).to_html
8
8
  end
9
9
  end
10
10
  elsif defined?(Formtastic)
11
11
  class AssetBoxInput < Formtastic::Inputs::FileInput
12
12
  def to_html
13
13
  input_wrapping do
14
- label_html << Inputs::AssetBox.new(@object, @object_name, @template, @method, @options).to_html
14
+ label_html << AssetBox.new(@object, @object_name, @template, @method, @options).to_html
15
15
  end
16
16
  end
17
17
  end
18
+ else
19
+ class AssetBoxInput < Object
20
+ def to_html
21
+ 'expected simpleform or formtastic'
22
+ end
23
+ end
18
24
  end
@@ -0,0 +1,5 @@
1
+ class AssetBoxSimpleFormInput < defined?(SimpleForm) ? SimpleForm::Inputs::FileInput : Object
2
+ def input(wrapper_options = nil)
3
+ AssetBox.new(object, object_name, template, attribute_name, options).to_html
4
+ end
5
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: effective_assets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.10.1
4
+ version: 1.11.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Code and Effect
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-14 00:00:00.000000000 Z
11
+ date: 2021-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -133,6 +133,7 @@ files:
133
133
  - MIT-LICENSE
134
134
  - README.md
135
135
  - active_admin/effective_assets.rb
136
+ - app/assets/config/effective_assets_manifest.js
136
137
  - app/assets/images/effective_assets/icon_close.png
137
138
  - app/assets/images/effective_assets/spinner.gif
138
139
  - app/assets/images/mime-types/excel.jpg
@@ -142,7 +143,7 @@ files:
142
143
  - app/assets/images/mime-types/video.png
143
144
  - app/assets/images/mime-types/word.jpg
144
145
  - app/assets/images/mime-types/zip.png
145
- - app/assets/javascripts/effective/snippets/effective_asset.js.coffee.erb
146
+ - app/assets/javascripts/effective/snippets/effective_asset.js.coffee
146
147
  - app/assets/javascripts/effective_assets.js
147
148
  - app/assets/javascripts/effective_assets/asset_box.js.coffee
148
149
  - app/assets/javascripts/effective_assets/asset_box_dialog.js.coffee
@@ -170,15 +171,8 @@ files:
170
171
  - app/models/effective/access_denied.rb
171
172
  - app/models/effective/asset.rb
172
173
  - app/models/effective/attachment.rb
173
- - app/models/effective/iframe_uploads.rb
174
+ - app/models/effective/iframe_upload.rb
174
175
  - app/models/effective/snippets/effective_asset.rb
175
- - app/models/inputs/asset_box.rb
176
- - app/models/inputs/asset_box_form_input.rb
177
- - app/models/inputs/asset_box_formtastic_input.rb
178
- - app/models/inputs/asset_box_input.rb
179
- - app/models/inputs/asset_box_simple_form_input.rb
180
- - app/models/validators/asset_box_length_validator.rb
181
- - app/models/validators/asset_box_presence_validator.rb
182
176
  - app/uploaders/effective_assets_uploader.rb
183
177
  - app/uploaders/test_asset_uploader.rb
184
178
  - app/views/active_admin/effective_assets/_edit.html.haml
@@ -201,12 +195,19 @@ files:
201
195
  - lib/effective_assets/version.rb
202
196
  - lib/generators/effective_assets/install_generator.rb
203
197
  - lib/generators/templates/asset_uploader.rb
198
+ - lib/inputs/asset_box.rb
199
+ - lib/inputs/asset_box_form_input.rb
200
+ - lib/inputs/asset_box_formtastic_input.rb
201
+ - lib/inputs/asset_box_input.rb
202
+ - lib/inputs/asset_box_simple_form_input.rb
204
203
  - lib/tasks/effective_assets_tasks.rake
204
+ - lib/validators/asset_box_length_validator.rb
205
+ - lib/validators/asset_box_presence_validator.rb
205
206
  homepage: https://github.com/code-and-effect/effective_assets
206
207
  licenses:
207
208
  - MIT
208
209
  metadata: {}
209
- post_install_message:
210
+ post_install_message:
210
211
  rdoc_options: []
211
212
  require_paths:
212
213
  - lib
@@ -221,9 +222,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
222
  - !ruby/object:Gem::Version
222
223
  version: '0'
223
224
  requirements: []
224
- rubyforge_project:
225
- rubygems_version: 2.4.5.1
226
- signing_key:
225
+ rubygems_version: 3.1.2
226
+ signing_key:
227
227
  specification_version: 4
228
228
  summary: Upload images and files directly to AWS S3 with a custom form input then
229
229
  seamlessly organize and attach them to any ActiveRecord object.
@@ -1,27 +0,0 @@
1
- # This is a class used for the IFrame views
2
-
3
- module Effective
4
- class IframeUploads < ActiveRecord::Base
5
- acts_as_asset_box :uploads
6
-
7
- def initialize(items = nil)
8
- super()
9
- @column_types = {}
10
-
11
- add_to_asset_box(:uploads, items)
12
- end
13
-
14
- def self.columns
15
- @columns ||= []
16
- end
17
-
18
- def self.column_defaults
19
- {}
20
- end
21
-
22
- def self.has_attribute?(*args)
23
- false
24
- end
25
-
26
- end
27
- end
@@ -1,213 +0,0 @@
1
- module Inputs
2
- class AssetBox
3
- delegate :content_tag, :render, :current_user, :to => :@template
4
-
5
- def initialize(object, object_name, template, method, opts)
6
- @object = object
7
- @object_name = object_name
8
- @template = template
9
- @options = initialize_options(method, opts)
10
- end
11
-
12
- def to_html
13
- output = ''
14
- output += header_html
15
-
16
- if @options[:uploader] == :top
17
- output += uploader_html
18
- output += attachments_html
19
- output += dialog_html if @options[:dialog]
20
- else
21
- output += attachments_html
22
- output += dialog_html if @options[:dialog]
23
- output += uploader_html if @options[:uploader]
24
- end
25
-
26
- output += footer_html
27
-
28
- output.html_safe
29
- end
30
-
31
- private
32
-
33
- def header_html
34
- "<div id='asset-box-input-#{@options[:uid]}'
35
- class='asset-box-input #{@options[:box]}'
36
- data-box='#{@options[:box]}'
37
- data-uploader='s3_#{@options[:uid]}'
38
- data-limit='#{@options[:limit]}'
39
- data-attachable-id='#{@options[:attachable_id]}'
40
- data-attachable-type='#{@options[:attachable_type]}'
41
- data-attachable-object-name='#{@object_name}'
42
- data-attachment-style='#{@options[:attachment_style]}'
43
- data-attachment-add-to='#{@options[:attachment_add_to]}'
44
- data-attachment-actions='#{@options[:attachment_actions].to_json()}'
45
- data-attachment-count='#{attachments.length}'
46
- data-attachment-links='#{@options[:attachment_links]}'
47
- data-over-limit-alerted='false'
48
- data-aws-acl='#{@options[:aws_acl]}'
49
- >".html_safe
50
- end
51
-
52
- def attachments_html
53
- if @options[:attachment_style] == :table
54
- attachments_table_html
55
- elsif @options[:attachment_style] == :list
56
- content_tag(:ul, build_values_html, :class => 'attachments')
57
- else
58
- content_tag(:div, build_values_html, :class => 'row attachments thumbnails')
59
- end
60
- end
61
-
62
- def attachments_table_html
63
- content_tag(:table, :class => 'table') do
64
- head = attachments_table_head_html if @options[:table_filter_bar]
65
- body = content_tag(:tbody, build_values_html, :class => 'attachments')
66
- head ? head + body : body
67
- end
68
- end
69
-
70
- def attachments_table_head_html
71
- content_tag(:thead) do
72
- content_tag(:tr) do
73
- content_tag(:th, filter_bar_html, :colspan => 4)
74
- end
75
- end
76
- end
77
-
78
- def dialog_html
79
- render(
80
- :partial => 'asset_box_input/dialog',
81
- :locals => {
82
- :dialog_url => @options[:dialog_url]
83
- }
84
- ).html_safe
85
- end
86
-
87
- def uploader_html
88
- # Check that we have permission to upload.
89
- asset = Effective::Asset.new(user_id: ((current_user.try(:id) || 1) rescue 1), upload_file: 'placeholder')
90
-
91
- unless (EffectiveAssets.authorized?(@template.controller, :create, asset) rescue false)
92
- @options[:btn_title] = 'Unable to upload. (cannot :create Effective::Asset)'
93
- @options[:disabled] = true
94
- end
95
-
96
- html_class = [
97
- ('drop-files' if @options[:uploader_drop_files]),
98
- ((@options[:uploader_html] || {})[:class])
99
- ].compact.join(' ')
100
-
101
- render(
102
- :partial => 'asset_box_input/uploader',
103
- :locals => {
104
- :uid => @options[:uid],
105
- :click_submit => @options[:click_submit],
106
- :html_class => html_class,
107
- :limit => @options[:limit],
108
- :disabled => @options[:disabled],
109
- :required => (@options[:required] == true && attachments.length == 0),
110
- :file_types => @options[:file_types],
111
- :progress_bar_partial => @options[:progress_bar_partial],
112
- :drop_files => @options[:uploader_drop_files],
113
- :drop_files_help_text => @options[:drop_files_help_text],
114
- :aws_acl => @options[:aws_acl],
115
- :btn_label => @options[:btn_label],
116
- :btn_title => @options[:btn_title]
117
- }
118
- ).html_safe
119
- end
120
-
121
- def filter_bar_html
122
- "<input type='text' class='form-control filter-attachments' placeholder='Filter by title'>".html_safe
123
- end
124
-
125
- def build_values_html
126
- attachment_partial =
127
- case @options[:attachment_style]
128
- when :table
129
- 'attachment_as_table'
130
- when :list
131
- 'attachment_as_list'
132
- when :thumbnail
133
- 'attachment_as_thumbnail'
134
- when nil
135
- 'attachment_as_thumbnail'
136
- else
137
- raise "unknown AssetBox attachment_style: #{@options[:attachment_style]}. Valid options are :thumbnail, :list and :table"
138
- end
139
-
140
- render(
141
- :partial => "asset_box_input/#{attachment_partial}",
142
- :collection => attachments.reject { |attachment| attachment.marked_for_destruction? },
143
- :as => :attachment,
144
- :locals => {
145
- :attachment_actions => @options[:attachment_actions].map { |action| action.to_s },
146
- :attachment_links => @options[:attachment_links],
147
- :limit => @options[:limit],
148
- :disabled => @options[:disabled],
149
- :attachable_object_name => @object_name
150
- }
151
- )
152
- end
153
-
154
- def footer_html
155
- "</div>".html_safe
156
- end
157
-
158
- def attachments
159
- @object.attachments.select { |attachment| attachment.box == @options[:box] }
160
- end
161
-
162
- def initialize_options(method, opts)
163
- {
164
- :uploader => true, # :top, :bottom, true or false
165
- :uploader_drop_files => false,
166
- :drop_files_help_text => 'Drop files here',
167
- :progress_bar_partial => 'asset_box_input/progress_bar_template',
168
- :attachment_style => :thumbnail, # :thumbnail, :table, or :list
169
- :attachment_links => true,
170
- :attachment_add_to => :bottom, # :bottom or :top (of attachments div)
171
- :attachment_actions => [:remove], # or :insert, :delete, :remove
172
- :table_filter_bar => false,
173
- :dialog => false,
174
- :dialog_url => @template.effective_assets.effective_assets_path,
175
- :disabled => false,
176
- :file_types => [:any],
177
- :btn_label => 'Upload...',
178
- :btn_title => 'Click or drag & drop to upload a file'
179
- }.merge(opts).tap do |options|
180
- options[:method] = method.to_s
181
- options[:box] = method.to_s.pluralize
182
- options[:attachable_id] ||= (@object.try(:id) rescue nil)
183
- options[:attachable_type] ||= @object.class.name.titleize.gsub(" ", "_").gsub('/', '_').downcase
184
-
185
- # The logic for the AWS ACL is such that:
186
- # 1.) If the :private or :aws_acl keys are set on the asset_box input, use those values
187
- # 2.) If the :private or :public keys are set on the acts_as_asset_box declaration, use those values
188
- # 3.) Fall back to default EffectiveAssets.aws_acl as per config file
189
-
190
- uploader_private = (opts[:private] == true || opts[:public] == false || opts[:aws_acl] == EffectiveAssets::AWS_PRIVATE)
191
- uploader_public = (opts[:private] == false || opts[:public] == true || opts[:aws_acl] == EffectiveAssets::AWS_PUBLIC)
192
- object_private = ((@object.asset_boxes[method] == :private || @object.asset_boxes[method].first[:private] == true || @object.asset_boxes[method].first[:public] == false) rescue false)
193
- object_public = ((@object.asset_boxes[method] == :public || @object.asset_boxes[method].first[:public] == true || @object.asset_boxes[method].first[:private] == false) rescue false)
194
-
195
- if uploader_private
196
- options[:aws_acl] = EffectiveAssets::AWS_PRIVATE
197
- elsif uploader_public
198
- options[:aws_acl] = EffectiveAssets::AWS_PUBLIC
199
- elsif object_private
200
- options[:aws_acl] = EffectiveAssets::AWS_PRIVATE
201
- elsif object_public
202
- options[:aws_acl] = EffectiveAssets::AWS_PUBLIC
203
- else
204
- options[:aws_acl] = EffectiveAssets.aws_acl
205
- end
206
-
207
- options[:uid] = "#{options[:attachable_type]}-#{options[:attachable_id]}-#{options[:method]}-#{Time.zone.now.to_f}".parameterize
208
- options[:limit] = (options[:method] == options[:box] ? (options[:limit] || 10000) : 1)
209
- end
210
- end
211
- end
212
- end
213
-
@@ -1,7 +0,0 @@
1
- module Inputs
2
- module AssetBoxFormInput
3
- def asset_box_input(method, opts = {})
4
- AssetBox.new(@object, @object_name, @template, method, opts).to_html
5
- end
6
- end
7
- end
@@ -1,9 +0,0 @@
1
- if defined?(Formtastic)
2
- class AssetBoxFormtasticInput < Formtastic::Inputs::FileInput
3
- def to_html
4
- input_wrapping do
5
- label_html << Inputs::AssetBox.new(@object, @object_name, @template, @method, @options).to_html
6
- end
7
- end
8
- end
9
- end
@@ -1,7 +0,0 @@
1
- if defined?(SimpleForm)
2
- class AssetBoxSimpleFormInput < SimpleForm::Inputs::FileInput
3
- def input(wrapper_options = nil)
4
- Inputs::AssetBox.new(object, object_name, template, attribute_name, options).to_html
5
- end
6
- end
7
- end