caboose-cms 0.4.42 → 0.4.43
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/app/assets/javascripts/caboose/jquery.fileupload.js +1441 -0
- data/app/assets/javascripts/caboose/lodash.min.js +56 -0
- data/app/assets/javascripts/caboose/s3upload.js +124 -0
- data/app/controllers/caboose/ab_variants_controller.rb +1 -1
- data/app/controllers/caboose/application_controller.rb +1 -1
- data/app/controllers/caboose/images_controller.rb +269 -0
- data/app/controllers/caboose/pages_controller.rb +21 -12
- data/app/controllers/caboose/permissions_controller.rb +1 -1
- data/app/controllers/caboose/roles_controller.rb +1 -1
- data/app/controllers/caboose/settings_controller.rb +1 -1
- data/app/controllers/caboose/sites_controller.rb +156 -0
- data/app/controllers/caboose/users_controller.rb +1 -1
- data/app/models/caboose/asset.rb +2 -2
- data/app/models/caboose/core_plugin.rb +7 -6
- data/app/models/caboose/domain.rb +8 -0
- data/app/models/caboose/media_category.rb +18 -0
- data/app/models/caboose/media_file.rb +9 -0
- data/app/models/caboose/media_image.rb +16 -0
- data/app/models/caboose/page.rb +16 -9
- data/app/models/caboose/schema.rb +191 -158
- data/app/models/caboose/site.rb +9 -0
- data/app/models/caboose/site_membership.rb +12 -0
- data/app/views/caboose/blocks/admin_edit.html.erb +2 -1
- data/app/views/caboose/blocks/admin_new.html.erb +5 -1
- data/app/views/caboose/images/admin_index.html.erb +24 -0
- data/app/views/caboose/images/admin_new.html.erb +63 -0
- data/app/views/caboose/pages/admin_index.html.erb +6 -3
- data/app/views/caboose/sites/admin_edit.html.erb +199 -0
- data/app/views/caboose/sites/admin_index.html.erb +31 -0
- data/app/views/caboose/sites/admin_new.html.erb +33 -0
- data/config/routes.rb +25 -0
- data/lib/caboose/version.rb +1 -1
- metadata +18 -2
@@ -0,0 +1,56 @@
|
|
1
|
+
/**
|
2
|
+
* @license
|
3
|
+
* Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE
|
4
|
+
* Build: `lodash modern -o ./dist/lodash.js`
|
5
|
+
*/
|
6
|
+
;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++e<r;)if(n[e]===t)return e;return-1}function t(t,e){var r=typeof e;if(t=t.l,"boolean"==r||null==e)return t[e]?0:-1;"number"!=r&&"string"!=r&&(r="object");var u="number"==r?e:m+e;return t=(t=t[r])&&t[u],"object"==r?t&&-1<n(t,e)?0:-1:t?0:-1}function e(n){var t=this.l,e=typeof n;if("boolean"==e||null==n)t[n]=true;else{"number"!=e&&"string"!=e&&(e="object");var r="number"==e?n:m+n,t=t[e]||(t[e]={});"object"==e?(t[r]||(t[r]=[])).push(n):t[r]=true
|
7
|
+
}}function r(n){return n.charCodeAt(0)}function u(n,t){for(var e=n.m,r=t.m,u=-1,o=e.length;++u<o;){var i=e[u],a=r[u];if(i!==a){if(i>a||typeof i=="undefined")return 1;if(i<a||typeof a=="undefined")return-1}}return n.n-t.n}function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],i=n[r-1];if(u&&typeof u=="object"&&o&&typeof o=="object"&&i&&typeof i=="object")return false;for(u=f(),u["false"]=u["null"]=u["true"]=u.undefined=false,o=f(),o.k=n,o.l=u,o.push=e;++t<r;)o.push(n[t]);return o}function i(n){return"\\"+U[n]
|
8
|
+
}function a(){return h.pop()||[]}function f(){return g.pop()||{k:null,l:null,m:null,"false":false,n:0,"null":false,number:null,object:null,push:null,string:null,"true":false,undefined:false,o:null}}function l(n){n.length=0,h.length<_&&h.push(n)}function c(n){var t=n.l;t&&c(t),n.k=n.l=n.m=n.object=n.number=n.string=n.o=null,g.length<_&&g.push(n)}function p(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);var r=-1;e=e-t||0;for(var u=Array(0>e?0:e);++r<e;)u[r]=n[t+r];return u}function s(e){function h(n,t,e){if(!n||!V[typeof n])return n;
|
9
|
+
t=t&&typeof e=="undefined"?t:tt(t,e,3);for(var r=-1,u=V[typeof n]&&Fe(n),o=u?u.length:0;++r<o&&(e=u[r],false!==t(n[e],e,n)););return n}function g(n,t,e){var r;if(!n||!V[typeof n])return n;t=t&&typeof e=="undefined"?t:tt(t,e,3);for(r in n)if(false===t(n[r],r,n))break;return n}function _(n,t,e){var r,u=n,o=u;if(!u)return o;for(var i=arguments,a=0,f=typeof e=="number"?2:i.length;++a<f;)if((u=i[a])&&V[typeof u])for(var l=-1,c=V[typeof u]&&Fe(u),p=c?c.length:0;++l<p;)r=c[l],"undefined"==typeof o[r]&&(o[r]=u[r]);
|
10
|
+
return o}function U(n,t,e){var r,u=n,o=u;if(!u)return o;var i=arguments,a=0,f=typeof e=="number"?2:i.length;if(3<f&&"function"==typeof i[f-2])var l=tt(i[--f-1],i[f--],2);else 2<f&&"function"==typeof i[f-1]&&(l=i[--f]);for(;++a<f;)if((u=i[a])&&V[typeof u])for(var c=-1,p=V[typeof u]&&Fe(u),s=p?p.length:0;++c<s;)r=p[c],o[r]=l?l(o[r],u[r]):u[r];return o}function H(n){var t,e=[];if(!n||!V[typeof n])return e;for(t in n)me.call(n,t)&&e.push(t);return e}function J(n){return n&&typeof n=="object"&&!Te(n)&&me.call(n,"__wrapped__")?n:new Q(n)
|
11
|
+
}function Q(n,t){this.__chain__=!!t,this.__wrapped__=n}function X(n){function t(){if(r){var n=p(r);be.apply(n,arguments)}if(this instanceof t){var o=nt(e.prototype),n=e.apply(o,n||arguments);return wt(n)?n:o}return e.apply(u,n||arguments)}var e=n[0],r=n[2],u=n[4];return $e(t,n),t}function Z(n,t,e,r,u){if(e){var o=e(n);if(typeof o!="undefined")return o}if(!wt(n))return n;var i=ce.call(n);if(!K[i])return n;var f=Ae[i];switch(i){case T:case F:return new f(+n);case W:case P:return new f(n);case z:return o=f(n.source,C.exec(n)),o.lastIndex=n.lastIndex,o
|
12
|
+
}if(i=Te(n),t){var c=!r;r||(r=a()),u||(u=a());for(var s=r.length;s--;)if(r[s]==n)return u[s];o=i?f(n.length):{}}else o=i?p(n):U({},n);return i&&(me.call(n,"index")&&(o.index=n.index),me.call(n,"input")&&(o.input=n.input)),t?(r.push(n),u.push(o),(i?St:h)(n,function(n,i){o[i]=Z(n,t,e,r,u)}),c&&(l(r),l(u)),o):o}function nt(n){return wt(n)?ke(n):{}}function tt(n,t,e){if(typeof n!="function")return Ut;if(typeof t=="undefined"||!("prototype"in n))return n;var r=n.__bindData__;if(typeof r=="undefined"&&(De.funcNames&&(r=!n.name),r=r||!De.funcDecomp,!r)){var u=ge.call(n);
|
13
|
+
De.funcNames||(r=!O.test(u)),r||(r=E.test(u),$e(n,r))}if(false===r||true!==r&&1&r[1])return n;switch(e){case 1:return function(e){return n.call(t,e)};case 2:return function(e,r){return n.call(t,e,r)};case 3:return function(e,r,u){return n.call(t,e,r,u)};case 4:return function(e,r,u,o){return n.call(t,e,r,u,o)}}return Mt(n,t)}function et(n){function t(){var n=f?i:this;if(u){var h=p(u);be.apply(h,arguments)}return(o||c)&&(h||(h=p(arguments)),o&&be.apply(h,o),c&&h.length<a)?(r|=16,et([e,s?r:-4&r,h,null,i,a])):(h||(h=arguments),l&&(e=n[v]),this instanceof t?(n=nt(e.prototype),h=e.apply(n,h),wt(h)?h:n):e.apply(n,h))
|
14
|
+
}var e=n[0],r=n[1],u=n[2],o=n[3],i=n[4],a=n[5],f=1&r,l=2&r,c=4&r,s=8&r,v=e;return $e(t,n),t}function rt(e,r){var u=-1,i=st(),a=e?e.length:0,f=a>=b&&i===n,l=[];if(f){var p=o(r);p?(i=t,r=p):f=false}for(;++u<a;)p=e[u],0>i(r,p)&&l.push(p);return f&&c(r),l}function ut(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r<u;){var i=n[r];if(i&&typeof i=="object"&&typeof i.length=="number"&&(Te(i)||yt(i))){t||(i=ut(i,t,e));var a=-1,f=i.length,l=o.length;for(o.length+=f;++a<f;)o[l++]=i[a]}else e||o.push(i)}return o
|
15
|
+
}function ot(n,t,e,r,u,o){if(e){var i=e(n,t);if(typeof i!="undefined")return!!i}if(n===t)return 0!==n||1/n==1/t;if(n===n&&!(n&&V[typeof n]||t&&V[typeof t]))return false;if(null==n||null==t)return n===t;var f=ce.call(n),c=ce.call(t);if(f==D&&(f=q),c==D&&(c=q),f!=c)return false;switch(f){case T:case F:return+n==+t;case W:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case z:case P:return n==oe(t)}if(c=f==$,!c){var p=me.call(n,"__wrapped__"),s=me.call(t,"__wrapped__");if(p||s)return ot(p?n.__wrapped__:n,s?t.__wrapped__:t,e,r,u,o);
|
16
|
+
if(f!=q)return false;if(f=n.constructor,p=t.constructor,f!=p&&!(dt(f)&&f instanceof f&&dt(p)&&p instanceof p)&&"constructor"in n&&"constructor"in t)return false}for(f=!u,u||(u=a()),o||(o=a()),p=u.length;p--;)if(u[p]==n)return o[p]==t;var v=0,i=true;if(u.push(n),o.push(t),c){if(p=n.length,v=t.length,(i=v==p)||r)for(;v--;)if(c=p,s=t[v],r)for(;c--&&!(i=ot(n[c],s,e,r,u,o)););else if(!(i=ot(n[v],s,e,r,u,o)))break}else g(t,function(t,a,f){return me.call(f,a)?(v++,i=me.call(n,a)&&ot(n[a],t,e,r,u,o)):void 0}),i&&!r&&g(n,function(n,t,e){return me.call(e,t)?i=-1<--v:void 0
|
17
|
+
});return u.pop(),o.pop(),f&&(l(u),l(o)),i}function it(n,t,e,r,u){(Te(t)?St:h)(t,function(t,o){var i,a,f=t,l=n[o];if(t&&((a=Te(t))||Pe(t))){for(f=r.length;f--;)if(i=r[f]==t){l=u[f];break}if(!i){var c;e&&(f=e(l,t),c=typeof f!="undefined")&&(l=f),c||(l=a?Te(l)?l:[]:Pe(l)?l:{}),r.push(t),u.push(l),c||it(l,t,e,r,u)}}else e&&(f=e(l,t),typeof f=="undefined"&&(f=t)),typeof f!="undefined"&&(l=f);n[o]=l})}function at(n,t){return n+he(Re()*(t-n+1))}function ft(e,r,u){var i=-1,f=st(),p=e?e.length:0,s=[],v=!r&&p>=b&&f===n,h=u||v?a():s;
|
18
|
+
for(v&&(h=o(h),f=t);++i<p;){var g=e[i],y=u?u(g,i,e):g;(r?!i||h[h.length-1]!==y:0>f(h,y))&&((u||v)&&h.push(y),s.push(g))}return v?(l(h.k),c(h)):u&&l(h),s}function lt(n){return function(t,e,r){var u={};e=J.createCallback(e,r,3),r=-1;var o=t?t.length:0;if(typeof o=="number")for(;++r<o;){var i=t[r];n(u,i,e(i,r,t),t)}else h(t,function(t,r,o){n(u,t,e(t,r,o),o)});return u}}function ct(n,t,e,r,u,o){var i=1&t,a=4&t,f=16&t,l=32&t;if(!(2&t||dt(n)))throw new ie;f&&!e.length&&(t&=-17,f=e=false),l&&!r.length&&(t&=-33,l=r=false);
|
19
|
+
var c=n&&n.__bindData__;return c&&true!==c?(c=p(c),c[2]&&(c[2]=p(c[2])),c[3]&&(c[3]=p(c[3])),!i||1&c[1]||(c[4]=u),!i&&1&c[1]&&(t|=8),!a||4&c[1]||(c[5]=o),f&&be.apply(c[2]||(c[2]=[]),e),l&&we.apply(c[3]||(c[3]=[]),r),c[1]|=t,ct.apply(null,c)):(1==t||17===t?X:et)([n,t,e,r,u,o])}function pt(n){return Be[n]}function st(){var t=(t=J.indexOf)===Wt?n:t;return t}function vt(n){return typeof n=="function"&&pe.test(n)}function ht(n){var t,e;return n&&ce.call(n)==q&&(t=n.constructor,!dt(t)||t instanceof t)?(g(n,function(n,t){e=t
|
20
|
+
}),typeof e=="undefined"||me.call(n,e)):false}function gt(n){return We[n]}function yt(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==D||false}function mt(n,t,e){var r=Fe(n),u=r.length;for(t=tt(t,e,3);u--&&(e=r[u],false!==t(n[e],e,n)););return n}function bt(n){var t=[];return g(n,function(n,e){dt(n)&&t.push(e)}),t.sort()}function _t(n){for(var t=-1,e=Fe(n),r=e.length,u={};++t<r;){var o=e[t];u[n[o]]=o}return u}function dt(n){return typeof n=="function"}function wt(n){return!(!n||!V[typeof n])
|
21
|
+
}function jt(n){return typeof n=="number"||n&&typeof n=="object"&&ce.call(n)==W||false}function kt(n){return typeof n=="string"||n&&typeof n=="object"&&ce.call(n)==P||false}function xt(n){for(var t=-1,e=Fe(n),r=e.length,u=Xt(r);++t<r;)u[t]=n[e[t]];return u}function Ct(n,t,e){var r=-1,u=st(),o=n?n.length:0,i=false;return e=(0>e?Ie(0,o+e):e)||0,Te(n)?i=-1<u(n,t,e):typeof o=="number"?i=-1<(kt(n)?n.indexOf(t,e):u(n,t,e)):h(n,function(n){return++r<e?void 0:!(i=n===t)}),i}function Ot(n,t,e){var r=true;t=J.createCallback(t,e,3),e=-1;
|
22
|
+
var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&(r=!!t(n[e],e,n)););else h(n,function(n,e,u){return r=!!t(n,e,u)});return r}function Nt(n,t,e){var r=[];t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u;){var o=n[e];t(o,e,n)&&r.push(o)}else h(n,function(n,e,u){t(n,e,u)&&r.push(n)});return r}function It(n,t,e){t=J.createCallback(t,e,3),e=-1;var r=n?n.length:0;if(typeof r!="number"){var u;return h(n,function(n,e,r){return t(n,e,r)?(u=n,false):void 0}),u}for(;++e<r;){var o=n[e];
|
23
|
+
if(t(o,e,n))return o}}function St(n,t,e){var r=-1,u=n?n.length:0;if(t=t&&typeof e=="undefined"?t:tt(t,e,3),typeof u=="number")for(;++r<u&&false!==t(n[r],r,n););else h(n,t);return n}function Et(n,t,e){var r=n?n.length:0;if(t=t&&typeof e=="undefined"?t:tt(t,e,3),typeof r=="number")for(;r--&&false!==t(n[r],r,n););else{var u=Fe(n),r=u.length;h(n,function(n,e,o){return e=u?u[--r]:--r,t(o[e],e,o)})}return n}function Rt(n,t,e){var r=-1,u=n?n.length:0;if(t=J.createCallback(t,e,3),typeof u=="number")for(var o=Xt(u);++r<u;)o[r]=t(n[r],r,n);
|
24
|
+
else o=[],h(n,function(n,e,u){o[++r]=t(n,e,u)});return o}function At(n,t,e){var u=-1/0,o=u;if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&Te(n)){e=-1;for(var i=n.length;++e<i;){var a=n[e];a>o&&(o=a)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Dt(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=J.createCallback(t,r,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(e=n[++o]);++o<i;)e=t(e,n[o],o,n);else h(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)
|
25
|
+
});return e}function $t(n,t,e,r){var u=3>arguments.length;return t=J.createCallback(t,r,4),Et(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Xt(typeof e=="number"?e:0);return St(n,function(n){var e=at(0,++t);r[t]=r[e],r[e]=n}),r}function Ft(n,t,e){var r;t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&!(r=t(n[e],e,n)););else h(n,function(n,e,u){return!(r=t(n,e,u))});return!!r}function Bt(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=-1;
|
26
|
+
for(t=J.createCallback(t,e,3);++o<u&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[0]:v;return p(n,0,Se(Ie(0,r),u))}function Wt(t,e,r){if(typeof r=="number"){var u=t?t.length:0;r=0>r?Ie(0,u+r):r||0}else if(r)return r=zt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=J.createCallback(t,e,3);++u<o&&t(n[u],u,n);)r++}else r=null==t||e?1:Ie(0,t);return p(n,r)}function zt(n,t,e,r){var u=0,o=n?n.length:u;for(e=e?J.createCallback(e,r,1):Ut,t=e(t);u<o;)r=u+o>>>1,e(n[r])<t?u=r+1:o=r;
|
27
|
+
return u}function Pt(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(e=J.createCallback(e,r,3)),ft(n,t,e)}function Kt(){for(var n=1<arguments.length?arguments:arguments[0],t=-1,e=n?At(Ve(n,"length")):0,r=Xt(0>e?0:e);++t<e;)r[t]=Ve(n,t);return r}function Lt(n,t){var e=-1,r=n?n.length:0,u={};for(t||!r||Te(n[0])||(t=[]);++e<r;){var o=n[e];t?u[o]=t[e]:o&&(u[o[0]]=o[1])}return u}function Mt(n,t){return 2<arguments.length?ct(n,17,p(arguments,2),null,t):ct(n,1,null,null,t)
|
28
|
+
}function Vt(n,t,e){function r(){c&&ve(c),i=c=p=v,(g||h!==t)&&(s=Ue(),a=n.apply(l,o),c||i||(o=l=null))}function u(){var e=t-(Ue()-f);0<e?c=_e(u,e):(i&&ve(i),e=p,i=c=p=v,e&&(s=Ue(),a=n.apply(l,o),c||i||(o=l=null)))}var o,i,a,f,l,c,p,s=0,h=false,g=true;if(!dt(n))throw new ie;if(t=Ie(0,t)||0,true===e)var y=true,g=false;else wt(e)&&(y=e.leading,h="maxWait"in e&&(Ie(t,e.maxWait)||0),g="trailing"in e?e.trailing:g);return function(){if(o=arguments,f=Ue(),l=this,p=g&&(c||!y),false===h)var e=y&&!c;else{i||y||(s=f);var v=h-(f-s),m=0>=v;
|
29
|
+
m?(i&&(i=ve(i)),s=f,a=n.apply(l,o)):i||(i=_e(r,v))}return m&&c?c=ve(c):c||t===h||(c=_e(u,t)),e&&(m=true,a=n.apply(l,o)),!m||c||i||(o=l=null),a}}function Ut(n){return n}function Gt(n,t,e){var r=true,u=t&&bt(t);t&&(e||u.length)||(null==e&&(e=t),o=Q,t=n,n=J,u=bt(t)),false===e?r=false:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=dt(o);St(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(be.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this;
|
30
|
+
i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,A)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,ae=[],fe=re.prototype,le=e._,ce=fe.toString,pe=ue("^"+oe(ce).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,ve=e.clearTimeout,he=te.floor,ge=ne.prototype.toString,ye=vt(ye=re.getPrototypeOf)&&ye,me=fe.hasOwnProperty,be=ae.push,_e=e.setTimeout,de=ae.splice,we=ae.unshift,je=function(){try{var n={},t=vt(t=re.defineProperty)&&t,e=t(n,n,n)&&t
|
31
|
+
}catch(r){}return e}(),ke=vt(ke=re.create)&&ke,xe=vt(xe=Xt.isArray)&&xe,Ce=e.isFinite,Oe=e.isNaN,Ne=vt(Ne=re.keys)&&Ne,Ie=te.max,Se=te.min,Ee=e.parseInt,Re=te.random,Ae={};Ae[$]=Xt,Ae[T]=Yt,Ae[F]=Zt,Ae[B]=ne,Ae[q]=re,Ae[W]=ee,Ae[z]=ue,Ae[P]=oe,Q.prototype=J.prototype;var De=J.support={};De.funcDecomp=!vt(e.a)&&E.test(s),De.funcNames=typeof ne.name=="string",J.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N,variable:"",imports:{_:J}},ke||(nt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t;
|
32
|
+
var r=new n;n.prototype=null}return r||e.Object()}}());var $e=je?function(n,t){M.value=t,je(n,"__bindData__",M)}:Ht,Te=xe||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==$||false},Fe=Ne?function(n){return wt(n)?Ne(n):[]}:H,Be={"&":"&","<":"<",">":">",'"':""","'":"'"},We=_t(Be),qe=ue("("+Fe(We).join("|")+")","g"),ze=ue("["+Fe(Be).join("")+"]","g"),Pe=ye?function(n){if(!n||ce.call(n)!=q)return false;var t=n.valueOf,e=vt(t)&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:ht(n)
|
33
|
+
}:ht,Ke=lt(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Le=lt(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)}),Me=lt(function(n,t,e){n[e]=t}),Ve=Rt,Ue=vt(Ue=Zt.now)&&Ue||function(){return(new Zt).getTime()},Ge=8==Ee(d+"08")?Ee:function(n,t){return Ee(kt(n)?n.replace(I,""):n,t||0)};return J.after=function(n,t){if(!dt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},J.assign=U,J.at=function(n){for(var t=arguments,e=-1,r=ut(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e<t;)u[e]=n[r[e]];
|
34
|
+
return u},J.bind=Mt,J.bindAll=function(n){for(var t=1<arguments.length?ut(arguments,true,false,1):bt(n),e=-1,r=t.length;++e<r;){var u=t[e];n[u]=ct(n[u],1,null,null,n)}return n},J.bindKey=function(n,t){return 2<arguments.length?ct(t,19,p(arguments,2),null,n):ct(t,3,null,null,n)},J.chain=function(n){return n=new Q(n),n.__chain__=true,n},J.compact=function(n){for(var t=-1,e=n?n.length:0,r=[];++t<e;){var u=n[t];u&&r.push(u)}return r},J.compose=function(){for(var n=arguments,t=n.length;t--;)if(!dt(n[t]))throw new ie;
|
35
|
+
return function(){for(var t=arguments,e=n.length;e--;)t=[n[e].apply(this,t)];return t[0]}},J.constant=function(n){return function(){return n}},J.countBy=Ke,J.create=function(n,t){var e=nt(n);return t?U(e,t):e},J.createCallback=function(n,t,e){var r=typeof n;if(null==n||"function"==r)return tt(n,t,e);if("object"!=r)return Jt(n);var u=Fe(n),o=u[0],i=n[o];return 1!=u.length||i!==i||wt(i)?function(t){for(var e=u.length,r=false;e--&&(r=ot(t[u[e]],n[u[e]],null,true)););return r}:function(n){return n=n[o],i===n&&(0!==i||1/i==1/n)
|
36
|
+
}},J.curry=function(n,t){return t=typeof t=="number"?t:+t||n.length,ct(n,4,null,null,null,t)},J.debounce=Vt,J.defaults=_,J.defer=function(n){if(!dt(n))throw new ie;var t=p(arguments,1);return _e(function(){n.apply(v,t)},1)},J.delay=function(n,t){if(!dt(n))throw new ie;var e=p(arguments,2);return _e(function(){n.apply(v,e)},t)},J.difference=function(n){return rt(n,ut(arguments,true,true,1))},J.filter=Nt,J.flatten=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(n=Rt(n,e,r)),ut(n,t)
|
37
|
+
},J.forEach=St,J.forEachRight=Et,J.forIn=g,J.forInRight=function(n,t,e){var r=[];g(n,function(n,t){r.push(t,n)});var u=r.length;for(t=tt(t,e,3);u--&&false!==t(r[u--],r[u],n););return n},J.forOwn=h,J.forOwnRight=mt,J.functions=bt,J.groupBy=Le,J.indexBy=Me,J.initial=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else r=null==t||e?1:t||r;return p(n,0,Se(Ie(0,u-r),u))},J.intersection=function(){for(var e=[],r=-1,u=arguments.length,i=a(),f=st(),p=f===n,s=a();++r<u;){var v=arguments[r];
|
38
|
+
(Te(v)||yt(v))&&(e.push(v),i.push(p&&v.length>=b&&o(r?e[r]:s)))}var p=e[0],h=-1,g=p?p.length:0,y=[];n:for(;++h<g;){var m=i[0],v=p[h];if(0>(m?t(m,v):f(s,v))){for(r=u,(m||s).push(v);--r;)if(m=i[r],0>(m?t(m,v):f(e[r],v)))continue n;y.push(v)}}for(;u--;)(m=i[u])&&c(m);return l(i),l(s),y},J.invert=_t,J.invoke=function(n,t){var e=p(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,i=Xt(typeof o=="number"?o:0);return St(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},J.keys=Fe,J.map=Rt,J.mapValues=function(n,t,e){var r={};
|
39
|
+
return t=J.createCallback(t,e,3),h(n,function(n,e,u){r[e]=t(n,e,u)}),r},J.max=At,J.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!dt(n))throw new ie;return e.cache={},e},J.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3<e&&"function"==typeof t[e-2])var r=tt(t[--e-1],t[e--],2);else 2<e&&"function"==typeof t[e-1]&&(r=t[--e]);for(var t=p(arguments,1,e),u=-1,o=a(),i=a();++u<e;)it(n,t[u],r,o,i);
|
40
|
+
return l(o),l(i),n},J.min=function(n,t,e){var u=1/0,o=u;if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&Te(n)){e=-1;for(var i=n.length;++e<i;){var a=n[e];a<o&&(o=a)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e<u&&(u=e,o=n)});return o},J.omit=function(n,t,e){var r={};if(typeof t!="function"){var u=[];g(n,function(n,t){u.push(t)});for(var u=rt(u,ut(arguments,true,false,1)),o=-1,i=u.length;++o<i;){var a=u[o];r[a]=n[a]}}else t=J.createCallback(t,e,3),g(n,function(n,e,u){t(n,e,u)||(r[e]=n)
|
41
|
+
});return r},J.once=function(n){var t,e;if(!dt(n))throw new ie;return function(){return t?e:(t=true,e=n.apply(this,arguments),n=null,e)}},J.pairs=function(n){for(var t=-1,e=Fe(n),r=e.length,u=Xt(r);++t<r;){var o=e[t];u[t]=[o,n[o]]}return u},J.partial=function(n){return ct(n,16,p(arguments,1))},J.partialRight=function(n){return ct(n,32,null,p(arguments,1))},J.pick=function(n,t,e){var r={};if(typeof t!="function")for(var u=-1,o=ut(arguments,true,false,1),i=wt(n)?o.length:0;++u<i;){var a=o[u];a in n&&(r[a]=n[a])
|
42
|
+
}else t=J.createCallback(t,e,3),g(n,function(n,e,u){t(n,e,u)&&(r[e]=n)});return r},J.pluck=Ve,J.property=Jt,J.pull=function(n){for(var t=arguments,e=0,r=t.length,u=n?n.length:0;++e<r;)for(var o=-1,i=t[e];++o<u;)n[o]===i&&(de.call(n,o--,1),u--);return n},J.range=function(n,t,e){n=+n||0,e=typeof e=="number"?e:+e||1,null==t&&(t=n,n=0);var r=-1;t=Ie(0,se((t-n)/(e||1)));for(var u=Xt(t);++r<t;)u[r]=n,n+=e;return u},J.reject=function(n,t,e){return t=J.createCallback(t,e,3),Nt(n,function(n,e,r){return!t(n,e,r)
|
43
|
+
})},J.remove=function(n,t,e){var r=-1,u=n?n.length:0,o=[];for(t=J.createCallback(t,e,3);++r<u;)e=n[r],t(e,r,n)&&(o.push(e),de.call(n,r--,1),u--);return o},J.rest=qt,J.shuffle=Tt,J.sortBy=function(n,t,e){var r=-1,o=Te(t),i=n?n.length:0,p=Xt(typeof i=="number"?i:0);for(o||(t=J.createCallback(t,e,3)),St(n,function(n,e,u){var i=p[++r]=f();o?i.m=Rt(t,function(t){return n[t]}):(i.m=a())[0]=t(n,e,u),i.n=r,i.o=n}),i=p.length,p.sort(u);i--;)n=p[i],p[i]=n.o,o||l(n.m),c(n);return p},J.tap=function(n,t){return t(n),n
|
44
|
+
},J.throttle=function(n,t,e){var r=true,u=true;if(!dt(n))throw new ie;return false===e?r=false:wt(e)&&(r="leading"in e?e.leading:r,u="trailing"in e?e.trailing:u),L.leading=r,L.maxWait=t,L.trailing=u,Vt(n,t,L)},J.times=function(n,t,e){n=-1<(n=+n)?n:0;var r=-1,u=Xt(n);for(t=tt(t,e,1);++r<n;)u[r]=t(r);return u},J.toArray=function(n){return n&&typeof n.length=="number"?p(n):xt(n)},J.transform=function(n,t,e,r){var u=Te(n);if(null==e)if(u)e=[];else{var o=n&&n.constructor;e=nt(o&&o.prototype)}return t&&(t=J.createCallback(t,r,4),(u?St:h)(n,function(n,r,u){return t(e,n,r,u)
|
45
|
+
})),e},J.union=function(){return ft(ut(arguments,true,true))},J.uniq=Pt,J.values=xt,J.where=Nt,J.without=function(n){return rt(n,p(arguments,1))},J.wrap=function(n,t){return ct(t,16,[n])},J.xor=function(){for(var n=-1,t=arguments.length;++n<t;){var e=arguments[n];if(Te(e)||yt(e))var r=r?ft(rt(r,e).concat(rt(e,r))):e}return r||[]},J.zip=Kt,J.zipObject=Lt,J.collect=Rt,J.drop=qt,J.each=St,J.eachRight=Et,J.extend=U,J.methods=bt,J.object=Lt,J.select=Nt,J.tail=qt,J.unique=Pt,J.unzip=Kt,Gt(J),J.clone=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=t,t=false),Z(n,t,typeof e=="function"&&tt(e,r,1))
|
46
|
+
},J.cloneDeep=function(n,t,e){return Z(n,true,typeof t=="function"&&tt(t,e,1))},J.contains=Ct,J.escape=function(n){return null==n?"":oe(n).replace(ze,pt)},J.every=Ot,J.find=It,J.findIndex=function(n,t,e){var r=-1,u=n?n.length:0;for(t=J.createCallback(t,e,3);++r<u;)if(t(n[r],r,n))return r;return-1},J.findKey=function(n,t,e){var r;return t=J.createCallback(t,e,3),h(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},J.findLast=function(n,t,e){var r;return t=J.createCallback(t,e,3),Et(n,function(n,e,u){return t(n,e,u)?(r=n,false):void 0
|
47
|
+
}),r},J.findLastIndex=function(n,t,e){var r=n?n.length:0;for(t=J.createCallback(t,e,3);r--;)if(t(n[r],r,n))return r;return-1},J.findLastKey=function(n,t,e){var r;return t=J.createCallback(t,e,3),mt(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},J.has=function(n,t){return n?me.call(n,t):false},J.identity=Ut,J.indexOf=Wt,J.isArguments=yt,J.isArray=Te,J.isBoolean=function(n){return true===n||false===n||n&&typeof n=="object"&&ce.call(n)==T||false},J.isDate=function(n){return n&&typeof n=="object"&&ce.call(n)==F||false
|
48
|
+
},J.isElement=function(n){return n&&1===n.nodeType||false},J.isEmpty=function(n){var t=true;if(!n)return t;var e=ce.call(n),r=n.length;return e==$||e==P||e==D||e==q&&typeof r=="number"&&dt(n.splice)?!r:(h(n,function(){return t=false}),t)},J.isEqual=function(n,t,e,r){return ot(n,t,typeof e=="function"&&tt(e,r,2))},J.isFinite=function(n){return Ce(n)&&!Oe(parseFloat(n))},J.isFunction=dt,J.isNaN=function(n){return jt(n)&&n!=+n},J.isNull=function(n){return null===n},J.isNumber=jt,J.isObject=wt,J.isPlainObject=Pe,J.isRegExp=function(n){return n&&typeof n=="object"&&ce.call(n)==z||false
|
49
|
+
},J.isString=kt,J.isUndefined=function(n){return typeof n=="undefined"},J.lastIndexOf=function(n,t,e){var r=n?n.length:0;for(typeof e=="number"&&(r=(0>e?Ie(0,r+e):Se(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},J.mixin=Gt,J.noConflict=function(){return e._=le,this},J.noop=Ht,J.now=Ue,J.parseInt=Ge,J.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Re(),Se(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):at(n,t)
|
50
|
+
},J.reduce=Dt,J.reduceRight=$t,J.result=function(n,t){if(n){var e=n[t];return dt(e)?n[t]():e}},J.runInContext=s,J.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:Fe(n).length},J.some=Ft,J.sortedIndex=zt,J.template=function(n,t,e){var r=J.templateSettings;n=oe(n||""),e=_({},e,r);var u,o=_({},e.imports,r.imports),r=Fe(o),o=xt(o),a=0,f=e.interpolate||S,l="__p+='",f=ue((e.escape||S).source+"|"+f.source+"|"+(f===N?x:S).source+"|"+(e.evaluate||S).source+"|$","g");n.replace(f,function(t,e,r,o,f,c){return r||(r=o),l+=n.slice(a,c).replace(R,i),e&&(l+="'+__e("+e+")+'"),f&&(u=true,l+="';"+f+";\n__p+='"),r&&(l+="'+((__t=("+r+"))==null?'':__t)+'"),a=c+t.length,t
|
51
|
+
}),l+="';",f=e=e.variable,f||(e="obj",l="with("+e+"){"+l+"}"),l=(u?l.replace(w,""):l).replace(j,"$1").replace(k,"$1;"),l="function("+e+"){"+(f?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}";try{var c=ne(r,"return "+l).apply(v,o)}catch(p){throw p.source=l,p}return t?c(t):(c.source=l,c)},J.unescape=function(n){return null==n?"":oe(n).replace(qe,gt)},J.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t
|
52
|
+
},J.all=Ot,J.any=Ft,J.detect=It,J.findWhere=It,J.foldl=Dt,J.foldr=$t,J.include=Ct,J.inject=Dt,Gt(function(){var n={};return h(J,function(t,e){J.prototype[e]||(n[e]=t)}),n}(),false),J.first=Bt,J.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:v;return p(n,Ie(0,u-r))},J.sample=function(n,t,e){return n&&typeof n.length!="number"&&(n=xt(n)),null==t||e?n?n[at(0,n.length-1)]:v:(n=Tt(n),n.length=Se(Ie(0,t),n.length),n)
|
53
|
+
},J.take=Bt,J.head=Bt,h(J,function(n,t){var e="sample"!==t;J.prototype[t]||(J.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new Q(o,u):o})}),J.VERSION="2.4.1",J.prototype.chain=function(){return this.__chain__=true,this},J.prototype.toString=function(){return oe(this.__wrapped__)},J.prototype.value=Qt,J.prototype.valueOf=Qt,St(["join","pop","shift"],function(n){var t=ae[n];J.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments);
|
54
|
+
return n?new Q(e,n):e}}),St(["push","reverse","sort","unshift"],function(n){var t=ae[n];J.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),St(["concat","slice","splice"],function(n){var t=ae[n];J.prototype[n]=function(){return new Q(t.apply(this.__wrapped__,arguments),this.__chain__)}}),J}var v,h=[],g=[],y=0,m=+new Date+"",b=75,_=40,d=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,N=/<%=([\s\S]+?)%>/g,I=RegExp("^["+d+"]*0+(?=.$)"),S=/($^)/,E=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,A="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),D="[object Arguments]",$="[object Array]",T="[object Boolean]",F="[object Date]",B="[object Function]",W="[object Number]",q="[object Object]",z="[object RegExp]",P="[object String]",K={};
|
55
|
+
K[B]=false,K[D]=K[$]=K[T]=K[F]=K[W]=K[q]=K[z]=K[P]=true;var L={leading:false,maxWait:0,trailing:false},M={configurable:false,enumerable:false,value:null,writable:false},V={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},U={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X);
|
56
|
+
var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G._=Y, define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this);
|
@@ -0,0 +1,124 @@
|
|
1
|
+
(function() {
|
2
|
+
|
3
|
+
window.S3Upload = (function() {
|
4
|
+
|
5
|
+
S3Upload.prototype.s3_object_name = 'default_name';
|
6
|
+
|
7
|
+
S3Upload.prototype.s3_sign_put_url = '/signS3put';
|
8
|
+
|
9
|
+
S3Upload.prototype.file_dom_selector = 'file_upload';
|
10
|
+
|
11
|
+
S3Upload.prototype.onFinishS3Put = function(public_url) {
|
12
|
+
return console.log('base.onFinishS3Put()', public_url);
|
13
|
+
};
|
14
|
+
|
15
|
+
S3Upload.prototype.onProgress = function(percent, status) {
|
16
|
+
return console.log('base.onProgress()', percent, status);
|
17
|
+
};
|
18
|
+
|
19
|
+
S3Upload.prototype.onError = function(status) {
|
20
|
+
return console.log('base.onError()', status);
|
21
|
+
};
|
22
|
+
|
23
|
+
function S3Upload(options) {
|
24
|
+
if (options == null) options = {};
|
25
|
+
for (option in options) {
|
26
|
+
this[option] = options[option];
|
27
|
+
}
|
28
|
+
this.handleFileSelect(document.getElementById(this.file_dom_selector));
|
29
|
+
}
|
30
|
+
|
31
|
+
S3Upload.prototype.handleFileSelect = function(file_element) {
|
32
|
+
var f, files, output, _i, _len, _results;
|
33
|
+
this.onProgress(0, 'Upload started.');
|
34
|
+
files = file_element.files;
|
35
|
+
output = [];
|
36
|
+
_results = [];
|
37
|
+
for (_i = 0, _len = files.length; _i < _len; _i++) {
|
38
|
+
f = files[_i];
|
39
|
+
_results.push(this.uploadFile(f));
|
40
|
+
}
|
41
|
+
return _results;
|
42
|
+
};
|
43
|
+
|
44
|
+
S3Upload.prototype.createCORSRequest = function(method, url) {
|
45
|
+
var xhr;
|
46
|
+
xhr = new XMLHttpRequest();
|
47
|
+
if (xhr.withCredentials != null) {
|
48
|
+
xhr.open(method, url, true);
|
49
|
+
} else if (typeof XDomainRequest !== "undefined") {
|
50
|
+
xhr = new XDomainRequest();
|
51
|
+
xhr.open(method, url);
|
52
|
+
} else {
|
53
|
+
xhr = null;
|
54
|
+
}
|
55
|
+
return xhr;
|
56
|
+
};
|
57
|
+
|
58
|
+
S3Upload.prototype.executeOnSignedUrl = function(file, callback) {
|
59
|
+
var this_s3upload, xhr;
|
60
|
+
this_s3upload = this;
|
61
|
+
xhr = new XMLHttpRequest();
|
62
|
+
xhr.open('GET', this.s3_sign_put_url + '?s3_object_type=' + file.type + '&s3_object_name=' + this.s3_object_name, true);
|
63
|
+
xhr.overrideMimeType('text/plain; charset=x-user-defined');
|
64
|
+
xhr.onreadystatechange = function(e) {
|
65
|
+
var result;
|
66
|
+
if (this.readyState === 4 && this.status === 200) {
|
67
|
+
try {
|
68
|
+
result = JSON.parse(this.responseText);
|
69
|
+
} catch (error) {
|
70
|
+
this_s3upload.onError('Signing server returned some ugly/empty JSON: "' + this.responseText + '"');
|
71
|
+
return false;
|
72
|
+
}
|
73
|
+
return callback(decodeURIComponent(result.signed_request), result.url);
|
74
|
+
} else if (this.readyState === 4 && this.status !== 200) {
|
75
|
+
return this_s3upload.onError('Could not contact request signing server. Status = ' + this.status);
|
76
|
+
}
|
77
|
+
};
|
78
|
+
return xhr.send();
|
79
|
+
};
|
80
|
+
|
81
|
+
S3Upload.prototype.uploadToS3 = function(file, url, public_url) {
|
82
|
+
var this_s3upload, xhr;
|
83
|
+
this_s3upload = this;
|
84
|
+
xhr = this.createCORSRequest('PUT', url);
|
85
|
+
if (!xhr) {
|
86
|
+
this.onError('CORS not supported');
|
87
|
+
} else {
|
88
|
+
xhr.onload = function() {
|
89
|
+
if (xhr.status === 200) {
|
90
|
+
this_s3upload.onProgress(100, 'Upload completed.');
|
91
|
+
return this_s3upload.onFinishS3Put(public_url);
|
92
|
+
} else {
|
93
|
+
return this_s3upload.onError('Upload error: ' + xhr.status);
|
94
|
+
}
|
95
|
+
};
|
96
|
+
xhr.onerror = function() {
|
97
|
+
return this_s3upload.onError('XHR error.');
|
98
|
+
};
|
99
|
+
xhr.upload.onprogress = function(e) {
|
100
|
+
var percentLoaded;
|
101
|
+
if (e.lengthComputable) {
|
102
|
+
percentLoaded = Math.round((e.loaded / e.total) * 100);
|
103
|
+
return this_s3upload.onProgress(percentLoaded, percentLoaded === 100 ? 'Finalizing.' : 'Uploading.');
|
104
|
+
}
|
105
|
+
};
|
106
|
+
}
|
107
|
+
xhr.setRequestHeader('Content-Type', file.type);
|
108
|
+
xhr.setRequestHeader('x-amz-acl', 'public-read');
|
109
|
+
return xhr.send(file);
|
110
|
+
};
|
111
|
+
|
112
|
+
S3Upload.prototype.uploadFile = function(file) {
|
113
|
+
var this_s3upload;
|
114
|
+
this_s3upload = this;
|
115
|
+
return this.executeOnSignedUrl(file, function(signedURL, publicURL) {
|
116
|
+
return this_s3upload.uploadToS3(file, signedURL, publicURL);
|
117
|
+
});
|
118
|
+
};
|
119
|
+
|
120
|
+
return S3Upload;
|
121
|
+
|
122
|
+
})();
|
123
|
+
|
124
|
+
}).call(this);
|
@@ -0,0 +1,269 @@
|
|
1
|
+
|
2
|
+
module Caboose
|
3
|
+
class ImagesController < ApplicationController
|
4
|
+
|
5
|
+
helper :application
|
6
|
+
|
7
|
+
def before_action
|
8
|
+
@page = Page.page_with_uri(request.host_with_port, '/admin')
|
9
|
+
end
|
10
|
+
|
11
|
+
# GET /admin/images
|
12
|
+
def admin_index
|
13
|
+
return if !user_is_allowed('images', 'view')
|
14
|
+
@domain = Domain.where(:domain => request.host_with_port).first
|
15
|
+
@media_category = @domain ? MediaCategory.top_image_category(@domain.site_id) : nil
|
16
|
+
render :layout => 'caboose/admin'
|
17
|
+
end
|
18
|
+
|
19
|
+
# GET /admin/images/new
|
20
|
+
def admin_new
|
21
|
+
return unless user_is_allowed('images', 'add')
|
22
|
+
@parent_id = params[:parent_id] ? params[:parent_id] : 1
|
23
|
+
@parent = Page.find(@parent_id)
|
24
|
+
render :layout => 'caboose/admin'
|
25
|
+
end
|
26
|
+
|
27
|
+
# GET /admin/images/:id
|
28
|
+
def admin_edit
|
29
|
+
return unless user_is_allowed('images', 'edit')
|
30
|
+
@page = Page.find(params[:id])
|
31
|
+
render :layout => 'caboose/admin'
|
32
|
+
end
|
33
|
+
|
34
|
+
# POST /admin/images
|
35
|
+
def admin_add
|
36
|
+
return unless user_is_allowed('images', 'add')
|
37
|
+
|
38
|
+
resp = Caboose::StdClass.new({
|
39
|
+
'error' => nil,
|
40
|
+
'redirect' => nil
|
41
|
+
})
|
42
|
+
|
43
|
+
parent_id = params[:parent_id]
|
44
|
+
title = params[:title]
|
45
|
+
|
46
|
+
if (title.strip.length == 0)
|
47
|
+
resp.error = "A page title is required."
|
48
|
+
elsif (!logged_in_user.is_allowed('all', 'all') &&
|
49
|
+
!Page.page_ids_with_permission(logged_in_user, 'edit' ).include?(parent_id) &&
|
50
|
+
!Page.page_ids_with_permission(logged_in_user, 'approve').include?(parent_id))
|
51
|
+
resp.error = "You don't have permission to add a page there."
|
52
|
+
end
|
53
|
+
if (!resp.error.nil?)
|
54
|
+
render :json => resp
|
55
|
+
return
|
56
|
+
end
|
57
|
+
|
58
|
+
parent = Caboose::Page.find(parent_id)
|
59
|
+
page = Caboose::Page.new
|
60
|
+
|
61
|
+
if parent.nil?
|
62
|
+
d = Domain.where(:domain => request.host_with_port).first.site_id
|
63
|
+
page.site_id = d.site_id
|
64
|
+
else
|
65
|
+
page.site_id = parent.site_id
|
66
|
+
end
|
67
|
+
|
68
|
+
page.title = title
|
69
|
+
page.parent_id = parent_id
|
70
|
+
page.hide = true
|
71
|
+
page.content_format = Caboose::Page::CONTENT_FORMAT_HTML
|
72
|
+
|
73
|
+
i = 0
|
74
|
+
begin
|
75
|
+
page.slug = Page.slug(page.title + (i > 0 ? " #{i}" : ""))
|
76
|
+
page.uri = parent.parent_id == -1 ? page.slug : "#{parent.uri}/#{page.slug}"
|
77
|
+
i = i+1
|
78
|
+
end while (Page.where(:uri => page.uri).count > 0 && i < 10)
|
79
|
+
|
80
|
+
page.save
|
81
|
+
|
82
|
+
# Create the top level block for the page
|
83
|
+
bt = BlockType.find(params[:block_type_id])
|
84
|
+
Block.create(:page_id => page.id, :block_type_id => params[:block_type_id], :name => bt.name)
|
85
|
+
|
86
|
+
# Set the new page's permissions
|
87
|
+
viewers = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'view' }).pluck(:role_id)
|
88
|
+
editors = Caboose::PagePermission.where({ :page_id => parent.id, :action => 'edit' }).pluck(:role_id)
|
89
|
+
Caboose::Page.update_authorized_for_action(page.id, 'view', viewers)
|
90
|
+
Caboose::Page.update_authorized_for_action(page.id, 'edit', editors)
|
91
|
+
|
92
|
+
# Send back the response
|
93
|
+
resp.redirect = "/admin/images/#{page.id}/edit"
|
94
|
+
render json: resp
|
95
|
+
end
|
96
|
+
|
97
|
+
# PUT /admin/images/:id
|
98
|
+
def admin_update
|
99
|
+
return unless user_is_allowed('images', 'edit')
|
100
|
+
|
101
|
+
resp = StdClass.new({'attributes' => {}})
|
102
|
+
page = Page.find(params[:id])
|
103
|
+
|
104
|
+
save = true
|
105
|
+
user = logged_in_user
|
106
|
+
params.each do |name, value|
|
107
|
+
case name
|
108
|
+
when 'parent_id'
|
109
|
+
value = value.to_i
|
110
|
+
if page.id == value
|
111
|
+
resp.error = "The page's parent cannot be itself."
|
112
|
+
elsif Page.is_child(page.id, value)
|
113
|
+
resp.error = "You can't set the current page's parent to be one of its child pages."
|
114
|
+
elsif value != page.parent_id
|
115
|
+
p = Page.find(value)
|
116
|
+
if !user.is_allowed(p, 'edit')
|
117
|
+
resp.error = "You don't have access to put the current page there."
|
118
|
+
end
|
119
|
+
end
|
120
|
+
if resp.error
|
121
|
+
save = false
|
122
|
+
else
|
123
|
+
page.parent = Page.find(value)
|
124
|
+
page.save
|
125
|
+
Page.update_uri(page)
|
126
|
+
resp.attributes['parent_id'] = { 'text' => page.parent.title }
|
127
|
+
end
|
128
|
+
|
129
|
+
when 'custom_css', 'custom_js'
|
130
|
+
value.strip!
|
131
|
+
page[name.to_sym] = value
|
132
|
+
|
133
|
+
when 'title', 'menu_title', 'hide', 'layout', 'redirect_url',
|
134
|
+
'seo_title', 'meta_description', 'fb_description', 'gp_description', 'canonical_url'
|
135
|
+
page[name.to_sym] = value
|
136
|
+
|
137
|
+
when 'linked_resources'
|
138
|
+
result = []
|
139
|
+
value.each_line do |line|
|
140
|
+
line.chomp!
|
141
|
+
line.strip!
|
142
|
+
next if line.empty?
|
143
|
+
|
144
|
+
if !(line.ends_with('.js') || line.ends_with('.css'))
|
145
|
+
resp.error = "Resource '#{line}' has an unsupported file type ('#{comps.last}')."
|
146
|
+
save = false
|
147
|
+
end
|
148
|
+
|
149
|
+
result << line
|
150
|
+
end
|
151
|
+
page.linked_resources = result.join("\n")
|
152
|
+
|
153
|
+
when 'content_format'
|
154
|
+
page.content_format = value
|
155
|
+
resp.attributes['content_format'] = { 'text' => value }
|
156
|
+
|
157
|
+
when 'meta_robots'
|
158
|
+
if (value.include?('index') && value.include?('noindex'))
|
159
|
+
resp.error = "You can't have both index and noindex"
|
160
|
+
save = false
|
161
|
+
elsif (value.include?('follow') && value.include?('nofollow'))
|
162
|
+
resp.error = "You can't have both follow and nofollow"
|
163
|
+
save = false
|
164
|
+
else
|
165
|
+
page.meta_robots = value.join(', ')
|
166
|
+
resp.attributes['meta_robots'] = { 'text' => page.meta_robots }
|
167
|
+
end
|
168
|
+
|
169
|
+
when 'content'
|
170
|
+
page.content = value.strip.gsub(/<meta.*?>/, '').gsub(/<link.*?>/, '').gsub(/\<\!--[\S\s]*?--\>/, '')
|
171
|
+
|
172
|
+
when 'slug'
|
173
|
+
page.slug = Page.slug(value.strip.length > 0 ? value : page.title)
|
174
|
+
page.save
|
175
|
+
Page.update_uri(page)
|
176
|
+
resp.attributes['slug'] = { 'value' => page.slug }
|
177
|
+
resp.attributes['uri'] = { 'value' => page.uri }
|
178
|
+
|
179
|
+
when 'alias'
|
180
|
+
page.alias = Page.slug(value.strip)
|
181
|
+
page.save
|
182
|
+
Page.update_uri(page)
|
183
|
+
resp.attributes['slug'] = { 'value' => page.slug }
|
184
|
+
resp.attributes['uri'] = { 'value' => page.uri }
|
185
|
+
|
186
|
+
when 'custom_sort_children'
|
187
|
+
if (value == 0)
|
188
|
+
page.children.each do |p|
|
189
|
+
p.sort_order = 1
|
190
|
+
p.save
|
191
|
+
end
|
192
|
+
end
|
193
|
+
page.custom_sort_children = value
|
194
|
+
|
195
|
+
when 'viewers'
|
196
|
+
Page.update_authorized_for_action(page.id, 'view', value)
|
197
|
+
when 'editors'
|
198
|
+
Page.update_authorized_for_action(page.id, 'edit', value)
|
199
|
+
when 'approvers'
|
200
|
+
Page.update_authorized_for_action(page.id, 'approve', value)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
resp.success = save && page.save
|
205
|
+
render json: resp
|
206
|
+
end
|
207
|
+
|
208
|
+
# DELETE /admin/images/1
|
209
|
+
def admin_delete
|
210
|
+
return unless user_is_allowed('images', 'delete')
|
211
|
+
p = Page.find(params[:id])
|
212
|
+
p.destroy
|
213
|
+
|
214
|
+
resp = StdClass.new({
|
215
|
+
'redirect' => '/admin/images'
|
216
|
+
})
|
217
|
+
render json: resp
|
218
|
+
end
|
219
|
+
|
220
|
+
# PUT /admin/images/sign-s3
|
221
|
+
def admin_sign_s3
|
222
|
+
return unless user_is_allowed('images', 'add')
|
223
|
+
|
224
|
+
config = YAML.load(File.read(Rails.root.join('config', 'aws.yml')))[Rails.env]
|
225
|
+
Caboose.log(config)
|
226
|
+
access_key = config['access_key_id']
|
227
|
+
secret_key = config['secret_access_key']
|
228
|
+
bucket = config['bucket']
|
229
|
+
s3 = AWS::S3.new(
|
230
|
+
:access_key_id => access_key,
|
231
|
+
:secret_access_key => secret_key
|
232
|
+
)
|
233
|
+
|
234
|
+
object_name = params[:s3_object_name]
|
235
|
+
mime_type = params[:s3_object_type]
|
236
|
+
|
237
|
+
#expires = (DateTime.now.utc + 10.seconds).to_i
|
238
|
+
#amz_headers = "x-amz-acl:public-read"
|
239
|
+
#put_request = "PUT\n\n#{mime_type}\n#{expires}\n#{amz_headers}\n/#{bucket}/media-images/#{object_name}"
|
240
|
+
#signature = CGI.escape(Base64.encode64("#{OpenSSL::HMAC.digest('sha1', secret_key, put_request)}\n"))
|
241
|
+
##signature = base64.encodestring(hmac.new(secret_key, put_request, sha1).digest())
|
242
|
+
##signature = urllib.quote_plus(signature.strip())
|
243
|
+
#render :json => {
|
244
|
+
# 'signed_request' => "#{url}?AWSAccessKeyId=#{access_key}&Expires=#{expires}&Signature=#{signature}",
|
245
|
+
# 'url' => url
|
246
|
+
#}
|
247
|
+
|
248
|
+
pp = AWS::S3::PresignedPost.new(s3.buckets[bucket],
|
249
|
+
:key => "media-images/#{object_name}",
|
250
|
+
:expires => DateTime.now + 10.seconds,
|
251
|
+
:content_type => mime_type
|
252
|
+
)
|
253
|
+
url = "#{pp.url.to_s}#{pp.key}" #"https://#{pp.bucket.name}.s3.amazonaws.com/#{pp.key}"
|
254
|
+
render :json => {
|
255
|
+
'signed_request' => "#{url}?AWSAccessKeyId=#{access_key}&Expires=#{pp.expires.to_time.to_i}&Signature=#{pp.fields[:signature]}",
|
256
|
+
'url' => url
|
257
|
+
}
|
258
|
+
|
259
|
+
@s3_direct_post = S3_BUCKET.presigned_post(
|
260
|
+
:key => "uploads/#{SecureRandom.uuid}/${filename}",
|
261
|
+
:success_action_status => 201,
|
262
|
+
:acl => :public_read
|
263
|
+
)
|
264
|
+
|
265
|
+
|
266
|
+
end
|
267
|
+
|
268
|
+
end
|
269
|
+
end
|