@bic-fe/mds-ui
Version:
A set of enterprise-class Vue UI components.
193 lines (171 loc) • 5.44 kB
JavaScript
'use strict';
exports.__esModule = true;
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _assign = require('babel-runtime/core-js/object/assign');
var _assign2 = _interopRequireDefault(_assign);
var _create = require('babel-runtime/core-js/object/create');
var _create2 = _interopRequireDefault(_create);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _popper = require('popper.js');
var _popper2 = _interopRequireDefault(_popper);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* 实际使用的位置和popper.js的位置映射表
*/
var placementMap = {
top: 'top',
left: 'left',
right: 'right',
bottom: 'bottom',
topLeft: 'top-start',
topRight: 'top-end',
bottomLeft: 'bottom-start',
bottomRight: 'bottom-end',
leftTop: 'left-start',
leftBottom: 'left-end',
rightTop: 'right-start',
rightBottom: 'right-end'
};
var popperMap = {
'top': 'top',
'left': 'left',
'right': 'right',
'bottom': 'bottom',
'top-start': 'topLeft',
'top-end': 'topRight',
'bottom-start': 'bottomLeft',
'bottom-end': 'bottomRight',
'left-start': 'leftTop',
'left-end': 'leftBottom',
'right-start': 'rightTop',
'right-end': 'rightBottom'
};
exports.default = {
props: {
placement: {
type: String,
default: 'bottom'
},
popperOptions: {
type: Object,
default: function _default() {}
}
},
data: function data() {
return {
placementMap: placementMap,
popperMap: popperMap,
popper: null,
reference: null,
visible: false,
visibleArrow: false,
currentPalcement: '',
popperModifiers: {}
};
},
watch: {
visible: function visible(val) {
var _this = this;
if (val) {
this.$nextTick(function () {
_this.updatePopper();
});
} else {
this.destroyPopper();
}
}
},
computed: {
placementCls: function placementCls() {
return [this.prefixCls + '-placement-' + this.popperMap[this.currentPalcement]];
}
},
created: function created() {
this.currentPalcement = this.placementMap[this.placement];
},
methods: {
createPopper: function createPopper() {
var _this2 = this;
if ((0, _keys2.default)(this.placementMap).indexOf(this.placement) === -1) return;
this.popper = this.popper || this.$refs.popper;
if (this.popperVM && this.popperVM.$el) {
this.popper = this.popperVM.$el;
}
var options = (0, _create2.default)(null);
if (!this.popper || !this.reference) return;
if (this.visibleArrow) this.appendArrow(this.popper);
document.body.appendChild(this.popper);
if (this.popperJS && this.popperJS.destroy) {
this.popperJS.destroy();
}
options.placement = this.currentPalcement;
var defaultModifiers = {
computeStyle: {
gpuAcceleration: false
}
};
options.modifiers = (0, _assign2.default)({}, defaultModifiers, this.popperModifiers);
options.onCreate = function () {
_this2.currentPalcement = _this2.popper.getAttribute('x-placement');
_this2.resetTransformOrigin();
_this2.$nextTick(_this2.updatePopper);
};
options.onUpdate = function () {
_this2.currentPalcement = _this2.popper.getAttribute('x-placement');
};
this.popperJS = new _popper2.default(this.reference, this.popper, (0, _extends3.default)({}, options, this.popperOptions));
},
updatePopper: function updatePopper() {
if (this.popperJS) {
this.popperJS.update();
} else {
this.createPopper();
this.reference && this.reference.__vue__ && this.reference.__vue__.initWidth && this.reference.__vue__.initWidth();
}
},
doDestroy: function doDestroy() {
if (this.visible || !this.popperJS) return;
this.popperJS.destroy();
this.popperJS = null;
},
destroyPopper: function destroyPopper() {
if (this.popperJS) {
this.resetTransformOrigin();
}
},
resetTransformOrigin: function resetTransformOrigin() {
var tfPlacementMap = { top: 'bottom', bottom: 'top', left: 'right', right: 'left' };
var placement = this.currentPalcement.split('-')[0];
var origin = tfPlacementMap[placement];
this.popper.style.transformOrigin = ['top', 'bottom'].indexOf(placement) > -1 ? 'center ' + origin : origin + ' center';
},
appendArrow: function appendArrow(element) {
var hash = void 0;
if (this.appended) {
return;
}
this.appended = true;
(0, _keys2.default)(element.attributes).some(function (item) {
if (/^_v-/.test(element.attributes[item].name)) {
hash = element.attributes[item].name;
return true;
}
return false;
});
var arrow = document.createElement('div');
if (hash) {
arrow.setAttribute(hash, '');
}
arrow.className = this.prefixCls + '-arrow';
element.querySelector('.' + this.prefixCls + '-content').appendChild(arrow);
}
},
beforeDestroy: function beforeDestroy() {
this.doDestroy();
if (this.popper && this.popper.parentNode === document.body) {
document.body.removeChild(this.popper);
}
}
};