the_crop 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +22 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +3 -0
- data/Rakefile +2 -0
- data/app/assets/javascripts/jcrop/jquery.Jcrop.js +1694 -0
- data/app/assets/javascripts/jcrop/jquery.color.js +661 -0
- data/app/assets/javascripts/the_crop/the_crop.js.coffee +205 -0
- data/app/assets/stylesheets/jcrop/jquery.Jcrop.css +167 -0
- data/app/assets/stylesheets/the_crop/the_crop.css.scss +70 -0
- data/app/views/the_crop/_canvas.html.haml +34 -0
- data/gem_version.rb +3 -0
- data/lib/the_crop.rb +5 -0
- data/lib/the_crop/version.rb +1 -0
- data/the_crop.gemspec +25 -0
- data/vendor/assets/images/Jcrop.gif +0 -0
- metadata +102 -0
@@ -0,0 +1,205 @@
|
|
1
|
+
@TheCrop = do ->
|
2
|
+
# HELPERS
|
3
|
+
dec: (val) -> parseInt val, 10
|
4
|
+
json_to_str: (json = {}) -> JSON.stringify(json)
|
5
|
+
by_id: (id) -> document.getElementById(id)
|
6
|
+
|
7
|
+
# INIT
|
8
|
+
init: ->
|
9
|
+
@params = {}
|
10
|
+
do @init_open_btn
|
11
|
+
do @init_close_btn
|
12
|
+
do @init_submit
|
13
|
+
do @init_ajaxian_callback
|
14
|
+
|
15
|
+
init_open_btn: ->
|
16
|
+
$('.js_the_crop').on 'click', (e) =>
|
17
|
+
link = $ e.target
|
18
|
+
params = link.data()
|
19
|
+
@params = params if params
|
20
|
+
|
21
|
+
@show_canvas()
|
22
|
+
@create(params)
|
23
|
+
false
|
24
|
+
|
25
|
+
init_close_btn: ->
|
26
|
+
$('.js_the_crop_close').on 'click', =>
|
27
|
+
do @destroy
|
28
|
+
do @hide_canvas
|
29
|
+
false
|
30
|
+
|
31
|
+
init_submit: ->
|
32
|
+
$('.js_the_crop_submit').on 'click', =>
|
33
|
+
form = $('.js_crop_form')
|
34
|
+
|
35
|
+
x = $('#crop_x', form).val()
|
36
|
+
y = $('#crop_y', form).val()
|
37
|
+
w = $('#crop_w', form).val()
|
38
|
+
h = $('#crop_h', form).val()
|
39
|
+
|
40
|
+
if x is '0' && y is '0' && w is '0' && h is '0'
|
41
|
+
alert 'Please, select crop area'
|
42
|
+
else
|
43
|
+
$('.js_crop_form').submit()
|
44
|
+
|
45
|
+
false
|
46
|
+
|
47
|
+
init_ajaxian_callback: ->
|
48
|
+
$('.js_crop_form').on 'ajax:success', (e, data, status, xhr) =>
|
49
|
+
callback = null
|
50
|
+
fn_chain = @params.callbackHandler.split '.'
|
51
|
+
|
52
|
+
for fn in fn_chain
|
53
|
+
callback = if callback then callback[fn] else window[fn]
|
54
|
+
|
55
|
+
callback(data, @params) if callback
|
56
|
+
|
57
|
+
init_crop_form: ->
|
58
|
+
$('.js_crop_form').attr('action', @params.url)
|
59
|
+
|
60
|
+
init_jcrop: (context) =>
|
61
|
+
$('#js_jcrop_target').Jcrop
|
62
|
+
onChange: context.buildPreview
|
63
|
+
onSelect: context.buildPreview
|
64
|
+
setSelect: [0,0,100,100]
|
65
|
+
aspectRatio: context.get_aspect_ration()
|
66
|
+
, ->
|
67
|
+
context.api = @
|
68
|
+
|
69
|
+
# GETTERS
|
70
|
+
get_aspect_ration: ->
|
71
|
+
prev = $('.js_preview_image')
|
72
|
+
@dec(prev.css('width')) / @dec(prev.css('height'))
|
73
|
+
|
74
|
+
# SETTERS
|
75
|
+
set_crop_form_params: (c) ->
|
76
|
+
form = $('.js_crop_form')
|
77
|
+
orig_img = $('#js_jcrop_target')
|
78
|
+
|
79
|
+
# Set img size for calc scale value
|
80
|
+
img_w = $('#crop_img_w', form)
|
81
|
+
img_w.val TheCrop.dec orig_img.css('width')
|
82
|
+
|
83
|
+
# Set crop params
|
84
|
+
x = $('#crop_x', form)
|
85
|
+
y = $('#crop_y', form)
|
86
|
+
w = $('#crop_w', form)
|
87
|
+
h = $('#crop_h', form)
|
88
|
+
|
89
|
+
x.val(c.x); y.val(c.y)
|
90
|
+
w.val(c.w); h.val(c.h)
|
91
|
+
|
92
|
+
set_preview_defaults: ->
|
93
|
+
$('.js_preview_image').css
|
94
|
+
width: 300
|
95
|
+
height: 300
|
96
|
+
|
97
|
+
set_preview_dimensions: ->
|
98
|
+
if prev_opt = @params?.preview
|
99
|
+
if prev_opt?.width && prev_opt?.height
|
100
|
+
$('.js_preview_image').css
|
101
|
+
width: prev_opt.width
|
102
|
+
height: prev_opt.height
|
103
|
+
|
104
|
+
set_holder_defaults: ->
|
105
|
+
if holder_opt = @params?.holder
|
106
|
+
if holder_opt?.width
|
107
|
+
$('.js_source_image').css
|
108
|
+
width: holder_opt.width
|
109
|
+
|
110
|
+
set_holder_image_same_dimentions: ->
|
111
|
+
holder = $('.js_source_image')
|
112
|
+
src_img = $('#js_jcrop_target')
|
113
|
+
|
114
|
+
width = @dec holder.css 'width'
|
115
|
+
src_img.css { width: width }
|
116
|
+
|
117
|
+
src_img_height = @dec src_img.css 'height'
|
118
|
+
holder.css { height: src_img_height }
|
119
|
+
|
120
|
+
set_original_image_size_info: ->
|
121
|
+
w = @by_id('js_jcrop_target').width
|
122
|
+
h = @by_id('js_jcrop_target').height
|
123
|
+
|
124
|
+
$('.js_the_crop_src_size').html """
|
125
|
+
#{ w }x#{ h } (px)
|
126
|
+
"""
|
127
|
+
|
128
|
+
set_croped_image_size_info: (w, h) ->
|
129
|
+
$('.js_the_crop_cropped_size').html """
|
130
|
+
#{ w }x#{ h } (px)
|
131
|
+
"""
|
132
|
+
|
133
|
+
set_final_size_info: ->
|
134
|
+
if @params.finalSize
|
135
|
+
item = $('.js_the_crop_final_size')
|
136
|
+
item.html "#{ @params.finalSize } (px)"
|
137
|
+
item.parent().show()
|
138
|
+
|
139
|
+
set_canvas_dimensions: ->
|
140
|
+
do @set_preview_defaults
|
141
|
+
do @set_preview_dimensions
|
142
|
+
|
143
|
+
do @set_holder_defaults
|
144
|
+
do @set_holder_image_same_dimentions
|
145
|
+
|
146
|
+
# FUNCTIONS
|
147
|
+
create: ->
|
148
|
+
do @set_original_image_size_info
|
149
|
+
do @set_canvas_dimensions
|
150
|
+
do @set_final_size_info
|
151
|
+
do @init_crop_form
|
152
|
+
@init_jcrop @
|
153
|
+
|
154
|
+
destroy: ->
|
155
|
+
@api.destroy()
|
156
|
+
|
157
|
+
buildPreview: (coords) ->
|
158
|
+
preview_holder = $('.js_preview_image')
|
159
|
+
original_img = $('#js_jcrop_target')
|
160
|
+
|
161
|
+
preview_view_w = TheCrop.dec preview_holder.css('width')
|
162
|
+
preview_view_h = TheCrop.dec preview_holder.css('height')
|
163
|
+
|
164
|
+
original_view_w = TheCrop.dec original_img.css('width')
|
165
|
+
original_view_h = TheCrop.dec original_img.css('height')
|
166
|
+
|
167
|
+
orig_image_w = TheCrop.by_id('js_jcrop_target').width
|
168
|
+
|
169
|
+
# Calculate scale
|
170
|
+
scale = original_view_w / orig_image_w
|
171
|
+
sw = TheCrop.dec coords.w / scale
|
172
|
+
sh = TheCrop.dec coords.h / scale
|
173
|
+
|
174
|
+
# Set scaled sizes
|
175
|
+
TheCrop.set_croped_image_size_info(sw, sh)
|
176
|
+
|
177
|
+
# When crop-area not selected
|
178
|
+
if sw is 0 && sh is 0
|
179
|
+
TheCrop.set_crop_form_params({ x: 0, y: 0, w: 0, h: 0 })
|
180
|
+
else
|
181
|
+
TheCrop.set_crop_form_params(coords)
|
182
|
+
|
183
|
+
# Calculate values for preview
|
184
|
+
rx = preview_view_w / coords.w
|
185
|
+
ry = preview_view_h / coords.h
|
186
|
+
|
187
|
+
$('#js_preview').css
|
188
|
+
width: "#{ Math.round(rx * original_view_w) }px"
|
189
|
+
height: "#{ Math.round(ry * original_view_h) }px"
|
190
|
+
|
191
|
+
marginLeft: "-#{ Math.round(rx * coords.x) }px"
|
192
|
+
marginTop: "-#{ Math.round(ry * coords.y) }px"
|
193
|
+
|
194
|
+
# OTHERS
|
195
|
+
show_canvas: ->
|
196
|
+
canvas = $('.js_the_crop_canvas')
|
197
|
+
|
198
|
+
canvas.css
|
199
|
+
width: $(document).width()
|
200
|
+
height: $(document).height()
|
201
|
+
|
202
|
+
canvas.fadeIn()
|
203
|
+
|
204
|
+
hide_canvas: ->
|
205
|
+
$('.js_the_crop_canvas').fadeOut()
|
@@ -0,0 +1,167 @@
|
|
1
|
+
/* jquery.Jcrop.css v0.9.12 - MIT License */
|
2
|
+
/*
|
3
|
+
The outer-most container in a typical Jcrop instance
|
4
|
+
If you are having difficulty with formatting related to styles
|
5
|
+
on a parent element, place any fixes here or in a like selector
|
6
|
+
|
7
|
+
You can also style this element if you want to add a border, etc
|
8
|
+
A better method for styling can be seen below with .jcrop-light
|
9
|
+
(Add a class to the holder and style elements for that extended class)
|
10
|
+
*/
|
11
|
+
.jcrop-holder {
|
12
|
+
direction: ltr;
|
13
|
+
text-align: left;
|
14
|
+
/* IE10 touch compatibility */
|
15
|
+
-ms-touch-action: none;
|
16
|
+
}
|
17
|
+
/* Selection Border */
|
18
|
+
.jcrop-vline,
|
19
|
+
.jcrop-hline {
|
20
|
+
background: #ffffff url("Jcrop.gif");
|
21
|
+
font-size: 0;
|
22
|
+
position: absolute;
|
23
|
+
}
|
24
|
+
.jcrop-vline {
|
25
|
+
height: 100%;
|
26
|
+
width: 1px !important;
|
27
|
+
}
|
28
|
+
.jcrop-vline.right {
|
29
|
+
right: 0;
|
30
|
+
}
|
31
|
+
.jcrop-hline {
|
32
|
+
height: 1px !important;
|
33
|
+
width: 100%;
|
34
|
+
}
|
35
|
+
.jcrop-hline.bottom {
|
36
|
+
bottom: 0;
|
37
|
+
}
|
38
|
+
/* Invisible click targets */
|
39
|
+
.jcrop-tracker {
|
40
|
+
height: 100%;
|
41
|
+
width: 100%;
|
42
|
+
/* "turn off" link highlight */
|
43
|
+
-webkit-tap-highlight-color: transparent;
|
44
|
+
/* disable callout, image save panel */
|
45
|
+
-webkit-touch-callout: none;
|
46
|
+
/* disable cut copy paste */
|
47
|
+
-webkit-user-select: none;
|
48
|
+
}
|
49
|
+
/* Selection Handles */
|
50
|
+
.jcrop-handle {
|
51
|
+
background-color: #333333;
|
52
|
+
border: 1px #eeeeee solid;
|
53
|
+
width: 7px;
|
54
|
+
height: 7px;
|
55
|
+
font-size: 1px;
|
56
|
+
}
|
57
|
+
.jcrop-handle.ord-n {
|
58
|
+
left: 50%;
|
59
|
+
margin-left: -4px;
|
60
|
+
margin-top: -4px;
|
61
|
+
top: 0;
|
62
|
+
}
|
63
|
+
.jcrop-handle.ord-s {
|
64
|
+
bottom: 0;
|
65
|
+
left: 50%;
|
66
|
+
margin-bottom: -4px;
|
67
|
+
margin-left: -4px;
|
68
|
+
}
|
69
|
+
.jcrop-handle.ord-e {
|
70
|
+
margin-right: -4px;
|
71
|
+
margin-top: -4px;
|
72
|
+
right: 0;
|
73
|
+
top: 50%;
|
74
|
+
}
|
75
|
+
.jcrop-handle.ord-w {
|
76
|
+
left: 0;
|
77
|
+
margin-left: -4px;
|
78
|
+
margin-top: -4px;
|
79
|
+
top: 50%;
|
80
|
+
}
|
81
|
+
.jcrop-handle.ord-nw {
|
82
|
+
left: 0;
|
83
|
+
margin-left: -4px;
|
84
|
+
margin-top: -4px;
|
85
|
+
top: 0;
|
86
|
+
}
|
87
|
+
.jcrop-handle.ord-ne {
|
88
|
+
margin-right: -4px;
|
89
|
+
margin-top: -4px;
|
90
|
+
right: 0;
|
91
|
+
top: 0;
|
92
|
+
}
|
93
|
+
.jcrop-handle.ord-se {
|
94
|
+
bottom: 0;
|
95
|
+
margin-bottom: -4px;
|
96
|
+
margin-right: -4px;
|
97
|
+
right: 0;
|
98
|
+
}
|
99
|
+
.jcrop-handle.ord-sw {
|
100
|
+
bottom: 0;
|
101
|
+
left: 0;
|
102
|
+
margin-bottom: -4px;
|
103
|
+
margin-left: -4px;
|
104
|
+
}
|
105
|
+
/* Dragbars */
|
106
|
+
.jcrop-dragbar.ord-n,
|
107
|
+
.jcrop-dragbar.ord-s {
|
108
|
+
height: 7px;
|
109
|
+
width: 100%;
|
110
|
+
}
|
111
|
+
.jcrop-dragbar.ord-e,
|
112
|
+
.jcrop-dragbar.ord-w {
|
113
|
+
height: 100%;
|
114
|
+
width: 7px;
|
115
|
+
}
|
116
|
+
.jcrop-dragbar.ord-n {
|
117
|
+
margin-top: -4px;
|
118
|
+
}
|
119
|
+
.jcrop-dragbar.ord-s {
|
120
|
+
bottom: 0;
|
121
|
+
margin-bottom: -4px;
|
122
|
+
}
|
123
|
+
.jcrop-dragbar.ord-e {
|
124
|
+
margin-right: -4px;
|
125
|
+
right: 0;
|
126
|
+
}
|
127
|
+
.jcrop-dragbar.ord-w {
|
128
|
+
margin-left: -4px;
|
129
|
+
}
|
130
|
+
/* The "jcrop-light" class/extension */
|
131
|
+
.jcrop-light .jcrop-vline,
|
132
|
+
.jcrop-light .jcrop-hline {
|
133
|
+
background: #ffffff;
|
134
|
+
filter: alpha(opacity=70) !important;
|
135
|
+
opacity: .70!important;
|
136
|
+
}
|
137
|
+
.jcrop-light .jcrop-handle {
|
138
|
+
-moz-border-radius: 3px;
|
139
|
+
-webkit-border-radius: 3px;
|
140
|
+
background-color: #000000;
|
141
|
+
border-color: #ffffff;
|
142
|
+
border-radius: 3px;
|
143
|
+
}
|
144
|
+
/* The "jcrop-dark" class/extension */
|
145
|
+
.jcrop-dark .jcrop-vline,
|
146
|
+
.jcrop-dark .jcrop-hline {
|
147
|
+
background: #000000;
|
148
|
+
filter: alpha(opacity=70) !important;
|
149
|
+
opacity: 0.7 !important;
|
150
|
+
}
|
151
|
+
.jcrop-dark .jcrop-handle {
|
152
|
+
-moz-border-radius: 3px;
|
153
|
+
-webkit-border-radius: 3px;
|
154
|
+
background-color: #ffffff;
|
155
|
+
border-color: #000000;
|
156
|
+
border-radius: 3px;
|
157
|
+
}
|
158
|
+
/* Simple macro to turn off the antlines */
|
159
|
+
.solid-line .jcrop-vline,
|
160
|
+
.solid-line .jcrop-hline {
|
161
|
+
background: #ffffff;
|
162
|
+
}
|
163
|
+
/* Fix for twitter bootstrap et al. */
|
164
|
+
.jcrop-holder img,
|
165
|
+
img.jcrop-preview {
|
166
|
+
max-width: none;
|
167
|
+
}
|
@@ -0,0 +1,70 @@
|
|
1
|
+
.the_crop_canvas{
|
2
|
+
display: none;
|
3
|
+
position: absolute;
|
4
|
+
top: 0; left: 0;
|
5
|
+
width: 100%; height: 100%;
|
6
|
+
z-index: 100;
|
7
|
+
|
8
|
+
&:before{
|
9
|
+
content:' ';
|
10
|
+
display: block;
|
11
|
+
position: absolute;
|
12
|
+
top: 0; left: 0;
|
13
|
+
width: 100%; height: 100%;
|
14
|
+
background: black;
|
15
|
+
opacity: 0.92;
|
16
|
+
z-index: -1;
|
17
|
+
}
|
18
|
+
|
19
|
+
.header_block{
|
20
|
+
p{
|
21
|
+
color: gray;
|
22
|
+
font-size: 12px;
|
23
|
+
margin-bottom: 3px;
|
24
|
+
line-height: 120%;
|
25
|
+
}
|
26
|
+
span{ color: white; }
|
27
|
+
margin-bottom: 7px;
|
28
|
+
}
|
29
|
+
|
30
|
+
.the_crop_body{
|
31
|
+
width: 90%;
|
32
|
+
margin: auto;
|
33
|
+
margin-top: 5%;
|
34
|
+
}
|
35
|
+
|
36
|
+
.the_crop_close{
|
37
|
+
float: right;
|
38
|
+
color: white;
|
39
|
+
}
|
40
|
+
|
41
|
+
.images_block{
|
42
|
+
overflow: hidden; zoom: 1;
|
43
|
+
margin-bottom: 30px;
|
44
|
+
}
|
45
|
+
|
46
|
+
.source_image{
|
47
|
+
float: left;
|
48
|
+
margin-right: 30px;
|
49
|
+
|
50
|
+
border: 1px solid white;
|
51
|
+
background: gray;
|
52
|
+
|
53
|
+
width: 400px;
|
54
|
+
height: 300px;
|
55
|
+
overflow: hidden;
|
56
|
+
zoom:1;
|
57
|
+
}
|
58
|
+
|
59
|
+
.preview_image{
|
60
|
+
float: left;
|
61
|
+
|
62
|
+
border: 1px solid white;
|
63
|
+
background: gray;
|
64
|
+
|
65
|
+
width: 100px;
|
66
|
+
height: 100px;
|
67
|
+
overflow: hidden;
|
68
|
+
zoom:1;
|
69
|
+
}
|
70
|
+
}
|
@@ -0,0 +1,34 @@
|
|
1
|
+
- content_for :the_crop do
|
2
|
+
.the_crop_canvas.js_the_crop_canvas
|
3
|
+
.the_crop_body
|
4
|
+
.header_block
|
5
|
+
= link_to "Close", '#', class: 'btn btn-info the_crop_close js_the_crop_close'
|
6
|
+
|
7
|
+
%p
|
8
|
+
Original image size:
|
9
|
+
%span.js_the_crop_src_size ?
|
10
|
+
|
11
|
+
%p
|
12
|
+
Cropped image size:
|
13
|
+
%span.js_the_crop_cropped_size ?
|
14
|
+
|
15
|
+
%p{ style: 'display:none' }
|
16
|
+
Image will be resized to:
|
17
|
+
%span.js_the_crop_final_size ?
|
18
|
+
|
19
|
+
.images_block
|
20
|
+
.source_image.js_source_image
|
21
|
+
%img#js_jcrop_target{ src: @post.main_image.url(:original) }
|
22
|
+
|
23
|
+
.preview_image.js_preview_image
|
24
|
+
%img#js_preview{ src: @post.main_image.url(:original) }
|
25
|
+
|
26
|
+
.actions
|
27
|
+
= link_to "Crop!", '#', class: 'btn btn-info js_the_crop_submit'
|
28
|
+
|
29
|
+
= form_tag '#', class: :js_crop_form, method: :patch, remote: true, style: 'display:none' do
|
30
|
+
= text_field_tag 'crop[img_w]'
|
31
|
+
= text_field_tag 'crop[x]'
|
32
|
+
= text_field_tag 'crop[y]'
|
33
|
+
= text_field_tag 'crop[w]'
|
34
|
+
= text_field_tag 'crop[h]'
|