UNPKG

vxe-table-demonic

Version:

一个基于 vue 的 PC 端表单/表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、JSON 配置式...

358 lines (357 loc) 14.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _xeUtils = _interopRequireDefault(require("xe-utils")); var _vXETable = require("../../v-x-e-table"); var _dom = require("../../tools/dom"); var _utils = require("../../tools/utils"); var _event = require("../../tools/event"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var __assign = void 0 && (void 0).__assign || function () { __assign = Object.assign || function (t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var tableMenuMethodKeys = ['closeMenu']; var tableMenuHook = { setupTable: function ($xetable) { var xID = $xetable.xID, props = $xetable.props, reactData = $xetable.reactData, internalData = $xetable.internalData; var _a = $xetable.getRefMaps(), refElem = _a.refElem, refTableFilter = _a.refTableFilter, refTableMenu = _a.refTableMenu; var _b = $xetable.getComputeMaps(), computeMouseOpts = _b.computeMouseOpts, computeIsMenu = _b.computeIsMenu, computeMenuOpts = _b.computeMenuOpts; var menuMethods = {}; var menuPrivateMethods = {}; /** * 显示快捷菜单 */ var openContextMenu = function (evnt, type, params) { var ctxMenuStore = reactData.ctxMenuStore; var isMenu = computeIsMenu.value; var menuOpts = computeMenuOpts.value; var config = menuOpts[type]; var visibleMethod = menuOpts.visibleMethod; if (config) { var options_1 = config.options, disabled = config.disabled; if (disabled) { evnt.preventDefault(); } else if (isMenu && options_1 && options_1.length) { params.options = options_1; $xetable.preventEvent(evnt, 'event.showMenu', params, function () { if (!visibleMethod || visibleMethod(params)) { evnt.preventDefault(); $xetable.updateZindex(); var _a = (0, _dom.getDomNode)(), scrollTop_1 = _a.scrollTop, scrollLeft_1 = _a.scrollLeft, visibleHeight_1 = _a.visibleHeight, visibleWidth_1 = _a.visibleWidth; var top_1 = evnt.clientY + scrollTop_1; var left_1 = evnt.clientX + scrollLeft_1; var handleVisible_1 = function () { internalData._currMenuParams = params; Object.assign(ctxMenuStore, { visible: true, list: options_1, selected: null, selectChild: null, showChild: false, style: { zIndex: internalData.tZindex, top: "".concat(top_1, "px"), left: "".concat(left_1, "px") } }); (0, _vue.nextTick)(function () { var tableMenu = refTableMenu.value; var ctxElem = tableMenu.getRefMaps().refElem.value; var clientHeight = ctxElem.clientHeight; var clientWidth = ctxElem.clientWidth; var _a = (0, _dom.getAbsolutePos)(ctxElem), boundingTop = _a.boundingTop, boundingLeft = _a.boundingLeft; var offsetTop = boundingTop + clientHeight - visibleHeight_1; var offsetLeft = boundingLeft + clientWidth - visibleWidth_1; if (offsetTop > -10) { ctxMenuStore.style.top = "".concat(Math.max(scrollTop_1 + 2, top_1 - clientHeight - 2), "px"); } if (offsetLeft > -10) { ctxMenuStore.style.left = "".concat(Math.max(scrollLeft_1 + 2, left_1 - clientWidth - 2), "px"); } }); }; var keyboard = params.keyboard, row_1 = params.row, column_1 = params.column; if (keyboard && row_1 && column_1) { $xetable.scrollToRow(row_1, column_1).then(function () { var cell = $xetable.getCell(row_1, column_1); if (cell) { var _a = (0, _dom.getAbsolutePos)(cell), boundingTop = _a.boundingTop, boundingLeft = _a.boundingLeft; top_1 = boundingTop + scrollTop_1 + Math.floor(cell.offsetHeight / 2); left_1 = boundingLeft + scrollLeft_1 + Math.floor(cell.offsetWidth / 2); } handleVisible_1(); }); } else { handleVisible_1(); } } else { menuMethods.closeMenu(); } }); } } $xetable.closeFilter(); }; menuMethods = { /** * 关闭快捷菜单 */ closeMenu: function () { Object.assign(reactData.ctxMenuStore, { visible: false, selected: null, selectChild: null, showChild: false }); return (0, _vue.nextTick)(); } }; menuPrivateMethods = { /** * 处理菜单的移动 */ moveCtxMenu: function (evnt, ctxMenuStore, property, hasOper, operRest, menuList) { var selectItem; var selectIndex = _xeUtils.default.findIndexOf(menuList, function (item) { return ctxMenuStore[property] === item; }); if (hasOper) { if (operRest && (0, _utils.hasChildrenList)(ctxMenuStore.selected)) { ctxMenuStore.showChild = true; } else { ctxMenuStore.showChild = false; ctxMenuStore.selectChild = null; } } else if ((0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.ARROW_UP)) { 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 ((0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.ARROW_DOWN)) { 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] && ((0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.ENTER) || (0, _event.hasEventKey)(evnt, _event.EVENT_KEYS.SPACEBAR))) { menuPrivateMethods.ctxMenuLinkEvent(evnt, ctxMenuStore[property]); } }, /** * 快捷菜单事件处理 */ handleGlobalContextmenuEvent: function (evnt) { var mouseConfig = props.mouseConfig, menuConfig = props.menuConfig; var editStore = reactData.editStore, ctxMenuStore = reactData.ctxMenuStore; var visibleColumn = internalData.visibleColumn; var tableFilter = refTableFilter.value; var tableMenu = refTableMenu.value; var mouseOpts = computeMouseOpts.value; var menuOpts = computeMenuOpts.value; var el = refElem.value; var selected = editStore.selected; var layoutList = ['header', 'body', 'footer']; if ((0, _utils.isEnableConf)(menuConfig)) { if (ctxMenuStore.visible && tableMenu && (0, _dom.getEventTargetNode)(evnt, tableMenu.getRefMaps().refElem.value).flag) { evnt.preventDefault(); return; } if (internalData._keyCtx) { var type = 'body'; var params = { type: type, $table: $xetable, keyboard: true, columns: visibleColumn.slice(0), $event: evnt }; // 如果开启单元格区域 if (mouseConfig && mouseOpts.area) { var activeArea = $xetable.getActiveCellArea(); if (activeArea && activeArea.row && activeArea.column) { params.row = activeArea.row; params.column = activeArea.column; openContextMenu(evnt, type, params); return; } } else if (mouseConfig && mouseOpts.selected) { // 如果启用键盘导航且已选中单元格 if (selected.row && selected.column) { params.row = selected.row; params.column = selected.column; openContextMenu(evnt, type, params); return; } } } // 分别匹配表尾、内容、表尾的快捷菜单 for (var index = 0; index < layoutList.length; index++) { var layout = layoutList[index]; var columnTargetNode = (0, _dom.getEventTargetNode)(evnt, el, "vxe-".concat(layout, "--column"), function (target) { // target=td|th,直接向上找 table 去匹配即可 return target.parentNode.parentNode.parentNode.getAttribute('xid') === xID; }); var params = { type: layout, $table: $xetable, columns: visibleColumn.slice(0), $event: evnt }; if (columnTargetNode.flag) { var cell = columnTargetNode.targetElem; var columnNodeRest = $xetable.getColumnNode(cell); var column = columnNodeRest ? columnNodeRest.item : null; var typePrefix = "".concat(layout, "-"); if (column) { Object.assign(params, { column: column, columnIndex: $xetable.getColumnIndex(column), cell: cell }); } if (layout === 'body') { var rowNodeRest = $xetable.getRowNode(cell.parentNode); var row = rowNodeRest ? rowNodeRest.item : null; typePrefix = ''; if (row) { params.row = row; params.rowIndex = $xetable.getRowIndex(row); } } var eventType = "".concat(typePrefix, "cell-menu"); openContextMenu(evnt, layout, params); $xetable.dispatchEvent(eventType, params, evnt); return; } else if ((0, _dom.getEventTargetNode)(evnt, el, "vxe-table--".concat(layout, "-wrapper"), function (target) { return target.getAttribute('xid') === xID; }).flag) { if (menuOpts.trigger === 'cell') { evnt.preventDefault(); } else { openContextMenu(evnt, layout, params); } return; } } } if (tableFilter && !(0, _dom.getEventTargetNode)(evnt, tableFilter.$el).flag) { $xetable.closeFilter(); } menuMethods.closeMenu(); }, ctxMenuMouseoverEvent: function (evnt, item, child) { var menuElem = evnt.currentTarget; var ctxMenuStore = reactData.ctxMenuStore; evnt.preventDefault(); evnt.stopPropagation(); ctxMenuStore.selected = item; ctxMenuStore.selectChild = child; if (!child) { ctxMenuStore.showChild = (0, _utils.hasChildrenList)(item); if (ctxMenuStore.showChild) { (0, _vue.nextTick)(function () { var childWrapperElem = menuElem.nextElementSibling; if (childWrapperElem) { var _a = (0, _dom.getAbsolutePos)(menuElem), boundingTop = _a.boundingTop, boundingLeft = _a.boundingLeft, visibleHeight = _a.visibleHeight, visibleWidth = _a.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_2 = ''; var bottom = ''; if (posTop + childWrapperElem.offsetHeight > visibleHeight - 10) { top_2 = 'auto'; bottom = '0'; } childWrapperElem.style.left = left; childWrapperElem.style.right = right; childWrapperElem.style.top = top_2; childWrapperElem.style.bottom = bottom; } }); } } }, ctxMenuMouseoutEvent: function (evnt, item) { var ctxMenuStore = reactData.ctxMenuStore; if (!item.children) { ctxMenuStore.selected = null; } ctxMenuStore.selectChild = null; }, /** * 快捷菜单点击事件 */ ctxMenuLinkEvent: function (evnt, menu) { // 如果一级菜单有配置 code 则允许点击,否则不能点击 if (!menu.disabled && (menu.code || !menu.children || !menu.children.length)) { var gMenuOpts = _vXETable.VXETable.menus.get(menu.code); var params = Object.assign({}, internalData._currMenuParams, { menu: menu, $table: $xetable, $grid: $xetable.xegrid, $event: evnt }); if (gMenuOpts && gMenuOpts.menuMethod) { gMenuOpts.menuMethod(params, evnt); } $xetable.dispatchEvent('menu-click', params, evnt); menuMethods.closeMenu(); } } }; return __assign(__assign({}, menuMethods), menuPrivateMethods); }, setupGrid: function ($xegrid) { return $xegrid.extendTableMethods(tableMenuMethodKeys); } }; var _default = tableMenuHook; exports.default = _default;