effective_assets 0.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (107) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +341 -72
  4. data/app/assets/javascripts/effective/snippets/effective_asset.js.coffee +53 -0
  5. data/app/assets/javascripts/effective_assets.js +4 -0
  6. data/app/assets/javascripts/effective_assets/asset_box.js.coffee +36 -0
  7. data/app/assets/javascripts/effective_assets/asset_box_dialog.js.coffee +49 -0
  8. data/app/assets/javascripts/effective_assets/asset_box_drag_and_drop.js.coffee +2 -0
  9. data/app/assets/javascripts/effective_assets/asset_box_filtering.js.coffee +16 -0
  10. data/app/assets/javascripts/effective_assets/asset_box_sorting.js.coffee +8 -0
  11. data/app/assets/javascripts/effective_assets/jquery_ui_sortable.js +813 -585
  12. data/app/assets/javascripts/effective_assets/s3_uploader.js.coffee +268 -0
  13. data/app/assets/javascripts/effective_assets_iframe.js.coffee +28 -0
  14. data/app/assets/stylesheets/active_admin/effective_assets.css.scss +57 -0
  15. data/app/assets/stylesheets/effective_assets/_asset_box_input.scss +54 -175
  16. data/app/assets/stylesheets/effective_assets/_iframe_bootstrap.scss +1714 -0
  17. data/app/assets/stylesheets/effective_assets/_input_bootstrap.scss +508 -0
  18. data/app/assets/stylesheets/effective_assets_iframe.css.scss +23 -0
  19. data/app/controllers/effective/assets_controller.rb +41 -0
  20. data/app/controllers/effective/s3_uploads_controller.rb +58 -74
  21. data/app/helpers/effective_assets_helper.rb +30 -14
  22. data/app/helpers/effective_assets_s3_helper.rb +69 -0
  23. data/app/models/concerns/acts_as_asset_box.rb +75 -11
  24. data/app/models/effective/access_denied.rb +17 -0
  25. data/app/models/effective/asset.rb +130 -93
  26. data/app/models/effective/attachment.rb +2 -7
  27. data/app/models/effective/delayed_job.rb +33 -78
  28. data/app/models/effective/snippets/effective_asset.rb +19 -0
  29. data/app/models/effective/user_uploads.rb +19 -0
  30. data/app/models/inputs/asset_box.rb +154 -0
  31. data/app/models/inputs/asset_box_form_input.rb +7 -0
  32. data/app/models/inputs/asset_box_formtastic_input.rb +9 -0
  33. data/app/models/inputs/asset_box_input.rb +13 -82
  34. data/app/models/inputs/asset_box_simple_form_input.rb +7 -0
  35. data/app/uploaders/effective_assets_uploader.rb +14 -2
  36. data/app/uploaders/{asset_uploader.rb → test_asset_uploader.rb} +1 -1
  37. data/app/views/active_admin/effective_assets/_edit.html.haml +3 -3
  38. data/app/views/active_admin/effective_assets/_new.html.haml +2 -1
  39. data/app/views/asset_box_input/_attachment_as_list.html.haml +17 -0
  40. data/app/views/asset_box_input/_attachment_as_table.html.haml +32 -0
  41. data/app/views/asset_box_input/_attachment_as_thumbnail.html.haml +20 -0
  42. data/app/views/asset_box_input/_dialog.html.haml +18 -0
  43. data/app/views/asset_box_input/_progress_bar_template.html.haml +8 -0
  44. data/app/views/asset_box_input/_uploader.html.haml +21 -115
  45. data/app/views/effective/assets/iframe.html.haml +17 -0
  46. data/app/views/effective/snippets/_effective_asset.html.haml +8 -0
  47. data/config/routes.rb +8 -2
  48. data/db/migrate/01_create_effective_assets.rb.erb +3 -0
  49. data/lib/effective_assets.rb +34 -3
  50. data/lib/effective_assets/engine.rb +11 -8
  51. data/lib/effective_assets/version.rb +1 -1
  52. data/lib/generators/templates/asset_uploader.rb +35 -0
  53. data/lib/generators/templates/effective_assets.rb +31 -4
  54. data/lib/tasks/effective_assets_tasks.rake +115 -4
  55. data/spec/internal/config/database.yml +3 -0
  56. data/spec/internal/config/initializers/effective_assets.rb +18 -0
  57. data/spec/internal/config/routes.rb +3 -0
  58. data/spec/internal/db/combustion_test.sqlite +0 -0
  59. data/spec/internal/db/schema.rb +52 -0
  60. data/spec/internal/log/test.log +793 -0
  61. data/spec/{dummy → internal}/public/favicon.ico +0 -0
  62. data/spec/internal/public/sprites.png +0 -0
  63. data/spec/models/asset_spec.rb +119 -35
  64. data/spec/spec_helper.rb +9 -3
  65. metadata +95 -234
  66. data/app/assets/images/effective_assets/s3_down_button.gif +0 -0
  67. data/app/assets/images/effective_assets/s3_over_button.gif +0 -0
  68. data/app/assets/images/effective_assets/s3_up_button.gif +0 -0
  69. data/app/assets/images/effective_assets/s3_upload.swf +0 -0
  70. data/app/assets/javascripts/effective_assets/asset_box_input.js.coffee +0 -71
  71. data/app/assets/javascripts/effective_assets/asset_box_uploader.js +0 -122
  72. data/app/assets/javascripts/effective_assets/asset_box_uploader_customization.js +0 -166
  73. data/app/controllers/effective/attachments_controller.rb +0 -14
  74. data/app/views/asset_box_input/_attachment_fields.html.haml +0 -14
  75. data/spec/dummy/README.rdoc +0 -261
  76. data/spec/dummy/Rakefile +0 -7
  77. data/spec/dummy/app/assets/javascripts/application.js +0 -15
  78. data/spec/dummy/app/assets/stylesheets/application.css +0 -13
  79. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  80. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  81. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  82. data/spec/dummy/config.ru +0 -4
  83. data/spec/dummy/config/application.rb +0 -65
  84. data/spec/dummy/config/boot.rb +0 -10
  85. data/spec/dummy/config/database.yml +0 -25
  86. data/spec/dummy/config/environment.rb +0 -5
  87. data/spec/dummy/config/environments/development.rb +0 -37
  88. data/spec/dummy/config/environments/production.rb +0 -67
  89. data/spec/dummy/config/environments/test.rb +0 -37
  90. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  91. data/spec/dummy/config/initializers/inflections.rb +0 -15
  92. data/spec/dummy/config/initializers/mime_types.rb +0 -5
  93. data/spec/dummy/config/initializers/secret_token.rb +0 -7
  94. data/spec/dummy/config/initializers/session_store.rb +0 -8
  95. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  96. data/spec/dummy/config/locales/en.yml +0 -5
  97. data/spec/dummy/config/routes.rb +0 -58
  98. data/spec/dummy/db/development.sqlite3 +0 -0
  99. data/spec/dummy/db/schema.rb +0 -16
  100. data/spec/dummy/db/test.sqlite3 +0 -0
  101. data/spec/dummy/log/development.log +0 -71
  102. data/spec/dummy/log/test.log +0 -33
  103. data/spec/dummy/public/404.html +0 -26
  104. data/spec/dummy/public/422.html +0 -26
  105. data/spec/dummy/public/500.html +0 -25
  106. data/spec/dummy/script/rails +0 -6
  107. data/spec/dummy/spec_link +0 -3
@@ -0,0 +1,268 @@
1
+ $ = jQuery
2
+
3
+ $.fn.S3Uploader = (options) ->
4
+
5
+ # support multiple elements
6
+ if @length > 1
7
+ @each -> $(this).S3Uploader options
8
+ return this
9
+
10
+ $uploadForm = this # the .asset-box-uploader div .asset-box-input > [.attachments, .uploads, .asset-box-uploader]
11
+
12
+ settings =
13
+ url: ''
14
+ remove_completed_progress_bar: true
15
+ remove_failed_progress_bar: true
16
+ progress_bar_target: null
17
+ progress_bar_template: null
18
+ allow_multiple_files: true
19
+ valid_s3_keys: ['key', 'acl', 'AWSAccessKeyId', 'policy', 'signature', 'success_action_status', 'X-Requested-With', 'content-type']
20
+ create_asset_url: null
21
+ update_asset_url: null
22
+ file_types: 'any'
23
+
24
+ $.extend settings, options
25
+
26
+ current_files = []
27
+
28
+ setUploadForm = ->
29
+ $uploadForm.fileupload
30
+ url: settings.url
31
+
32
+ add: (e, data) ->
33
+ file = data.files[0]
34
+
35
+ # Check File Type
36
+ if settings.file_types != 'any'
37
+ types = new RegExp("(\.|\/)(#{settings.file_types})$")
38
+ unless types.test(file.type) || types.test(file.name.toLowerCase())
39
+ alert("Unable to add #{file.name}.\n\nOnly #{settings.file_types.replace(/\|/g, ', ')} files allowed.")
40
+ return false
41
+
42
+ # We're all good. Let's go ahead and add this
43
+ current_files.push data
44
+ $uploadForm.trigger("s3_file_added", [e, file])
45
+
46
+ template = settings.progress_bar_template
47
+ data.context = $($.trim(tmpl(template.html(), file)))
48
+ $(data.context).appendTo(settings.progress_bar_target)
49
+ data.submit()
50
+
51
+ start: (e) ->
52
+ $uploadForm.trigger("s3_uploads_start", [e])
53
+ disable_submit()
54
+
55
+ progress: (e, data) ->
56
+ if data.context
57
+ progress = parseInt(data.loaded / data.total * 100, 10)
58
+ data.context.find('.bar').css('width', progress + '%').html(format_bitrate(data.bitrate))
59
+ data.context.find('.progress > span').remove()
60
+
61
+ done: (e, data) ->
62
+ content = build_content_object($uploadForm, data.files[0], data.result)
63
+
64
+ if settings.update_asset_url
65
+ update_asset_and_load_attachment(content)
66
+
67
+ data.context.fadeOut('slow', -> $(this).remove()) if data.context && settings.remove_completed_progress_bar # remove progress bar
68
+ $uploadForm.trigger("s3_upload_complete", [$uploadForm, content])
69
+
70
+ current_files.splice($.inArray(data, current_files), 1) # remove that element from the array
71
+
72
+ unless current_files.length
73
+ $uploadForm.trigger("s3_uploads_complete", [$uploadForm, content])
74
+ enable_submit()
75
+
76
+ fail: (e, data) ->
77
+ content = build_content_object($uploadForm, data.files[0], data.result)
78
+ content.error_thrown = data.errorThrown
79
+
80
+ data.context.fadeOut('slow', -> $(this).remove()) if data.context && settings.remove_failed_progress_bar # remove progress bar
81
+ $uploadForm.trigger("s3_upload_failed", [$uploadForm, content])
82
+ enable_submit()
83
+
84
+ formData: (form) ->
85
+ inputs = form.find($uploadForm).children('input')
86
+ inputs.each -> $(this).prop('disabled', false)
87
+ data = inputs.serializeArray()
88
+
89
+ inputs = form.find($uploadForm).children("input:not([name='file'])")
90
+ inputs.each -> $(this).prop('disabled', true)
91
+
92
+ fileType = ""
93
+ if "type" of @files[0]
94
+ fileType = @files[0].type
95
+ data.push
96
+ name: "content-type"
97
+ value: fileType
98
+
99
+ # Remove anything we can't submit to S3
100
+ for item in data
101
+ data.splice(data.indexOf(data), 1) unless item.name in settings.valid_s3_keys
102
+
103
+ # Ask our server for a unique ID for this Asset
104
+ asset = create_asset(@files[0])
105
+ @files[0].asset_id = asset.id
106
+ key = asset.s3_key
107
+
108
+ # substitute upload timestamp and unique_id into key
109
+ key_field = $.grep data, (n) ->
110
+ n if n.name == "key"
111
+
112
+ if key_field.length > 0
113
+ key_field[0].value = key
114
+
115
+ # IE <= 9 doesn't have XHR2 hence it can't use formData
116
+ # replace 'key' field to submit form
117
+ unless 'FormData' of window
118
+ $uploadForm.find("input[name='key']").val(key)
119
+ data
120
+
121
+ build_content_object = ($uploadForm, file, result) ->
122
+ content = {}
123
+ if result # Use the S3 response to set the URL to avoid character encodings bugs
124
+ content.url = $(result).find("Location").text()
125
+ content.filepath = $('<a />').attr('href', content.url)[0].pathname
126
+ else # IE <= 9 return a null result object so we use the file object instead
127
+ domain = settings.url
128
+ content.filepath = $uploadForm.find('input[name=key]').val().replace('/${filename}', '')
129
+ content.url = domain + content.filepath + '/' + encodeURIComponent(file.name)
130
+
131
+ content.url = s3urlDecode(content.url)
132
+ content.filepath = s3urlDecode(content.filepath)
133
+
134
+ content.filename = file.name
135
+ content.filesize = file.size if 'size' of file
136
+ content.lastModifiedDate = file.lastModifiedDate if 'lastModifiedDate' of file
137
+ content.filetype = file.type if 'type' of file
138
+ content.asset_id = file.asset_id if 'asset_id' of file
139
+ content.relativePath = build_relativePath(file) if has_relativePath(file)
140
+ content
141
+
142
+ has_relativePath = (file) ->
143
+ file.relativePath || file.webkitRelativePath
144
+
145
+ build_relativePath = (file) ->
146
+ file.relativePath || (file.webkitRelativePath.split("/")[0..-2].join("/") + "/" if file.webkitRelativePath)
147
+
148
+ s3urlDecode = (url) -> url.replace(/%2F/g, "/").replace(/\+/g, '%20')
149
+
150
+ extra_fields_for_asset = ->
151
+ # Any field in our form that shares our name like effective_asset[#{box}][something2] should be gotten
152
+ # And we return something2 => something2.value
153
+ box = $uploadForm.closest('.asset-box-input').data('box')
154
+ fields = $uploadForm.closest('form').find(":input[name*='[#{box}]']").serializeArray()
155
+
156
+ extra = {}
157
+
158
+ $.each fields, (i, field) ->
159
+ pieces = field.name.split('[').map (piece) -> piece.replace(']', '')
160
+
161
+ if (index_of_box = pieces.indexOf(box)) == -1
162
+ name = pieces.join()
163
+ else
164
+ name = pieces.slice(index_of_box+1, pieces.length).join()
165
+
166
+ extra[name] = field.value if name.length > 0
167
+
168
+ extra
169
+
170
+ create_asset = (file) ->
171
+ asset = 'false'
172
+
173
+ $.ajax
174
+ url: settings.create_asset_url
175
+ type: 'POST'
176
+ dataType: 'json'
177
+ data:
178
+ title: file.name
179
+ content_type: file.type
180
+ data_size: file.size
181
+ extra: extra_fields_for_asset()
182
+ async: false
183
+ success: (data) -> asset = data
184
+
185
+ asset
186
+
187
+ update_asset_and_load_attachment = (file) ->
188
+ asset_box = $uploadForm.closest('.asset-box-input')
189
+
190
+ $.ajax
191
+ url: settings.update_asset_url.replace(':id', file.asset_id)
192
+ type: 'PUT'
193
+ data:
194
+ upload_file: file.url
195
+ data_size: file.filesize
196
+ content_type: file.filetype
197
+ title: file.filename
198
+ attachable_type: asset_box.data('attachable-type')
199
+ attachable_id: asset_box.data('attachable-id')
200
+ attachable_object_name: asset_box.data('attachable-object-name')
201
+ attachment_style: asset_box.data('attachment-style')
202
+ attachment_actions: asset_box.data('attachment-actions')
203
+ aws_acl: asset_box.data('aws-acl')
204
+ box: asset_box.data('box')
205
+ async: true
206
+ success: (data) ->
207
+ limit = asset_box.data('limit')
208
+
209
+ if limit == 10000 # Guard value for no limit
210
+ asset_box.find('.attachments').append($(data))
211
+ else
212
+ asset_box.find('.attachments').prepend($(data))
213
+
214
+ asset_box.find("input.asset-box-remove").each (index) ->
215
+ if "#{$(this).val()}" == '1' # If we're going to delete it...
216
+ $(this).closest('.attachment').hide()
217
+ limit = limit + 1
218
+ return
219
+
220
+ if index >= limit
221
+ $(this).closest('.attachment').hide()
222
+ else
223
+ $(this).closest('.attachment').show()
224
+
225
+
226
+ disable_submit = ->
227
+ $uploadForm.data('effective-assets-uploading', true)
228
+
229
+ $uploadForm.closest('form').find('input[type=submit]').each ->
230
+ submit = $(this)
231
+ submit.data('effective-assets-original-label', submit.val()) if submit.data('effective-assets-original-label') == undefined
232
+ submit.prop('disabled', true)
233
+ submit.val('Uploading...')
234
+
235
+ enable_submit = ->
236
+ $uploadForm.data('effective-assets-uploading', false)
237
+
238
+ anyUploading = false
239
+ $uploadForm.closest('form').find('.asset-box-uploader').each ->
240
+ anyUploading = true if $(this).data('effective-assets-uploading') == true
241
+
242
+ unless anyUploading
243
+ $uploadForm.closest('form').find('input[type=submit]').each ->
244
+ submit = $(this)
245
+ submit.val(submit.data('effective-assets-original-label') || 'Submit')
246
+ submit.prop('disabled', false)
247
+ submit.removeData('effective-assets-original-label')
248
+
249
+ format_bitrate = (bits) ->
250
+ if typeof bits != 'number'
251
+ ''
252
+ else if (bits >= 1000000000)
253
+ (bits / 1000000000).toFixed(2) + ' Gbit/s'
254
+ else if (bits >= 1000000)
255
+ (bits / 1000000).toFixed(2) + ' Mbit/s'
256
+ else if (bits >= 1000)
257
+ (bits / 1000).toFixed(2) + ' kbit/s'
258
+ else
259
+ bits.toFixed(2) + ' bit/s'
260
+
261
+ #public methods
262
+ @initialize = ->
263
+ # Save key for IE9 Fix
264
+ $uploadForm.data("key", $uploadForm.find("input[name='key']").val())
265
+ setUploadForm()
266
+ this
267
+
268
+ @initialize()
@@ -0,0 +1,28 @@
1
+ getCkEditorFuncNum = ->
2
+ reParam = new RegExp( '(?:[\?&]|&)' + 'CKEditorFuncNum' + '=([^&]+)', 'i' )
3
+ match = window.location.search.match(reParam)
4
+
5
+ if match && match.length > 0
6
+ match[1]
7
+
8
+ $(document).on 'click', 'a.attachment-insert', (event) ->
9
+ ckeditor = getCkEditorFuncNum()
10
+
11
+ if ckeditor && window.opener && window.opener.CKEDITOR
12
+ event.preventDefault()
13
+
14
+ obj = $(event.currentTarget)
15
+ asset = $(obj.data('asset'))
16
+
17
+ url = asset.attr('src') || asset.attr('href')
18
+ alt = asset.attr('alt') || ''
19
+
20
+ window.opener.CKEDITOR.tools.callFunction(ckeditor, url, ->
21
+ dialog = this.getDialog()
22
+
23
+ if dialog && dialog.getName() == 'image2'
24
+ dialog.getContentElement('info', 'alt').setValue(alt)
25
+ )
26
+
27
+ window.close()
28
+
@@ -0,0 +1,57 @@
1
+ body.active_admin {
2
+ .asset-box-input {
3
+ @import "effective_assets/input_bootstrap";
4
+ margin-left: 20%;
5
+
6
+ .thumbnails { // This was added for active_admin
7
+ margin-left: 0px;
8
+ position: relative;
9
+ left: -20px;
10
+ }
11
+ }
12
+
13
+ @import "effective_assets/asset_box_input";
14
+
15
+ // This is for the ActiveAdmin Attach... functionality
16
+ .effective-assets-overlay {
17
+ background-color: rgba(0, 0, 0, 0.7);
18
+ position: fixed;
19
+ left: 0;
20
+ top: 0;
21
+ width: 100%;
22
+ height: 100%;
23
+ opacity: 1.0;
24
+ z-index: 2000;
25
+ }
26
+
27
+ .effective-assets-dialog {
28
+ position: fixed !important;
29
+ top: 40px !important;
30
+ z-index: 2001;
31
+
32
+ .ui-dialog-titlebar { display: none; }
33
+
34
+ .ui-dialog-buttonpane {
35
+ -moz-border-bottom-colors: none;
36
+ -moz-border-left-colors: none;
37
+ -moz-border-right-colors: none;
38
+ -moz-border-top-colors: none;
39
+ background: -moz-linear-gradient(-90deg, #EFEFEF, #DFE1E2) repeat scroll 0 0 rgba(0, 0, 0, 0);
40
+ border-color: #E6E6E6 #D4D4D4 #EEEEEE;
41
+ border-image: none;
42
+ border-style: solid;
43
+ border-width: 1px;
44
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.37);
45
+ color: #5E6469;
46
+ font-size: 1em;
47
+ font-weight: bold;
48
+ line-height: 18px;
49
+ margin-bottom: 0.5em;
50
+ padding: 5px 10px 3px;
51
+ text-shadow: 0 1px 0 #FFFFFF;
52
+
53
+ button { margin: 2px; }
54
+ }
55
+ }
56
+
57
+ }
@@ -1,8 +1,3 @@
1
- @mixin clearfix {
2
- display: block;
3
- &:after { content:"\0020";display:block;height:0;clear:both;visibility:hidden;overflow:hidden; }
4
- }
5
-
6
1
  @mixin border-radius ($radius) {
7
2
  position: relative;
8
3
  -webkit-border-radius: $radius;
@@ -12,195 +7,79 @@
12
7
  border-radius: $radius;
13
8
  }
14
9
 
15
- .asset_box_uploader {
16
- width: 800px;
17
- margin: 0px auto;
18
- text-align: left;
10
+ .asset-box-input {
11
+ width: 100%;
12
+ height: 100%;
19
13
 
20
- .file_lists {
21
- border: 1px solid #B7B9BB;
22
- height: 300px;
23
- margin-bottom: 10px;
24
- overflow-y: scroll;
14
+ // asset_box_input/attachment_as_table
15
+ tbody.attachments {
16
+ .attachment-image img {
17
+ max-height: 48px;
18
+ }
25
19
  }
26
20
 
27
- .file_list {
28
- border-width: 0 0 1px 0;
29
- list-style-type: none;
30
- padding: 0;
31
- margin: 0;
32
-
33
- li {
34
- border: 1px solid #B7B9BB;
35
- height: 60px;
36
- line-height: 45px;
21
+ // asset_box_input/attachment_as_list
22
+ ul.attachments {
23
+ .attachment {
37
24
  position: relative;
38
- padding: 0 0 25px 0;
39
- }
40
-
41
- .progress {
42
- display: block;
43
- height: 85px;
44
- text-align: right;
45
- background: #EFEFEF;
46
- background: -webkit-gradient(linear, left top, left bottom, from(#EFEFEF), to(#DFE1E2));
47
- background: -moz-linear-gradient(-90deg, #EFEFEF, #DFE1E2);
48
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#efefef, endColorstr=#dfe1e2);
49
- -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#efefef, endColorstr=#dfe1e2);
50
25
 
51
- .amount {
52
- position: absolute;
53
- right: 10px;
54
- top: 15px;
55
- color: #666;
56
- text-shadow: 1px 1px #fff;
26
+ .attachment-title {
27
+ overflow: hidden;
28
+ word-break: keep-all;
29
+ text-align: left;
57
30
  }
58
- }
59
-
60
- .file_name {
61
- display: block;
62
- position: absolute;
63
- font-weight: bold;
64
- margin: 0 0 15px 10px;
65
- }
66
-
67
- .file_size {
68
- display: block;
69
- position: absolute;
70
- right: 10px;
71
- bottom: 0;
72
- line-height: 2;
73
- color: #AEAEAE;
74
- }
75
31
 
76
- .properties {
77
- position: absolute;
78
- left: 10px;
79
- bottom: 10px;
80
- display: block;
81
-
82
- label {
83
- float: left !important;
84
- line-height: 2 !important;
85
- margin-right: 4px !important;
86
- }
87
-
88
- input[type="text"] {
89
- float: left !important;
90
- margin-right: 30px !important;
91
- width: 130px !important;
32
+ .attachment-remove {
33
+ position: absolute;
34
+ top: 0px;
35
+ right: 7px;
92
36
  }
93
37
  }
94
38
  }
95
39
 
96
- .file_todo_list {
97
- .progress { display: none; }
98
- }
99
-
100
- .file_done_list {
101
- .progress { width: 100%; }
102
- }
103
-
104
- .overall {
105
- border: 1px solid #B7B9BB;
106
- height: 35px;
107
- line-height: 35px;
108
- position: relative;
109
- font-size: 130%;
110
- margin-bottom: 10px;
40
+ // asset_box_input/attachment_as_thumbnail
41
+ div.attachments {
42
+ .attachment {
43
+ position: relative;
111
44
 
112
- .progress {
113
- display: block;
114
- height: 35px;
115
- background: #6A7176;
116
- background: -webkit-gradient(linear, left top, left bottom, from(#6A7176), to(#4D5256));
117
- background: -moz-linear-gradient(-90deg, #6A7176, #4D5256);
118
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6a7176, endColorstr=#4d5256);
119
- -ms-filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6a7176, endColorstr=#4d5256);
45
+ .attachment-title {
46
+ overflow: hidden;
47
+ word-break: keep-all;
48
+ text-align: center;
49
+ }
120
50
 
121
- .amount {
122
- padding-right: 0px;
123
- color: #eaeaea;
124
- text-shadow: 1px 1px #333;
51
+ .attachment-remove {
125
52
  position: absolute;
126
- right: 10px;
53
+ top: 7px;
54
+ right: 22px;
127
55
  }
128
56
  }
129
-
130
- .status {
131
- text-align: center;
132
- display: block;
133
- width: 100%;
134
- font-weight: bold;
135
- color: #aaa;
136
- position: absolute;
137
- }
138
-
139
57
  }
140
58
 
141
- .progress {
142
- display: block;
143
- position: absolute;
144
- text-align: right;
145
- }
146
-
147
- input[type="submit"] {
148
- margin-left: 0 !important;
149
-
150
- &.StopButton, &.ResetButton {
151
- float: right;
152
- margin-left: 10px !important;
59
+ .uploads {
60
+ .upload {
61
+ border-top: solid 1px #CCC;
62
+ width: 100%;
63
+ min-width: 400px;
64
+ padding-top: 10px;
65
+ margin-top: 10px;
66
+
67
+ .progress {
68
+ margin-top: 8px;
69
+ border: solid 1px #555;
70
+ @include border-radius(3px);
71
+
72
+ .spinner {
73
+ height: 20px;
74
+ width: 20px;
75
+ }
76
+
77
+ .bar {
78
+ height: 100%;
79
+ background: #3EC144;
80
+ }
81
+ }
153
82
  }
154
83
  }
155
-
156
- label {
157
- float: none;
158
- width: auto !important;
159
- text-align: left;
160
- margin: 0 !important;
161
- }
162
- }
163
-
164
- .asset-box-attachment {
165
- position: relative;
166
- width: 128px;
167
- float: left;
168
- margin-right: 20px;
169
- height: 190px;
170
-
171
- p.title {
172
- font-size: 14px;
173
- color: #818181;
174
- padding: 10px;
175
- margin: 0;
176
- }
177
- }
178
-
179
- .asset-box-spinner {
180
- height: 128px;
181
- width: 128px;
182
- background: rgba(255,255,255,0.8) image-url('effective_assets/spinner.gif') no-repeat center center;
183
- display: block;
184
- margin-bottom: 6px;
185
84
  }
186
85
 
187
- .attachments {
188
- @include clearfix;
189
- }
190
-
191
- .file_to_upload .delete, .asset-box-remove {
192
- @include border-radius(3px);
193
- display: block;
194
- position: absolute;
195
- background: rgba(255,255,255,0.8) image-url('effective_assets/icon_close.png') no-repeat center center;
196
- text-indent: -99999px !important;
197
- height: 20px;
198
- width: 20px;
199
- right: 10px;
200
- top: 10px;
201
- cursor: pointer;
202
- }
203
-
204
- .assets {
205
- clear: both;
206
- }