UNPKG

vxe-table-select-area

Version:

一个基于 vxe-table 的可区域选中复制、粘贴的组件

332 lines (331 loc) 14.9 kB
"use strict"; 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); } Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _xeUtils = _interopRequireDefault(require("xe-utils")); var _utils = _interopRequireWildcard(require("../../tools/utils")); var _dom = _interopRequireDefault(require("../../tools/dom")); var _vXETable = _interopRequireDefault(require("../../v-x-e-table")); var _log = require("../../tools/log"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } var _default = { methods: { /** * 关闭快捷菜单 */ _closeMenu: function _closeMenu() { Object.assign(this.ctxMenuStore, { visible: false, selected: null, selectChild: null, showChild: false }); return this.$nextTick(); }, // 处理菜单的移动 moveCtxMenu: function moveCtxMenu(evnt, keyCode, ctxMenuStore, property, operKey, operRest, menuList) { var selectItem; var selectIndex = _xeUtils["default"].findIndexOf(menuList, function (item) { return ctxMenuStore[property] === item; }); if (keyCode === operKey) { if (operRest && _utils["default"].hasChildrenList(ctxMenuStore.selected)) { ctxMenuStore.showChild = true; } else { ctxMenuStore.showChild = false; ctxMenuStore.selectChild = null; } } else if (keyCode === 38) { for (var len = selectIndex - 1; len >= 0; len--) { if (menuList[len].visible !== false) { selectItem = menuList[len]; break; } } ctxMenuStore[property] = selectItem || menuList[menuList.length - 1]; } else if (keyCode === 40) { for (var index = selectIndex + 1; index < menuList.length; index++) { if (menuList[index].visible !== false) { selectItem = menuList[index]; break; } } ctxMenuStore[property] = selectItem || menuList[0]; } else if (ctxMenuStore[property] && (keyCode === 13 || keyCode === 32)) { this.ctxMenuLinkEvent(evnt, ctxMenuStore[property]); } }, /** * 快捷菜单事件处理 */ handleGlobalContextmenuEvent: function handleGlobalContextmenuEvent(evnt) { var $refs = this.$refs, tId = this.tId, editStore = this.editStore, menuConfig = this.menuConfig, contextMenu = this.contextMenu, ctxMenuStore = this.ctxMenuStore, ctxMenuOpts = this.ctxMenuOpts, mouseConfig = this.mouseConfig, mouseOpts = this.mouseOpts; var selected = editStore.selected; var layoutList = ['header', 'body', 'footer']; if ((0, _utils.isEnableConf)(menuConfig) || contextMenu) { if (ctxMenuStore.visible && $refs.ctxWrapper && _dom["default"].getEventTargetNode(evnt, $refs.ctxWrapper.$el).flag) { evnt.preventDefault(); return; } if (this._keyCtx) { var type = 'body'; var params = { type: type, $grid: this.$xegrid, $table: this, keyboard: true, columns: this.visibleColumn.slice(0), $event: evnt }; // 如果开启单元格区域 if (mouseConfig && mouseOpts.area) { var activeArea = this.getActiveCellArea(); if (activeArea && activeArea.row && activeArea.column) { params.row = activeArea.row; params.column = activeArea.column; this.openContextMenu(evnt, type, params); return; } } else if (mouseConfig && mouseOpts.selected) { // 如果启用键盘导航且已选中单元格 if (selected.row && selected.column) { params.row = selected.row; params.column = selected.column; this.openContextMenu(evnt, type, params); return; } } } // 分别匹配表尾、内容、表尾的快捷菜单 for (var index = 0; index < layoutList.length; index++) { var layout = layoutList[index]; var columnTargetNode = _dom["default"].getEventTargetNode(evnt, this.$el, "vxe-".concat(layout, "--column"), function (target) { // target=td|th,直接向上找 table 去匹配即可 return target.parentNode.parentNode.parentNode.getAttribute('xid') === tId; }); var _params = { type: layout, $grid: this.$xegrid, $table: this, columns: this.visibleColumn.slice(0), $event: evnt }; if (columnTargetNode.flag) { var cell = columnTargetNode.targetElem; var column = this.getColumnNode(cell).item; var typePrefix = "".concat(layout, "-"); Object.assign(_params, { column: column, columnIndex: this.getColumnIndex(column), cell: cell }); if (layout === 'body') { var row = this.getRowNode(cell.parentNode).item; typePrefix = ''; _params.row = row; _params.rowIndex = this.getRowIndex(row); } this.openContextMenu(evnt, layout, _params); // 在 v4 中废弃事件 cell-context-menu、header-cell-context-menu、footer-cell-context-menu if (this.$listeners["".concat(typePrefix, "cell-context-menu")]) { if (process.env.NODE_ENV === 'development') { (0, _log.warnLog)('vxe.error.delEvent', ["".concat(typePrefix, "cell-context-menu"), "".concat(typePrefix, "cell-menu")]); } this.emitEvent("".concat(typePrefix, "cell-context-menu"), _params, evnt); } else { this.emitEvent("".concat(typePrefix, "cell-menu"), _params, evnt); } return; } else if (_dom["default"].getEventTargetNode(evnt, this.$el, "vxe-table--".concat(layout, "-wrapper"), function (target) { return target.getAttribute('xid') === tId; }).flag) { if (ctxMenuOpts.trigger === 'cell') { evnt.preventDefault(); } else { this.openContextMenu(evnt, layout, _params); } return; } } } if ($refs.filterWrapper && !_dom["default"].getEventTargetNode(evnt, $refs.filterWrapper.$el).flag) { this.closeFilter(); } this.closeMenu(); }, /** * 显示快捷菜单 */ openContextMenu: function openContextMenu(evnt, type, params) { var _this = this; var isCtxMenu = this.isCtxMenu, ctxMenuStore = this.ctxMenuStore, ctxMenuOpts = this.ctxMenuOpts; var config = ctxMenuOpts[type]; var visibleMethod = ctxMenuOpts.visibleMethod; if (config) { var options = config.options, disabled = config.disabled; if (disabled) { evnt.preventDefault(); } else if (isCtxMenu && options && options.length) { params.options = options; this.preventEvent(evnt, 'event.showMenu', params, function () { if (!visibleMethod || visibleMethod(params)) { evnt.preventDefault(); _this.updateZindex(); var _DomTools$getDomNode = _dom["default"].getDomNode(), scrollTop = _DomTools$getDomNode.scrollTop, scrollLeft = _DomTools$getDomNode.scrollLeft, visibleHeight = _DomTools$getDomNode.visibleHeight, visibleWidth = _DomTools$getDomNode.visibleWidth; var top = evnt.clientY + scrollTop; var left = evnt.clientX + scrollLeft; var handleVisible = function handleVisible() { Object.assign(ctxMenuStore, { args: params, visible: true, list: options, selected: null, selectChild: null, showChild: false, style: { zIndex: _this.tZindex, top: "".concat(top, "px"), left: "".concat(left, "px") } }); _this.$nextTick(function () { var ctxElem = _this.$refs.ctxWrapper.$el; var clientHeight = ctxElem.clientHeight; var clientWidth = ctxElem.clientWidth; var _DomTools$getAbsolute = _dom["default"].getAbsolutePos(ctxElem), boundingTop = _DomTools$getAbsolute.boundingTop, boundingLeft = _DomTools$getAbsolute.boundingLeft; var offsetTop = boundingTop + clientHeight - visibleHeight; var offsetLeft = boundingLeft + clientWidth - visibleWidth; if (offsetTop > -10) { ctxMenuStore.style.top = "".concat(Math.max(scrollTop + 2, top - clientHeight - 2), "px"); } if (offsetLeft > -10) { ctxMenuStore.style.left = "".concat(Math.max(scrollLeft + 2, left - clientWidth - 2), "px"); } }); }; var keyboard = params.keyboard, row = params.row, column = params.column; if (keyboard && row && column) { _this.scrollToRow(row, column).then(function () { var cell = _this.getCell(row, column); var _DomTools$getAbsolute2 = _dom["default"].getAbsolutePos(cell), boundingTop = _DomTools$getAbsolute2.boundingTop, boundingLeft = _DomTools$getAbsolute2.boundingLeft; top = boundingTop + scrollTop + Math.floor(cell.offsetHeight / 2); left = boundingLeft + scrollLeft + Math.floor(cell.offsetWidth / 2); handleVisible(); }); } else { handleVisible(); } } else { _this.closeMenu(); } }); } } this.closeFilter(); }, ctxMenuMouseoverEvent: function ctxMenuMouseoverEvent(evnt, item, child) { var menuElem = evnt.currentTarget; var ctxMenuStore = this.ctxMenuStore; evnt.preventDefault(); evnt.stopPropagation(); ctxMenuStore.selected = item; ctxMenuStore.selectChild = child; if (!child) { ctxMenuStore.showChild = _utils["default"].hasChildrenList(item); if (ctxMenuStore.showChild) { this.$nextTick(function () { var childWrapperElem = menuElem.nextElementSibling; if (childWrapperElem) { var _DomTools$getAbsolute3 = _dom["default"].getAbsolutePos(menuElem), boundingTop = _DomTools$getAbsolute3.boundingTop, boundingLeft = _DomTools$getAbsolute3.boundingLeft, visibleHeight = _DomTools$getAbsolute3.visibleHeight, visibleWidth = _DomTools$getAbsolute3.visibleWidth; var posTop = boundingTop + menuElem.offsetHeight; var posLeft = boundingLeft + menuElem.offsetWidth; var left = ''; var right = ''; // 是否超出右侧 if (posLeft + childWrapperElem.offsetWidth > visibleWidth - 10) { left = 'auto'; right = "".concat(menuElem.offsetWidth, "px"); } // 是否超出底部 var top = ''; var bottom = ''; if (posTop + childWrapperElem.offsetHeight > visibleHeight - 10) { top = 'auto'; bottom = '0'; } childWrapperElem.style.left = left; childWrapperElem.style.right = right; childWrapperElem.style.top = top; childWrapperElem.style.bottom = bottom; } }); } } }, ctxMenuMouseoutEvent: function ctxMenuMouseoutEvent(evnt, item) { var ctxMenuStore = this.ctxMenuStore; if (!item.children) { ctxMenuStore.selected = null; } ctxMenuStore.selectChild = null; }, /** * 快捷菜单点击事件 */ ctxMenuLinkEvent: function ctxMenuLinkEvent(evnt, menu) { // 如果一级菜单有配置 code 则允许点击,否则不能点击 if (!menu.disabled && (menu.code || !menu.children || !menu.children.length)) { var ctxMenuMethod = _vXETable["default"].menus.get(menu.code); var params = Object.assign({ menu: menu, $grid: this.$xegrid, $table: this, $event: evnt }, this.ctxMenuStore.args); if (ctxMenuMethod) { ctxMenuMethod.call(this, params, evnt); } // 在 v4 中废弃事件 context-menu-click if (this.$listeners['context-menu-click']) { if (process.env.NODE_ENV === 'development') { (0, _log.warnLog)('vxe.error.delEvent', ['context-menu-click', 'menu-click']); } this.emitEvent('context-menu-click', params, evnt); } else { this.emitEvent('menu-click', params, evnt); } this.closeMenu(); } } } }; exports["default"] = _default;