ideyabox 0.1.2 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +11 -1
- data/app/assets/javascripts/default.js +24 -0
- data/app/assets/javascripts/jquery.Jcrop.min.js +22 -0
- data/app/assets/javascripts/jquery.color.js +123 -0
- data/app/assets/stylesheets/Jcrop.gif +0 -0
- data/app/assets/stylesheets/default.scss.erb +6 -0
- data/app/assets/stylesheets/jquery.Jcrop.css +86 -0
- data/app/helpers/admin_helper.rb +4 -2
- data/ideyabox.gemspec +10 -10
- data/lib/generators/ideyabox/admin/templates/assets/admin.js +3 -0
- data/lib/generators/ideyabox/crop/crop_generator.rb +195 -0
- data/lib/generators/ideyabox/crop/templates/_crop.html.haml +17 -0
- data/lib/generators/ideyabox/images_scaffold/images_scaffold_generator.rb +5 -1
- data/lib/generators/ideyabox/images_scaffold/templates/controllers/controller.rb +1 -1
- data/lib/generators/ideyabox/images_scaffold/templates/views/_images.html.haml +2 -2
- data/lib/generators/ideyabox/images_scaffold/templates/views/edit.html.haml +4 -1
- data/lib/ideyabox/version.rb +1 -1
- metadata +9 -163
data/README.md
CHANGED
@@ -27,7 +27,9 @@ Hey, people!
|
|
27
27
|
|
28
28
|
It's simple like this:
|
29
29
|
|
30
|
-
|
30
|
+
### Generating admin layout
|
31
|
+
|
32
|
+
After installation generate all administrative staff (flag -f is for forced replacement of some files)
|
31
33
|
|
32
34
|
$ rails g ideyabox:admin -f
|
33
35
|
|
@@ -45,6 +47,14 @@ like this
|
|
45
47
|
root :to => "guests#index"
|
46
48
|
end
|
47
49
|
|
50
|
+
### Generating admin assets
|
51
|
+
|
52
|
+
### Admin Scaffold
|
53
|
+
|
54
|
+
### Views for associated images
|
55
|
+
|
56
|
+
### Crop functionality
|
57
|
+
|
48
58
|
## TODO
|
49
59
|
|
50
60
|
1. Add search engine
|
@@ -2,6 +2,8 @@
|
|
2
2
|
//= require jquery
|
3
3
|
//= require jquery-ui
|
4
4
|
//= require jquery_ujs
|
5
|
+
//= require jquery.Jcrop.min.js
|
6
|
+
//= require jquery.color.js
|
5
7
|
//= require swfobject.js
|
6
8
|
//= require jquery.uploadify.min
|
7
9
|
//= require jquery-ui.min.js
|
@@ -10,9 +12,12 @@
|
|
10
12
|
|
11
13
|
//
|
12
14
|
$(document).ready(function(){
|
15
|
+
|
13
16
|
$(".chosen_select").chosen();
|
14
17
|
$('.pagination').hide();
|
15
18
|
|
19
|
+
|
20
|
+
|
16
21
|
$('.zebra th a').live('click', function () {
|
17
22
|
$.getScript(this.href);
|
18
23
|
return false;
|
@@ -57,4 +62,23 @@ $(document).ready(function(){
|
|
57
62
|
data.context.html('<span>Загрузка файла <strong>\'' + file.name + '\'</strong> завершена.</span>');
|
58
63
|
}
|
59
64
|
});
|
65
|
+
|
66
|
+
$('#rehook').on('click', function(e){
|
67
|
+
e.preventDefault();
|
68
|
+
$('#unhook').show();
|
69
|
+
$(this).hide();
|
70
|
+
$('.preview_crop').show();
|
71
|
+
$(".cropable").attr('id','cropbox');
|
72
|
+
jcropInit();
|
73
|
+
});
|
74
|
+
|
75
|
+
$('#unhook').on('click', function(e){
|
76
|
+
e.preventDefault();
|
77
|
+
$('#rehook').show();
|
78
|
+
$('.preview_crop').hide();
|
79
|
+
$(this).hide();
|
80
|
+
$(".cropable").removeAttr('id');
|
81
|
+
$('.crop_params input').val('');
|
82
|
+
});
|
83
|
+
|
60
84
|
});
|
@@ -0,0 +1,22 @@
|
|
1
|
+
/**
|
2
|
+
* jquery.Jcrop.min.js v0.9.10 (build:20120429)
|
3
|
+
* jQuery Image Cropping Plugin - released under MIT License
|
4
|
+
* Copyright (c) 2008-2012 Tapmodo Interactive LLC
|
5
|
+
* https://github.com/tapmodo/Jcrop
|
6
|
+
*/
|
7
|
+
(function(a){a.Jcrop=function(b,c){function h(a){return a+"px"}function i(a){return d.baseClass+"-"+a}function j(){return a.fx.step.hasOwnProperty("backgroundColor")}function k(b){var c=a(b).offset();return[c.left,c.top]}function l(a){return[a.pageX-e[0],a.pageY-e[1]]}function m(b){typeof b!="object"&&(b={}),d=a.extend(d,b),a.each(["onChange","onSelect","onRelease","onDblClick"],function(a,b){typeof d[b]!="function"&&(d[b]=function(){})})}function n(a,b){e=k(E),bd.setCursor(a==="move"?a:a+"-resize");if(a==="move")return bd.activateHandlers(p(b),u);var c=ba.getFixed(),d=q(a),f=ba.getCorner(q(d));ba.setPressed(ba.getCorner(d)),ba.setCurrent(f),bd.activateHandlers(o(a,c),u)}function o(a,b){return function(c){if(!d.aspectRatio)switch(a){case"e":c[1]=b.y2;break;case"w":c[1]=b.y2;break;case"n":c[0]=b.x2;break;case"s":c[0]=b.x2}else switch(a){case"e":c[1]=b.y+1;break;case"w":c[1]=b.y+1;break;case"n":c[0]=b.x+1;break;case"s":c[0]=b.x+1}ba.setCurrent(c),bc.update()}}function p(a){var b=a;return be.watchKeys(),function(
|
8
|
+
a){ba.moveOffset([a[0]-b[0],a[1]-b[1]]),b=a,bc.update()}}function q(a){switch(a){case"n":return"sw";case"s":return"nw";case"e":return"nw";case"w":return"ne";case"ne":return"sw";case"nw":return"se";case"se":return"nw";case"sw":return"ne"}}function r(a){return function(b){return d.disabled?!1:a==="move"&&!d.allowMove?!1:(e=k(E),X=!0,n(a,l(b)),b.stopPropagation(),b.preventDefault(),!1)}}function s(a,b,c){var d=a.width(),e=a.height();d>b&&b>0&&(d=b,e=b/a.width()*a.height()),e>c&&c>0&&(e=c,d=c/a.height()*a.width()),U=a.width()/d,V=a.height()/e,a.width(d).height(e)}function t(a){return{x:a.x*U,y:a.y*V,x2:a.x2*U,y2:a.y2*V,w:a.w*U,h:a.h*V}}function u(a){var b=ba.getFixed();b.w>d.minSelect[0]&&b.h>d.minSelect[1]?(bc.enableHandles(),bc.done()):bc.release(),bd.setCursor(d.allowSelect?"crosshair":"default")}function v(a){if(d.disabled)return!1;if(!d.allowSelect)return!1;X=!0,e=k(E),bc.disableHandles(),bd.setCursor("crosshair");var b=l(a);return ba.setPressed(b),bc.update(),bd.activateHandlers(w,u),be.watchKeys(),a.stopPropagation
|
9
|
+
(),a.preventDefault(),!1}function w(a){ba.setCurrent(a),bc.update()}function z(){var b=a("<div></div>").addClass(i("tracker"));return a.browser.msie&&b.css({opacity:0,backgroundColor:"white"}),b}function bf(a){H.removeClass().addClass(i("holder")).addClass(a)}function bg(a,b){function t(){window.setTimeout(u,l)}var c=a[0]/U,e=a[1]/V,f=a[2]/U,g=a[3]/V;if(Y)return;var h=ba.flipCoords(c,e,f,g),i=ba.getFixed(),j=[i.x,i.y,i.x2,i.y2],k=j,l=d.animationDelay,m=h[0]-j[0],n=h[1]-j[1],o=h[2]-j[2],p=h[3]-j[3],q=0,r=d.swingSpeed;x=k[0],y=k[1],f=k[2],g=k[3],bc.animMode(!0);var s,u=function(){return function(){q+=(100-q)/r,k[0]=x+q/100*m,k[1]=y+q/100*n,k[2]=f+q/100*o,k[3]=g+q/100*p,q>=99.8&&(q=100),q<100?(bi(k),t()):(bc.done(),typeof b=="function"&&b.call(bt))}}();t()}function bh(a){bi([a[0]/U,a[1]/V,a[2]/U,a[3]/V]),d.onSelect.call(bt,t(ba.getFixed())),bc.enableHandles()}function bi(a){ba.setPressed([a[0],a[1]]),ba.setCurrent([a[2],a[3]]),bc.update()}function bj(){return t(ba.getFixed())}function bk(){return ba.getFixed()}function bl
|
10
|
+
(a){m(a),bs()}function bm(){d.disabled=!0,bc.disableHandles(),bc.setCursor("default"),bd.setCursor("default")}function bn(){d.disabled=!1,bs()}function bo(){bc.done(),bd.activateHandlers(null,null)}function bp(){H.remove(),B.show(),a(b).removeData("Jcrop")}function bq(a,b){bc.release(),bm();var c=new Image;c.onload=function(){var e=c.width,f=c.height,g=d.boxWidth,h=d.boxHeight;E.width(e).height(f),E.attr("src",a),I.attr("src",a),s(E,g,h),F=E.width(),G=E.height(),I.width(F).height(G),N.width(F+M*2).height(G+M*2),H.width(F).height(G),bb.resize(F,G),bn(),typeof b=="function"&&b.call(bt)},c.src=a}function br(a,b,c){var e=b||d.bgColor;d.bgFade&&j()&&d.fadeTime&&!c?a.animate({backgroundColor:e},{queue:!1,duration:d.fadeTime}):a.css("backgroundColor",e)}function bs(a){d.allowResize?a?bc.enableOnly():bc.enableHandles():bc.disableHandles(),bd.setCursor(d.allowSelect?"crosshair":"default"),bc.setCursor(d.allowMove?"move":"default"),d.hasOwnProperty("trueSize")&&(U=d.trueSize[0]/F,V=d.trueSize[1]/G),d.hasOwnProperty("setSelect"
|
11
|
+
)&&(bh(d.setSelect),bc.done(),delete d.setSelect),bb.refresh(),d.bgColor!=O&&(br(d.shade?bb.getShades():H,d.shade?d.shadeColor||d.bgColor:d.bgColor),O=d.bgColor),P!=d.bgOpacity&&(P=d.bgOpacity,d.shade?bb.refresh():bc.setBgOpacity(P)),Q=d.maxSize[0]||0,R=d.maxSize[1]||0,S=d.minSize[0]||0,T=d.minSize[1]||0,d.hasOwnProperty("outerImage")&&(E.attr("src",d.outerImage),delete d.outerImage),bc.refresh()}var d=a.extend({},a.Jcrop.defaults),e,f,g=!1;a.browser.msie&&a.browser.version.split(".")[0]==="6"&&(g=!0),typeof b!="object"&&(b=a(b)[0]),typeof c!="object"&&(c={}),m(c);var A={border:"none",visibility:"visible",margin:0,padding:0,position:"absolute",top:0,left:0},B=a(b),C=!0;if(b.tagName=="IMG"){if(B[0].width!=0&&B[0].height!=0)B.width(B[0].width),B.height(B[0].height);else{var D=new Image;D.src=B[0].src,B.width(D.width),B.height(D.height)}var E=B.clone().removeAttr("id").css(A).show();E.width(B.width()),E.height(B.height()),B.after(E).hide()}else E=B.css(A).show(),C=!1,d.shade===null&&(d.shade=!0);s(E,d.boxWidth,d.
|
12
|
+
boxHeight);var F=E.width(),G=E.height(),H=a("<div />").width(F).height(G).addClass(i("holder")).css({position:"relative",backgroundColor:d.bgColor}).insertAfter(B).append(E);d.addClass&&H.addClass(d.addClass);var I=a("<div />"),J=a("<div />").width("100%").height("100%").css({zIndex:310,position:"absolute",overflow:"hidden"}),K=a("<div />").width("100%").height("100%").css("zIndex",320),L=a("<div />").css({position:"absolute",zIndex:600}).dblclick(function(){var a=ba.getFixed();d.onDblClick.call(bt,a)}).insertBefore(E).append(J,K);C&&(I=a("<img />").attr("src",E.attr("src")).css(A).width(F).height(G),J.append(I)),g&&L.css({overflowY:"hidden"});var M=d.boundary,N=z().width(F+M*2).height(G+M*2).css({position:"absolute",top:h(-M),left:h(-M),zIndex:290}).mousedown(v),O=d.bgColor,P=d.bgOpacity,Q,R,S,T,U,V,W=!0,X,Y,Z;e=k(E);var _=function(){function a(){var a={},b=["touchstart","touchmove","touchend"],c=document.createElement("div"),d;try{for(d=0;d<b.length;d++){var e=b[d];e="on"+e;var f=e in c;f||(c.setAttribute(e,"return;"
|
13
|
+
),f=typeof c[e]=="function"),a[b[d]]=f}return a.touchstart&&a.touchend&&a.touchmove}catch(g){return!1}}function b(){return d.touchSupport===!0||d.touchSupport===!1?d.touchSupport:a()}return{createDragger:function(a){return function(b){return b.pageX=b.originalEvent.changedTouches[0].pageX,b.pageY=b.originalEvent.changedTouches[0].pageY,d.disabled?!1:a==="move"&&!d.allowMove?!1:(X=!0,n(a,l(b)),b.stopPropagation(),b.preventDefault(),!1)}},newSelection:function(a){return a.pageX=a.originalEvent.changedTouches[0].pageX,a.pageY=a.originalEvent.changedTouches[0].pageY,v(a)},isSupported:a,support:b()}}(),ba=function(){function h(d){d=n(d),c=a=d[0],e=b=d[1]}function i(a){a=n(a),f=a[0]-c,g=a[1]-e,c=a[0],e=a[1]}function j(){return[f,g]}function k(d){var f=d[0],g=d[1];0>a+f&&(f-=f+a),0>b+g&&(g-=g+b),G<e+g&&(g+=G-(e+g)),F<c+f&&(f+=F-(c+f)),a+=f,c+=f,b+=g,e+=g}function l(a){var b=m();switch(a){case"ne":return[b.x2,b.y];case"nw":return[b.x,b.y];case"se":return[b.x2,b.y2];case"sw":return[b.x,b.y2]}}function m(){if(!d.aspectRatio
|
14
|
+
)return p();var f=d.aspectRatio,g=d.minSize[0]/U,h=d.maxSize[0]/U,i=d.maxSize[1]/V,j=c-a,k=e-b,l=Math.abs(j),m=Math.abs(k),n=l/m,r,s,t,u;return h===0&&(h=F*10),i===0&&(i=G*10),n<f?(s=e,t=m*f,r=j<0?a-t:t+a,r<0?(r=0,u=Math.abs((r-a)/f),s=k<0?b-u:u+b):r>F&&(r=F,u=Math.abs((r-a)/f),s=k<0?b-u:u+b)):(r=c,u=l/f,s=k<0?b-u:b+u,s<0?(s=0,t=Math.abs((s-b)*f),r=j<0?a-t:t+a):s>G&&(s=G,t=Math.abs(s-b)*f,r=j<0?a-t:t+a)),r>a?(r-a<g?r=a+g:r-a>h&&(r=a+h),s>b?s=b+(r-a)/f:s=b-(r-a)/f):r<a&&(a-r<g?r=a-g:a-r>h&&(r=a-h),s>b?s=b+(a-r)/f:s=b-(a-r)/f),r<0?(a-=r,r=0):r>F&&(a-=r-F,r=F),s<0?(b-=s,s=0):s>G&&(b-=s-G,s=G),q(o(a,b,r,s))}function n(a){return a[0]<0&&(a[0]=0),a[1]<0&&(a[1]=0),a[0]>F&&(a[0]=F),a[1]>G&&(a[1]=G),[a[0],a[1]]}function o(a,b,c,d){var e=a,f=c,g=b,h=d;return c<a&&(e=c,f=a),d<b&&(g=d,h=b),[e,g,f,h]}function p(){var d=c-a,f=e-b,g;return Q&&Math.abs(d)>Q&&(c=d>0?a+Q:a-Q),R&&Math.abs(f)>R&&(e=f>0?b+R:b-R),T/V&&Math.abs(f)<T/V&&(e=f>0?b+T/V:b-T/V),S/U&&Math.abs(d)<S/U&&(c=d>0?a+S/U:a-S/U),a<0&&(c-=a,a-=a),b<0&&(e-=b,b-=b),c<0&&
|
15
|
+
(a-=c,c-=c),e<0&&(b-=e,e-=e),c>F&&(g=c-F,a-=g,c-=g),e>G&&(g=e-G,b-=g,e-=g),a>F&&(g=a-G,e-=g,b-=g),b>G&&(g=b-G,e-=g,b-=g),q(o(a,b,c,e))}function q(a){return{x:a[0],y:a[1],x2:a[2],y2:a[3],w:a[2]-a[0],h:a[3]-a[1]}}var a=0,b=0,c=0,e=0,f,g;return{flipCoords:o,setPressed:h,setCurrent:i,getOffset:j,moveOffset:k,getCorner:l,getFixed:m}}(),bb=function(){function f(a,b){e.left.css({height:h(b)}),e.right.css({height:h(b)})}function g(){return i(ba.getFixed())}function i(a){e.top.css({left:h(a.x),width:h(a.w),height:h(a.y)}),e.bottom.css({top:h(a.y2),left:h(a.x),width:h(a.w),height:h(G-a.y2)}),e.right.css({left:h(a.x2),width:h(F-a.x2)}),e.left.css({width:h(a.x)})}function j(){return a("<div />").css({position:"absolute",backgroundColor:d.shadeColor||d.bgColor}).appendTo(c)}function k(){b||(b=!0,c.insertBefore(E),g(),bc.setBgOpacity(1,0,1),I.hide(),l(d.shadeColor||d.bgColor,1),bc.isAwake()?n(d.bgOpacity,1):n(1,1))}function l(a,b){br(p(),a,b)}function m(){b&&(c.remove(),I.show(),b=!1,bc.isAwake()?bc.setBgOpacity(d.bgOpacity
|
16
|
+
,1,1):(bc.setBgOpacity(1,1,1),bc.disableHandles()),br(H,0,1))}function n(a,e){b&&(d.bgFade&&!e?c.animate({opacity:1-a},{queue:!1,duration:d.fadeTime}):c.css({opacity:1-a}))}function o(){d.shade?k():m(),bc.isAwake()&&n(d.bgOpacity)}function p(){return c.children()}var b=!1,c=a("<div />").css({position:"absolute",zIndex:240,opacity:0}),e={top:j(),left:j().height(G),right:j().height(G),bottom:j()};return{update:g,updateRaw:i,getShades:p,setBgColor:l,enable:k,disable:m,resize:f,refresh:o,opacity:n}}(),bc=function(){function k(b){var c=a("<div />").css({position:"absolute",opacity:d.borderOpacity}).addClass(i(b));return J.append(c),c}function l(b,c){var d=a("<div />").mousedown(r(b)).css({cursor:b+"-resize",position:"absolute",zIndex:c}).addClass("ord-"+b);return _.support&&d.bind("touchstart.jcrop",_.createDragger(b)),K.append(d),d}function m(a){var b=d.handleSize;return l(a,c++).css({opacity:d.handleOpacity}).width(b).height(b).addClass(i("handle"))}function n(a){return l(a,c++).addClass("jcrop-dragbar")}function o
|
17
|
+
(a){var b;for(b=0;b<a.length;b++)g[a[b]]=n(a[b])}function p(a){var b,c;for(c=0;c<a.length;c++){switch(a[c]){case"n":b="hline";break;case"s":b="hline bottom";break;case"e":b="vline right";break;case"w":b="vline"}e[a[c]]=k(b)}}function q(a){var b;for(b=0;b<a.length;b++)f[a[b]]=m(a[b])}function s(a,b){d.shade||I.css({top:h(-b),left:h(-a)}),L.css({top:h(b),left:h(a)})}function u(a,b){L.width(a).height(b)}function v(){var a=ba.getFixed();ba.setPressed([a.x,a.y]),ba.setCurrent([a.x2,a.y2]),w()}function w(a){if(b)return x(a)}function x(a){var c=ba.getFixed();u(c.w,c.h),s(c.x,c.y),d.shade&&bb.updateRaw(c),b||A(),a?d.onSelect.call(bt,t(c)):d.onChange.call(bt,t(c))}function y(a,c,e){if(!b&&!c)return;d.bgFade&&!e?E.animate({opacity:a},{queue:!1,duration:d.fadeTime}):E.css("opacity",a)}function A(){L.show(),d.shade?bb.opacity(P):y(P,!0),b=!0}function B(){F(),L.hide(),d.shade?bb.opacity(1):y(1),b=!1,d.onRelease.call(bt)}function C(){j&&K.show()}function D(){j=!0;if(d.allowResize)return K.show(),!0}function F(){j=!1,K.hide(
|
18
|
+
)}function G(a){Y===a?F():D()}function H(){G(!1),v()}var b,c=370,e={},f={},g={},j=!1;d.dragEdges&&a.isArray(d.createDragbars)&&o(d.createDragbars),a.isArray(d.createHandles)&&q(d.createHandles),d.drawBorders&&a.isArray(d.createBorders)&&p(d.createBorders),a(document).bind("touchstart.jcrop-ios",function(b){a(b.currentTarget).hasClass("jcrop-tracker")&&b.stopPropagation()});var M=z().mousedown(r("move")).css({cursor:"move",position:"absolute",zIndex:360});return _.support&&M.bind("touchstart.jcrop",_.createDragger("move")),J.append(M),F(),{updateVisible:w,update:x,release:B,refresh:v,isAwake:function(){return b},setCursor:function(a){M.css("cursor",a)},enableHandles:D,enableOnly:function(){j=!0},showHandles:C,disableHandles:F,animMode:G,setBgOpacity:y,done:H}}(),bd=function(){function f(){N.css({zIndex:450}),_.support&&a(document).bind("touchmove.jcrop",k).bind("touchend.jcrop",m),e&&a(document).bind("mousemove.jcrop",h).bind("mouseup.jcrop",i)}function g(){N.css({zIndex:290}),a(document).unbind(".jcrop")}function h
|
19
|
+
(a){return b(l(a)),!1}function i(a){return a.preventDefault(),a.stopPropagation(),X&&(X=!1,c(l(a)),bc.isAwake()&&d.onSelect.call(bt,t(ba.getFixed())),g(),b=function(){},c=function(){}),!1}function j(a,d){return X=!0,b=a,c=d,f(),!1}function k(a){return a.pageX=a.originalEvent.changedTouches[0].pageX,a.pageY=a.originalEvent.changedTouches[0].pageY,h(a)}function m(a){return a.pageX=a.originalEvent.changedTouches[0].pageX,a.pageY=a.originalEvent.changedTouches[0].pageY,i(a)}function n(a){N.css("cursor",a)}var b=function(){},c=function(){},e=d.trackDocument;return e||N.mousemove(h).mouseup(i).mouseout(i),E.before(N),{activateHandlers:j,setCursor:n}}(),be=function(){function e(){d.keySupport&&(b.show(),b.focus())}function f(a){b.hide()}function h(a,b,c){d.allowMove&&(ba.moveOffset([b,c]),bc.updateVisible(!0)),a.preventDefault(),a.stopPropagation()}function i(a){if(a.ctrlKey||a.metaKey)return!0;Z=a.shiftKey?!0:!1;var b=Z?10:1;switch(a.keyCode){case 37:h(a,-b,0);break;case 39:h(a,b,0);break;case 38:h(a,0,-b);break;case 40
|
20
|
+
:h(a,0,b);break;case 27:d.allowSelect&&bc.release();break;case 9:return!0}return!1}var b=a('<input type="radio" />').css({position:"fixed",left:"-120px",width:"12px"}),c=a("<div />").css({position:"absolute",overflow:"hidden"}).append(b);return d.keySupport&&(b.keydown(i).blur(f),g||!d.fixedSupport?(b.css({position:"absolute",left:"-20px"}),c.append(b).insertBefore(E)):b.insertBefore(E)),{watchKeys:e}}();_.support&&N.bind("touchstart.jcrop",_.newSelection),K.hide(),bs(!0);var bt={setImage:bq,animateTo:bg,setSelect:bh,setOptions:bl,tellSelect:bj,tellScaled:bk,setClass:bf,disable:bm,enable:bn,cancel:bo,release:bc.release,destroy:bp,focus:be.watchKeys,getBounds:function(){return[F*U,G*V]},getWidgetSize:function(){return[F,G]},getScaleFactor:function(){return[U,V]},getOptions:function(){return d},ui:{holder:H,selection:L}};return a.browser.msie&&H.bind("selectstart",function(){return!1}),B.data("Jcrop",bt),bt},a.fn.Jcrop=function(b,c){var d;return this.each(function(){if(a(this).data("Jcrop")){if(b==="api")return a
|
21
|
+
(this).data("Jcrop");a(this).data("Jcrop").setOptions(b)}else this.tagName=="IMG"?a.Jcrop.Loader(this,function(){a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d)}):(a(this).css({display:"block",visibility:"hidden"}),d=a.Jcrop(this,b),a.isFunction(c)&&c.call(d))}),this},a.Jcrop.Loader=function(b,c,d){function g(){f.complete?(e.unbind(".jcloader"),a.isFunction(c)&&c.call(f)):window.setTimeout(g,50)}var e=a(b),f=e[0];e.bind("load.jcloader",g).bind("error.jcloader",function(b){e.unbind(".jcloader"),a.isFunction(d)&&d.call(f)}),f.complete&&a.isFunction(c)&&(e.unbind(".jcloader"),c.call(f))},a.Jcrop.defaults={allowSelect:!0,allowMove:!0,allowResize:!0,trackDocument:!0,baseClass:"jcrop",addClass:null,bgColor:"black",bgOpacity:.6,bgFade:!1,borderOpacity:.4,handleOpacity:.5,handleSize:7,aspectRatio:0,keySupport:!0,createHandles:["n","s","e","w","nw","ne","se","sw"],createDragbars:["n","s","e","w"],createBorders:["n","s","e","w"],drawBorders:!0,dragEdges:!0,fixedSupport:!0,
|
22
|
+
touchSupport:null,shade:null,boxWidth:0,boxHeight:0,boundary:2,fadeTime:400,animationDelay:20,swingSpeed:3,minSelect:[0,0],maxSize:[0,0],minSize:[0,0],onChange:function(){},onSelect:function(){},onDblClick:function(){},onRelease:function(){}}})(jQuery);
|
@@ -0,0 +1,123 @@
|
|
1
|
+
/*
|
2
|
+
* jQuery Color Animations
|
3
|
+
* Copyright 2007 John Resig
|
4
|
+
* Released under the MIT and GPL licenses.
|
5
|
+
*/
|
6
|
+
|
7
|
+
(function(jQuery){
|
8
|
+
|
9
|
+
// We override the animation for all of these color styles
|
10
|
+
jQuery.each(['backgroundColor', 'borderBottomColor', 'borderLeftColor', 'borderRightColor', 'borderTopColor', 'color', 'outlineColor'], function(i,attr){
|
11
|
+
jQuery.fx.step[attr] = function(fx){
|
12
|
+
if ( fx.state == 0 ) {
|
13
|
+
fx.start = getColor( fx.elem, attr );
|
14
|
+
fx.end = getRGB( fx.end );
|
15
|
+
}
|
16
|
+
|
17
|
+
fx.elem.style[attr] = "rgb(" + [
|
18
|
+
Math.max(Math.min( parseInt((fx.pos * (fx.end[0] - fx.start[0])) + fx.start[0]), 255), 0),
|
19
|
+
Math.max(Math.min( parseInt((fx.pos * (fx.end[1] - fx.start[1])) + fx.start[1]), 255), 0),
|
20
|
+
Math.max(Math.min( parseInt((fx.pos * (fx.end[2] - fx.start[2])) + fx.start[2]), 255), 0)
|
21
|
+
].join(",") + ")";
|
22
|
+
}
|
23
|
+
});
|
24
|
+
|
25
|
+
// Color Conversion functions from highlightFade
|
26
|
+
// By Blair Mitchelmore
|
27
|
+
// http://jquery.offput.ca/highlightFade/
|
28
|
+
|
29
|
+
// Parse strings looking for color tuples [255,255,255]
|
30
|
+
function getRGB(color) {
|
31
|
+
var result;
|
32
|
+
|
33
|
+
// Check if we're already dealing with an array of colors
|
34
|
+
if ( color && color.constructor == Array && color.length == 3 )
|
35
|
+
return color;
|
36
|
+
|
37
|
+
// Look for rgb(num,num,num)
|
38
|
+
if (result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(color))
|
39
|
+
return [parseInt(result[1]), parseInt(result[2]), parseInt(result[3])];
|
40
|
+
|
41
|
+
// Look for rgb(num%,num%,num%)
|
42
|
+
if (result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec(color))
|
43
|
+
return [parseFloat(result[1])*2.55, parseFloat(result[2])*2.55, parseFloat(result[3])*2.55];
|
44
|
+
|
45
|
+
// Look for #a0b1c2
|
46
|
+
if (result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(color))
|
47
|
+
return [parseInt(result[1],16), parseInt(result[2],16), parseInt(result[3],16)];
|
48
|
+
|
49
|
+
// Look for #fff
|
50
|
+
if (result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec(color))
|
51
|
+
return [parseInt(result[1]+result[1],16), parseInt(result[2]+result[2],16), parseInt(result[3]+result[3],16)];
|
52
|
+
|
53
|
+
// Otherwise, we're most likely dealing with a named color
|
54
|
+
return colors[jQuery.trim(color).toLowerCase()];
|
55
|
+
}
|
56
|
+
|
57
|
+
function getColor(elem, attr) {
|
58
|
+
var color;
|
59
|
+
|
60
|
+
do {
|
61
|
+
color = jQuery.curCSS(elem, attr);
|
62
|
+
|
63
|
+
// Keep going until we find an element that has color, or we hit the body
|
64
|
+
if ( color != '' && color != 'transparent' || jQuery.nodeName(elem, "body") )
|
65
|
+
break;
|
66
|
+
|
67
|
+
attr = "backgroundColor";
|
68
|
+
} while ( elem = elem.parentNode );
|
69
|
+
|
70
|
+
return getRGB(color);
|
71
|
+
};
|
72
|
+
|
73
|
+
// Some named colors to work with
|
74
|
+
// From Interface by Stefan Petre
|
75
|
+
// http://interface.eyecon.ro/
|
76
|
+
|
77
|
+
var colors = {
|
78
|
+
aqua:[0,255,255],
|
79
|
+
azure:[240,255,255],
|
80
|
+
beige:[245,245,220],
|
81
|
+
black:[0,0,0],
|
82
|
+
blue:[0,0,255],
|
83
|
+
brown:[165,42,42],
|
84
|
+
cyan:[0,255,255],
|
85
|
+
darkblue:[0,0,139],
|
86
|
+
darkcyan:[0,139,139],
|
87
|
+
darkgrey:[169,169,169],
|
88
|
+
darkgreen:[0,100,0],
|
89
|
+
darkkhaki:[189,183,107],
|
90
|
+
darkmagenta:[139,0,139],
|
91
|
+
darkolivegreen:[85,107,47],
|
92
|
+
darkorange:[255,140,0],
|
93
|
+
darkorchid:[153,50,204],
|
94
|
+
darkred:[139,0,0],
|
95
|
+
darksalmon:[233,150,122],
|
96
|
+
darkviolet:[148,0,211],
|
97
|
+
fuchsia:[255,0,255],
|
98
|
+
gold:[255,215,0],
|
99
|
+
green:[0,128,0],
|
100
|
+
indigo:[75,0,130],
|
101
|
+
khaki:[240,230,140],
|
102
|
+
lightblue:[173,216,230],
|
103
|
+
lightcyan:[224,255,255],
|
104
|
+
lightgreen:[144,238,144],
|
105
|
+
lightgrey:[211,211,211],
|
106
|
+
lightpink:[255,182,193],
|
107
|
+
lightyellow:[255,255,224],
|
108
|
+
lime:[0,255,0],
|
109
|
+
magenta:[255,0,255],
|
110
|
+
maroon:[128,0,0],
|
111
|
+
navy:[0,0,128],
|
112
|
+
olive:[128,128,0],
|
113
|
+
orange:[255,165,0],
|
114
|
+
pink:[255,192,203],
|
115
|
+
purple:[128,0,128],
|
116
|
+
violet:[128,0,128],
|
117
|
+
red:[255,0,0],
|
118
|
+
silver:[192,192,192],
|
119
|
+
white:[255,255,255],
|
120
|
+
yellow:[255,255,0]
|
121
|
+
};
|
122
|
+
|
123
|
+
})(jQuery);
|
Binary file
|
@@ -1,5 +1,6 @@
|
|
1
1
|
//= require 'font-awesome.css'
|
2
2
|
//*= require normalize
|
3
|
+
//*= require jquery.Jcrop.css
|
3
4
|
//*= require chosen
|
4
5
|
//*= require_self
|
5
6
|
* {
|
@@ -479,4 +480,9 @@ html.login {
|
|
479
480
|
.bar {
|
480
481
|
@include gradient(#53B75F, #1B7726);
|
481
482
|
height: 10px;
|
483
|
+
}
|
484
|
+
.preview_crop {display:none;overflow:hidden;img{max-width:none;}}
|
485
|
+
.crop_panel {
|
486
|
+
margin:1em 0;
|
487
|
+
#unhook {display:none;}
|
482
488
|
}
|
@@ -0,0 +1,86 @@
|
|
1
|
+
/* jquery.Jcrop.css v0.9.10 - MIT License */
|
2
|
+
|
3
|
+
/*
|
4
|
+
The outer-most container in a typical Jcrop instance
|
5
|
+
If you are having difficulty with formatting related to styles
|
6
|
+
on a parent element, place any fixes here or in a like selector
|
7
|
+
|
8
|
+
You can also style this element if you want to add a border, etc
|
9
|
+
A better method for styling can be seen below with .jcrop-light
|
10
|
+
(Add a class to the holder and style elements for that extended class)
|
11
|
+
*/
|
12
|
+
.jcrop-holder {
|
13
|
+
direction: ltr;
|
14
|
+
text-align: left;
|
15
|
+
}
|
16
|
+
|
17
|
+
/* These styles define the border lines */
|
18
|
+
.jcrop-vline,.jcrop-hline{background:#FFF url(Jcrop.gif) top left repeat;font-size:0;position:absolute;}
|
19
|
+
.jcrop-vline{height:100%;width:1px!important;}
|
20
|
+
.jcrop-hline{height:1px!important;width:100%;}
|
21
|
+
.jcrop-vline.right{right:0;}
|
22
|
+
.jcrop-hline.bottom{bottom:0;}
|
23
|
+
|
24
|
+
/* Handle style - size is set by Jcrop handleSize option (currently) */
|
25
|
+
.jcrop-handle{background-color:#333;border:1px #eee solid;font-size:1px;}
|
26
|
+
|
27
|
+
/* This style is used for invisible click targets */
|
28
|
+
.jcrop-tracker
|
29
|
+
{
|
30
|
+
height: 100%;
|
31
|
+
width: 100%;
|
32
|
+
-webkit-tap-highlight-color: transparent; /* "turn off" link highlight */
|
33
|
+
-webkit-touch-callout: none; /* disable callout, image save panel */
|
34
|
+
-webkit-user-select: none; /* disable cut copy paste */
|
35
|
+
}
|
36
|
+
|
37
|
+
/* Positioning of handles and drag bars */
|
38
|
+
.jcrop-handle.ord-n{left:50%;margin-left:-4px;margin-top:-4px;top:0;}
|
39
|
+
.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px;}
|
40
|
+
.jcrop-handle.ord-e{margin-right:-4px;margin-top:-4px;right:0;top:50%;}
|
41
|
+
.jcrop-handle.ord-w{left:0;margin-left:-4px;margin-top:-4px;top:50%;}
|
42
|
+
.jcrop-handle.ord-nw{left:0;margin-left:-4px;margin-top:-4px;top:0;}
|
43
|
+
.jcrop-handle.ord-ne{margin-right:-4px;margin-top:-4px;right:0;top:0;}
|
44
|
+
.jcrop-handle.ord-se{bottom:0;margin-bottom:-4px;margin-right:-4px;right:0;}
|
45
|
+
.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px;}
|
46
|
+
.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{height:7px;width:100%;}
|
47
|
+
.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{height:100%;width:7px;}
|
48
|
+
.jcrop-dragbar.ord-n{margin-top:-4px;}
|
49
|
+
.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px;}
|
50
|
+
.jcrop-dragbar.ord-e{margin-right:-4px;right:0;}
|
51
|
+
.jcrop-dragbar.ord-w{margin-left:-4px;}
|
52
|
+
|
53
|
+
/* The "jcrop-light" class/extension */
|
54
|
+
.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline
|
55
|
+
{
|
56
|
+
background:#FFF;
|
57
|
+
filter:Alpha(opacity=70)!important;
|
58
|
+
opacity:.70!important;
|
59
|
+
}
|
60
|
+
.jcrop-light .jcrop-handle
|
61
|
+
{
|
62
|
+
-moz-border-radius:3px;
|
63
|
+
-webkit-border-radius:3px;
|
64
|
+
background-color:#000;
|
65
|
+
border-color:#FFF;
|
66
|
+
border-radius:3px;
|
67
|
+
}
|
68
|
+
|
69
|
+
/* The "jcrop-dark" class/extension */
|
70
|
+
.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline
|
71
|
+
{
|
72
|
+
background:#000;
|
73
|
+
filter:Alpha(opacity=70)!important;
|
74
|
+
opacity:.7!important;
|
75
|
+
}
|
76
|
+
.jcrop-dark .jcrop-handle
|
77
|
+
{
|
78
|
+
-moz-border-radius:3px;
|
79
|
+
-webkit-border-radius:3px;
|
80
|
+
background-color:#FFF;
|
81
|
+
border-color:#000;
|
82
|
+
border-radius:3px;
|
83
|
+
}
|
84
|
+
|
85
|
+
/* Fix for twitter bootstrap et al. */
|
86
|
+
.jcrop-holder img,img.jcrop-preview{ max-width: none; }
|
data/app/helpers/admin_helper.rb
CHANGED
@@ -24,6 +24,7 @@ module AdminHelper
|
|
24
24
|
</script>
|
25
25
|
}.gsub(/[\n ]+/, ' ').strip.html_safe
|
26
26
|
end
|
27
|
+
|
27
28
|
|
28
29
|
|
29
30
|
def sortable_columns(column, title = nil)
|
@@ -37,7 +38,8 @@ module AdminHelper
|
|
37
38
|
url_for :only_path => false, :params => params.merge(overwrite)
|
38
39
|
end
|
39
40
|
|
40
|
-
|
41
|
+
def image_sortable(images)
|
42
|
+
sort_url = "sort_admin_#{images.to_s}_path(:auth_token => current_user.authentication_token)"
|
41
43
|
%Q{
|
42
44
|
<script type="text/javascript">
|
43
45
|
$(document).ready(function() {
|
@@ -54,7 +56,7 @@ module AdminHelper
|
|
54
56
|
type: 'post',
|
55
57
|
data: $('.image-list').sortable('serialize') + '&authenticity_token=#{u(form_authenticity_token)}',
|
56
58
|
dataType: 'script',
|
57
|
-
url: '#{
|
59
|
+
url: '#{eval(sort_url)}'})
|
58
60
|
}
|
59
61
|
});
|
60
62
|
});
|
data/ideyabox.gemspec
CHANGED
@@ -15,15 +15,15 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib", "app"]
|
16
16
|
gem.version = Ideyabox::VERSION
|
17
17
|
|
18
|
-
gem.add_dependency "russian"
|
19
|
-
gem.add_dependency "redactor-rails"
|
20
|
-
gem.add_dependency "kaminari"
|
21
|
-
gem.add_dependency "haml", ">= 3.1.6"
|
22
|
-
gem.add_dependency "devise"
|
23
|
-
gem.add_dependency "jquery-fileupload-rails"
|
24
|
-
gem.add_dependency "mini_magick"
|
25
|
-
gem.add_dependency "sexy_validators", ">=0.0.5"
|
26
|
-
gem.add_development_dependency "haml-rails", ">= 0.3.4"
|
27
|
-
gem.add_development_dependency "capistrano"
|
18
|
+
# gem.add_dependency "russian"
|
19
|
+
# gem.add_dependency "redactor-rails"
|
20
|
+
# gem.add_dependency "kaminari"
|
21
|
+
# gem.add_dependency "haml", ">= 3.1.6"
|
22
|
+
# gem.add_dependency "devise"
|
23
|
+
# gem.add_dependency "jquery-fileupload-rails"
|
24
|
+
# gem.add_dependency "mini_magick"
|
25
|
+
# gem.add_dependency "sexy_validators", ">=0.0.5"
|
26
|
+
# gem.add_development_dependency "haml-rails", ">= 0.3.4"
|
27
|
+
# gem.add_development_dependency "capistrano"
|
28
28
|
|
29
29
|
end
|
@@ -0,0 +1,195 @@
|
|
1
|
+
#encoding:utf-8
|
2
|
+
require 'rails/generators'
|
3
|
+
require 'rails/generators/generated_attribute'
|
4
|
+
|
5
|
+
module Ideyabox
|
6
|
+
module Generators
|
7
|
+
class CropGenerator < ::Rails::Generators::Base
|
8
|
+
source_root File.expand_path('../templates', __FILE__)
|
9
|
+
argument :controller_path, :type => :string
|
10
|
+
argument :model_name, :type => :string, :required => false
|
11
|
+
argument :layout, :type => :string, :default => "application",
|
12
|
+
:banner => "Specify application layout"
|
13
|
+
|
14
|
+
def initialize(args, *options)
|
15
|
+
super(args, *options)
|
16
|
+
initialize_views_variables
|
17
|
+
end
|
18
|
+
|
19
|
+
def copy_views
|
20
|
+
generate_views
|
21
|
+
end
|
22
|
+
|
23
|
+
def updating_models
|
24
|
+
inject_into_file "app/models/#{resource_name}.rb", " :crop_x, :crop_y, :crop_w, :crop_h,", :after => " attr_accessible"
|
25
|
+
inject_into_file "app/models/#{resource_name}.rb", "\n attr_accessor :crop_x, :crop_y, :crop_w, :crop_h\n after_update :crop_image\n def crop_image\n image.recreate_versions! if crop_x.present?\n end\n", :after => "class #{@model_name.demodulize} < ActiveRecord::Base"
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
def updating_uploader
|
30
|
+
inject_into_file "app/uploaders/#{resource_name}_uploader.rb", "\n
|
31
|
+
version :large do
|
32
|
+
process :resize_to_limit => [500, 500]
|
33
|
+
end
|
34
|
+
|
35
|
+
version :crop do
|
36
|
+
process :crop
|
37
|
+
resize_to_fill(300, 200)
|
38
|
+
end
|
39
|
+
|
40
|
+
def crop
|
41
|
+
if model.crop_x.present?
|
42
|
+
resize_to_limit(500, 500)
|
43
|
+
manipulate! do |img|
|
44
|
+
x = model.crop_x.to_i
|
45
|
+
y = model.crop_y.to_i
|
46
|
+
w = model.crop_w.to_i
|
47
|
+
h = model.crop_h.to_i
|
48
|
+
img.crop(\"\#{w}x\#{h}+\#{x}+\#{y}\")
|
49
|
+
img
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
\n", :after => "process :resize_to_fill => [160, 100]\n end"
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
def updating_edit_view
|
58
|
+
inject_into_file "app/views/admin/#{plural_resource_name}/edit.html.haml", "(:large), :id=>'cropbox'\n = render 'crop', :#{resource_name} => @#{resource_name}\n", :after => " = image_tag @#{resource_name}.image_url"
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
protected
|
63
|
+
|
64
|
+
def initialize_views_variables
|
65
|
+
@base_name, @controller_class_path, @controller_file_path, @controller_class_nesting, @controller_class_nesting_depth = extract_modules(controller_path)
|
66
|
+
@controller_routing_path = @controller_file_path.gsub(/\//, '_')
|
67
|
+
@model_name = @controller_class_nesting + "::#{@base_name.singularize.camelize}" unless @model_name
|
68
|
+
@model_name = @model_name.camelize
|
69
|
+
end
|
70
|
+
|
71
|
+
def controller_routing_path
|
72
|
+
@controller_routing_path
|
73
|
+
end
|
74
|
+
|
75
|
+
def singular_controller_routing_path
|
76
|
+
@controller_routing_path.singularize
|
77
|
+
end
|
78
|
+
|
79
|
+
def model_name
|
80
|
+
@model_name
|
81
|
+
end
|
82
|
+
|
83
|
+
def plural_model_name
|
84
|
+
@model_name.pluralize
|
85
|
+
end
|
86
|
+
|
87
|
+
def resource_name
|
88
|
+
@model_name.demodulize.underscore
|
89
|
+
end
|
90
|
+
|
91
|
+
def parent_name
|
92
|
+
resource_name.split("_").first
|
93
|
+
end
|
94
|
+
|
95
|
+
def plural_parent_name
|
96
|
+
parent_name.pluralize
|
97
|
+
end
|
98
|
+
|
99
|
+
def plural_resource_name
|
100
|
+
resource_name.pluralize
|
101
|
+
end
|
102
|
+
|
103
|
+
def sort_priority(column_name)
|
104
|
+
case column_name
|
105
|
+
when "position" then 1
|
106
|
+
when "visible" then 2
|
107
|
+
when "name" then 3
|
108
|
+
when "title" then 3
|
109
|
+
else 5
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
def columns
|
114
|
+
begin
|
115
|
+
excluded_column_names = %w[id created_at updated_at]
|
116
|
+
@model_name.constantize.columns.reject{|c| excluded_column_names.include?(c.name) || c.name.index("_id") }.sort{|a, b| sort_priority(a.name) <=> sort_priority(b.name)}.collect{|c| ::Rails::Generators::GeneratedAttribute.new(c.name, c.type)}
|
117
|
+
rescue NoMethodError
|
118
|
+
@model_name.constantize.fields.collect{|c| c[1]}.reject{|c| excluded_column_names.include?(c.name) || c.name.index("_id") }.collect{|c| ::Rails::Generators::GeneratedAttribute.new(c.name, c.type.to_s)}
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def column_names
|
123
|
+
@model_name.constantize.column_names
|
124
|
+
end
|
125
|
+
|
126
|
+
def extract_modules(name)
|
127
|
+
modules = name.include?('/') ? name.split('/') : name.split('::')
|
128
|
+
name = modules.pop
|
129
|
+
path = modules.map { |m| m.underscore }
|
130
|
+
file_path = (path + [name.underscore]).join('/')
|
131
|
+
nesting = modules.map { |m| m.camelize }.join('::')
|
132
|
+
[name, path, file_path, nesting, modules.size]
|
133
|
+
end
|
134
|
+
|
135
|
+
def generate_views
|
136
|
+
views = {
|
137
|
+
"_crop.html.haml" => "app/views/admin/#{@controller_file_path}/_crop.html.#{ext}",
|
138
|
+
}
|
139
|
+
|
140
|
+
selected_views = views
|
141
|
+
options.engine == generate_erb(selected_views)
|
142
|
+
end
|
143
|
+
|
144
|
+
def generate_erb(views)
|
145
|
+
views.each do |template_name, output_path|
|
146
|
+
template template_name, output_path
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
def ext
|
151
|
+
:haml
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
def add_resource_route
|
156
|
+
resources_string = "\n resources :#{plural_resource_name} do\n"
|
157
|
+
sort_string = " post \"sort\", :on => :collection\n"
|
158
|
+
toggleshow_string = " get \"toggleshow\", :on => :member\n"
|
159
|
+
|
160
|
+
if column_names.include?("visible") && column_names.include?("position")
|
161
|
+
final_string = "#{resources_string}#{sort_string}#{toggleshow_string} end\n"
|
162
|
+
elsif column_names.include?("visible")
|
163
|
+
final_string = "#{resources_string}#{toggleshow_string} end\n"
|
164
|
+
elsif column_names.include?("position")
|
165
|
+
final_string = "#{resources_string}#{sort_string} end\n"
|
166
|
+
else
|
167
|
+
final_string = "\n resources :#{plural_resource_name}\n"
|
168
|
+
end
|
169
|
+
|
170
|
+
inject_into_file "config/routes.rb", final_string, :after => "\n namespace :admin do\n"
|
171
|
+
|
172
|
+
inject_into_file "config/routes.rb", "\n resources :#{plural_resource_name}\n", :after => "\n resources :#{plural_parent_name} do"
|
173
|
+
|
174
|
+
inject_into_file "config/routes.rb", " do\n resources :#{plural_resource_name}\n end", :after => "\n resources :#{plural_parent_name}\n"
|
175
|
+
end
|
176
|
+
|
177
|
+
def add_to_locales
|
178
|
+
locales = [:ru, :en]
|
179
|
+
|
180
|
+
attributes = column_names.collect {|column| " #{column}: \"#{column}\"\n"}
|
181
|
+
|
182
|
+
attributes_string = " #{resource_name}:\n#{attributes.join}"
|
183
|
+
|
184
|
+
locales.each do |locale|
|
185
|
+
inject_into_file "config/locales/#{locale}.yml", " #{resource_name}: \"#{resource_name}\"\n", :after => "models:\n"
|
186
|
+
inject_into_file "config/locales/#{locale}.yml", attributes_string, :after => "attributes:\n"
|
187
|
+
end
|
188
|
+
end
|
189
|
+
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
.crop_panel
|
2
|
+
= link_to "Выделить фрагмент вручную", "#", :id=>'rehook', :class=>'bright_link'
|
3
|
+
= link_to "Не выделять фрагмент", "#", :id=>'unhook', :class=>'bright_link'
|
4
|
+
%h3 Preview:
|
5
|
+
.preview_crop
|
6
|
+
|
7
|
+
= image_tag @<%=resource_name%>.image_url(:large), :id=>'preview'
|
8
|
+
|
9
|
+
- if @<%=resource_name%>.image && @<%=resource_name%>.image_url(:crop)
|
10
|
+
%h3 Current version:
|
11
|
+
= image_tag @<%= resource_name %>.image_url(:crop)
|
12
|
+
|
13
|
+
%br
|
14
|
+
= form_for [:admin, <%=resource_name%>] do |f|
|
15
|
+
- ['x','y','w','h'].each do |attribute|
|
16
|
+
= f.hidden_field "crop_#{attribute}"
|
17
|
+
= cropable('<%=resource_name%>', 0, 0, 300, 200)
|
@@ -36,7 +36,8 @@ module Ideyabox
|
|
36
36
|
|
37
37
|
def updating_models
|
38
38
|
inject_into_file "app/models/#{parent_name}.rb", "\n has_many :#{plural_resource_name}", :after => "class #{parent_name.capitalize} < ActiveRecord::Base"
|
39
|
-
inject_into_file "app/models/#{resource_name}.rb", "\n belongs_to :#{parent_name}\n mount_uploader :image, #{@model_name.demodulize}Uploader", :after => "class #{@model_name.demodulize} < ActiveRecord::Base"
|
39
|
+
inject_into_file "app/models/#{resource_name}.rb", "\n belongs_to :#{parent_name}\n mount_uploader :image, #{@model_name.demodulize}Uploader", :after => "class #{@model_name.demodulize} < ActiveRecord::Base"
|
40
|
+
inject_into_file "app/models/#{resource_name}.rb", "\n before_create :add_position\n def add_position\n last_#{resource_name} = self.#{parent_name}.#{plural_resource_name}.order(\"position\").last\n if last_#{resource_name}\n self.position = last_#{resource_name}.position + 1\n else\n self.position = 1\n end\n end\n", :after => "\n mount_uploader :image, #{@model_name.demodulize}Uploader\n"
|
40
41
|
end
|
41
42
|
|
42
43
|
protected
|
@@ -158,7 +159,10 @@ module Ideyabox
|
|
158
159
|
end
|
159
160
|
|
160
161
|
inject_into_file "config/routes.rb", final_string, :after => "\n namespace :admin do\n"
|
162
|
+
|
161
163
|
inject_into_file "config/routes.rb", "\n resources :#{plural_resource_name}\n", :after => "\n resources :#{plural_parent_name} do"
|
164
|
+
|
165
|
+
inject_into_file "config/routes.rb", " do\n resources :#{plural_resource_name}\n end", :after => "\n resources :#{plural_parent_name}\n"
|
162
166
|
end
|
163
167
|
|
164
168
|
def add_to_locales
|
@@ -31,7 +31,7 @@ class Admin::<%= @model_name.demodulize.pluralize -%>Controller < Admin::Applica
|
|
31
31
|
def update
|
32
32
|
@<%= resource_name %> = <%= @model_name.demodulize -%>.find(params[:id])
|
33
33
|
if @<%= resource_name %>.update_attributes(params[:<%= resource_name %>])
|
34
|
-
redirect_to
|
34
|
+
redirect_to [:edit, :admin, @<%= resource_name %>.<%= parent_name %>], :notice => "#{<%= @model_name.demodulize %>.model_name.human} #{t 'flash.notice.was_updated'}"
|
35
35
|
else
|
36
36
|
render 'edit'
|
37
37
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
%h2 Галерея изображений
|
2
2
|
.image-list#<%=plural_resource_name%>
|
3
|
-
= render @<%=parent_name%>.<%=plural_resource_name
|
4
|
-
= image_sortable
|
3
|
+
= render @<%=parent_name%>.<%=plural_resource_name%>.order('position')
|
4
|
+
= image_sortable("<%=plural_resource_name%>")
|
5
5
|
|
6
6
|
.image_upload_form.bordered_box
|
7
7
|
%h3 Загрузить изображения
|
data/lib/ideyabox/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ideyabox
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,168 +10,8 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2012-
|
14
|
-
dependencies:
|
15
|
-
- !ruby/object:Gem::Dependency
|
16
|
-
name: russian
|
17
|
-
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
|
-
requirements:
|
20
|
-
- - ! '>='
|
21
|
-
- !ruby/object:Gem::Version
|
22
|
-
version: '0'
|
23
|
-
type: :runtime
|
24
|
-
prerelease: false
|
25
|
-
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
|
-
requirements:
|
28
|
-
- - ! '>='
|
29
|
-
- !ruby/object:Gem::Version
|
30
|
-
version: '0'
|
31
|
-
- !ruby/object:Gem::Dependency
|
32
|
-
name: redactor-rails
|
33
|
-
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
|
-
requirements:
|
36
|
-
- - ! '>='
|
37
|
-
- !ruby/object:Gem::Version
|
38
|
-
version: '0'
|
39
|
-
type: :runtime
|
40
|
-
prerelease: false
|
41
|
-
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
|
-
requirements:
|
44
|
-
- - ! '>='
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '0'
|
47
|
-
- !ruby/object:Gem::Dependency
|
48
|
-
name: kaminari
|
49
|
-
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
|
-
requirements:
|
52
|
-
- - ! '>='
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '0'
|
55
|
-
type: :runtime
|
56
|
-
prerelease: false
|
57
|
-
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
|
-
requirements:
|
60
|
-
- - ! '>='
|
61
|
-
- !ruby/object:Gem::Version
|
62
|
-
version: '0'
|
63
|
-
- !ruby/object:Gem::Dependency
|
64
|
-
name: haml
|
65
|
-
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
|
-
requirements:
|
68
|
-
- - ! '>='
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: 3.1.6
|
71
|
-
type: :runtime
|
72
|
-
prerelease: false
|
73
|
-
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
|
-
requirements:
|
76
|
-
- - ! '>='
|
77
|
-
- !ruby/object:Gem::Version
|
78
|
-
version: 3.1.6
|
79
|
-
- !ruby/object:Gem::Dependency
|
80
|
-
name: devise
|
81
|
-
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
|
-
requirements:
|
84
|
-
- - ! '>='
|
85
|
-
- !ruby/object:Gem::Version
|
86
|
-
version: '0'
|
87
|
-
type: :runtime
|
88
|
-
prerelease: false
|
89
|
-
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
|
-
requirements:
|
92
|
-
- - ! '>='
|
93
|
-
- !ruby/object:Gem::Version
|
94
|
-
version: '0'
|
95
|
-
- !ruby/object:Gem::Dependency
|
96
|
-
name: jquery-fileupload-rails
|
97
|
-
requirement: !ruby/object:Gem::Requirement
|
98
|
-
none: false
|
99
|
-
requirements:
|
100
|
-
- - ! '>='
|
101
|
-
- !ruby/object:Gem::Version
|
102
|
-
version: '0'
|
103
|
-
type: :runtime
|
104
|
-
prerelease: false
|
105
|
-
version_requirements: !ruby/object:Gem::Requirement
|
106
|
-
none: false
|
107
|
-
requirements:
|
108
|
-
- - ! '>='
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: mini_magick
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
none: false
|
115
|
-
requirements:
|
116
|
-
- - ! '>='
|
117
|
-
- !ruby/object:Gem::Version
|
118
|
-
version: '0'
|
119
|
-
type: :runtime
|
120
|
-
prerelease: false
|
121
|
-
version_requirements: !ruby/object:Gem::Requirement
|
122
|
-
none: false
|
123
|
-
requirements:
|
124
|
-
- - ! '>='
|
125
|
-
- !ruby/object:Gem::Version
|
126
|
-
version: '0'
|
127
|
-
- !ruby/object:Gem::Dependency
|
128
|
-
name: sexy_validators
|
129
|
-
requirement: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
|
-
requirements:
|
132
|
-
- - ! '>='
|
133
|
-
- !ruby/object:Gem::Version
|
134
|
-
version: 0.0.5
|
135
|
-
type: :runtime
|
136
|
-
prerelease: false
|
137
|
-
version_requirements: !ruby/object:Gem::Requirement
|
138
|
-
none: false
|
139
|
-
requirements:
|
140
|
-
- - ! '>='
|
141
|
-
- !ruby/object:Gem::Version
|
142
|
-
version: 0.0.5
|
143
|
-
- !ruby/object:Gem::Dependency
|
144
|
-
name: haml-rails
|
145
|
-
requirement: !ruby/object:Gem::Requirement
|
146
|
-
none: false
|
147
|
-
requirements:
|
148
|
-
- - ! '>='
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: 0.3.4
|
151
|
-
type: :development
|
152
|
-
prerelease: false
|
153
|
-
version_requirements: !ruby/object:Gem::Requirement
|
154
|
-
none: false
|
155
|
-
requirements:
|
156
|
-
- - ! '>='
|
157
|
-
- !ruby/object:Gem::Version
|
158
|
-
version: 0.3.4
|
159
|
-
- !ruby/object:Gem::Dependency
|
160
|
-
name: capistrano
|
161
|
-
requirement: !ruby/object:Gem::Requirement
|
162
|
-
none: false
|
163
|
-
requirements:
|
164
|
-
- - ! '>='
|
165
|
-
- !ruby/object:Gem::Version
|
166
|
-
version: '0'
|
167
|
-
type: :development
|
168
|
-
prerelease: false
|
169
|
-
version_requirements: !ruby/object:Gem::Requirement
|
170
|
-
none: false
|
171
|
-
requirements:
|
172
|
-
- - ! '>='
|
173
|
-
- !ruby/object:Gem::Version
|
174
|
-
version: '0'
|
13
|
+
date: 2012-12-08 00:00:00.000000000 Z
|
14
|
+
dependencies: []
|
175
15
|
description: Write a gem description
|
176
16
|
email:
|
177
17
|
- maks.rydkin@gmail.com
|
@@ -203,11 +43,14 @@ files:
|
|
203
43
|
- app/assets/javascripts/.DS_Store
|
204
44
|
- app/assets/javascripts/chosen.jquery.js
|
205
45
|
- app/assets/javascripts/default.js
|
46
|
+
- app/assets/javascripts/jquery.Jcrop.min.js
|
47
|
+
- app/assets/javascripts/jquery.color.js
|
206
48
|
- app/assets/javascripts/jquery.ui.nestedSortable.js
|
207
49
|
- app/assets/javascripts/jquery.uploadify.min.js
|
208
50
|
- app/assets/javascripts/modernizr.js
|
209
51
|
- app/assets/javascripts/swfobject.js
|
210
52
|
- app/assets/stylesheets/.DS_Store
|
53
|
+
- app/assets/stylesheets/Jcrop.gif
|
211
54
|
- app/assets/stylesheets/chosen.scss.erb
|
212
55
|
- app/assets/stylesheets/default.scss.erb
|
213
56
|
- app/assets/stylesheets/font-awesome.css
|
@@ -216,6 +59,7 @@ files:
|
|
216
59
|
- app/assets/stylesheets/font_awesome/font/fontawesome-webfont.svg
|
217
60
|
- app/assets/stylesheets/font_awesome/font/fontawesome-webfont.ttf
|
218
61
|
- app/assets/stylesheets/font_awesome/font/fontawesome-webfont.woff
|
62
|
+
- app/assets/stylesheets/jquery.Jcrop.css
|
219
63
|
- app/assets/stylesheets/normalize.css
|
220
64
|
- app/helpers/.DS_Store
|
221
65
|
- app/helpers/admin_helper.rb
|
@@ -244,6 +88,8 @@ files:
|
|
244
88
|
- lib/generators/ideyabox/admin/templates/views/layouts/admin.html.haml
|
245
89
|
- lib/generators/ideyabox/admin/templates/views/layouts/login.html.haml
|
246
90
|
- lib/generators/ideyabox/assets/assets_generator.rb
|
91
|
+
- lib/generators/ideyabox/crop/crop_generator.rb
|
92
|
+
- lib/generators/ideyabox/crop/templates/_crop.html.haml
|
247
93
|
- lib/generators/ideyabox/images_scaffold/.DS_Store
|
248
94
|
- lib/generators/ideyabox/images_scaffold/images_scaffold_generator.rb
|
249
95
|
- lib/generators/ideyabox/images_scaffold/templates/.DS_Store
|