vxe-table-select-area
Version:
一个基于 vxe-table 的可区域选中复制、粘贴的组件
359 lines (358 loc) • 11.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _xeUtils = _interopRequireDefault(require("xe-utils"));
var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf"));
var _size = _interopRequireDefault(require("../../mixins/size"));
var _utils = _interopRequireDefault(require("../../tools/utils"));
var _dom = _interopRequireDefault(require("../../tools/dom"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function updateTipStyle(_vm) {
var wrapperElem = _vm.$el,
tipTarget = _vm.tipTarget,
tipStore = _vm.tipStore;
if (tipTarget) {
var _DomTools$getDomNode = _dom["default"].getDomNode(),
scrollTop = _DomTools$getDomNode.scrollTop,
scrollLeft = _DomTools$getDomNode.scrollLeft,
visibleWidth = _DomTools$getDomNode.visibleWidth;
var _DomTools$getAbsolute = _dom["default"].getAbsolutePos(tipTarget),
top = _DomTools$getAbsolute.top,
left = _DomTools$getAbsolute.left;
var marginSize = 6;
var offsetHeight = wrapperElem.offsetHeight;
var offsetWidth = wrapperElem.offsetWidth;
var tipTop = top - offsetHeight - marginSize;
var tipLeft = Math.max(marginSize, left + Math.floor((tipTarget.offsetWidth - offsetWidth) / 2));
if (tipLeft + offsetWidth + marginSize > scrollLeft + visibleWidth) {
tipLeft = scrollLeft + visibleWidth - offsetWidth - marginSize;
}
if (top - offsetHeight < scrollTop + marginSize) {
tipStore.placement = 'bottom';
tipTop = top + tipTarget.offsetHeight + marginSize;
}
tipStore.style.top = "".concat(tipTop, "px");
tipStore.style.left = "".concat(tipLeft, "px");
tipStore.arrowStyle.left = "".concat(left - tipLeft + tipTarget.offsetWidth / 2, "px");
}
}
function showTip(_vm) {
var $el = _vm.$el,
tipStore = _vm.tipStore,
zIndex = _vm.zIndex;
var parentNode = $el.parentNode;
if (!parentNode) {
document.body.appendChild($el);
}
_vm.updateValue(true);
_vm.updateZindex();
tipStore.placement = 'top';
tipStore.style = {
width: 'auto',
left: 0,
top: 0,
zIndex: zIndex || _vm.tipZindex
};
tipStore.arrowStyle = {
left: '50%'
};
return _vm.updatePlacement();
}
function renderContent(h, _vm) {
var $scopedSlots = _vm.$scopedSlots,
useHTML = _vm.useHTML,
tipContent = _vm.tipContent;
if ($scopedSlots.content) {
return h('div', {
key: 1,
"class": 'vxe-table--tooltip-content'
}, $scopedSlots.content.call(this, {}));
}
if (useHTML) {
return h('div', {
key: 2,
"class": 'vxe-table--tooltip-content',
domProps: {
innerHTML: tipContent
}
});
}
return h('div', {
key: 3,
"class": 'vxe-table--tooltip-content'
}, _utils["default"].formatText(tipContent));
}
var _default2 = {
name: 'VxeTooltip',
mixins: [_size["default"]],
props: {
value: Boolean,
size: {
type: String,
"default": function _default() {
return _conf["default"].tooltip.size || _conf["default"].size;
}
},
trigger: {
type: String,
"default": function _default() {
return _conf["default"].tooltip.trigger;
}
},
theme: {
type: String,
"default": function _default() {
return _conf["default"].tooltip.theme;
}
},
content: {
type: [String, Number],
"default": null
},
useHTML: Boolean,
zIndex: [String, Number],
isArrow: {
type: Boolean,
"default": true
},
enterable: Boolean,
enterDelay: {
type: Number,
"default": function _default() {
return _conf["default"].tooltip.enterDelay;
}
},
leaveDelay: {
type: Number,
"default": function _default() {
return _conf["default"].tooltip.leaveDelay;
}
}
},
data: function data() {
return {
isUpdate: false,
visible: false,
tipContent: '',
tipActive: false,
tipTarget: null,
tipZindex: 0,
tipStore: {
style: {},
placement: '',
arrowStyle: null
}
};
},
watch: {
content: function content(value) {
this.tipContent = value;
},
value: function value(_value) {
if (!this.isUpdate) {
this[_value ? 'open' : 'close']();
}
this.isUpdate = false;
}
},
created: function created() {
var _this = this;
this.showDelayTip = _xeUtils["default"].debounce(function () {
if (_this.tipActive) {
showTip(_this);
}
}, this.enterDelay, {
leading: false,
trailing: true
});
},
mounted: function mounted() {
var $el = this.$el,
trigger = this.trigger,
content = this.content,
value = this.value;
var parentNode = $el.parentNode;
if (parentNode) {
var target;
this.tipContent = content;
this.tipZindex = _utils["default"].nextZIndex();
_xeUtils["default"].arrayEach($el.children, function (elem, index) {
if (index > 1) {
parentNode.insertBefore(elem, $el);
if (!target) {
target = elem;
}
}
});
parentNode.removeChild($el);
this.target = target;
if (target) {
if (trigger === 'hover') {
target.onmouseleave = this.targetMouseleaveEvent;
target.onmouseenter = this.targetMouseenterEvent;
} else if (trigger === 'click') {
target.onclick = this.clickEvent;
}
}
if (value) {
this.open();
}
}
},
beforeDestroy: function beforeDestroy() {
var $el = this.$el,
target = this.target,
trigger = this.trigger;
var parentNode = $el.parentNode;
if (parentNode) {
parentNode.removeChild($el);
}
if (target) {
if (trigger === 'hover') {
target.onmouseenter = null;
target.onmouseleave = null;
} else if (trigger === 'click') {
target.onclick = null;
}
}
},
render: function render(h) {
var _ref;
var $scopedSlots = this.$scopedSlots,
vSize = this.vSize,
theme = this.theme,
tipActive = this.tipActive,
isArrow = this.isArrow,
visible = this.visible,
tipStore = this.tipStore,
enterable = this.enterable;
var on;
if (enterable) {
on = {
mouseenter: this.wrapperMouseenterEvent,
mouseleave: this.wrapperMouseleaveEvent
};
}
return h('div', {
"class": ['vxe-table--tooltip-wrapper', "theme--".concat(theme), (_ref = {}, _defineProperty(_ref, "size--".concat(vSize), vSize), _defineProperty(_ref, "placement--".concat(tipStore.placement), tipStore.placement), _defineProperty(_ref, 'is--enterable', enterable), _defineProperty(_ref, 'is--visible', visible), _defineProperty(_ref, 'is--arrow', isArrow), _defineProperty(_ref, 'is--actived', tipActive), _ref)],
style: tipStore.style,
ref: 'tipWrapper',
on: on
}, [renderContent(h, this), h('div', {
"class": 'vxe-table--tooltip-arrow',
style: tipStore.arrowStyle
})].concat($scopedSlots["default"] ? $scopedSlots["default"].call(this, {}) : []));
},
methods: {
open: function open(target, content) {
return this.toVisible(target || this.target, content);
},
close: function close() {
this.tipTarget = null;
this.tipActive = false;
Object.assign(this.tipStore, {
style: {},
placement: '',
arrowStyle: null
});
this.updateValue(false);
return this.$nextTick();
},
updateValue: function updateValue(value) {
if (value !== this.visible) {
this.visible = value;
this.isUpdate = true;
if (this.$listeners.input) {
this.$emit('input', this.visible);
}
}
},
updateZindex: function updateZindex() {
if (this.tipZindex < _utils["default"].getLastZIndex()) {
this.tipZindex = _utils["default"].nextZIndex();
}
},
toVisible: function toVisible(target, content) {
if (target) {
var trigger = this.trigger,
enterDelay = this.enterDelay;
this.tipActive = true;
this.tipTarget = target;
if (content) {
this.tipContent = content;
}
if (enterDelay && trigger === 'hover') {
this.showDelayTip();
} else {
return showTip(this);
}
}
return this.$nextTick();
},
updatePlacement: function updatePlacement() {
var _this2 = this;
return this.$nextTick().then(function () {
var wrapperElem = _this2.$el,
tipTarget = _this2.tipTarget;
if (tipTarget && wrapperElem) {
updateTipStyle(_this2);
return _this2.$nextTick().then(function () {
return updateTipStyle(_this2);
});
}
});
},
isActived: function isActived() {
return this.tipActive;
},
setActived: function setActived(actived) {
this.tipActive = !!actived;
},
clickEvent: function clickEvent() {
this[this.visible ? 'close' : 'open']();
},
targetMouseenterEvent: function targetMouseenterEvent() {
this.open();
},
targetMouseleaveEvent: function targetMouseleaveEvent() {
var _this3 = this;
var trigger = this.trigger,
enterable = this.enterable,
leaveDelay = this.leaveDelay;
this.tipActive = false;
if (enterable && trigger === 'hover') {
setTimeout(function () {
if (!_this3.tipActive) {
_this3.close();
}
}, leaveDelay);
} else {
this.close();
}
},
wrapperMouseenterEvent: function wrapperMouseenterEvent() {
this.tipActive = true;
},
wrapperMouseleaveEvent: function wrapperMouseleaveEvent() {
var _this4 = this;
var trigger = this.trigger,
enterable = this.enterable,
leaveDelay = this.leaveDelay;
this.tipActive = false;
if (enterable && trigger === 'hover') {
setTimeout(function () {
if (!_this4.tipActive) {
_this4.close();
}
}, leaveDelay);
}
}
}
};
exports["default"] = _default2;