ant-design-vue
Version:
An enterprise-class UI design language and Vue-based implementation
277 lines (249 loc) • 10.2 kB
JavaScript
import { isVNode as _isVNode, createVNode as _createVNode, Fragment as _Fragment } from "vue";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
import { ref, watch, defineComponent, computed, onMounted } from 'vue';
import { isNumber } from 'lodash-es';
import BaseMixin from '../../_util/BaseMixin';
import cn from '../../_util/classNames';
import PropTypes from '../../_util/vue-types';
import { getOffset } from '../../vc-util/Dom/css';
import Preview from './Preview';
import PreviewGroup, { context } from './PreviewGroup';
function _isSlot(s) {
return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !_isVNode(s);
}
export var ImageProps = {
src: PropTypes.string,
wrapperClassName: PropTypes.string,
wrapperStyle: PropTypes.style,
prefixCls: PropTypes.string,
previewPrefixCls: PropTypes.string,
placeholder: PropTypes.VNodeChild,
fallback: PropTypes.string,
preview: PropTypes.oneOfType([PropTypes.looseBool, PropTypes.shape({
visible: PropTypes.bool,
onVisibleChange: PropTypes.func,
getContainer: PropTypes.oneOf([PropTypes.func, PropTypes.bool])
})]).def(true)
};
var mergeDefaultValue = function mergeDefaultValue(obj, defaultValues) {
var res = _extends({}, obj);
Object.keys(defaultValues).forEach(function (key) {
if (obj[key] === undefined) {
res[key] = defaultValues[key];
}
});
return res;
};
var uuid = 0;
var ImageInternal = defineComponent({
name: 'Image',
mixins: [BaseMixin],
inheritAttrs: false,
props: ImageProps,
emits: ['click'],
setup: function setup(props, _ref) {
var attrs = _ref.attrs,
slots = _ref.slots,
emit = _ref.emit;
var prefixCls = computed(function () {
return props.prefixCls;
});
var previewPrefixCls = computed(function () {
return "".concat(prefixCls.value, "-preview");
});
var preview = computed(function () {
var defaultValues = {
visible: undefined,
onVisibleChange: function onVisibleChange() {},
getContainer: undefined
};
return _typeof(props.preview) === 'object' ? mergeDefaultValue(props.preview, defaultValues) : defaultValues;
});
var isCustomPlaceholder = computed(function () {
return props.placeholder && props.placeholder !== true || slots.placeholder;
});
var previewVisible = computed(function () {
return preview.value.visible;
});
var onPreviewVisibleChange = computed(function () {
return preview.value.onVisibleChange;
});
var getPreviewContainer = computed(function () {
return preview.value.getContainer;
});
var isControlled = computed(function () {
return previewVisible.value !== undefined;
});
var isShowPreview = ref(!!previewVisible.value);
watch(previewVisible, function () {
isShowPreview.value = !!previewVisible.value;
});
watch(isShowPreview, function (val, preVal) {
onPreviewVisibleChange.value(val, preVal);
});
var status = ref(isCustomPlaceholder.value ? 'loading' : 'normal');
watch(function () {
return props.src;
}, function () {
status.value = isCustomPlaceholder.value ? 'loading' : 'normal';
});
var mousePosition = ref(null);
var isError = computed(function () {
return status.value === 'error';
});
var groupContext = context.inject();
var isPreviewGroup = groupContext.isPreviewGroup,
setCurrent = groupContext.setCurrent,
setGroupShowPreview = groupContext.setShowPreview,
setGroupMousePosition = groupContext.setMousePosition,
registerImage = groupContext.registerImage;
var currentId = ref(uuid++);
var canPreview = computed(function () {
return props.preview && !isError.value;
});
var onLoad = function onLoad() {
status.value = 'normal';
};
var onError = function onError() {
status.value = 'error';
};
var onPreview = function onPreview(e) {
if (!isControlled.value) {
var _getOffset = getOffset(e.target),
left = _getOffset.left,
top = _getOffset.top;
if (isPreviewGroup.value) {
setCurrent(currentId.value);
setGroupMousePosition({
x: left,
y: top
});
} else {
mousePosition.value = {
x: left,
y: top
};
}
}
if (isPreviewGroup.value) {
setGroupShowPreview(true);
} else {
isShowPreview.value = true;
}
emit('click', e);
};
var onPreviewClose = function onPreviewClose() {
isShowPreview.value = false;
if (!isControlled.value) {
mousePosition.value = null;
}
};
var img = ref(null);
watch(function () {
return img;
}, function () {
if (status.value !== 'loading') return;
if (img.value.complete && (img.value.naturalWidth || img.value.naturalHeight)) {
onLoad();
}
});
var unRegister = function unRegister() {};
onMounted(function () {
watch([function () {
return props.src;
}, canPreview], function () {
unRegister();
if (!isPreviewGroup.value) {
return function () {};
}
unRegister = registerImage(currentId.value, props.src);
if (!canPreview.value) {
unRegister();
}
}, {
flush: 'post',
immediate: true
});
});
var toSizePx = function toSizePx(l) {
if (isNumber(l)) return l + 'px';
return l;
};
return function () {
var prefixCls = props.prefixCls,
wrapperClassName = props.wrapperClassName,
fallback = props.fallback,
src = props.src,
preview = props.preview,
placeholder = props.placeholder,
wrapperStyle = props.wrapperStyle;
var width = attrs.width,
height = attrs.height,
crossorigin = attrs.crossorigin,
decoding = attrs.decoding,
alt = attrs.alt,
sizes = attrs.sizes,
srcset = attrs.srcset,
usemap = attrs.usemap,
cls = attrs.class,
style = attrs.style;
var wrappperClass = cn(prefixCls, wrapperClassName, _defineProperty({}, "".concat(prefixCls, "-error"), isError.value));
var mergedSrc = isError.value && fallback ? fallback : src;
var previewMask = slots.previewMask && slots.previewMask();
var imgCommonProps = {
crossorigin: crossorigin,
decoding: decoding,
alt: alt,
sizes: sizes,
srcset: srcset,
usemap: usemap,
class: cn("".concat(prefixCls, "-img"), _defineProperty({}, "".concat(prefixCls, "-img-placeholder"), placeholder === true), cls),
style: _extends({
height: height
}, style)
};
return _createVNode(_Fragment, null, [_createVNode("div", {
"class": wrappperClass,
"onClick": preview && !isError.value ? onPreview : function (e) {
emit('click', e);
},
"style": _extends({
width: toSizePx(width),
height: toSizePx(height)
}, wrapperStyle)
}, [_createVNode("img", _objectSpread(_objectSpread(_objectSpread({}, imgCommonProps), isError.value && fallback ? {
src: fallback
} : {
onLoad: onLoad,
onError: onError,
src: src
}), {}, {
"ref": img
}), null), status.value === 'loading' && _createVNode("div", {
"aria-hidden": "true",
"class": "".concat(prefixCls, "-placeholder")
}, [placeholder || slots.placeholder && slots.placeholder()]), previewMask && canPreview.value && _createVNode("div", {
"class": "".concat(prefixCls, "-mask")
}, _isSlot(previewMask) ? previewMask : {
default: function _default() {
return [previewMask];
}
})]), !isPreviewGroup.value && canPreview.value && _createVNode(Preview, {
"aria-hidden": !isShowPreview.value,
"visible": isShowPreview.value,
"prefixCls": previewPrefixCls.value,
"onClose": onPreviewClose,
"mousePosition": mousePosition.value,
"src": mergedSrc,
"alt": alt,
"getContainer": getPreviewContainer
}, null)]);
};
}
});
ImageInternal.PreviewGroup = PreviewGroup;
export default ImageInternal;