caboose-cms 0.4.52 → 0.4.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- YjFkNDIxYjhkZGIxNmQ5MTMxNjhkNWE4Y2E5YzU1ZjQ4OTIzOWRjZg==
4
+ NzhlMzNkYzE1YTRiM2FmY2RhZTBlODVjYTEyY2VjZTM4YWNiYWZjNA==
5
5
  data.tar.gz: !binary |-
6
- MTA1MWI4N2QwYmI4NDVkODUzMDVjZjVlYTYwMWViNDNjNmY5NGVlMw==
6
+ ZGI2ZGYyNDJhZTEwNjU3ZDhjODM2NTQxMGFkOGNhZDllMzQ0NDg4Mw==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- NjM5N2RjZjI5MWQ0YzljYjlkMmYxMzYwNWYwZDVhZGM2NjJhNjk4MDQxNzQy
10
- OWY5MTQ4ZjQzZjg5NjlhNzY3NzZmMTQ1NGU2MzE3NWQ5MWQyYWM3Y2RkZGM2
11
- MGQ2OTkyNDE4MmI0YmE1NWUzYjViNzNmNzljYjAzY2Q1MmYxZGY=
9
+ ZmQ2MWY0YThkYzA1YWJlNjI2MThiYjMyOTZkYjQ3NzcyYTY5ZTA5ZmE5YWRh
10
+ MDNmOGRiMzE2ZTBiNzIzODFiMTUzN2UwNmQ3MjZjZTI5ZjFmMDQ4M2RkYWI0
11
+ NTAwYmQ4MTFkZTU5OWEyZjI2MDQ3NWJmMDgzNDY4YzdlMGRlYzk=
12
12
  data.tar.gz: !binary |-
13
- YTNlZWM3MTg3MmRlZDIyOTM0ZGExZjYzNWQyY2U0ZjBhNmZjZjM3MjRiOGI0
14
- MjczMTJhODIzZDNlMjhlM2Y1YzMxYTNkMWEwZjFkODUzOGUzM2VhY2ZmOGZl
15
- ZTY0NmY1NzlmZjUyMDkzMTc3NTg4NDZiZTBlNGU0YTRlOTI1YjY=
13
+ Nzk1ZTBhZWY1NTc4MzM5YmVjNDRkM2VjYjIxOWI1NzI4ZmMyNGVmM2IxOGNj
14
+ YWE0MGJhMWE0M2RlMjk3M2JiMDExZDNmYjQwOGIxYTkzNjZkOTY0OTUzY2Ji
15
+ OTFjOWVkN2M4YjhiMzMyN2ZmYWZjNTBkYmFjOGI5Njc1MDIzYzQ=
@@ -42,8 +42,8 @@ PageContentController.prototype = {
42
42
  {
43
43
  var ids = [];
44
44
  $.each($(e.target).children(), function(i, el) {
45
- var id = $(el).attr('id');
46
- if (id.substr(0, 6) == 'block_') ids.push(id.substr(6));
45
+ var id = $(el).attr('id');
46
+ if (id && id.substr(0, 6) == 'block_') ids.push(id.substr(6));
47
47
  });
48
48
 
49
49
  $.ajax({
@@ -163,7 +163,7 @@
163
163
  // value properties, a function returning such an array, a FormData
164
164
  // object (for XHR file uploads), or a simple object.
165
165
  // The form of the first fileInput is given as parameter to the function:
166
- formData: function (form) {
166
+ formData: function (form) {
167
167
  return form.serializeArray();
168
168
  },
169
169
 
@@ -1 +1,215 @@
1
- (function(a,b){a.ajaxPrefilter(function(d,c,e){if(d.iframe){d.originalURL=d.url;return"iframe"}});a.ajaxTransport("iframe",function(l,j,k){var f=null,i=null,e="iframe-"+a.now(),d=a(l.files).filter(":file:enabled"),h=null,c=null;function g(){d.each(function(o,n){var m=a(n);m.data("clone").replaceWith(m)});f.remove();i.one("load",function(){i.remove()});i.attr("src","javascript:false;")}l.dataTypes.shift();l.data=j.data;if(d.length){f=a("<form enctype='multipart/form-data' method='post'></form>").hide().attr({action:l.originalURL,target:e});if(typeof(l.data)==="string"&&l.data.length>0){a.error("data must not be serialized")}a.each(l.data||{},function(m,n){if(a.isPlainObject(n)){m=n.name;n=n.value}a("<input type='hidden' />").attr({name:m,value:n}).appendTo(f)});a("<input type='hidden' value='IFrame' name='X-Requested-With' />").appendTo(f);if(l.dataTypes[0]&&l.accepts[l.dataTypes[0]]){c=l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", */*; q=0.01":"")}else{c=l.accepts["*"]}a("<input type='hidden' name='X-HTTP-Accept'>").attr("value",c).appendTo(f);h=d.after(function(m){var o=a(this),n=o.clone().prop("disabled",true);o.data("clone",n);return n}).next();d.appendTo(f);return{send:function(n,m){i=a("<iframe src='javascript:false;' name='"+e+"' id='"+e+"' style='display:none'></iframe>");i.one("load",function(){i.one("load",function(){var u=this.contentWindow?this.contentWindow.document:(this.contentDocument?this.contentDocument:this.document),q=u.documentElement?u.documentElement:u.body,p=q.getElementsByTagName("textarea")[0],r=p&&p.getAttribute("data-type")||null,o=p&&p.getAttribute("data-status")||200,t=p&&p.getAttribute("data-statusText")||"OK",s={html:q.innerHTML,text:r?p.value:q?(q.textContent||q.innerText):null};g();m(o,t,s,r?("Content-Type: "+r):null)});f[0].submit()});a("body").append(f,i)},abort:function(){if(i!==null){i.unbind("load").attr("src","javascript:false;");g()}}}}})})(jQuery);
1
+ /*
2
+ * jQuery Iframe Transport Plugin 1.8.2
3
+ * https://github.com/blueimp/jQuery-File-Upload
4
+ *
5
+ * Copyright 2011, Sebastian Tschan
6
+ * https://blueimp.net
7
+ *
8
+ * Licensed under the MIT license:
9
+ * http://www.opensource.org/licenses/MIT
10
+ */
11
+
12
+ /* global define, window, document */
13
+
14
+ (function (factory) {
15
+ 'use strict';
16
+ if (typeof define === 'function' && define.amd) {
17
+ // Register as an anonymous AMD module:
18
+ define(['jquery'], factory);
19
+ } else {
20
+ // Browser globals:
21
+ factory(window.jQuery);
22
+ }
23
+ }(function ($) {
24
+ 'use strict';
25
+
26
+ // Helper variable to create unique names for the transport iframes:
27
+ var counter = 0;
28
+
29
+ // The iframe transport accepts four additional options:
30
+ // options.fileInput: a jQuery collection of file input fields
31
+ // options.paramName: the parameter name for the file form data,
32
+ // overrides the name property of the file input field(s),
33
+ // can be a string or an array of strings.
34
+ // options.formData: an array of objects with name and value properties,
35
+ // equivalent to the return data of .serializeArray(), e.g.:
36
+ // [{name: 'a', value: 1}, {name: 'b', value: 2}]
37
+ // options.initialIframeSrc: the URL of the initial iframe src,
38
+ // by default set to "javascript:false;"
39
+ $.ajaxTransport('iframe', function (options) {
40
+ if (options.async) {
41
+ // javascript:false as initial iframe src
42
+ // prevents warning popups on HTTPS in IE6:
43
+ /*jshint scripturl: true */
44
+ var initialIframeSrc = options.initialIframeSrc || 'javascript:false;',
45
+ /*jshint scripturl: false */
46
+ form,
47
+ iframe,
48
+ addParamChar;
49
+ return {
50
+ send: function (_, completeCallback) {
51
+ form = $('<form style="display:block;"></form>');
52
+ form.attr('accept-charset', options.formAcceptCharset);
53
+ addParamChar = /\?/.test(options.url) ? '&' : '?';
54
+ // XDomainRequest only supports GET and POST:
55
+ if (options.type === 'DELETE') {
56
+ options.url = options.url + addParamChar + '_method=DELETE';
57
+ options.type = 'POST';
58
+ } else if (options.type === 'PUT') {
59
+ options.url = options.url + addParamChar + '_method=PUT';
60
+ options.type = 'POST';
61
+ } else if (options.type === 'PATCH') {
62
+ options.url = options.url + addParamChar + '_method=PATCH';
63
+ options.type = 'POST';
64
+ }
65
+ // IE versions below IE8 cannot set the name property of
66
+ // elements that have already been added to the DOM,
67
+ // so we set the name along with the iframe HTML markup:
68
+ counter += 1;
69
+ iframe = $(
70
+ '<iframe src="' + initialIframeSrc +
71
+ '" name="iframe-transport-' + counter + '" style="width: 1000px; height: 800px;"></iframe>'
72
+ ).bind('load', function () {
73
+ var fileInputClones,
74
+ paramNames = $.isArray(options.paramName) ?
75
+ options.paramName : [options.paramName];
76
+ iframe
77
+ .unbind('load')
78
+ .bind('load', function () {
79
+ var response;
80
+ // Wrap in a try/catch block to catch exceptions thrown
81
+ // when trying to access cross-domain iframe contents:
82
+ try {
83
+ response = iframe.contents();
84
+ // Google Chrome and Firefox do not throw an
85
+ // exception when calling iframe.contents() on
86
+ // cross-domain requests, so we unify the response:
87
+ if (!response.length || !response[0].firstChild) {
88
+ throw new Error();
89
+ }
90
+ } catch (e) {
91
+ response = undefined;
92
+ }
93
+ // The complete callback returns the
94
+ // iframe content document as response object:
95
+ completeCallback(
96
+ 200,
97
+ 'success',
98
+ {'iframe': response}
99
+ );
100
+ // Fix for IE endless progress bar activity bug
101
+ // (happens on form submits to iframe targets):
102
+ $('<iframe src="' + initialIframeSrc + '"></iframe>')
103
+ .appendTo(form);
104
+ return;
105
+ window.setTimeout(function () {
106
+ // Removing the form in a setTimeout call
107
+ // allows Chrome's developer tools to display
108
+ // the response result
109
+ form.remove();
110
+ }, 0);
111
+ });
112
+ form
113
+ .prop('target', iframe.prop('name'))
114
+ .prop('action', options.url)
115
+ .prop('method', options.type);
116
+ if (options.formData) {
117
+ $.each(options.formData, function (index, field) {
118
+ $('<input type="hidden"/>')
119
+ .prop('name', field.name)
120
+ .val(field.value)
121
+ .appendTo(form);
122
+ });
123
+ }
124
+ if (options.fileInput && options.fileInput.length &&
125
+ options.type === 'POST') {
126
+ fileInputClones = options.fileInput.clone();
127
+ // Insert a clone for each file input field:
128
+ options.fileInput.after(function (index) {
129
+ return fileInputClones[index];
130
+ });
131
+ if (options.paramName) {
132
+ options.fileInput.each(function (index) {
133
+ $(this).prop(
134
+ 'name',
135
+ paramNames[index] || options.paramName
136
+ );
137
+ });
138
+ }
139
+ // Appending the file input fields to the hidden form
140
+ // removes them from their original location:
141
+ form
142
+ .append(options.fileInput)
143
+ .prop('enctype', 'multipart/form-data')
144
+ // enctype must be set as encoding for IE:
145
+ .prop('encoding', 'multipart/form-data');
146
+ // Remove the HTML5 form attribute from the input(s):
147
+ options.fileInput.removeAttr('form');
148
+ }
149
+ form.submit();
150
+ // Insert the file input fields at their original location
151
+ // by replacing the clones with the originals:
152
+ if (fileInputClones && fileInputClones.length) {
153
+ options.fileInput.each(function (index, input) {
154
+ var clone = $(fileInputClones[index]);
155
+ // Restore the original name and form properties:
156
+ $(input)
157
+ .prop('name', clone.prop('name'))
158
+ .attr('form', clone.attr('form'));
159
+ clone.replaceWith(input);
160
+ });
161
+ }
162
+ });
163
+ form.append(iframe).appendTo(document.body);
164
+ },
165
+ abort: function () {
166
+ if (iframe) {
167
+ // javascript:false as iframe src aborts the request
168
+ // and prevents warning popups on HTTPS in IE6.
169
+ // concat is used to avoid the "Script URL" JSLint error:
170
+ iframe
171
+ .unbind('load')
172
+ .prop('src', initialIframeSrc);
173
+ }
174
+ if (form) {
175
+ form.remove();
176
+ }
177
+ }
178
+ };
179
+ }
180
+ });
181
+
182
+ // The iframe transport returns the iframe content document as response.
183
+ // The following adds converters from iframe to text, json, html, xml
184
+ // and script.
185
+ // Please note that the Content-Type for JSON responses has to be text/plain
186
+ // or text/html, if the browser doesn't include application/json in the
187
+ // Accept header, else IE will show a download dialog.
188
+ // The Content-Type for XML responses on the other hand has to be always
189
+ // application/xml or text/xml, so IE properly parses the XML response.
190
+ // See also
191
+ // https://github.com/blueimp/jQuery-File-Upload/wiki/Setup#content-type-negotiation
192
+ $.ajaxSetup({
193
+ converters: {
194
+ 'iframe text': function (iframe) {
195
+ return iframe && $(iframe[0].body).text();
196
+ },
197
+ 'iframe json': function (iframe) {
198
+ return iframe && $.parseJSON($(iframe[0].body).text());
199
+ },
200
+ 'iframe html': function (iframe) {
201
+ return iframe && $(iframe[0].body).html();
202
+ },
203
+ 'iframe xml': function (iframe) {
204
+ var xmlDoc = iframe && iframe[0];
205
+ return xmlDoc && $.isXMLDoc(xmlDoc) ? xmlDoc :
206
+ $.parseXML((xmlDoc.XMLDocument && xmlDoc.XMLDocument.xml) ||
207
+ $(xmlDoc.body).html());
208
+ },
209
+ 'iframe script': function (iframe) {
210
+ return iframe && $.globalEval($(iframe[0].body).text());
211
+ }
212
+ }
213
+ });
214
+
215
+ }));
@@ -276,31 +276,58 @@ module Caboose
276
276
  # GET /admin/images/sign-s3
277
277
  def admin_sign_s3
278
278
 
279
+ name = params[:name]
280
+ mi = MediaImage.create(
281
+ :media_category_id => params[:media_category_id],
282
+ :name => params[:name]
283
+ )
284
+ key = "media-images/#{mi.id}#{File.extname(name)}".downcase
285
+
279
286
  config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
280
287
  access_key = config['access_key_id']
281
288
  secret_key = config['secret_access_key']
282
289
  bucket = config['bucket']
283
290
 
284
- policy = {
291
+ policy = {
285
292
  "expiration" => 10.seconds.from_now.utc.xmlschema,
286
293
  "conditions" => [
287
- { "bucket" => 'cabooseit' },
294
+ { "bucket" => 'cabooseit' },
295
+ ["starts-with", "$key", key],
288
296
  { "acl" => "public-read" },
289
- { "success_action_status" => "200" }
297
+ { "success_action_status" => "200" }
298
+ #{ "success_action_redirect" => "/admin/images/s3-result" }
290
299
  ]
291
300
  }
292
301
  policy = Base64.encode64(policy.to_json).gsub(/\n/,'')
293
302
  signature = Base64.encode64(OpenSSL::HMAC.digest(OpenSSL::Digest::Digest.new('sha1'), secret_key, policy)).gsub("\n","")
294
303
 
295
304
  render :json => {
296
- :policy => policy,
297
- :signature => signature,
298
- :key => 'media-images/test.jpg',
299
- :success_action_status => '200'
300
- #:success_action_redirect => document_upload_success_document_url(@document)
305
+ :media_image_id => mi.id,
306
+ :url => "https://#{bucket}.s3.amazonaws.com",
307
+ :fields => {
308
+ :key => key,
309
+ 'AWSAccessKeyId' => access_key,
310
+ :acl => 'public-read',
311
+ :success_action_status => '200',
312
+ #:success_action_redirect => '/admin/images/s3-result',
313
+ :policy => policy,
314
+ :signature => signature
315
+ }
301
316
  }
302
317
 
303
- end
318
+ end
319
+
320
+ def admin_s3_result
321
+ render :layout => 'caboose/empty'
322
+ end
323
+
324
+ # GET /admin/images/:id/process
325
+ def admin_process
326
+ return if !user_is_allowed('images', 'edit')
327
+ mi = MediaImage.find(params[:id])
328
+ mi.delay.process
329
+ render :json => true
330
+ end
304
331
 
305
332
  end
306
333
  end
@@ -1,3 +1,5 @@
1
+ require 'uri'
2
+
1
3
  class Caboose::MediaImage < ActiveRecord::Base
2
4
 
3
5
  self.table_name = "media_images"
@@ -13,4 +15,10 @@ class Caboose::MediaImage < ActiveRecord::Base
13
15
  do_not_validate_attachment_file_type :image
14
16
  attr_accessible :id, :media_category_id, :name, :description
15
17
 
18
+ def process
19
+ puts "http://#{Caboose::cdn_domain}/media-images/#{self.id}#{File.extname(self.name.downcase)}"
20
+ self.image = URI.parse("http://#{Caboose::cdn_domain}/media-images/#{self.id}#{File.extname(self.name.downcase)}")
21
+ self.save
22
+ end
23
+
16
24
  end
@@ -1,9 +1,18 @@
1
1
  <h1>Images</h1>
2
2
 
3
- <% if @domain && @media_category %>
4
- <p>
5
- <a href='/admin/images/new'>Upload Images</a> |
6
- <a href='/admin/images/new-category?parent_id=<%= @media_category.id %>'>New Category</a>
3
+ <% if @domain && @media_category %>
4
+ <form action='/admin/images/sign-s3' method='post' id='new_image_form' enctype='multipart/form-data'>
5
+ <input type='hidden' name='key' value='' />
6
+ <input type='hidden' name='AWSAccessKeyId' value='' />
7
+ <input type='hidden' name='acl' value='' />
8
+ <input type='hidden' name='success_action_status' value='' />
9
+ <!--<input type='hidden' name='success_action_redirect' value='' />-->
10
+ <input type='hidden' name='policy' value='' />
11
+ <input type='hidden' name='signature' value='' />
12
+ <input type="file" name="file" id="file" multiple='true' />
13
+ <div id='progress'><div id='bar'></div></div>
14
+ </form>
15
+ <p><a href='/admin/images/new-category?parent_id=<%= @media_category.id %>'>New Category</a></p>
7
16
  </p>
8
17
  <% if @media_category.children.count > 0 || @media_category.media_images.count > 0 %>
9
18
  <ul class='media'>
@@ -11,7 +20,7 @@
11
20
  <li class='category' id='cat<%= cat.id %>'><a href='/admin/images?media_category_id=<%= cat.id %>'><%= cat.name %></a></li>
12
21
  <% end %>
13
22
  <% @media_category.media_images.each do |mi| %>
14
- <li class='image' id='image<%= mi.id %>'><a href='/admin/images/<%= mi.id %>'><img src='<%= mi.image.url(:thumb) %>' /><span><%= img.name %></span></a></li>
23
+ <li class='image' id='image<%= mi.id %>'><a href='/admin/images/<%= mi.id %>'><img src='<%= mi.image.url(:thumb) %>' /><span><%= mi.name %></span></a></li>
15
24
  <% end %>
16
25
  </ul>
17
26
  <% else %>
@@ -22,3 +31,78 @@
22
31
  <% else %>
23
32
  <p>It doesn't look like this site is configured for the current domain. Please <a href='/admin/sites'>configure your sites</a>.</p>
24
33
  <% end %>
34
+
35
+ <% content_for :caboose_css do %>
36
+ <style type='text/css'>
37
+ ul.media li.image { list-style: none; margin: 0; padding: 0; float: left; }
38
+ ul.media li.image { list-style: none; margin: 0; padding: 0; float: left; }
39
+ ul.media li.image img {}
40
+ .progress { max-width: 600px; margin: 0.2em 0 0.2em 0; }
41
+ .progress .bar { height: 1.2em; padding: 0.2em; color: white; display: none; }
42
+ </style>
43
+ <% end %>
44
+
45
+ <% content_for :caboose_js do %>
46
+ <%= javascript_include_tag 'jquery.ui.widget' %>
47
+ <%= javascript_include_tag 'caboose/jquery.iframe-transport.js' %>
48
+ <%= javascript_include_tag 'caboose/jquery.fileupload.js' %>
49
+ <script type='text/javascript'>
50
+
51
+ var image_ids = [];
52
+ $(document).ready(function() {
53
+ $('#file').fileupload({
54
+ //forceIframeTransport: true,
55
+ autoUpload: true,
56
+ //replaceFileInput: true,
57
+ //singleFileUploads: false,
58
+ add: function(e, data) {
59
+ $.ajax({
60
+ url: '/admin/images/s3',
61
+ type: 'get',
62
+ data: {
63
+ name: data.files[0].name,
64
+ media_category_id: <%= @media_category.id %>
65
+ },
66
+ async: false,
67
+ success: function(resp) {
68
+ image_ids.push(resp.media_image_id);
69
+ var form = $('#new_image_form');
70
+ for (var i in resp.fields)
71
+ form.find("input[name=" + i + "]").val(resp.fields[i]);
72
+ form.attr('action', resp.url);
73
+ }
74
+ });
75
+ data.submit();
76
+ },
77
+ progressall: function (e, data) {
78
+ $('#bar').css('width', parseInt(data.loaded / data.total * 100, 10) + '%')
79
+ },
80
+ start: function (e) {
81
+ $('#file').hide();
82
+ $('#bar').css('background', 'green').css('display', 'block').css('width', '0%').html("&nbsp;");
83
+ },
84
+ done: function(e, data) {
85
+ console.log("Upload done.");
86
+ console.log(data);
87
+ setTimeout(function() {
88
+ $.each(image_ids, function(i, id) {
89
+ $.ajax({
90
+ url: '/admin/images/' + id + '/process',
91
+ type: 'get',
92
+ async: false,
93
+ success: function(resp) {}
94
+ });
95
+ });
96
+ window.location.reload(true);
97
+ }, 500);
98
+ },
99
+ fail: function(e, data) {
100
+ console.log("Upload failed.");
101
+ console.log(data);
102
+ $('#bar').css("background", "red").text("Failed");
103
+ }
104
+ });
105
+ });
106
+
107
+ </script>
108
+ <% end %>
@@ -1,10 +1,19 @@
1
-
1
+ <%
2
+ # https://github.com/blueimp/jQuery-File-Upload/wiki/Upload-directly-to-S3
3
+ %>
2
4
  <h1>Upload Images</h1>
3
5
 
4
- <form action='https://cabooseit.s3.amazonaws.com' method='post' id='new_image_form' enctype='multipart/form-data'>
5
- <input type="file" name="new_image" id="new_image" />
6
- <div class='#progress'><div class='#bar'></div></div>
7
- <form>
6
+ <form action='/admin/images/sign-s3' method='post' id='new_image_form' enctype='multipart/form-data'>
7
+ <input type='hidden' name='key' value='' />
8
+ <input type='hidden' name='AWSAccessKeyId' value='' />
9
+ <input type='hidden' name='acl' value='' />
10
+ <input type='hidden' name='success_action_status' value='' />
11
+ <!--<input type='hidden' name='success_action_redirect' value='' />-->
12
+ <input type='hidden' name='policy' value='' />
13
+ <input type='hidden' name='signature' value='' />
14
+ <input type="file" name="file" id="file" multiple='true' />
15
+ <div id='progress'><div id='bar'></div></div>
16
+ </form>
8
17
 
9
18
  <% content_for :caboose_css do %>
10
19
  <style type='text/css'>
@@ -14,48 +23,57 @@
14
23
  <% end %>
15
24
 
16
25
  <% content_for :caboose_js do %>
17
- <%= javascript_include_tag 'jquery.ui.all' %>
26
+ <%= javascript_include_tag 'jquery.ui.widget' %>
18
27
  <%= javascript_include_tag 'caboose/jquery.iframe-transport.js' %>
19
28
  <%= javascript_include_tag 'caboose/jquery.fileupload.js' %>
20
29
  <script type='text/javascript'>
21
30
 
22
- $(document).ready(function() {
23
- $('#new_image').fileupload({
24
- forceIframeTransport: true,
25
- autoUpload: true,
26
-
27
- //fileInput: $('#new_image'),
28
- //url: pp.url,
29
- type: 'POST',
30
- //formData: pp.fields,
31
- //paramName: 'file', // S3 does not like nested name fields i.e. name="user[avatar_url]"
32
- //dataType: 'XML', // S3 returns XML if success_action_status is set to 201
33
- replaceFileInput: false,
34
-
35
- add: function(e, data) {
31
+ $(document).ready(function() {
32
+ $('#file').fileupload({
33
+ //forceIframeTransport: true,
34
+ autoUpload: true,
35
+ //replaceFileInput: true,
36
+ //singleFileUploads: false,
37
+ add: function(e, data) {
36
38
  $.ajax({
37
- url: '/admin/images/sign-s3',
39
+ url: '/admin/images/s3',
38
40
  type: 'get',
39
41
  data: {
40
- name: document.getElementById('new_image').value,
42
+ name: data.files[0].name,
41
43
  media_category_id: <%= @media_category_id %>
42
44
  },
43
45
  async: false,
44
- success: function(resp) {
45
- pp = resp.presigned_post;
46
- var form = $('#new_image_form');
47
- for (var i in pp.fields)
48
- form.append($('<input/>').attr('type', 'hidden').attr('name', i).val(pp.fields[i]));
49
- //form.attr('action', pp.url);
46
+ success: function(resp) {
47
+ var form = $('#new_image_form');
48
+ for (var i in resp.fields)
49
+ form.find("input[name=" + i + "]").val(resp.fields[i]);
50
+ form.attr('action', resp.url);
50
51
  }
51
- });
52
- //data.submit();
52
+ });
53
+ data.submit();
53
54
  },
54
- progressall: function (e, data) { $('#bar').css('width', parseInt(data.loaded / data.total * 100, 10) + '%') },
55
- start: function (e) { $('#bar').css('background', 'green').css('display', 'block').css('width', '0%').text("Loading..."); },
56
- done: function(e, data) { $('#bar').text("Uploading done"); },
57
- fail: function(e, data) { $('#bar').css("background", "red").text("Failed"); }
58
- });
55
+ progressall: function (e, data) {
56
+ $('#bar').css('width', parseInt(data.loaded / data.total * 100, 10) + '%')
57
+ },
58
+ start: function (e) {
59
+ $('#file').hide();
60
+ $('#bar').css('background', 'green').css('display', 'block').css('width', '0%').text("Uploading...");
61
+ },
62
+ done: function(e, data) {
63
+ console.log("Upload done.");
64
+ console.log(data);
65
+ $('#bar').text("Uploading done");
66
+ setTimeout(function() {
67
+ $('#file').val('').show();
68
+ $('#bar').css('background', 'transparent').empty();
69
+ }, 2000);
70
+ },
71
+ fail: function(e, data) {
72
+ console.log("Upload failed.");
73
+ console.log(data);
74
+ $('#bar').css("background", "red").text("Failed");
75
+ }
76
+ });
59
77
  });
60
78
 
61
79
  </script>
@@ -0,0 +1,3 @@
1
+ <script>
2
+ document.body.innerText=document.body.textContent=decodeURIComponent(window.location.search.slice(1));
3
+ </script>
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE HTML>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>Empty Page</title>
6
+ </head>
7
+ <body>
8
+ <%= yield %>
9
+ </body>
10
+ </html>
data/config/routes.rb CHANGED
@@ -63,9 +63,11 @@ Caboose::Engine.routes.draw do
63
63
  delete "admin/roles/:id/permissions/:permission_id" => "roles#remove_permission"
64
64
 
65
65
  get "admin/images" => "images#admin_index"
66
- get "admin/images/sign-s3" => "images#admin_sign_s3"
66
+ get "admin/images/s3" => "images#admin_sign_s3"
67
+ get "admin/images/s3-result" => "images#admin_s3_result"
67
68
  get "admin/images/new" => "images#admin_new"
68
- get "admin/images/:id" => "images#admin_edit"
69
+ get "admin/images/:id/process" => "images#admin_process"
70
+ get "admin/images/:id" => "images#admin_edit"
69
71
  put "admin/images/:id" => "images#admin_update"
70
72
  post "admin/images/:id/image" => "images#admin_update_image"
71
73
  post "admin/images" => "images#admin_add"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.4.52'
2
+ VERSION = '0.4.53'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-cms
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.52
4
+ version: 0.4.53
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-22 00:00:00.000000000 Z
11
+ date: 2014-07-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -369,6 +369,7 @@ files:
369
369
  - app/views/caboose/extras/error404.html.erb
370
370
  - app/views/caboose/images/admin_index.html.erb
371
371
  - app/views/caboose/images/admin_new.html.erb
372
+ - app/views/caboose/images/admin_s3_result.html.erb
372
373
  - app/views/caboose/login/forgot_password_form.html.erb
373
374
  - app/views/caboose/login/index.html.erb
374
375
  - app/views/caboose/login/reset_password_form.html.erb
@@ -431,6 +432,7 @@ files:
431
432
  - app/views/layouts/caboose/_top_nav.html.erb
432
433
  - app/views/layouts/caboose/admin.html.erb
433
434
  - app/views/layouts/caboose/application.html.erb
435
+ - app/views/layouts/caboose/empty.html.erb
434
436
  - app/views/layouts/caboose/error404.html.erb
435
437
  - app/views/layouts/caboose/modal.html.erb
436
438
  - bin/caboose