import {
DATA_PREVIEW,
} from './constants';
import {
each,
empty,
extend,
getData,
getTransforms,
removeData,
setData,
setStyle,
} from './utilities';
export default {
initPreview() {
const { crossOrigin } = this;
const { preview } = this.options;
const url = crossOrigin ? this.crossOriginUrl : this.url;
const image = document.createElement('img');
if (crossOrigin) {
image.crossOrigin = crossOrigin;
}
image.src = url;
this.viewBox.appendChild(image);
this.image2 = image;
if (!preview) {
return;
}
const previews = preview.querySelector ? [preview] : document.querySelectorAll(preview);
this.previews = previews;
each(previews, (element) => {
const img = document.createElement('img');
// Save the original size for recover
setData(element, DATA_PREVIEW, {
width: element.offsetWidth,
height: element.offsetHeight,
html: element.innerHTML,
});
if (crossOrigin) {
img.crossOrigin = crossOrigin;
}
img.src = url;
/**
* Override img element styles
* Add `display:block` to avoid margin top issue
* Add `height:auto` to override `height` attribute on IE8
* (Occur only when margin-top <= -height)
*/
img.style.cssText = (
'display:block;' +
'width:100%;' +
'height:auto;' +
'min-width:0!important;' +
'min-height:0!important;' +
'max-width:none!important;' +
'max-height:none!important;' +
'image-orientation:0deg!important;"'
);
empty(element);
element.appendChild(img);
});
},
resetPreview() {
each(this.previews, (element) => {
const data = getData(element, DATA_PREVIEW);
setStyle(element, {
width: data.width,
height: data.height,
});
element.innerHTML = data.html;
removeData(element, DATA_PREVIEW);
});
},
preview() {
const { imageData, canvasData, cropBoxData } = this;
const { width: cropBoxWidth, height: cropBoxHeight } = cropBoxData;
const { width, height } = imageData;
const left = cropBoxData.left - canvasData.left - imageData.left;
const top = cropBoxData.top - canvasData.top - imageData.top;
if (!this.cropped || this.disabled) {
return;
}
setStyle(this.image2, extend({
width,
height,
}, getTransforms(extend({
translateX: -left,
translateY: -top,
}, imageData))));
each(this.previews, (element) => {
const data = getData(element, DATA_PREVIEW);
const originalWidth = data.width;
const originalHeight = data.height;
let newWidth = originalWidth;
let newHeight = originalHeight;
let ratio = 1;
if (cropBoxWidth) {
ratio = originalWidth / cropBoxWidth;
newHeight = cropBoxHeight * ratio;
}
if (cropBoxHeight && newHeight > originalHeight) {
ratio = originalHeight / cropBoxHeight;
newWidth = cropBoxWidth * ratio;
newHeight = originalHeight;
}
setStyle(element, {
width: newWidth,
height: newHeight,
});
setStyle(element.getElementsByTagName('img')[0], extend({
width: width * ratio,
height: height * ratio,
}, getTransforms(extend({
translateX: -left * ratio,
translateY: -top * ratio,
}, imageData))));
});
},
};