From 4e302a752ff053343bd02807c2989836954f52f1 Mon Sep 17 00:00:00 2001 From: Shailesh Patil Date: Tue, 30 Jul 2013 19:47:30 +0530 Subject: [PATCH] Initial the Dropzone project --- .gitignore | 1 + .rvmrc | 1 + Gemfile | 7 +- Gemfile.lock | 28 ++ app/assets/images/spritemap.png | Bin 0 -> 16954 bytes app/assets/images/spritemap@2x.png | Bin 0 -> 41065 bytes app/assets/javascripts/application.js | 2 + app/assets/javascripts/dropzone.min.js | 26 + app/assets/javascripts/home.js.coffee | 45 ++ .../{application.css => application.css.scss} | 9 + app/assets/stylesheets/dropzone.css | 457 ++++++++++++++++++ app/assets/stylesheets/home.css.scss | 3 + app/controllers/home_controller.rb | 25 + app/helpers/home_helper.rb | 2 + app/models/asset.rb | 40 ++ app/uploaders/asset_uploader.rb | 56 +++ app/views/home/index.html.haml | 8 + app/views/home/set_primary.js.haml | 2 + config/cloudinary.yml | 19 + config/routes.rb | 6 +- public/index.html | 241 --------- spec/controllers/home_controller_spec.rb | 5 + spec/helpers/home_helper_spec.rb | 15 + spec/models/asset_spec.rb | 5 + 24 files changed, 759 insertions(+), 244 deletions(-) create mode 100644 .rvmrc create mode 100644 app/assets/images/spritemap.png create mode 100644 app/assets/images/spritemap@2x.png create mode 100644 app/assets/javascripts/dropzone.min.js create mode 100644 app/assets/javascripts/home.js.coffee rename app/assets/stylesheets/{application.css => application.css.scss} (77%) create mode 100644 app/assets/stylesheets/dropzone.css create mode 100644 app/assets/stylesheets/home.css.scss create mode 100644 app/controllers/home_controller.rb create mode 100644 app/helpers/home_helper.rb create mode 100644 app/models/asset.rb create mode 100644 app/uploaders/asset_uploader.rb create mode 100644 app/views/home/index.html.haml create mode 100644 app/views/home/set_primary.js.haml create mode 100644 config/cloudinary.yml delete mode 100644 public/index.html create mode 100644 spec/controllers/home_controller_spec.rb create mode 100644 spec/helpers/home_helper_spec.rb create mode 100644 spec/models/asset_spec.rb diff --git a/.gitignore b/.gitignore index eb3489a..90ec8a8 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ # Ignore all logfiles and tempfiles. /log/*.log /tmp +/public diff --git a/.rvmrc b/.rvmrc new file mode 100644 index 0000000..81983d7 --- /dev/null +++ b/.rvmrc @@ -0,0 +1 @@ +rvm --create use "ruby-2.0.0@dropzone" diff --git a/Gemfile b/Gemfile index 860f485..d1b2b5d 100644 --- a/Gemfile +++ b/Gemfile @@ -14,7 +14,7 @@ group :assets do gem 'coffee-rails', '~> 3.2.1' # See https://github.com/sstephenson/execjs#readme for more supported runtimes - # gem 'therubyracer', :platforms => :ruby + gem 'therubyracer', :platforms => :ruby gem 'uglifier', '>= 1.0.3' end @@ -41,4 +41,7 @@ gem "haml-rails" gem "jquery-rails" gem "bson_ext" gem "mongoid", ">= 2.0.0.beta.19" -gem "rspec-rails", ">= 2.0.1", :group => [:development, :test] \ No newline at end of file +gem "rspec-rails", ">= 2.0.1", :group => [:development, :test] +gem "cloudinary" +gem 'carrierwave-mongoid' +gem 'bootstrap-sass' diff --git a/Gemfile.lock b/Gemfile.lock index f5dd6fb..92210d2 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -29,10 +29,24 @@ GEM i18n (~> 0.6) multi_json (~> 1.0) arel (3.0.2) + aws_cf_signer (0.1.1) + bootstrap-sass (2.3.2.1) + sass (~> 3.2) bson (1.9.1) bson_ext (1.9.1) bson (~> 1.9.1) builder (3.0.4) + carrierwave (0.9.0) + activemodel (>= 3.2.0) + activesupport (>= 3.2.0) + json (>= 1.7) + carrierwave-mongoid (0.6.1) + carrierwave (>= 0.8.0, < 0.10.0) + mongoid (>= 3.0, < 5.0) + mongoid-grid_fs (~> 1.3) + cloudinary (1.0.62) + aws_cf_signer + rest-client coffee-rails (3.2.2) coffee-script (>= 2.2.0) railties (~> 3.2.0) @@ -58,6 +72,7 @@ GEM railties (>= 3.0, < 5.0) thor (>= 0.14, < 2.0) json (1.8.0) + libv8 (3.11.8.17) mail (2.4.4) i18n (>= 0.4.0) mime-types (~> 1.16) @@ -68,6 +83,9 @@ GEM moped (~> 1.4) origin (~> 1.0) tzinfo (~> 0.3.22) + mongoid-grid_fs (1.8.0) + mime-types (~> 1.19) + mongoid (~> 3.0) moped (1.5.0) multi_json (1.7.7) origin (1.1.0) @@ -97,6 +115,9 @@ GEM rake (10.1.0) rdoc (3.12.2) json (~> 1.4) + ref (1.0.5) + rest-client (1.6.7) + mime-types (>= 1.16) rspec-core (2.14.4) rspec-expectations (2.14.0) diff-lcs (>= 1.1.3, < 2.0) @@ -118,6 +139,9 @@ GEM multi_json (~> 1.0) rack (~> 1.0) tilt (~> 1.1, != 1.3.0) + therubyracer (0.11.4) + libv8 (~> 3.11.8.12) + ref thor (0.18.1) tilt (1.4.1) treetop (1.4.14) @@ -132,7 +156,10 @@ PLATFORMS ruby DEPENDENCIES + bootstrap-sass bson_ext + carrierwave-mongoid + cloudinary coffee-rails (~> 3.2.1) haml (>= 3.0.0) haml-rails @@ -141,4 +168,5 @@ DEPENDENCIES rails (= 3.2.11) rspec-rails (>= 2.0.1) sass-rails (~> 3.2.3) + therubyracer uglifier (>= 1.0.3) diff --git a/app/assets/images/spritemap.png b/app/assets/images/spritemap.png new file mode 100644 index 0000000000000000000000000000000000000000..9f21314542aa49d389c88a2d4d2e733a227279ed GIT binary patch literal 16954 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[n].apply(this,t)}return this},n.prototype.listeners=function(e){return this._callbacks=this._callbacks||{},this._callbacks[e]||[]},n.prototype.hasListeners=function(e){return!!this.listeners(e).length}}),e.register("dropzone/index.js",function(e,t,i){i.exports=t("./lib/dropzone.js")}),e.register("dropzone/lib/dropzone.js",function(e,t,i){/* +# +# More info at [www.dropzonejs.com](http://www.dropzonejs.com) +# +# Copyright (c) 2012, Matias Meno +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +# THE SOFTWARE. +# +*/ +!function(){var e,n,r,s,o,l,a={}.hasOwnProperty,p=function(e,t){function i(){this.constructor=e}for(var n in t)a.call(t,n)&&(e[n]=t[n]);return i.prototype=t.prototype,e.prototype=new i,e.__super__=t.prototype,e},u=[].slice;n="undefined"!=typeof Emitter&&null!==Emitter?Emitter:t("emitter"),o=function(){},e=function(e){function t(e,n){var r,s,o;if(this.element=e,this.version=t.version,this.defaultOptions.previewTemplate=this.defaultOptions.previewTemplate.replace(/\n*/g,""),this.clickableElements=[],this.listeners=[],this.files=[],"string"==typeof this.element&&(this.element=document.querySelector(this.element)),!this.element||null==this.element.nodeType)throw new Error("Invalid dropzone element.");if(this.element.dropzone)throw new Error("Dropzone already attached.");if(t.instances.push(this),e.dropzone=this,r=null!=(o=t.optionsForElement(this.element))?o:{},this.options=i({},this.defaultOptions,r,null!=n?n:{}),null==this.options.url&&(this.options.url=this.element.action),!this.options.url)throw new Error("No URL provided.");if(this.options.acceptedFiles&&this.options.acceptedMimeTypes)throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");return this.options.acceptedMimeTypes&&(this.options.acceptedFiles=this.options.acceptedMimeTypes,delete this.options.acceptedMimeTypes),this.options.method=this.options.method.toUpperCase(),this.options.forceFallback||!t.isBrowserSupported()?this.options.fallback.call(this):((s=this.getExistingFallback())&&s.parentNode&&s.parentNode.removeChild(s),this.previewsContainer=this.options.previewsContainer?t.getElement(this.options.previewsContainer,"previewsContainer"):this.element,this.options.clickable&&(this.clickableElements=this.options.clickable===!0?[this.element]:t.getElements(this.options.clickable,"clickable")),this.init(),void 0)}var i;return p(t,e),t.prototype.events=["drop","dragstart","dragend","dragenter","dragover","dragleave","selectedfiles","addedfile","removedfile","thumbnail","error","processing","processingmultiple","uploadprogress","totaluploadprogress","sending","sendingmultiple","success","successmultiple","canceled","canceledmultiple","complete","completemultiple","reset"],t.prototype.defaultOptions={url:null,method:"post",withCredentials:!1,parallelUploads:2,uploadMultiple:!1,maxFilesize:256,paramName:"file",createImageThumbnails:!0,maxThumbnailFilesize:10,thumbnailWidth:100,thumbnailHeight:100,params:{},clickable:!0,ignoreHiddenFiles:!0,acceptedFiles:null,acceptedMimeTypes:null,autoProcessQueue:!0,addRemoveLinks:!1,previewsContainer:null,dictDefaultMessage:"Drop files here to upload",dictFallbackMessage:"Your browser does not support drag'n'drop file uploads.",dictFallbackText:"Please use the fallback form below to upload your files like in the olden days.",dictFileTooBig:"File is too big ({{filesize}}MB). Max filesize: {{maxFilesize}}MB.",dictInvalidFileType:"You can't upload files of this type.",dictResponseError:"Server responded with {{statusCode}} code.",dictCancelUpload:"Cancel upload",dictCancelUploadConfirmation:"Are you sure you want to cancel this upload?",dictRemoveFile:"Remove file",accept:function(e,t){return t()},init:function(){return o},forceFallback:!1,fallback:function(){var e,i,n,r,s,o;for(this.element.className=""+this.element.className+" dz-browser-not-supported",o=this.element.getElementsByTagName("div"),r=0,s=o.length;s>r;r++)e=o[r],/(^| )dz-message($| )/.test(e.className)&&(i=e,e.className="dz-message");return i||(i=t.createElement('
'),this.element.appendChild(i)),n=i.getElementsByTagName("span")[0],n&&(n.textContent=this.options.dictFallbackMessage),this.element.appendChild(this.getFallbackForm())},resize:function(e){var t,i,n;return t={srcX:0,srcY:0,srcWidth:e.width,srcHeight:e.height},i=e.width/e.height,n=this.options.thumbnailWidth/this.options.thumbnailHeight,e.heightn?(t.srcHeight=e.height,t.srcWidth=t.srcHeight*n):(t.srcWidth=e.width,t.srcHeight=t.srcWidth/n),t.srcX=(e.width-t.srcWidth)/2,t.srcY=(e.height-t.srcHeight)/2,t},drop:function(){return this.element.classList.remove("dz-drag-hover")},dragstart:o,dragend:function(){return this.element.classList.remove("dz-drag-hover")},dragenter:function(){return this.element.classList.add("dz-drag-hover")},dragover:function(){return this.element.classList.add("dz-drag-hover")},dragleave:function(){return this.element.classList.remove("dz-drag-hover")},selectedfiles:function(){return this.element===this.previewsContainer?this.element.classList.add("dz-started"):void 0},reset:function(){return this.element.classList.remove("dz-started")},addedfile:function(e){var i=this;return e.previewElement=t.createElement(this.options.previewTemplate),e.previewTemplate=e.previewElement,this.previewsContainer.appendChild(e.previewElement),e.previewElement.querySelector("[data-dz-name]").textContent=e.name,e.previewElement.querySelector("[data-dz-size]").innerHTML=this.filesize(e.size),e.remote_url&&(e.previewElement.querySelector("[data-dz-thumbnail]").src=e.remote_url,e.previewElement.classList.remove("dz-file-preview"),e.previewElement.classList.add("dz-image-preview"),e.previewElement.classList.add("dz-success")),this.options.addRemoveLinks?(e._removeLink=t.createElement(''+this.options.dictRemoveFile+""),e._removeLink.addEventListener("click",function(n){return n.preventDefault(),n.stopPropagation(),e.status!==t.UPLOADING?i.removeFile(e):window.confirm(i.options.dictCancelUploadConfirmation)?i.removeFile(e):void 0}),e.previewElement.appendChild(e._removeLink)):void 0},removedfile:function(e){var t;return null!=(t=e.previewElement)?t.parentNode.removeChild(e.previewElement):void 0},thumbnail:function(e,t){var i;return e.previewElement.classList.remove("dz-file-preview"),e.previewElement.classList.add("dz-image-preview"),i=e.previewElement.querySelector("[data-dz-thumbnail]"),i.alt=e.name,i.src=t},error:function(e,t){return e.previewElement.classList.add("dz-error"),e.previewElement.querySelector("[data-dz-errormessage]").textContent=t},processing:function(e){return e.previewElement.classList.add("dz-processing"),e._removeLink?e._removeLink.textContent=this.options.dictCancelUpload:void 0},processingmultiple:o,uploadprogress:function(e,t){return e.previewElement.querySelector("[data-dz-uploadprogress]").style.width=""+t+"%"},totaluploadprogress:o,sending:o,sendingmultiple:o,success:function(e){return e.previewElement.classList.add("dz-success")},successmultiple:o,canceled:function(e){return this.emit("error",e,"Upload canceled.")},canceledmultiple:o,complete:function(e){return e._removeLink?e._removeLink.textContent=this.options.dictRemoveFile:void 0},completemultiple:o,previewTemplate:'
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
'},i=function(){var e,t,i,n,r,s,o;for(n=arguments[0],i=2<=arguments.length?u.call(arguments,1):[],s=0,o=i.length;o>s;s++){t=i[s];for(e in t)r=t[e],n[e]=r}return n},t.prototype.getAcceptedFiles=function(){var e,t,i,n,r;for(n=this.files,r=[],t=0,i=n.length;i>t;t++)e=n[t],e.accepted&&r.push(e);return r},t.prototype.getRejectedFiles=function(){var e,t,i,n,r;for(n=this.files,r=[],t=0,i=n.length;i>t;t++)e=n[t],e.accepted||r.push(e);return r},t.prototype.getQueuedFiles=function(){var e,i,n,r,s;for(r=this.files,s=[],i=0,n=r.length;n>i;i++)e=r[i],e.status===t.QUEUED&&s.push(e);return s},t.prototype.getUploadingFiles=function(){var e,i,n,r,s;for(r=this.files,s=[],i=0,n=r.length;n>i;i++)e=r[i],e.status===t.UPLOADING&&s.push(e);return s},t.prototype.init=function(){var e,i,n,r,s,o,l,a=this;for("form"===this.element.tagName&&this.element.setAttribute("enctype","multipart/form-data"),this.element.classList.contains("dropzone")&&!this.element.querySelector(".dz-message")&&this.element.appendChild(t.createElement('
'+this.options.dictDefaultMessage+"
")),this.clickableElements.length&&(n=function(){return a.hiddenFileInput&&document.body.removeChild(a.hiddenFileInput),a.hiddenFileInput=document.createElement("input"),a.hiddenFileInput.setAttribute("type","file"),a.options.uploadMultiple&&a.hiddenFileInput.setAttribute("multiple","multiple"),null!=a.options.acceptedFiles&&a.hiddenFileInput.setAttribute("accept",a.options.acceptedFiles),a.hiddenFileInput.style.visibility="hidden",a.hiddenFileInput.style.position="absolute",a.hiddenFileInput.style.top="0",a.hiddenFileInput.style.left="0",a.hiddenFileInput.style.height="0",a.hiddenFileInput.style.width="0",document.body.appendChild(a.hiddenFileInput),a.hiddenFileInput.addEventListener("change",function(){var e;return e=a.hiddenFileInput.files,e.length&&(a.emit("selectedfiles",e),a.handleFiles(e)),n()})},n()),this.URL=null!=(o=window.URL)?o:window.webkitURL,l=this.events,r=0,s=l.length;s>r;r++)e=l[r],this.on(e,this.options[e]);return this.on("uploadprogress",function(){return a.updateTotalUploadProgress()}),this.on("removedfile",function(){return a.updateTotalUploadProgress()}),this.on("canceled",function(e){return a.emit("complete",e)}),i=function(e){return e.stopPropagation(),e.preventDefault?e.preventDefault():e.returnValue=!1},this.listeners=[{element:this.element,events:{dragstart:function(e){return a.emit("dragstart",e)},dragenter:function(e){return i(e),a.emit("dragenter",e)},dragover:function(e){return i(e),a.emit("dragover",e)},dragleave:function(e){return a.emit("dragleave",e)},drop:function(e){return i(e),a.drop(e),a.emit("drop",e)},dragend:function(e){return a.emit("dragend",e)}}}],this.clickableElements.forEach(function(e){return a.listeners.push({element:e,events:{click:function(i){return e!==a.element||i.target===a.element||t.elementInside(i.target,a.element.querySelector(".dz-message"))?a.hiddenFileInput.click():void 0}}})}),this.enable(),this.options.init.call(this)},t.prototype.destroy=function(){var e;return this.disable(),this.removeAllFiles(!0),(null!=(e=this.hiddenFileInput)?e.parentNode:void 0)&&(this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput),this.hiddenFileInput=null),delete this.element.dropzone},t.prototype.updateTotalUploadProgress=function(){var e,t,i,n,r,s,o,l;if(n=0,i=0,e=this.getAcceptedFiles(),e.length){for(l=this.getAcceptedFiles(),s=0,o=l.length;o>s;s++)t=l[s],n+=t.upload.bytesSent,i+=t.upload.total;r=100*n/i}else r=100;return this.emit("totaluploadprogress",r,i,n)},t.prototype.getFallbackForm=function(){var e,i,n,r;return(e=this.getExistingFallback())?e:(n='
',this.options.dictFallbackText&&(n+="

"+this.options.dictFallbackText+"

"),n+='
',i=t.createElement(n),"FORM"!==this.element.tagName?(r=t.createElement('
'),r.appendChild(i)):(this.element.setAttribute("enctype","multipart/form-data"),this.element.setAttribute("method",this.options.method)),null!=r?r:i)},t.prototype.getExistingFallback=function(){var e,t,i,n,r,s;for(t=function(e){var t,i,n;for(i=0,n=e.length;n>i;i++)if(t=e[i],/(^| )fallback($| )/.test(t.className))return t},s=["div","form"],n=0,r=s.length;r>n;n++)if(i=s[n],e=t(this.element.getElementsByTagName(i)))return e},t.prototype.setupEventListeners=function(){var e,t,i,n,r,s,o;for(s=this.listeners,o=[],n=0,r=s.length;r>n;n++)e=s[n],o.push(function(){var n,r;n=e.events,r=[];for(t in n)i=n[t],r.push(e.element.addEventListener(t,i,!1));return r}());return o},t.prototype.removeEventListeners=function(){var e,t,i,n,r,s,o;for(s=this.listeners,o=[],n=0,r=s.length;r>n;n++)e=s[n],o.push(function(){var n,r;n=e.events,r=[];for(t in n)i=n[t],r.push(e.element.removeEventListener(t,i,!1));return r}());return o},t.prototype.disable=function(){var e,t,i,n,r;for(this.clickableElements.forEach(function(e){return e.classList.remove("dz-clickable")}),this.removeEventListeners(),n=this.files,r=[],t=0,i=n.length;i>t;t++)e=n[t],r.push(this.cancelUpload(e));return r},t.prototype.enable=function(){return this.clickableElements.forEach(function(e){return e.classList.add("dz-clickable")}),this.setupEventListeners()},t.prototype.filesize=function(e){var t;return e>=1e11?(e/=1e11,t="TB"):e>=1e8?(e/=1e8,t="GB"):e>=1e5?(e/=1e5,t="MB"):e>=100?(e/=100,t="KB"):(e=10*e,t="b"),""+Math.round(e)/10+" "+t},t.prototype.drop=function(e){var t,i;e.dataTransfer&&(t=e.dataTransfer.files,this.emit("selectedfiles",t),t.length&&(i=e.dataTransfer.items,i&&i.length&&(null!=i[0].webkitGetAsEntry||null!=i[0].getAsEntry)?this.handleItems(i):this.handleFiles(t)))},t.prototype.handleFiles=function(e){var t,i,n,r;for(r=[],i=0,n=e.length;n>i;i++)t=e[i],r.push(this.addFile(t));return r},t.prototype.handleItems=function(e){var t,i,n,r;for(n=0,r=e.length;r>n;n++)i=e[n],null!=i.webkitGetAsEntry?(t=i.webkitGetAsEntry(),t.isFile?this.addFile(i.getAsFile()):t.isDirectory&&this.addDirectory(t,t.name)):this.addFile(i.getAsFile())},t.prototype.accept=function(e,i){return e.size>1024*1024*this.options.maxFilesize?i(this.options.dictFileTooBig.replace("{{filesize}}",Math.round(e.size/1024/10.24)/100).replace("{{maxFilesize}}",this.options.maxFilesize)):t.isValidFile(e,this.options.acceptedFiles)?this.options.accept.call(this,e,i):i(this.options.dictInvalidFileType)},t.prototype.addExistingFile=function(e){e.upload={progress:0,total:e.size,bytesSent:0},this.files.push(e),e.status=t.ADDED,this.emit("addedfile",e),e.previewElement.id=e._id},t.prototype.addFile=function(e){var i=this;return e.upload={progress:0,total:e.size,bytesSent:0},this.files.push(e),e.status=t.ADDED,this.emit("addedfile",e),this.options.createImageThumbnails&&e.type.match(/image.*/)&&e.size<=1024*1024*this.options.maxThumbnailFilesize&&this.createThumbnail(e),this.accept(e,function(t){return t?(e.accepted=!1,i._errorProcessing([e],t)):(e.accepted=!0,i.enqueueFile(e))})},t.prototype.enqueueFiles=function(e){var t,i,n;for(i=0,n=e.length;n>i;i++)t=e[i],this.enqueueFile(t);return null},t.prototype.enqueueFile=function(e){var i=this;if(e.status!==t.ADDED)throw new Error("This file can't be queued because it has already been processed or was rejected.");return e.status=t.QUEUED,this.options.autoProcessQueue?setTimeout(function(){return i.processQueue()},1):void 0},t.prototype.addDirectory=function(e,t){var i,n,r=this;return i=e.createReader(),n=function(i){var n,s;for(n=0,s=i.length;s>n;n++)e=i[n],e.isFile?e.file(function(e){return r.options.ignoreHiddenFiles&&"."===e.name.substring(0,1)?void 0:(e.fullPath=""+t+"/"+e.name,r.addFile(e))}):e.isDirectory&&r.addDirectory(e,""+t+"/"+e.name)},i.readEntries(n,function(e){return"undefined"!=typeof console&&null!==console?"function"==typeof console.log?console.log(e):void 0:void 0})},t.prototype.removeFile=function(e){return e.status===t.UPLOADING&&this.cancelUpload(e),this.files=l(this.files,e),this.emit("removedfile",e),0===this.files.length?this.emit("reset"):void 0},t.prototype.removeAllFiles=function(e){var i,n,r,s;for(null==e&&(e=!1),s=this.files.slice(),n=0,r=s.length;r>n;n++)i=s[n],(i.status!==t.UPLOADING||e)&&this.removeFile(i);return null},t.prototype.createThumbnail=function(e){var t,i=this;return t=new FileReader,t.onload=function(){var n;return n=new Image,n.onload=function(){var t,r,s,o,l,a,p,u;return e.width=n.width,e.height=n.height,s=i.options.resize.call(i,e),null==s.trgWidth&&(s.trgWidth=i.options.thumbnailWidth),null==s.trgHeight&&(s.trgHeight=i.options.thumbnailHeight),t=document.createElement("canvas"),r=t.getContext("2d"),t.width=s.trgWidth,t.height=s.trgHeight,r.drawImage(n,null!=(l=s.srcX)?l:0,null!=(a=s.srcY)?a:0,s.srcWidth,s.srcHeight,null!=(p=s.trgX)?p:0,null!=(u=s.trgY)?u:0,s.trgWidth,s.trgHeight),o=t.toDataURL("image/png"),i.emit("thumbnail",e,o)},n.src=t.result},t.readAsDataURL(e)},t.prototype.processQueue=function(){var e,t,i,n;if(t=this.options.parallelUploads,i=this.getUploadingFiles().length,e=i,n=this.getQueuedFiles(),n.length>0){if(this.options.uploadMultiple)return this.processFiles(n.slice(0,t));for(;t>e;){if(!n.length)return;this.processFile(n.shift()),e++}}},t.prototype.processFile=function(e){return this.processFiles([e])},t.prototype.processFiles=function(e){var i,n,r;for(n=0,r=e.length;r>n;n++)i=e[n],i.processing=!0,i.status=t.UPLOADING,this.emit("processing",i);return this.options.uploadMultiple&&this.emit("processingmultiple",e),this.uploadFiles(e)},t.prototype._getFilesWithXhr=function(e){var t,i;return i=function(){var i,n,r,s;for(r=this.files,s=[],i=0,n=r.length;n>i;i++)t=r[i],t.xhr===e&&s.push(t);return s}.call(this)},t.prototype.cancelUpload=function(e){var i,n,r,s,o,l,a;if(e.status===t.UPLOADING){for(n=this._getFilesWithXhr(e.xhr),r=0,o=n.length;o>r;r++)i=n[r],i.status=t.CANCELED;for(e.xhr.abort(),s=0,l=n.length;l>s;s++)i=n[s],this.emit("canceled",i);this.options.uploadMultiple&&this.emit("canceledmultiple",n)}else((a=e.status)===t.ADDED||a===t.QUEUED)&&(e.status=t.CANCELED,this.emit("canceled",e),this.options.uploadMultiple&&this.emit("canceledmultiple",[e]));return this.options.autoProcessQueue?this.processQueue():void 0},t.prototype.uploadFile=function(e){return this.uploadFiles([e])},t.prototype.uploadFiles=function(e){var n,r,s,o,l,a,p,u,d,c,h,m,f,v,g,y,E,b,w,F,z,L,k,C,D,A,x,T=this;for(g=new XMLHttpRequest,y=0,F=e.length;F>y;y++)n=e[y],n.xhr=g;g.open(this.options.method,this.options.url,!0),g.withCredentials=!!this.options.withCredentials,m=null,s=function(){var t,i,r;for(r=[],t=0,i=e.length;i>t;t++)n=e[t],r.push(T._errorProcessing(e,m||T.options.dictResponseError.replace("{{statusCode}}",g.status),g));return r},f=function(t){var i,r,s,o,l,a,p,u,d;if(null!=t)for(r=100*t.loaded/t.total,s=0,a=e.length;a>s;s++)n=e[s],n.upload={progress:r,total:t.total,bytesSent:t.loaded};else{for(i=!0,r=100,o=0,p=e.length;p>o;o++)n=e[o],(100!==n.upload.progress||n.upload.bytesSent!==n.upload.total)&&(i=!1),n.upload.progress=r,n.upload.bytesSent=n.upload.total;if(i)return}for(d=[],l=0,u=e.length;u>l;l++)n=e[l],d.push(T.emit("uploadprogress",n,r,n.upload.bytesSent));return d},g.onload=function(i){var n;if(e[0].status!==t.CANCELED&&4===g.readyState){if(m=g.responseText,g.getResponseHeader("content-type")&&~g.getResponseHeader("content-type").indexOf("application/json"))try{m=JSON.parse(m)}catch(r){i=r,m="Invalid JSON response from server."}return f(),200<=(n=g.status)&&300>n?T._finished(e,m,i):s()}},g.onerror=function(){return e[0].status!==t.CANCELED?s():void 0},h=null!=(C=g.upload)?C:g,h.onprogress=f,l={Accept:"application/json","Cache-Control":"no-cache","X-Requested-With":"XMLHttpRequest"},this.options.headers&&i(l,this.options.headers);for(o in l)c=l[o],g.setRequestHeader(o,c);if(r=new FormData,this.options.params){D=this.options.params;for(d in D)v=D[d],r.append(d,v)}for(E=0,z=e.length;z>E;E++)n=e[E],this.emit("sending",n,g,r);if(this.options.uploadMultiple&&this.emit("sendingmultiple",e,g,r),"FORM"===this.element.tagName)for(A=this.element.querySelectorAll("input, textarea, select, button"),b=0,L=A.length;L>b;b++)a=A[b],p=a.getAttribute("name"),u=a.getAttribute("type"),(!u||"checkbox"!==(x=u.toLowerCase())&&"radio"!==x||a.checked)&&r.append(p,a.value);for(w=0,k=e.length;k>w;w++)n=e[w],r.append(""+this.options.paramName+(this.options.uploadMultiple?"[]":""),n,n.name);return g.send(r)},t.prototype._finished=function(e,i,n){var r,s,o;for(s=0,o=e.length;o>s;s++)r=e[s],r.status=t.SUCCESS,this.emit("success",r,i,n),this.emit("complete",r);return this.options.uploadMultiple&&(this.emit("successmultiple",e,i,n),this.emit("completemultiple",e)),this.options.autoProcessQueue?this.processQueue():void 0},t.prototype._errorProcessing=function(e,i,n){var r,s,o;for(s=0,o=e.length;o>s;s++)r=e[s],r.status=t.ERROR,this.emit("error",r,i,n),this.emit("complete",r);return this.options.uploadMultiple&&(this.emit("errormultiple",e,i,n),this.emit("completemultiple",e)),this.options.autoProcessQueue?this.processQueue():void 0},t}(n),e.version="3.6.1",e.options={},e.optionsForElement=function(t){return t.id?e.options[r(t.id)]:void 0},e.instances=[],e.forElement=function(e){if("string"==typeof e&&(e=document.querySelector(e)),null==(null!=e?e.dropzone:void 0))throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");return e.dropzone},e.autoDiscover=!0,e.discover=function(){var t,i,n,r,s,o;if(e.autoDiscover){for(document.querySelectorAll?n=document.querySelectorAll(".dropzone"):(n=[],t=function(e){var t,i,r,s;for(s=[],i=0,r=e.length;r>i;i++)t=e[i],/(^| )dropzone($| )/.test(t.className)?s.push(n.push(t)):s.push(void 0);return s},t(document.getElementsByTagName("div")),t(document.getElementsByTagName("form"))),o=[],r=0,s=n.length;s>r;r++)i=n[r],e.optionsForElement(i)!==!1?o.push(new e(i)):o.push(void 0);return o}},e.blacklistedBrowsers=[/opera.*Macintosh.*version\/12/i],e.isBrowserSupported=function(){var t,i,n,r,s;if(t=!0,window.File&&window.FileReader&&window.FileList&&window.Blob&&window.FormData&&document.querySelector)if("classList"in document.createElement("a"))for(s=e.blacklistedBrowsers,n=0,r=s.length;r>n;n++)i=s[n],i.test(navigator.userAgent)&&(t=!1);else t=!1;else t=!1;return t},l=function(e,t){var i,n,r,s;for(s=[],n=0,r=e.length;r>n;n++)i=e[n],i!==t&&s.push(i);return s},r=function(e){return e.replace(/[\-_](\w)/g,function(e){return e[1].toUpperCase()})},e.createElement=function(e){var t;return t=document.createElement("div"),t.innerHTML=e,t.childNodes[0]},e.elementInside=function(e,t){if(e===t)return!0;for(;e=e.parentNode;)if(e===t)return!0;return!1},e.getElement=function(e,t){var i;if("string"==typeof e?i=document.querySelector(e):null!=e.nodeType&&(i=e),null==i)throw new Error("Invalid `"+t+"` option provided. Please provide a CSS selector or a plain HTML element.");return i},e.getElements=function(e,t){var i,n,r,s,o,l,a,p;if(e instanceof Array){r=[];try{for(s=0,l=e.length;l>s;s++)n=e[s],r.push(this.getElement(n,t))}catch(u){i=u,r=null}}else if("string"==typeof e)for(r=[],p=document.querySelectorAll(e),o=0,a=p.length;a>o;o++)n=p[o],r.push(n);else null!=e.nodeType&&(r=[e]);if(null==r||!r.length)throw new Error("Invalid `"+t+"` option provided. Please provide a CSS selector, a plain HTML element or a list of those.");return r},e.isValidFile=function(e,t){var i,n,r,s,o;if(!t)return!0;for(t=t.split(","),n=e.type,i=n.replace(/\/.*$/,""),s=0,o=t.length;o>s;s++)if(r=t[s],r=r.trim(),"."===r.charAt(0)){if(-1!==e.name.indexOf(r,e.name.length-r.length))return!0}else if(/\/\*$/.test(r)){if(i===r.replace(/\/.*$/,""))return!0}else if(n===r)return!0;return!1},"undefined"!=typeof jQuery&&null!==jQuery&&(jQuery.fn.dropzone=function(t){return this.each(function(){return new e(this,t)})}),"undefined"!=typeof i&&null!==i?i.exports=e:window.Dropzone=e,e.ADDED="added",e.QUEUED="queued",e.ACCEPTED=e.QUEUED,e.UPLOADING="uploading",e.PROCESSING=e.UPLOADING,e.CANCELED="canceled",e.ERROR="error",e.SUCCESS="success",s=function(e,t){var i,n,r,s,o,l,a,p,u;if(r=!1,u=!0,n=e.document,p=n.documentElement,i=n.addEventListener?"addEventListener":"attachEvent",a=n.addEventListener?"removeEventListener":"detachEvent",l=n.addEventListener?"":"on",s=function(i){return"readystatechange"!==i.type||"complete"===n.readyState?(("load"===i.type?e:n)[a](l+i.type,s,!1),!r&&(r=!0)?t.call(e,i.type||i):void 0):void 0},o=function(){var e;try{p.doScroll("left")}catch(t){return e=t,setTimeout(o,50),void 0}return s("poll")},"complete"!==n.readyState){if(n.createEventObject&&p.doScroll){try{u=!e.frameElement}catch(d){}u&&o()}return n[i](l+"DOMContentLoaded",s,!1),n[i](l+"readystatechange",s,!1),e[i](l+"load",s,!1)}},s(window,e.discover)}.call(this)}),e.alias("component-emitter/index.js","dropzone/deps/emitter/index.js"),e.alias("component-emitter/index.js","emitter/index.js"),"object"==typeof exports?module.exports=e("dropzone"):"function"==typeof define&&define.amd?define(function(){return e("dropzone")}):this.Dropzone=e("dropzone")}(); \ No newline at end of file diff --git a/app/assets/javascripts/home.js.coffee b/app/assets/javascripts/home.js.coffee new file mode 100644 index 0000000..64c5fbe --- /dev/null +++ b/app/assets/javascripts/home.js.coffee @@ -0,0 +1,45 @@ +# Place all the behaviors and hooks related to the matching controller here. +# All this logic will automatically be available in application.js. +# You can use CoffeeScript in this file: http://jashkenas.github.com/coffee-script/ + +$(document).ready -> + + org_success = Dropzone.prototype.defaultOptions.success + org_removed = Dropzone.prototype.defaultOptions.removedfile + + Dropzone.options.assetsDropzone = { + addRemoveLinks: true, + paramName: 'image', + previewTemplate: '
Set Primary
', + removedfile: (file) -> + $.ajax({ + url: "/#{file._id}/remove_image", + method: 'post' + }) + org_removed(file) + , + success: (file, data) -> + index = $('#assets-dropzone').get(0).dropzone.files.indexOf(file) + $('#assets-dropzone').get(0).dropzone.files[index]["_id"] = data["asset_id"] + $('#assets-dropzone').get(0).dropzone.files[index].previewElement.id = data["asset_id"] + org_success(file) + } + Dropzone.autoDiscover = false + + $('#assets-dropzone').on 'click', '.dz-set-primary', -> + $.ajax({ + url: "/#{$(this).parent().attr('id')}/set_primary", + method: 'post' + }) + + if images? + $('#assets-dropzone').dropzone() + + $.each images, (i, image) -> + $('#assets-dropzone').get(0).dropzone.addExistingFile(image) + + primary_asset = images.filter((x) -> + x if x.is_primary is true + )[0] + + $('#'+primary_asset._id).addClass('dz-primary') if primary_asset? diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css.scss similarity index 77% rename from app/assets/stylesheets/application.css rename to app/assets/stylesheets/application.css.scss index 3192ec8..74c0488 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css.scss @@ -11,3 +11,12 @@ *= require_self *= require_tree . */ + +@import "bootstrap"; + +#assets-dropzone { + border-radius: 3px 3px 3px 3px; + box-shadow: 0 0 50px rgba(0, 0, 0, 0.13); + margin: 30px 0; + padding: 4px; +} diff --git a/app/assets/stylesheets/dropzone.css b/app/assets/stylesheets/dropzone.css new file mode 100644 index 0000000..4db9e11 --- /dev/null +++ b/app/assets/stylesheets/dropzone.css @@ -0,0 +1,457 @@ +/* The MIT License */ +.dropzone, +.dropzone *, +.dropzone-previews, +.dropzone-previews * { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.dropzone { + position: relative; + border: 1px solid rgba(0,0,0,0.08); + background: rgba(0,0,0,0.02); + padding: 1em; +} +.dropzone.dz-clickable { + cursor: pointer; +} +.dropzone.dz-clickable .dz-message, +.dropzone.dz-clickable .dz-message span { + cursor: pointer; +} +.dropzone.dz-clickable * { + cursor: default; +} +.dropzone .dz-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone.dz-drag-hover { + border-color: rgba(0,0,0,0.15); + background: rgba(0,0,0,0.04); +} +.dropzone.dz-started .dz-message { + display: none; +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + background: rgba(255,255,255,0.8); + position: relative; + display: inline-block; + margin: 17px; + vertical-align: top; + border: 1px solid #acacac; + padding: 6px 6px 6px 6px; +} +.dropzone .dz-preview.dz-file-preview [data-dz-thumbnail], +.dropzone-previews .dz-preview.dz-file-preview [data-dz-thumbnail] { + display: none; +} +.dropzone .dz-preview .dz-details, +.dropzone-previews .dz-preview .dz-details { + width: 100px; + height: 100px; + position: relative; + background: #ebebeb; + padding: 5px; + margin-bottom: 22px; +} +.dropzone .dz-preview .dz-details .dz-filename, +.dropzone-previews .dz-preview .dz-details .dz-filename { + overflow: hidden; + height: 100%; +} +.dropzone .dz-preview .dz-details img, +.dropzone-previews .dz-preview .dz-details img { + position: absolute; + top: 0; + left: 0; + width: 100px; + height: 100px; +} +.dropzone .dz-preview .dz-details .dz-size, +.dropzone-previews .dz-preview .dz-details .dz-size { + position: absolute; + bottom: -28px; + left: 3px; + height: 28px; + line-height: 28px; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + display: block; +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + display: block; +} +.dropzone .dz-preview:hover .dz-details img, +.dropzone-previews .dz-preview:hover .dz-details img { + display: none; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark, +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + display: none; + position: absolute; + width: 40px; + height: 40px; + font-size: 30px; + text-align: center; + right: -10px; + top: -10px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + color: #8cc657; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + color: #ee162d; +} +.dropzone .dz-preview .dz-progress, +.dropzone-previews .dz-preview .dz-progress { + position: absolute; + top: 100px; + left: 6px; + right: 6px; + height: 6px; + background: #d7d7d7; + display: none; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 0%; + background-color: #8cc657; +} +.dropzone .dz-preview.dz-processing .dz-progress, +.dropzone-previews .dz-preview.dz-processing .dz-progress { + display: block; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: none; + position: absolute; + top: -5px; + left: -20px; + background: rgba(245,245,245,0.8); + padding: 8px 10px; + color: #800; + min-width: 140px; + max-width: 500px; + z-index: 500; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + display: block; +} +.dropzone { + border: 1px solid rgba(0,0,0,0.03); + min-height: 360px; + -webkit-border-radius: 3px; + border-radius: 3px; + background: rgba(0,0,0,0.03); + padding: 23px; +} +.dropzone .dz-default.dz-message { + opacity: 1; + -ms-filter: none; + filter: none; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; + background-image: url("/assets/spritemap.png"); + background-repeat: no-repeat; + background-position: 0 0; + position: absolute; + width: 428px; + height: 123px; + margin-left: -214px; + margin-top: -61.5px; + top: 50%; + left: 50%; +} +@media all and (-webkit-min-device-pixel-ratio: 1.5) { + .dropzone .dz-default.dz-message { + background-image: url("/assets/spritemap@2x.png"); + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-default.dz-message span { + display: none; +} +.dropzone.dz-square .dz-default.dz-message { + background-position: 0 -123px; + width: 268px; + margin-left: -134px; + height: 174px; + margin-top: -87px; +} +.dropzone.dz-drag-hover .dz-message { + opacity: 0.15; + filter: alpha(opacity=15); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=15)"; +} +.dropzone.dz-started .dz-message { + display: block; + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; +} +.dropzone .dz-preview, +.dropzone-previews .dz-preview { + -webkit-box-shadow: 1px 1px 4px rgba(0,0,0,0.16); + box-shadow: 1px 1px 4px rgba(0,0,0,0.16); + font-size: 14px; +} +.dropzone .dz-preview.dz-image-preview:hover .dz-details img, +.dropzone-previews .dz-preview.dz-image-preview:hover .dz-details img { + display: block; + opacity: 0.1; + filter: alpha(opacity=10); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=10)"; +} +.dropzone .dz-preview.dz-success .dz-success-mark, +.dropzone-previews .dz-preview.dz-success .dz-success-mark { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone .dz-preview.dz-error .dz-error-mark, +.dropzone-previews .dz-preview.dz-error .dz-error-mark { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone .dz-preview.dz-error .dz-progress .dz-upload, +.dropzone-previews .dz-preview.dz-error .dz-progress .dz-upload { + background: #ee1e2d; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark, +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + display: block; + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; + background-image: url("/assets/spritemap.png"); + background-repeat: no-repeat; +} +@media all and (-webkit-min-device-pixel-ratio: 1.5) { + .dropzone .dz-preview .dz-error-mark, + .dropzone-previews .dz-preview .dz-error-mark, + .dropzone .dz-preview .dz-success-mark, + .dropzone-previews .dz-preview .dz-success-mark { + background-image: url("/assets/spritemap@2x.png"); + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-preview .dz-error-mark span, +.dropzone-previews .dz-preview .dz-error-mark span, +.dropzone .dz-preview .dz-success-mark span, +.dropzone-previews .dz-preview .dz-success-mark span { + display: none; +} +.dropzone .dz-preview .dz-error-mark, +.dropzone-previews .dz-preview .dz-error-mark { + background-position: -268px -123px; +} +.dropzone .dz-preview .dz-success-mark, +.dropzone-previews .dz-preview .dz-success-mark { + background-position: -268px -163px; +} +.dropzone .dz-preview .dz-progress .dz-upload, +.dropzone-previews .dz-preview .dz-progress .dz-upload { + -webkit-animation: loading 0.4s linear infinite; + -moz-animation: loading 0.4s linear infinite; + -o-animation: loading 0.4s linear infinite; + -ms-animation: loading 0.4s linear infinite; + animation: loading 0.4s linear infinite; + -webkit-transition: width 0.3s ease-in-out; + -moz-transition: width 0.3s ease-in-out; + -o-transition: width 0.3s ease-in-out; + -ms-transition: width 0.3s ease-in-out; + transition: width 0.3s ease-in-out; + -webkit-border-radius: 2px; + border-radius: 2px; + position: absolute; + top: 0; + left: 0; + width: 0%; + height: 100%; + background-image: url("/assets/spritemap.png"); + background-repeat: repeat-x; + background-position: 0px -400px; +} +@media all and (-webkit-min-device-pixel-ratio: 1.5) { + .dropzone .dz-preview .dz-progress .dz-upload, + .dropzone-previews .dz-preview .dz-progress .dz-upload { + background-image: url("/assets/spritemap@2x.png"); + -webkit-background-size: 428px 406px; + -moz-background-size: 428px 406px; + background-size: 428px 406px; + } +} +.dropzone .dz-preview.dz-success .dz-progress, +.dropzone-previews .dz-preview.dz-success .dz-progress { + display: block; + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + -webkit-transition: opacity 0.4s ease-in-out; + -moz-transition: opacity 0.4s ease-in-out; + -o-transition: opacity 0.4s ease-in-out; + -ms-transition: opacity 0.4s ease-in-out; + transition: opacity 0.4s ease-in-out; +} +.dropzone .dz-preview .dz-error-message, +.dropzone-previews .dz-preview .dz-error-message { + display: block; + opacity: 0; + filter: alpha(opacity=0); + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + -o-transition: opacity 0.3s ease-in-out; + -ms-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} +.dropzone .dz-preview:hover.dz-error .dz-error-message, +.dropzone-previews .dz-preview:hover.dz-error .dz-error-message { + opacity: 1; + -ms-filter: none; + filter: none; +} +.dropzone a.dz-remove, +.dropzone-previews a.dz-remove { + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fafafa), color-stop(1, #eee)); + background-image: -webkit-linear-gradient(top, #fafafa 0%, #eee 100%); + background-image: -moz-linear-gradient(top, #fafafa 0%, #eee 100%); + background-image: -o-linear-gradient(top, #fafafa 0%, #eee 100%); + background-image: -ms-linear-gradient(top, #fafafa 0%, #eee 100%); + background-image: linear-gradient(top, #fafafa 0%, #eee 100%); + -webkit-border-radius: 2px; + border-radius: 2px; + border: 1px solid #eee; + text-decoration: none; + display: block; + padding: 4px 5px; + text-align: center; + color: #aaa; + margin-top: 26px; +} +.dropzone a.dz-remove:hover, +.dropzone-previews a.dz-remove:hover { + color: #666; +} +@-moz-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-webkit-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-o-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@-ms-keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} +@keyframes loading { + 0% { + background-position: 0 -400px; + } + + 100% { + background-position: -7px -400px; + } +} + +.dropzone .dz-preview, .dropzone-previews .dz-preview { + z-index: 1; +} + +.dz-primary .dz-primary-mark { + display: block; +} + +.dz-primary .dz-primary-mark:after { + background-color: #F41D3D; + border: 1px solid #F41D3D; + border-radius: 4px 0 4px 0; + color: white; + content: "Primary"; + font-size: 12px; + font-weight: bold; + left: -1px; + padding: 4px; + position: absolute; + top: -1px; +} + +.dz-primary-mark { + display: none; +} + +.dz-set-primary { + background-image: -moz-linear-gradient(center top , #FAFAFA 0%, #EEEEEE 100%); + border: 1px solid #EEEEEE; + border-radius: 2px 2px 2px 2px; + color: #AAAAAA; + display: block; + margin-top: 26px; + padding: 4px 5px; + text-align: center; + text-decoration: none; +} + +.dz-set-primary:hover { + text-decoration: none; + color: #666; +} + +a.dz-remove { + margin-top: 5px !important; +} diff --git a/app/assets/stylesheets/home.css.scss b/app/assets/stylesheets/home.css.scss new file mode 100644 index 0000000..f0ddc68 --- /dev/null +++ b/app/assets/stylesheets/home.css.scss @@ -0,0 +1,3 @@ +// Place all the styles related to the home controller here. +// They will automatically be included in application.css. +// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/home_controller.rb b/app/controllers/home_controller.rb new file mode 100644 index 0000000..592e958 --- /dev/null +++ b/app/controllers/home_controller.rb @@ -0,0 +1,25 @@ +class HomeController < ApplicationController + skip_before_filter :protect_from_forgery, only: :upload + + def index + @assets = Asset.all + end + + def upload + asset = Asset.new(image: params[:image], file_name: params[:image].original_filename) + asset.save! + render json: {asset_id: asset.id} + end + + def remove_image + Asset.find(params[:asset_id]).destroy + render nothing: true + end + + def set_primary + Asset.primary.update_all(is_primary: false) + + asset = Asset.find(params[:asset_id]) + asset.update_attributes(is_primary: true) + end +end diff --git a/app/helpers/home_helper.rb b/app/helpers/home_helper.rb new file mode 100644 index 0000000..23de56a --- /dev/null +++ b/app/helpers/home_helper.rb @@ -0,0 +1,2 @@ +module HomeHelper +end diff --git a/app/models/asset.rb b/app/models/asset.rb new file mode 100644 index 0000000..9aa46e0 --- /dev/null +++ b/app/models/asset.rb @@ -0,0 +1,40 @@ +class Asset + include Mongoid::Document + + mount_uploader :image, AssetUploader + + field :file_name + field :file_size + field :is_primary, type: Boolean, default: false + + scope :primary, where(is_primary: true) + + def name + self.file_name + end + + def size + self.file_size + end + + def remote_url + self.image.url + end + + def type + "image/png" + end + + def as_json(options= {}) + options.merge!(only: [:_id, :is_primary], methods: [:name, :size, :remote_url, :type]) + super + end + + private + + def update_asset_attributes + if image.present? && image_changed? + self.file_size = image.file.size + end + end +end diff --git a/app/uploaders/asset_uploader.rb b/app/uploaders/asset_uploader.rb new file mode 100644 index 0000000..4c44f7a --- /dev/null +++ b/app/uploaders/asset_uploader.rb @@ -0,0 +1,56 @@ +# encoding: utf-8 + +class AssetUploader < CarrierWave::Uploader::Base + include Cloudinary::CarrierWave + + # Include RMagick or MiniMagick support: + # include CarrierWave::RMagick + # include CarrierWave::MiniMagick + + # Choose what kind of storage to use for this uploader: + #storage :file + # storage :fog + + # Override the directory where uploaded files will be stored. + # This is a sensible default for uploaders that are meant to be mounted: + #def store_dir + # "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + #end + + def public_id + "#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" + end + + # Provide a default URL as a default if there hasn't been a file uploaded: + # def default_url + # # For Rails 3.1+ asset pipeline compatibility: + # # ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_')) + # + # "/images/fallback/" + [version_name, "default.png"].compact.join('_') + # end + + # Process files as they are uploaded: + # process :scale => [200, 300] + # + # def scale(width, height) + # # do something + # end + + # Create different versions of your uploaded files: + # version :thumb do + # process :scale => [50, 50] + # end + + # Add a white list of extensions which are allowed to be uploaded. + # For images you might use something like this: + def extension_white_list + %w(jpg jpeg gif png) + end + + # Override the filename of the uploaded files: + # Avoid using model.id or version_name here, see uploader/store.rb for details. + # def filename + # "something.jpg" if original_filename + # end + +end diff --git a/app/views/home/index.html.haml b/app/views/home/index.html.haml new file mode 100644 index 0000000..0c92bcd --- /dev/null +++ b/app/views/home/index.html.haml @@ -0,0 +1,8 @@ +.span12 + #images + #my-zone + %h3 My Images + %form{action: upload_path, class: "dropzone#{' dz-started' if @assets.count > 0}", id: 'assets-dropzone'} + +:coffeescript + @images = #{@assets.to_json} diff --git a/app/views/home/set_primary.js.haml b/app/views/home/set_primary.js.haml new file mode 100644 index 0000000..64fbd54 --- /dev/null +++ b/app/views/home/set_primary.js.haml @@ -0,0 +1,2 @@ +$('#assets-dropzone').find('.dz-primary').removeClass('dz-primary') +$('#'+"#{params[:asset_id]}").addClass('dz-primary') diff --git a/config/cloudinary.yml b/config/cloudinary.yml new file mode 100644 index 0000000..8a59ff8 --- /dev/null +++ b/config/cloudinary.yml @@ -0,0 +1,19 @@ +--- +development: + cloud_name: dt8tllzzd + api_key: '992573219328542' + api_secret: vweQ0Z_yIT5DHbrbkx8fMFIKusk + enhance_image_tag: true + static_image_support: false +production: + cloud_name: dt8tllzzd + api_key: '992573219328542' + api_secret: vweQ0Z_yIT5DHbrbkx8fMFIKusk + enhance_image_tag: true + static_image_support: true +test: + cloud_name: dt8tllzzd + api_key: '992573219328542' + api_secret: vweQ0Z_yIT5DHbrbkx8fMFIKusk + enhance_image_tag: true + static_image_support: false diff --git a/config/routes.rb b/config/routes.rb index 3e77e84..578815c 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -1,4 +1,8 @@ DropzoneRails::Application.routes.draw do + + match 'upload' => "home#upload", as: :upload + match '/:asset_id/set_primary' => "home#set_primary", as: :set_primary + match '/:asset_id/remove_image' => "home#remove_image", as: :remove_image # The priority is based upon order of creation: # first created -> highest priority. @@ -48,7 +52,7 @@ # You can have the root of your site routed with "root" # just remember to delete public/index.html. - # root :to => 'welcome#index' + root :to => 'home#index' # See how all your routes lay out with "rake routes" diff --git a/public/index.html b/public/index.html deleted file mode 100644 index a1d5099..0000000 --- a/public/index.html +++ /dev/null @@ -1,241 +0,0 @@ - - - - Ruby on Rails: Welcome aboard - - - - -
- - -
- - - - -
-

Getting started

-

Here’s how to get rolling:

- -
    -
  1. -

    Use rails generate to create your models and controllers

    -

    To see all available options, run it without parameters.

    -
  2. - -
  3. -

    Set up a default route and remove public/index.html

    -

    Routes are set up in config/routes.rb.

    -
  4. - -
  5. -

    Create your database

    -

    Run rake db:create to create your database. If you're not using SQLite (the default), edit config/database.yml with your username and password.

    -
  6. -
-
-
- - -
- - diff --git a/spec/controllers/home_controller_spec.rb b/spec/controllers/home_controller_spec.rb new file mode 100644 index 0000000..9d48b6a --- /dev/null +++ b/spec/controllers/home_controller_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe HomeController do + +end diff --git a/spec/helpers/home_helper_spec.rb b/spec/helpers/home_helper_spec.rb new file mode 100644 index 0000000..f529425 --- /dev/null +++ b/spec/helpers/home_helper_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +# Specs in this file have access to a helper object that includes +# the HomeHelper. For example: +# +# describe HomeHelper do +# describe "string concat" do +# it "concats two strings with spaces" do +# expect(helper.concat_strings("this","that")).to eq("this that") +# end +# end +# end +describe HomeHelper do + pending "add some examples to (or delete) #{__FILE__}" +end diff --git a/spec/models/asset_spec.rb b/spec/models/asset_spec.rb new file mode 100644 index 0000000..fd1e183 --- /dev/null +++ b/spec/models/asset_spec.rb @@ -0,0 +1,5 @@ +require 'spec_helper' + +describe Asset do + pending "add some examples to (or delete) #{__FILE__}" +end