iep-ui
Version:
An enterprise-class UI design language and Vue-based implementation
431 lines (393 loc) • 13.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ImageProps = undefined;
var _babelHelperVueJsxMergeProps = require('babel-helper-vue-jsx-merge-props');
var _babelHelperVueJsxMergeProps2 = _interopRequireDefault(_babelHelperVueJsxMergeProps);
var _defineProperty2 = require('babel-runtime/helpers/defineProperty');
var _defineProperty3 = _interopRequireDefault(_defineProperty2);
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _rkWebIcon = require('rk-web-icon');
var _vueTypes = require('../_util/vue-types');
var _vueTypes2 = _interopRequireDefault(_vueTypes);
var _configConsumerProps = require('../config-provider/configConsumerProps');
var _isNumeric = require('../_util/isNumeric');
var _isNumeric2 = _interopRequireDefault(_isNumeric);
var _propsUtil = require('../_util/props-util');
var _classnames3 = require('classnames');
var _classnames4 = _interopRequireDefault(_classnames3);
var _vcDialog = require('../vc-dialog');
var _vcDialog2 = _interopRequireDefault(_vcDialog);
var _addEventListener = require('../vc-util/Dom/addEventListener');
var _addEventListener2 = _interopRequireDefault(_addEventListener);
var _warning = require('../vc-util/warning');
var _getFixScaleEleTransPosition = require('./getFixScaleEleTransPosition');
var _getFixScaleEleTransPosition2 = _interopRequireDefault(_getFixScaleEleTransPosition);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var ImageProps = exports.ImageProps = {
alt: _vueTypes2['default'].string,
fallback: _vueTypes2['default'].string,
height: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].number]),
placeholder: _vueTypes2['default'].any,
preview: _vueTypes2['default'].bool.def(true),
picture: _vueTypes2['default'].string,
src: _vueTypes2['default'].string,
width: _vueTypes2['default'].oneOfType([_vueTypes2['default'].string, _vueTypes2['default'].number]),
onError: _vueTypes2['default'].func
};
exports['default'] = {
name: 'AImage',
inheritAttrs: false,
props: ImageProps,
data: function data() {
return {
imagePath: '',
status: 'loading',
visible: false,
isMoving: false,
scale: 1,
rotate: 0,
wheelDirection: 0,
position: {
x: 0,
y: 0
},
originPositionRef: {
originX: 0,
originY: 0,
deltaX: 0,
deltaY: 0
}
};
},
inject: {
configProvider: { 'default': function _default() {
return _configConsumerProps.ConfigConsumerProps;
} }
},
mounted: function mounted() {
var _this = this;
this.$watch('src', function (e) {
_this.status = 'loading';
}, {
deep: true,
immediate: true
});
this.$watch('visible', function (e) {
if (e) {
_this.addWindowsListeners();
}
}, {
deep: true,
immediate: true
});
},
beforeDestroy: function beforeDestroy() {
this.detachListeners();
},
methods: {
reset: function reset() {
this.visible = false;
this.scale = 1;
this.rotate = 0;
this.wheelDirection = 0;
this.detachListeners();
this.originPositionRef = {
originX: 0,
originY: 0,
deltaX: 0,
deltaY: 0
};
this.position = {
x: 0,
y: 0
};
this.detachListeners();
},
addWindowsListeners: function addWindowsListeners() {
this.onMouseUpListener = (0, _addEventListener2['default'])(window, 'mouseup', this.onMouseUp, false);
this.onMouseMoveListener = (0, _addEventListener2['default'])(window, 'mousemove', this.onMouseMove, false);
this.onScrollWheelListener = (0, _addEventListener2['default'])(window, 'wheel', this.onWheelMove, {
passive: false
});
try {
if (window.top !== window.self) {
this.onMouseUpListener = (0, _addEventListener2['default'])(window.top, 'mouseup', this.onMouseUp, false);
this.onMouseUpListener = (0, _addEventListener2['default'])(window.top, 'mousemove', this.onMouseMove, false);
}
} catch (error) {
/* istanbul ignore next */
(0, _warning.warning)(false, '[vc-image] ' + error);
}
},
detachListeners: function detachListeners() {
this.onMouseUpListener && this.onMouseUpListener.remove();
this.onMouseMoveListener && this.onMouseMoveListener.remove();
this.onScrollWheelListener && this.onScrollWheelListener.remove();
},
onImageLoad: function onImageLoad() {
this.status = 'normal';
},
onImageError: function onImageError(e) {
this.status = 'error';
this.$emit('onError', e);
},
onZoomIn: function onZoomIn() {
this.scale++;
this.setPosition({
x: 0,
y: 0
});
},
onZoomOut: function onZoomOut() {
if (this.scale > 1) {
this.scale--;
}
this.setPosition({
x: 0,
y: 0
});
},
onRotateRight: function onRotateRight() {
this.rotate += 90;
},
onRotateLeft: function onRotateLeft() {
this.rotate -= 90;
},
onMouseUp: function onMouseUp(event) {
event.preventDefault();
event.stopPropagation();
if (this.visible && this.isMoving) {
var imgRef = this.$refs.imgRef;
var width = imgRef.offsetWidth * this.scale;
var height = imgRef.offsetHeight * this.scale;
var _imgRef$getBoundingCl = imgRef.getBoundingClientRect(),
left = _imgRef$getBoundingCl.left,
top = _imgRef$getBoundingCl.top;
var isRotate = this.rotate % 180 !== 0;
this.isMoving = false;
var fixState = (0, _getFixScaleEleTransPosition2['default'])(isRotate ? height : width, isRotate ? width : height, left, top);
if (fixState) {
this.setPosition((0, _extends3['default'])({}, fixState));
}
}
},
onMouseDown: function onMouseDown(event) {
if (event.button !== 0) return;
event.preventDefault();
event.stopPropagation();
this.originPositionRef = {
deltaX: event.pageX - this.position.x,
deltaY: event.pageY - this.position.y,
originX: this.position.x,
originY: this.position.y
};
this.isMoving = true;
},
onMouseMove: function onMouseMove(event) {
if (!this.isMoving) return;
event.preventDefault();
this.setPosition({
x: event.pageX - this.originPositionRef.deltaX,
y: event.pageY - this.originPositionRef.deltaY
});
},
onWheelMove: function onWheelMove(event) {
if (!this.visible) return;
event.preventDefault();
this.wheelDirection = event.nativeEvent.deltaY;
this.setLastWheelZoomDirection();
},
setLastWheelZoomDirection: function setLastWheelZoomDirection() {
if (this.wheelDirection > 0) {
this.onZoomOut();
} else if (this.wheelDirection < 0) {
this.onZoomIn();
} else {
this.setPosition({
x: 0,
y: 0
});
}
},
handleCancel: function handleCancel() {
this.reset();
this.$emit('close');
},
setPosition: function setPosition(e) {
if (e.x || e.x === 0) {
this.position.x = e.x;
}
if (e.y || e.y === 0) {
this.position.y = e.y;
}
}
},
render: function render() {
var _this2 = this;
var h = arguments[0];
var customizePrefixCls = this.prefixCls,
width = this.width,
height = this.height,
$slots = this.$slots,
alt = this.alt,
fallback = this.fallback,
src = this.src,
picture = this.picture,
placeholder = this.placeholder,
preview = this.preview,
status = this.status,
scale = this.scale,
visible = this.visible,
rotate = this.rotate;
var _configProvider = this.configProvider,
getPrefixCls = _configProvider.getPrefixCls,
getContextPopupContainer = _configProvider.getPopupContainer;
var prefixCls = getPrefixCls('image', customizePrefixCls);
var wrapperPrefixCls = getPrefixCls('image-group', customizePrefixCls);
var previewPrefixCls = getPrefixCls('image-preview', customizePrefixCls);
var wrappperClass = (0, _classnames4['default'])(prefixCls, (0, _defineProperty3['default'])({}, prefixCls + '-error', this.isError));
var imgCommonProps = {
on: (0, _propsUtil.getListeners)(this),
alt: alt,
'class': (0, _classnames4['default'])(prefixCls + '-img', (0, _defineProperty3['default'])({}, prefixCls + '-img-placeholder', placeholder === true))
};
var dialogProps = {
props: {
getContainer: getContextPopupContainer,
prefixCls: previewPrefixCls,
visible: visible
},
on: {
close: this.handleCancel
}
};
var wrapClassName = (0, _classnames4['default'])((0, _defineProperty3['default'])({}, previewPrefixCls + '-moving', this.isMoving));
var toolClassName = previewPrefixCls + '-operations-operation';
var iconClassName = previewPrefixCls + '-operations-icon';
var tools = [{
onClick: this.handleCancel,
type: 'basic_linear_button_close'
}, {
onClick: this.onZoomIn,
type: 'basic_linear_common_oom'
}, {
onClick: this.onZoomOut,
type: 'basic_linear_common_oom2',
disabled: this.scale === 1
}, {
onClick: this.onRotateRight,
type: 'basic_linear_directive_rotate2'
}, {
onClick: this.onRotateLeft,
type: 'basic_linear_directive_rotate'
}];
return h(
'div',
{
'class': wrappperClass,
on: {
'click': function click() {
if (_this2.status === 'error' || !preview) return;
if (_this2.$parent.ANT_PREVIEW_GROUP) {
_this2.$parent.setPreview(src);
} else {
_this2.visible = true;
_this2.$emit('click', src);
}
}
},
style: {
width: (0, _isNumeric2['default'])(width) ? width + 'px' : String(width),
height: (0, _isNumeric2['default'])(height) ? height + 'px' : String(height)
}
},
[$slots.placeholder ? $slots.placeholder : h('img', (0, _babelHelperVueJsxMergeProps2['default'])([{
attrs: {
src: status === 'error' && fallback ? fallback : src
}
}, imgCommonProps, {
on: {
'load': this.onImageLoad,
'error': this.onImageError
},
ref: 'fiexdImage'
}])), status === 'error' && !fallback ? h('div', {
attrs: { 'aria-hidden': 'true' },
'class': prefixCls + '-img-placeholder' }) : null, status === 'loading' && h(
'div',
{
attrs: { 'aria-hidden': 'true' },
'class': prefixCls + '-img-placeholder' },
[$slots.placeholder]
), preview && status !== 'error' && h(
'div',
{ 'class': 'ant-image-mask' },
[h(
'div',
{ 'class': 'ant-image-mask-info' },
[h(_rkWebIcon.IepIcon, {
attrs: { type: 'basic_linear_common_ee4' }
}), '\u9884\u89C8']
)]
), h(
'div',
{ 'class': wrapperPrefixCls, ref: 'AntimageGroup' },
[$slots['default'], h(
_vcDialog2['default'],
(0, _babelHelperVueJsxMergeProps2['default'])([{
attrs: {
closable: false,
wrapClassName: wrapClassName,
transitionName: 'zoom',
afterClose: this.onAfterClose,
maskClosable: false,
maskTransitionName: 'fade',
keyboard: true
}
}, dialogProps]),
[h(
'ul',
{ 'class': previewPrefixCls + '-operations' },
[tools.map(function (item) {
return h(
'li',
{
'class': (0, _classnames4['default'])(toolClassName, (0, _defineProperty3['default'])({}, previewPrefixCls + '-operations-operation-disabled', item.disabled)),
on: {
'click': item.onClick
},
key: item.type
},
[h(_rkWebIcon.IepIcon, { 'class': (0, _classnames4['default'])(iconClassName, ['anticon', iconClassName]), attrs: { type: item.type }
})]
);
})]
), h(
'div',
{
'class': previewPrefixCls + '-img-wrapper',
style: {
transform: 'translate3d(' + this.position.x + 'px, ' + this.position.y + 'px, 0)'
}
},
[h('img', {
on: {
'mousedown': this.onMouseDown
},
ref: 'imgRef',
'class': previewPrefixCls + '-img',
attrs: { src: picture ? picture : src
},
style: {
transform: 'scale3d(' + scale + ', ' + scale + ', 1) rotate(' + rotate + 'deg)'
}
})]
)]
)]
)]
);
}
};