@lemonadejs/cropper 1.6.2 → 5.0.0

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.
Files changed (2) hide show
  1. package/dist/cropper.js +369 -365
  2. package/package.json +5 -4
package/dist/cropper.js CHANGED
@@ -1,366 +1,370 @@
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
- root.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
- root.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
- root.addEventListener('onkeydown', function(e) {
351
- if (e.key == 'Delete' && e.target.tagName == 'IMG') {
352
- self.deletePhoto();
353
- }
354
- })
355
-
356
- root.val = function(v) {
357
- if (v === undefined) {
358
- return self.getValue();
359
- } else {
360
- self.setValue(v);
361
- }
362
- }
363
-
364
- return root;
365
- });
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
+ }
366
370
  })));
package/package.json CHANGED
@@ -14,10 +14,11 @@
14
14
  "javascript plugins"
15
15
  ],
16
16
  "dependencies": {
17
- "lemonadejs": "^2.2.6",
18
- "jsuites": "^4.10.1",
19
- "@jsuites/cropper": "^1.6.0"
17
+ "lemonadejs": "^5.0.6",
18
+ "@lemonadejs/studio": "^5.0.0",
19
+ "jsuites": "^5.9.2",
20
+ "@jsuites/cropper": "^1.6.2"
20
21
  },
21
22
  "main": "dist/cropper.js",
22
- "version": "1.6.2"
23
+ "version": "5.0.0"
23
24
  }