@lemonadejs/cropper 2.0.0 → 5.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.
- package/dist/index.js +370 -0
- package/package.json +5 -4
- package/dist/cropper.js +0 -366
package/dist/index.js
ADDED
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* (c) LemonadeJS components
|
|
3
|
+
*
|
|
4
|
+
* Website: https://lemonadejs.com
|
|
5
|
+
* Description: Image cropper v5
|
|
6
|
+
*
|
|
7
|
+
* MIT License
|
|
8
|
+
*
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
if (!lemonade && typeof (require) === 'function') {
|
|
12
|
+
var lemonade = require('lemonadejs');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!studio && typeof (require) === 'function') {
|
|
16
|
+
var studio = require('@lemonadejs/studio');
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Load jsuites
|
|
20
|
+
if (typeof(jSuites) == 'undefined') {
|
|
21
|
+
if (typeof(require) === 'function') {
|
|
22
|
+
var jSuites = require('jsuites');
|
|
23
|
+
} else if (window.jSuites) {
|
|
24
|
+
var jSuites = window.jSuites;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
if (typeof(cropper) == 'undefined') {
|
|
29
|
+
if (typeof(require) === 'function') {
|
|
30
|
+
var Crop = require('@jsuites/cropper');
|
|
31
|
+
} else if (window.cropper) {
|
|
32
|
+
var Crop = window.cropper;
|
|
33
|
+
}
|
|
34
|
+
} else {
|
|
35
|
+
var Crop = cropper;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
;(function (global, factory) {
|
|
39
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
40
|
+
typeof define === 'function' && define.amd ? define(factory) :
|
|
41
|
+
global.Cropper = factory();
|
|
42
|
+
}(this, (function () {
|
|
43
|
+
|
|
44
|
+
'use strict';
|
|
45
|
+
|
|
46
|
+
const Cropper = function() {
|
|
47
|
+
let self = this;
|
|
48
|
+
let original = self.original ? 1 : 0;
|
|
49
|
+
let width = self.width || 300;
|
|
50
|
+
let height = self.height || 240;
|
|
51
|
+
let modal = null;
|
|
52
|
+
let crop = null;
|
|
53
|
+
let menu = null;
|
|
54
|
+
|
|
55
|
+
self.cropperArea = null;
|
|
56
|
+
self.brightness = 0;
|
|
57
|
+
self.contrast = 0;
|
|
58
|
+
self.greyscale = 0;
|
|
59
|
+
|
|
60
|
+
// Methods
|
|
61
|
+
self.createModal = function(o) {
|
|
62
|
+
modal = jSuites.modal(o, {
|
|
63
|
+
closed: true,
|
|
64
|
+
width: '800px',
|
|
65
|
+
height: '680px',
|
|
66
|
+
title: 'Photo Upload',
|
|
67
|
+
padding: '0',
|
|
68
|
+
icon: 'photo'
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
self.createCropper = function(o) {
|
|
73
|
+
let area = jSuites.getWindowWidth();
|
|
74
|
+
let a;
|
|
75
|
+
let c;
|
|
76
|
+
if (area < 800) {
|
|
77
|
+
a = [ area, area ];
|
|
78
|
+
c = [ area, area ];
|
|
79
|
+
} else {
|
|
80
|
+
a = [798, 360];
|
|
81
|
+
c = [width, height];
|
|
82
|
+
}
|
|
83
|
+
crop = Crop(o, {
|
|
84
|
+
area: a,
|
|
85
|
+
crop: c ,
|
|
86
|
+
allowResize: false,
|
|
87
|
+
onchange: function(el, image) {
|
|
88
|
+
if (image) {
|
|
89
|
+
self.setControls(true);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
self.createMenu = function(o) {
|
|
96
|
+
// Start contextmenu component
|
|
97
|
+
menu = jSuites.contextmenu(o, {
|
|
98
|
+
onclick: function(a,b) {
|
|
99
|
+
a.close();
|
|
100
|
+
b.stopPropagation();
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Controls
|
|
106
|
+
self.createControls = function(o) {
|
|
107
|
+
let tabs = jSuites.tabs(o.children[0], {
|
|
108
|
+
data: [{
|
|
109
|
+
title: 'Crop',
|
|
110
|
+
icon: 'crop',
|
|
111
|
+
width: '100px',
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
title:'Adjusts',
|
|
115
|
+
icon: 'image',
|
|
116
|
+
width: '100px',
|
|
117
|
+
}],
|
|
118
|
+
padding:'10px',
|
|
119
|
+
animation: true,
|
|
120
|
+
position: 'bottom',
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
tabs.content.style.backgroundColor = '#eee';
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const updateZoom = (e) => {
|
|
127
|
+
crop.zoom(e.target.value);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const updateRotate = (e) => {
|
|
131
|
+
crop.rotate(e.target.value);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const setBrightness = (e) => {
|
|
135
|
+
crop.brightness(e.target.value);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
const setContrast = (e) => {
|
|
139
|
+
crop.contrast(e.target.value);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
const updatePhoto = () => {
|
|
143
|
+
// Checks if cropper container is editable
|
|
144
|
+
if (self.cropperArea.classList.contains('jcrop_edition')) {
|
|
145
|
+
self.image.innerHTML = '';
|
|
146
|
+
// Create image with metadata
|
|
147
|
+
let newImage = crop.getCroppedImage();
|
|
148
|
+
// Callback for the blob
|
|
149
|
+
let createImage = function(b) {
|
|
150
|
+
// Transform to blob
|
|
151
|
+
let filename = window.URL.createObjectURL(b);
|
|
152
|
+
// Set upload information
|
|
153
|
+
let data = {
|
|
154
|
+
file: filename,
|
|
155
|
+
content: newImage.src,
|
|
156
|
+
extension: newImage.content.extension,
|
|
157
|
+
};
|
|
158
|
+
// Upload original image
|
|
159
|
+
if (original == true) {
|
|
160
|
+
data.original = crop.getImage().src;
|
|
161
|
+
}
|
|
162
|
+
// Update file to blob
|
|
163
|
+
newImage.src = filename;
|
|
164
|
+
// Integration with jSuites.form
|
|
165
|
+
if (self.name) {
|
|
166
|
+
newImage.classList.remove('jfile');
|
|
167
|
+
}
|
|
168
|
+
// Value
|
|
169
|
+
self.value = [data];
|
|
170
|
+
// Append new image
|
|
171
|
+
self.image.appendChild(newImage);
|
|
172
|
+
}
|
|
173
|
+
// Create image
|
|
174
|
+
crop.getCroppedAsBlob(createImage);
|
|
175
|
+
// Close the modal
|
|
176
|
+
setTimeout(function() {
|
|
177
|
+
modal.close();
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const uploadPhoto = () => {
|
|
183
|
+
jSuites.click(crop.getFileInput());
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const deletePhoto = function() {
|
|
187
|
+
if (self.image) {
|
|
188
|
+
// Reset photo from crop
|
|
189
|
+
crop.reset();
|
|
190
|
+
// Disable controls
|
|
191
|
+
self.setControls(false);
|
|
192
|
+
// Reset from container
|
|
193
|
+
self.image.innerHTML = '';
|
|
194
|
+
// Reset container
|
|
195
|
+
self.value = null;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
self.setControls = function(state) {
|
|
200
|
+
let controls = self.el.querySelectorAll('input.controls');
|
|
201
|
+
if (state == false) {
|
|
202
|
+
for (let i = 0; i < controls.length; i++) {
|
|
203
|
+
controls[i].setAttribute('disabled', 'disabled');
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
for (let i = 0; i < controls.length; i++) {
|
|
207
|
+
controls[i].removeAttribute('disabled');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
for (let i = 0; i < controls.length; i++) {
|
|
212
|
+
if (controls[i].type === 'range') {
|
|
213
|
+
controls[i].value = 0;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
self.getValue = function() {
|
|
219
|
+
return self.value;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
self.setValue = function(data) {
|
|
223
|
+
if (! data) {
|
|
224
|
+
// Reset container
|
|
225
|
+
deletePhoto();
|
|
226
|
+
} else {
|
|
227
|
+
if (typeof(data) == 'string') {
|
|
228
|
+
data = {
|
|
229
|
+
file: data
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
if (data.file) {
|
|
234
|
+
let img = document.createElement('img');
|
|
235
|
+
img.setAttribute('src', data.file);
|
|
236
|
+
img.setAttribute('tabindex', -1);
|
|
237
|
+
self.image.innerHTML = '';
|
|
238
|
+
self.image.appendChild(img);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
if (data.original) {
|
|
242
|
+
crop.addFromFile(data.original);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
self.value = [data];
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
self.open = function() {
|
|
250
|
+
if (! modal.isOpen()) {
|
|
251
|
+
modal.open();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
self.onload = function() {
|
|
256
|
+
self.image.style.maxWidth = self.width + 'px';
|
|
257
|
+
self.image.style.maxHeight = self.height + 'px';
|
|
258
|
+
|
|
259
|
+
// Onclick event
|
|
260
|
+
self.el.addEventListener('mousedown', function(e) {
|
|
261
|
+
let mouseButton;
|
|
262
|
+
e = e || window.event;
|
|
263
|
+
if (e.buttons) {
|
|
264
|
+
mouseButton = e.buttons;
|
|
265
|
+
} else if (e.button) {
|
|
266
|
+
mouseButton = e.button;
|
|
267
|
+
} else {
|
|
268
|
+
mouseButton = e.which;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
if (mouseButton == 1) {
|
|
272
|
+
self.open();
|
|
273
|
+
} else {
|
|
274
|
+
if (e.target.tagName == 'IMG') {
|
|
275
|
+
e.target.focus();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
self.el.addEventListener('contextmenu', function(e) {
|
|
281
|
+
if (e.target.tagName == 'IMG') {
|
|
282
|
+
menu.open(e, [
|
|
283
|
+
{
|
|
284
|
+
title: jSuites.translate('Change image'),
|
|
285
|
+
icon: 'edit',
|
|
286
|
+
onclick: function() {
|
|
287
|
+
self.open();
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
title: jSuites.translate('Delete image'),
|
|
292
|
+
icon: 'delete',
|
|
293
|
+
shortcut: 'DELETE',
|
|
294
|
+
onclick: function() {
|
|
295
|
+
e.target.remove();
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
]);
|
|
299
|
+
e.preventDefault();
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
|
|
303
|
+
self.el.addEventListener('onkeydown', function(e) {
|
|
304
|
+
if (e.key == 'Delete' && e.target.tagName == 'IMG') {
|
|
305
|
+
deletePhoto();
|
|
306
|
+
}
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
self.el.val = function(v) {
|
|
310
|
+
if (v === undefined) {
|
|
311
|
+
return self.getValue();
|
|
312
|
+
} else {
|
|
313
|
+
self.setValue(v);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Template
|
|
320
|
+
return render => render `<div name="{{self.name}}" value="{{self.value}}">
|
|
321
|
+
<div :ref='this.image' class="jphoto jcropper"></div>
|
|
322
|
+
<div :ready='self.createModal'>
|
|
323
|
+
<div :ready='self.createCropper' :ref='self.cropperArea'></div>
|
|
324
|
+
<div :ready='self.createControls' class="controls">
|
|
325
|
+
<div role='tabs'>
|
|
326
|
+
<div role='headers'>
|
|
327
|
+
<div style="background-color: white; padding: 15px !important;"></div>
|
|
328
|
+
<div style="background-color: white;"></div>
|
|
329
|
+
</div>
|
|
330
|
+
<div role='content' style='background-color: #ccc;'>
|
|
331
|
+
<div>
|
|
332
|
+
<div class="lm-center lm-row">
|
|
333
|
+
<label class="lm-f1 lm-p6"> Zoom <input type='range' step='.05' min='0.1' max='5.45' value='1' oninput='${updateZoom}' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
334
|
+
<label class="lm-f1 lm-p6"> Rotate <input type='range' step='.05' min='-1' max='1' value='0' oninput='${updateRotate}' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
335
|
+
</div>
|
|
336
|
+
</div>
|
|
337
|
+
<div>
|
|
338
|
+
<div class="lm-center lm-row">
|
|
339
|
+
<label class="lm-f1 lm-p6"> Brigthness <input type='range' min='-1' max='1' step='.05' value='0' :bind='self.brightness' oninput='${setBrightness}' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
340
|
+
<label class="lm-f1 lm-p6"> Contrast <input type='range' min='-1' max='1' step='.05' value='0' :bind='self.contrast' oninput='${setContrast}' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
341
|
+
</div>
|
|
342
|
+
</div>
|
|
343
|
+
</div>
|
|
344
|
+
</div>
|
|
345
|
+
<div class='lm-row om-p20' style='border-top: 1px solid #aaa'>
|
|
346
|
+
<div class='lm-column lm-p6 lm-f1'>
|
|
347
|
+
<input type='button' value='Save Photo' class='lm-button controls' style='min-width: 140px;' onclick='${updatePhoto}' disabled='disabled'>
|
|
348
|
+
</div><div class='lm-column lm-p6'>
|
|
349
|
+
<input type='button' value='Upload Photo' class='lm-button' style='min-width: 140px;' onclick='${uploadPhoto}'>
|
|
350
|
+
</div><div class='lm-column lm-p6' style='text-align:right'>
|
|
351
|
+
<input type='button' value='Delete Photo' class='lm-button controls' style='min-width: 140px;' onclick='${deletePhoto}' disabled='disabled'>
|
|
352
|
+
</div>
|
|
353
|
+
</div>
|
|
354
|
+
</div>
|
|
355
|
+
</div>
|
|
356
|
+
<div :ready="self.createMenu"></div>
|
|
357
|
+
</div>`;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
lemonade.setComponents({ Cropper: Cropper });
|
|
361
|
+
|
|
362
|
+
return function (root, options, template) {
|
|
363
|
+
if (typeof (root) === 'object') {
|
|
364
|
+
lemonade.render(Cropper, root, options, template)
|
|
365
|
+
return options;
|
|
366
|
+
} else {
|
|
367
|
+
return Cropper.call(this, root, template)
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
})));
|
package/package.json
CHANGED
|
@@ -14,10 +14,11 @@
|
|
|
14
14
|
"javascript plugins"
|
|
15
15
|
],
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"lemonadejs": "^
|
|
18
|
-
"
|
|
17
|
+
"lemonadejs": "^5.0.6",
|
|
18
|
+
"@lemonadejs/studio": "^5.0.0",
|
|
19
|
+
"jsuites": "^5.9.2",
|
|
19
20
|
"@jsuites/cropper": "^1.6.2"
|
|
20
21
|
},
|
|
21
|
-
"main": "dist/
|
|
22
|
-
"version": "
|
|
22
|
+
"main": "dist/index.js",
|
|
23
|
+
"version": "5.0.1"
|
|
23
24
|
}
|
package/dist/cropper.js
DELETED
|
@@ -1,366 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* (c) LemonadeJS components
|
|
3
|
-
*
|
|
4
|
-
* Website: https://lemonadejs.net
|
|
5
|
-
* Description: Image cropper v1.5.2
|
|
6
|
-
*
|
|
7
|
-
* MIT License
|
|
8
|
-
*
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
;(function (global, factory) {
|
|
12
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
|
13
|
-
typeof define === 'function' && define.amd ? define(factory) :
|
|
14
|
-
global.Cropper = factory();
|
|
15
|
-
}(this, (function () {
|
|
16
|
-
|
|
17
|
-
'use strict';
|
|
18
|
-
|
|
19
|
-
// Load lemonadejs
|
|
20
|
-
if (typeof(lemonade) == 'undefined') {
|
|
21
|
-
if (typeof(require) === 'function') {
|
|
22
|
-
var lemonade = require('lemonadejs');
|
|
23
|
-
} else if (window.lemonade) {
|
|
24
|
-
var lemonade = window.lemonade;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
// Load jsuites
|
|
29
|
-
if (typeof(jSuites) == 'undefined') {
|
|
30
|
-
if (typeof(require) === 'function') {
|
|
31
|
-
var jSuites = require('jsuites');
|
|
32
|
-
} else if (window.jSuites) {
|
|
33
|
-
var jSuites = window.jSuites;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if (typeof(cropper) == 'undefined') {
|
|
38
|
-
if (typeof(require) === 'function') {
|
|
39
|
-
var Crop = require('@jsuites/cropper');
|
|
40
|
-
} else if (window.cropper) {
|
|
41
|
-
var Crop = window.cropper;
|
|
42
|
-
}
|
|
43
|
-
} else {
|
|
44
|
-
var Crop = cropper;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return (function() {
|
|
48
|
-
var self = this;
|
|
49
|
-
var original = self.original ? 1 : 0;
|
|
50
|
-
var width = self.width || 300;
|
|
51
|
-
var height = self.height || 240;
|
|
52
|
-
var modal = null;
|
|
53
|
-
var crop = null;
|
|
54
|
-
var menu = null;
|
|
55
|
-
|
|
56
|
-
self.cropperArea = null;
|
|
57
|
-
self.brightness = 0;
|
|
58
|
-
self.contrast = 0;
|
|
59
|
-
self.greyscale = 0;
|
|
60
|
-
|
|
61
|
-
// Methods
|
|
62
|
-
self.createModal = function(o) {
|
|
63
|
-
modal = jSuites.modal(o, {
|
|
64
|
-
closed: true,
|
|
65
|
-
width: '800px',
|
|
66
|
-
height: '680px',
|
|
67
|
-
title: 'Photo Upload',
|
|
68
|
-
padding: '0',
|
|
69
|
-
icon: 'photo'
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
self.createCropper = function(o) {
|
|
74
|
-
var area = jSuites.getWindowWidth();
|
|
75
|
-
if (area < 800) {
|
|
76
|
-
var a = [ area, area ];
|
|
77
|
-
var c = [ area, area ];
|
|
78
|
-
} else {
|
|
79
|
-
var a = [798, 360];
|
|
80
|
-
var c = [width, height];
|
|
81
|
-
}
|
|
82
|
-
crop = Crop(o, {
|
|
83
|
-
area: a,
|
|
84
|
-
crop: c ,
|
|
85
|
-
allowResize: false,
|
|
86
|
-
onchange: function(el, image) {
|
|
87
|
-
if (image) {
|
|
88
|
-
self.setControls(true);
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
self.createMenu = function(o) {
|
|
95
|
-
// Start contextmenu component
|
|
96
|
-
menu = jSuites.contextmenu(o, {
|
|
97
|
-
onclick: function(a,b) {
|
|
98
|
-
a.close();
|
|
99
|
-
b.stopPropagation();
|
|
100
|
-
}
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
// Controls
|
|
105
|
-
self.createControls = function(o) {
|
|
106
|
-
var tabs = jSuites.tabs(o.children[0], {
|
|
107
|
-
data: [{
|
|
108
|
-
title: 'Crop',
|
|
109
|
-
icon: 'crop',
|
|
110
|
-
width: '100px',
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
title:'Adjusts',
|
|
114
|
-
icon: 'image',
|
|
115
|
-
width: '100px',
|
|
116
|
-
}],
|
|
117
|
-
padding:'10px',
|
|
118
|
-
animation: true,
|
|
119
|
-
position: 'bottom',
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
tabs.content.style.backgroundColor = '#eee';
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
self.updateZoom = function(o) {
|
|
126
|
-
crop.zoom(o.value);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
self.updateRotate = function(o) {
|
|
130
|
-
crop.rotate(o.value);
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
self.setBrightness = function(o) {
|
|
134
|
-
crop.brightness(o.value);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
self.setContrast = function(o) {
|
|
138
|
-
crop.contrast(o.value);
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
self.setGreyscale = function(o) {
|
|
142
|
-
crop.greyScale(o.value);
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
self.updatePhoto = function() {
|
|
146
|
-
// Checks if cropper container is editable
|
|
147
|
-
if (self.cropperArea.classList.contains('jcrop_edition')) {
|
|
148
|
-
self.image.innerHTML = '';
|
|
149
|
-
// Create image with metadata
|
|
150
|
-
var newImage = crop.getCroppedImage();
|
|
151
|
-
// Callback for the blob
|
|
152
|
-
var createImage = function(b) {
|
|
153
|
-
// Transform to blob
|
|
154
|
-
var filename = window.URL.createObjectURL(b);
|
|
155
|
-
// Set upload information
|
|
156
|
-
var data = {
|
|
157
|
-
file: filename,
|
|
158
|
-
content: newImage.src,
|
|
159
|
-
extension: newImage.content.extension,
|
|
160
|
-
};
|
|
161
|
-
// Upload original image
|
|
162
|
-
if (original == true) {
|
|
163
|
-
data.original = crop.getImage().src;
|
|
164
|
-
}
|
|
165
|
-
// Update file to blob
|
|
166
|
-
newImage.src = filename;
|
|
167
|
-
// Integration with jSuites.form
|
|
168
|
-
if (self.name) {
|
|
169
|
-
newImage.classList.remove('jfile');
|
|
170
|
-
}
|
|
171
|
-
// Value
|
|
172
|
-
self.value = [data];
|
|
173
|
-
// Append new image
|
|
174
|
-
self.image.appendChild(newImage);
|
|
175
|
-
}
|
|
176
|
-
// Create image
|
|
177
|
-
crop.getCroppedAsBlob(createImage);
|
|
178
|
-
// Close the modal
|
|
179
|
-
setTimeout(function() {
|
|
180
|
-
modal.close();
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
|
|
185
|
-
self.uploadPhoto = function() {
|
|
186
|
-
jSuites.click(crop.getFileInput());
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
self.deletePhoto = function() {
|
|
190
|
-
if (self.image) {
|
|
191
|
-
// Reset photo from crop
|
|
192
|
-
crop.reset();
|
|
193
|
-
// Disable controls
|
|
194
|
-
self.setControls(false);
|
|
195
|
-
// Reset from container
|
|
196
|
-
self.image.innerHTML = '';
|
|
197
|
-
// Reset container
|
|
198
|
-
self.value = null;
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
self.setControls = function(state) {
|
|
203
|
-
var controls = self.el.querySelectorAll('input.controls');
|
|
204
|
-
if (state == false) {
|
|
205
|
-
for (var i = 0; i < controls.length; i++) {
|
|
206
|
-
controls[i].setAttribute('disabled', 'disabled');
|
|
207
|
-
}
|
|
208
|
-
} else {
|
|
209
|
-
for (var i = 0; i < controls.length; i++) {
|
|
210
|
-
controls[i].removeAttribute('disabled');
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
for (var i = 0; i < controls.length; i++) {
|
|
215
|
-
if (controls[i].type === 'range') {
|
|
216
|
-
controls[i].value = 0;
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
self.getValue = function() {
|
|
222
|
-
return self.value;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
self.setValue = function(data) {
|
|
226
|
-
if (! data) {
|
|
227
|
-
// Reset container
|
|
228
|
-
self.deletePhoto();
|
|
229
|
-
} else {
|
|
230
|
-
if (typeof(data) == 'string') {
|
|
231
|
-
data = {
|
|
232
|
-
file: data
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
if (data.file) {
|
|
237
|
-
var img = document.createElement('img');
|
|
238
|
-
img.setAttribute('src', data.file);
|
|
239
|
-
img.setAttribute('tabindex', -1);
|
|
240
|
-
self.image.innerHTML = '';
|
|
241
|
-
self.image.appendChild(img);
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
if (data.original) {
|
|
245
|
-
crop.addFromFile(data.original);
|
|
246
|
-
}
|
|
247
|
-
|
|
248
|
-
self.value = [data];
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
self.open = function() {
|
|
253
|
-
if (! modal.isOpen()) {
|
|
254
|
-
modal.open();
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
self.onload = function() {
|
|
259
|
-
self.image.style.maxWidth = self.width + 'px';
|
|
260
|
-
self.image.style.maxHeight = self.height + 'px';
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
// Template
|
|
264
|
-
var template = `
|
|
265
|
-
<div name="{{self.name}}" value="{{self.value}}">
|
|
266
|
-
<div @ref='self.image' class="jphoto jcropper"></div>
|
|
267
|
-
<div @ready='self.createModal(this)'>
|
|
268
|
-
<div @ready='self.createCropper(this)' @ref='self.cropperArea'></div>
|
|
269
|
-
<div @ready='self.createControls(this)' class="controls">
|
|
270
|
-
<div role='tabs'>
|
|
271
|
-
<div role='headers'>
|
|
272
|
-
<div style="background-color: white; padding: 15px !important;"></div>
|
|
273
|
-
<div style="background-color: white;"></div>
|
|
274
|
-
</div>
|
|
275
|
-
<div role='content' style='background-color: #ccc;'>
|
|
276
|
-
<div>
|
|
277
|
-
<div class="center row">
|
|
278
|
-
<label class="f1 p6" style="padding-top:0px"> Zoom <input type='range' step='.05' min='0.1' max='5.45' value='1' oninput='self.updateZoom(this)' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
279
|
-
<label class="f1 p6" style="padding-top:0px"> Rotate <input type='range' step='.05' min='-1' max='1' value='0' oninput='self.updateRotate(this)' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
280
|
-
</div>
|
|
281
|
-
</div>
|
|
282
|
-
<div>
|
|
283
|
-
<div class="center row">
|
|
284
|
-
<label class="f1 p6" style="padding-top:0px"> Brigthness <input type='range' min='-1' max='1' step='.05' value='0' @bind='self.brightness' oninput='self.setBrightness(this)' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
285
|
-
<label class="f1 p6" style="padding-top:0px"> Contrast <input type='range' min='-1' max='1' step='.05' value='0' @bind='self.contrast' oninput='self.setContrast(this)' style="margin-top:10px;" class='jrange controls' disabled='disabled'></label>
|
|
286
|
-
</div>
|
|
287
|
-
</div>
|
|
288
|
-
</div>
|
|
289
|
-
</div>
|
|
290
|
-
<div class='row p20' style='border-top: 1px solid #aaa'>
|
|
291
|
-
<div class='column p6 f1'>
|
|
292
|
-
<input type='button' value='Save Photo' class='jbutton dark controls w100' style='min-width: 140px;' onclick='self.updatePhoto()' disabled='disabled'>
|
|
293
|
-
</div><div class='column p6'>
|
|
294
|
-
<input type='button' value='Upload Photo' class='jbutton dark w100' style='min-width: 140px;' onclick='self.uploadPhoto()'>
|
|
295
|
-
</div><div class='column p6' style='text-align:right'>
|
|
296
|
-
<input type='button' value='Delete Photo' class='jbutton dark controls w100' style='min-width: 140px;' onclick='self.deletePhoto()' disabled='disabled'>
|
|
297
|
-
</div>
|
|
298
|
-
</div>
|
|
299
|
-
</div>
|
|
300
|
-
</div>
|
|
301
|
-
<div @ready="self.createMenu(this)"></div>
|
|
302
|
-
</div>`;
|
|
303
|
-
|
|
304
|
-
var root = lemonade.element(template, self);
|
|
305
|
-
|
|
306
|
-
// Onclick event
|
|
307
|
-
self.el.addEventListener('mousedown', function(e) {
|
|
308
|
-
|
|
309
|
-
e = e || window.event;
|
|
310
|
-
if (e.buttons) {
|
|
311
|
-
var mouseButton = e.buttons;
|
|
312
|
-
} else if (e.button) {
|
|
313
|
-
var mouseButton = e.button;
|
|
314
|
-
} else {
|
|
315
|
-
var mouseButton = e.which;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
if (mouseButton == 1) {
|
|
319
|
-
self.open();
|
|
320
|
-
} else {
|
|
321
|
-
if (e.target.tagName == 'IMG') {
|
|
322
|
-
e.target.focus();
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
});
|
|
326
|
-
|
|
327
|
-
self.el.addEventListener('contextmenu', function(e) {
|
|
328
|
-
if (e.target.tagName == 'IMG') {
|
|
329
|
-
menu.open(e, [
|
|
330
|
-
{
|
|
331
|
-
title: jSuites.translate('Change image'),
|
|
332
|
-
icon: 'edit',
|
|
333
|
-
onclick: function() {
|
|
334
|
-
self.open();
|
|
335
|
-
}
|
|
336
|
-
},
|
|
337
|
-
{
|
|
338
|
-
title: jSuites.translate('Delete image'),
|
|
339
|
-
icon: 'delete',
|
|
340
|
-
shortcut: 'DELETE',
|
|
341
|
-
onclick: function() {
|
|
342
|
-
e.target.remove();
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
]);
|
|
346
|
-
e.preventDefault();
|
|
347
|
-
}
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
self.el.addEventListener('onkeydown', function(e) {
|
|
351
|
-
if (e.key == 'Delete' && e.target.tagName == 'IMG') {
|
|
352
|
-
self.deletePhoto();
|
|
353
|
-
}
|
|
354
|
-
})
|
|
355
|
-
|
|
356
|
-
self.el.val = function(v) {
|
|
357
|
-
if (v === undefined) {
|
|
358
|
-
return self.getValue();
|
|
359
|
-
} else {
|
|
360
|
-
self.setValue(v);
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
return root;
|
|
365
|
-
});
|
|
366
|
-
})));
|