UNPKG

vxe-table-demonic

Version:

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

739 lines (738 loc) 27.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 _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf")); var _vXETable = require("../../v-x-e-table"); var _size = require("../../hooks/size"); var _dom = require("../../tools/dom"); var _utils = require("../../tools/utils"); var _log = require("../../tools/log"); var _event = require("../../tools/event"); var _vn = require("../../tools/vn"); 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 _default = (0, _vue.defineComponent)({ name: 'VxeToolbar', props: { loading: Boolean, refresh: [Boolean, Object], import: [Boolean, Object], export: [Boolean, Object], print: [Boolean, Object], zoom: [Boolean, Object], custom: [Boolean, Object], buttons: { type: Array, default: function () { return _conf.default.toolbar.buttons; } }, tools: { type: Array, default: function () { return _conf.default.toolbar.tools; } }, perfect: { type: Boolean, default: function () { return _conf.default.toolbar.perfect; } }, size: { type: String, default: function () { return _conf.default.toolbar.size || _conf.default.size; } }, className: [String, Function] }, emits: ['button-click', 'tool-click'], setup: function (props, context) { var slots = context.slots, emit = context.emit; var xID = _xeUtils.default.uniqueId(); var computeSize = (0, _size.useSize)(props); var reactData = (0, _vue.reactive)({ isRefresh: false, columns: [] }); var refElem = (0, _vue.ref)(); var refCustomWrapper = (0, _vue.ref)(); var customStore = (0, _vue.reactive)({ isAll: false, isIndeterminate: false, activeBtn: false, activeWrapper: false, visible: false }); var refMaps = { refElem: refElem }; var $xetoolbar = { xID: xID, props: props, context: context, reactData: reactData, getRefMaps: function () { return refMaps; } }; var toolbarMethods = {}; var $xegrid = (0, _vue.inject)('$xegrid', null); var $xetable; var computeRefreshOpts = (0, _vue.computed)(function () { return Object.assign({}, _conf.default.toolbar.refresh, props.refresh); }); var computeImportOpts = (0, _vue.computed)(function () { return Object.assign({}, _conf.default.toolbar.import, props.import); }); var computeExportOpts = (0, _vue.computed)(function () { return Object.assign({}, _conf.default.toolbar.export, props.export); }); var computePrintOpts = (0, _vue.computed)(function () { return Object.assign({}, _conf.default.toolbar.print, props.print); }); var computeZoomOpts = (0, _vue.computed)(function () { return Object.assign({}, _conf.default.toolbar.zoom, props.zoom); }); var computeCustomOpts = (0, _vue.computed)(function () { return Object.assign({}, _conf.default.toolbar.custom, props.custom); }); var checkTable = function () { if ($xetable) { return true; } (0, _log.errLog)('vxe.error.barUnableLink'); }; var checkCustomStatus = function () { var columns = reactData.columns; var computeTableCustomOpts = $xetable.getComputeMaps().computeCustomOpts; var tableCustomOpts = computeTableCustomOpts.value; var checkMethod = tableCustomOpts.checkMethod; customStore.isAll = columns.every(function (column) { return (checkMethod ? !checkMethod({ column: column }) : false) || column.visible; }); customStore.isIndeterminate = !customStore.isAll && columns.some(function (column) { return (!checkMethod || checkMethod({ column: column })) && (column.visible || column.halfVisible); }); }; var showCustom = function () { customStore.visible = true; checkCustomStatus(); }; var handleTableCustom = function () { $xetable.handleCustom(); }; var closeCustom = function () { var custom = props.custom; var customOpts = computeCustomOpts.value; if (customStore.visible) { customStore.visible = false; if (custom && !customOpts.immediate) { handleTableCustom(); } } }; var emitCustomEvent = function (type, evnt) { var comp = $xegrid || $xetable; comp.dispatchEvent('custom', { type: type }, evnt); }; var confirmCustomEvent = function (evnt) { closeCustom(); emitCustomEvent('confirm', evnt); }; var customOpenEvent = function (evnt) { if (checkTable()) { if (!customStore.visible) { showCustom(); emitCustomEvent('open', evnt); } } }; var customColseEvent = function (evnt) { if (customStore.visible) { closeCustom(); emitCustomEvent('close', evnt); } }; var resetCustomEvent = function (evnt) { $xetable.resetColumn(true); closeCustom(); emitCustomEvent('reset', evnt); }; var handleOptionCheck = function (column) { var columns = reactData.columns; var matchObj = _xeUtils.default.findTree(columns, function (item) { return item === column; }); if (matchObj && matchObj.parent) { var parent_1 = matchObj.parent; if (parent_1.children && parent_1.children.length) { parent_1.visible = parent_1.children.every(function (column) { return column.visible; }); parent_1.halfVisible = !parent_1.visible && parent_1.children.some(function (column) { return column.visible || column.halfVisible; }); handleOptionCheck(parent_1); } } }; var changeCheckboxOption = function (column) { var isChecked = !column.visible; var customOpts = computeCustomOpts.value; _xeUtils.default.eachTree([column], function (item) { item.visible = isChecked; item.halfVisible = false; }); handleOptionCheck(column); if (props.custom && customOpts.immediate) { handleTableCustom(); } checkCustomStatus(); }; var changeFixedOption = function (column, colFixed) { var computeIsMaxFixedColumn = $xetable.getComputeMaps().computeIsMaxFixedColumn; var isMaxFixedColumn = computeIsMaxFixedColumn.value; if (column.fixed === colFixed) { $xetable.clearColumnFixed(column); } else { if (!isMaxFixedColumn || column.fixed) { $xetable.setColumnFixed(column, colFixed); } } }; var allCustomEvent = function () { var columns = reactData.columns; var computeTableCustomOpts = $xetable.getComputeMaps().computeCustomOpts; var tableCustomOpts = computeTableCustomOpts.value; var checkMethod = tableCustomOpts.checkMethod; var isAll = !customStore.isAll; _xeUtils.default.eachTree(columns, function (column) { if (!checkMethod || checkMethod({ column: column })) { column.visible = isAll; column.halfVisible = false; } }); customStore.isAll = isAll; checkCustomStatus(); }; var handleGlobalMousedownEvent = function (evnt) { var customWrapperElem = refCustomWrapper.value; if (!(0, _dom.getEventTargetNode)(evnt, customWrapperElem).flag) { customColseEvent(evnt); } }; var handleGlobalBlurEvent = function (evnt) { customColseEvent(evnt); }; var handleClickSettingEvent = function (evnt) { if (customStore.visible) { customColseEvent(evnt); } else { customOpenEvent(evnt); } }; var handleMouseenterSettingEvent = function (evnt) { customStore.activeBtn = true; customOpenEvent(evnt); }; var handleMouseleaveSettingEvent = function (evnt) { customStore.activeBtn = false; setTimeout(function () { if (!customStore.activeBtn && !customStore.activeWrapper) { customColseEvent(evnt); } }, 300); }; var handleWrapperMouseenterEvent = function (evnt) { customStore.activeWrapper = true; customOpenEvent(evnt); }; var handleWrapperMouseleaveEvent = function (evnt) { customStore.activeWrapper = false; setTimeout(function () { if (!customStore.activeBtn && !customStore.activeWrapper) { customColseEvent(evnt); } }, 300); }; var refreshEvent = function (evnt) { var isRefresh = reactData.isRefresh; var refreshOpts = computeRefreshOpts.value; if (!isRefresh) { var queryMethod = refreshOpts.queryMethod || refreshOpts.query; if (queryMethod) { reactData.isRefresh = true; try { Promise.resolve(queryMethod({})).catch(function (e) { return e; }).then(function () { reactData.isRefresh = false; }); } catch (e) { reactData.isRefresh = false; } } else if ($xegrid) { reactData.isRefresh = true; $xegrid.triggerToolbarCommitEvent({ code: refreshOpts.code || 'reload' }, evnt).catch(function (e) { return e; }).then(function () { reactData.isRefresh = false; }); } } }; var zoomEvent = function (evnt) { if ($xegrid) { $xegrid.triggerZoomEvent(evnt); } }; var btnEvent = function (evnt, item) { var code = item.code; if (code) { if ($xegrid) { $xegrid.triggerToolbarBtnEvent(item, evnt); } else { var gCommandOpts = _vXETable.VXETable.commands.get(code); var params = { code: code, button: item, $table: $xetable, $grid: $xegrid, $event: evnt }; if (gCommandOpts) { if (gCommandOpts.commandMethod) { gCommandOpts.commandMethod(params); } else { if (process.env.NODE_ENV === 'development') { (0, _log.errLog)('vxe.error.notCommands', [code]); } } } $xetoolbar.dispatchEvent('button-click', params, evnt); } } }; var tolEvent = function (evnt, item) { var code = item.code; if (code) { if ($xegrid) { $xegrid.triggerToolbarTolEvent(item, evnt); } else { var gCommandOpts = _vXETable.VXETable.commands.get(code); var params = { code: code, tool: item, $table: $xetable, $grid: $xegrid, $event: evnt }; if (gCommandOpts) { if (gCommandOpts.commandMethod) { gCommandOpts.commandMethod(params); } else { if (process.env.NODE_ENV === 'development') { (0, _log.errLog)('vxe.error.notCommands', [code]); } } } $xetoolbar.dispatchEvent('tool-click', params, evnt); } } }; var importEvent = function () { if (checkTable()) { $xetable.openImport(); } }; var exportEvent = function () { if (checkTable()) { $xetable.openExport(); } }; var printEvent = function () { if (checkTable()) { $xetable.openPrint(); } }; var renderDropdowns = function (item, isBtn) { var dropdowns = item.dropdowns; var downVNs = []; if (dropdowns) { return dropdowns.map(function (child, index) { if (child.visible === false) { return (0, _vue.createCommentVNode)(); } return (0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { key: index, disabled: child.disabled, loading: child.loading, type: child.type, icon: child.icon, circle: child.circle, round: child.round, status: child.status, content: child.name, onClick: function (evnt) { return isBtn ? btnEvent(evnt, child) : tolEvent(evnt, child); } }); }); } return downVNs; }; /** * 渲染按钮 */ var renderBtns = function () { var buttons = props.buttons; var buttonsSlot = slots.buttons; if (buttonsSlot) { return (0, _vn.getSlotVNs)(buttonsSlot({ $grid: $xegrid, $table: $xetable })); } var btnVNs = []; if (buttons) { buttons.forEach(function (item) { var dropdowns = item.dropdowns, buttonRender = item.buttonRender; if (item.visible !== false) { var compConf = buttonRender ? _vXETable.VXETable.renderer.get(buttonRender.name) : null; if (buttonRender && compConf && compConf.renderToolbarButton) { var toolbarButtonClassName = compConf.toolbarButtonClassName; var params = { $grid: $xegrid, $table: $xetable, button: item }; btnVNs.push((0, _vue.h)('span', { class: ['vxe-button--item', toolbarButtonClassName ? _xeUtils.default.isFunction(toolbarButtonClassName) ? toolbarButtonClassName(params) : toolbarButtonClassName : ''] }, (0, _vn.getSlotVNs)(compConf.renderToolbarButton(buttonRender, params)))); } else { btnVNs.push((0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { disabled: item.disabled, loading: item.loading, type: item.type, icon: item.icon, circle: item.circle, round: item.round, status: item.status, content: item.name, destroyOnClose: item.destroyOnClose, placement: item.placement, transfer: item.transfer, onClick: function (evnt) { return btnEvent(evnt, item); } }, dropdowns && dropdowns.length ? { dropdowns: function () { return renderDropdowns(item, true); } } : {})); } } }); } return btnVNs; }; /** * 渲染右侧工具 */ var renderRightTools = function () { var tools = props.tools; var toolsSlot = slots.tools; if (toolsSlot) { return (0, _vn.getSlotVNs)(toolsSlot({ $grid: $xegrid, $table: $xetable })); } var btnVNs = []; if (tools) { tools.forEach(function (item) { var dropdowns = item.dropdowns, toolRender = item.toolRender; if (item.visible !== false) { var compConf = toolRender ? _vXETable.VXETable.renderer.get(toolRender.name) : null; if (toolRender && compConf && compConf.renderToolbarTool) { var toolbarToolClassName = compConf.toolbarToolClassName; var params = { $grid: $xegrid, $table: $xetable, tool: item }; btnVNs.push((0, _vue.h)('span', { class: ['vxe-tool--item', toolbarToolClassName ? _xeUtils.default.isFunction(toolbarToolClassName) ? toolbarToolClassName(params) : toolbarToolClassName : ''] }, (0, _vn.getSlotVNs)(compConf.renderToolbarTool(toolRender, params)))); } else { btnVNs.push((0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { disabled: item.disabled, loading: item.loading, type: item.type, icon: item.icon, circle: item.circle, round: item.round, status: item.status, content: item.name, destroyOnClose: item.destroyOnClose, placement: item.placement, transfer: item.transfer, onClick: function (evnt) { return tolEvent(evnt, item); } }, dropdowns && dropdowns.length ? { dropdowns: function () { return renderDropdowns(item, false); } } : {})); } } }); } return btnVNs; }; var renderCustoms = function () { var columns = reactData.columns; var customOpts = computeCustomOpts.value; var isMaxFixedColumn = true; var colVNs = []; var customBtnOns = {}; var customWrapperOns = {}; var checkMethod; if ($xetable) { var _a = $xetable.getComputeMaps(), computeTableCustomOpts = _a.computeCustomOpts, computeIsMaxFixedColumn = _a.computeIsMaxFixedColumn; var tableCustomOpts = computeTableCustomOpts.value; checkMethod = tableCustomOpts.checkMethod; isMaxFixedColumn = computeIsMaxFixedColumn.value; } if (customOpts.trigger === 'manual') { // 手动触发 } else if (customOpts.trigger === 'hover') { // hover 触发 customBtnOns.onMouseenter = handleMouseenterSettingEvent; customBtnOns.onMouseleave = handleMouseleaveSettingEvent; customWrapperOns.onMouseenter = handleWrapperMouseenterEvent; customWrapperOns.onMouseleave = handleWrapperMouseleaveEvent; } else { // 点击触发 customBtnOns.onClick = handleClickSettingEvent; } _xeUtils.default.eachTree(columns, function (column, index, items, path, parent) { var colTitle = (0, _utils.formatText)(column.getTitle(), 1); var colKey = column.getKey(); var isColGroup = column.children && column.children.length; var isDisabled = checkMethod ? !checkMethod({ column: column }) : false; if (isColGroup || colKey) { var isChecked = column.visible; var isIndeterminate = column.halfVisible; colVNs.push((0, _vue.h)('li', { class: ['vxe-custom--option', "level--".concat(column.level), { 'is--group': isColGroup }] }, [(0, _vue.h)('div', { title: colTitle, class: ['vxe-custom--checkbox-option', { 'is--checked': isChecked, 'is--indeterminate': isIndeterminate, 'is--disabled': isDisabled }], onClick: function () { if (!isDisabled) { changeCheckboxOption(column); } } }, [(0, _vue.h)('span', { class: ['vxe-checkbox--icon', isIndeterminate ? _conf.default.icon.TABLE_CHECKBOX_INDETERMINATE : isChecked ? _conf.default.icon.TABLE_CHECKBOX_CHECKED : _conf.default.icon.TABLE_CHECKBOX_UNCHECKED] }), (0, _vue.h)('span', { class: 'vxe-checkbox--label' }, colTitle)]), !parent && customOpts.allowFixed ? (0, _vue.h)('div', { class: 'vxe-custom--fixed-option' }, [(0, _vue.h)('span', { class: ['vxe-custom--fixed-left-option', column.fixed === 'left' ? _conf.default.icon.TOOLBAR_TOOLS_FIXED_LEFT_ACTIVED : _conf.default.icon.TOOLBAR_TOOLS_FIXED_LEFT, { 'is--checked': column.fixed === 'left', 'is--disabled': isMaxFixedColumn && !column.fixed }], title: _conf.default.i18n(column.fixed === 'left' ? 'vxe.toolbar.cancelfixed' : 'vxe.toolbar.fixedLeft'), onClick: function () { changeFixedOption(column, 'left'); } }), (0, _vue.h)('span', { class: ['vxe-custom--fixed-right-option', column.fixed === 'right' ? _conf.default.icon.TOOLBAR_TOOLS_FIXED_RIGHT_ACTIVED : _conf.default.icon.TOOLBAR_TOOLS_FIXED_RIGHT, { 'is--checked': column.fixed === 'right', 'is--disabled': isMaxFixedColumn && !column.fixed }], title: _conf.default.i18n(column.fixed === 'right' ? 'vxe.toolbar.cancelfixed' : 'vxe.toolbar.fixedRight'), onClick: function () { changeFixedOption(column, 'right'); } })]) : null])); } }); var isAllChecked = customStore.isAll; var isAllIndeterminate = customStore.isIndeterminate; return (0, _vue.h)('div', { class: ['vxe-custom--wrapper', { 'is--active': customStore.visible }], ref: refCustomWrapper }, [(0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), __assign({ circle: true, icon: customOpts.icon || _conf.default.icon.TOOLBAR_TOOLS_CUSTOM, title: _conf.default.i18n('vxe.toolbar.custom') }, customBtnOns)), (0, _vue.h)('div', { class: 'vxe-custom--option-wrapper' }, [(0, _vue.h)('ul', { class: 'vxe-custom--header' }, [(0, _vue.h)('li', { class: 'vxe-custom--option' }, [(0, _vue.h)('div', { class: ['vxe-custom--checkbox-option', { 'is--checked': isAllChecked, 'is--indeterminate': isAllIndeterminate }], title: _conf.default.i18n('vxe.table.allTitle'), onClick: allCustomEvent }, [(0, _vue.h)('span', { class: ['vxe-checkbox--icon', isAllIndeterminate ? _conf.default.icon.TABLE_CHECKBOX_INDETERMINATE : isAllChecked ? _conf.default.icon.TABLE_CHECKBOX_CHECKED : _conf.default.icon.TABLE_CHECKBOX_UNCHECKED] }), (0, _vue.h)('span', { class: 'vxe-checkbox--label' }, _conf.default.i18n('vxe.toolbar.customAll'))])])]), (0, _vue.h)('ul', __assign({ class: 'vxe-custom--body' }, customWrapperOns), colVNs), customOpts.showFooter || customOpts.isFooter ? (0, _vue.h)('div', { class: 'vxe-custom--footer' }, [(0, _vue.h)('button', { class: 'btn--reset', onClick: resetCustomEvent }, customOpts.resetButtonText || _conf.default.i18n('vxe.toolbar.customRestore')), (0, _vue.h)('button', { class: 'btn--confirm', onClick: confirmCustomEvent }, customOpts.confirmButtonText || _conf.default.i18n('vxe.toolbar.customConfirm'))]) : null])]); }; toolbarMethods = { dispatchEvent: function (type, params, evnt) { emit(type, Object.assign({ $toolbar: $xetoolbar, $event: evnt }, params)); }, syncUpdate: function (params) { var collectColumn = params.collectColumn; $xetable = params.$table; reactData.columns = collectColumn; } }; Object.assign($xetoolbar, toolbarMethods); (0, _vue.onMounted)(function () { _event.GlobalEvent.on($xetoolbar, 'mousedown', handleGlobalMousedownEvent); _event.GlobalEvent.on($xetoolbar, 'blur', handleGlobalBlurEvent); }); (0, _vue.onUnmounted)(function () { _event.GlobalEvent.off($xetoolbar, 'mousedown'); _event.GlobalEvent.off($xetoolbar, 'blur'); }); (0, _vue.nextTick)(function () { var refresh = props.refresh; var refreshOpts = computeRefreshOpts.value; var queryMethod = refreshOpts.queryMethod || refreshOpts.query; if (refresh && !$xegrid && !queryMethod) { (0, _log.warnLog)('vxe.error.notFunc', ['queryMethod']); } var customOpts = computeCustomOpts.value; if (process.env.NODE_ENV === 'development') { if (customOpts.isFooter) { (0, _log.warnLog)('vxe.error.notValidators', ['custom.isFooter', 'custom.showFooter']); } } }); var renderVN = function () { var _a; var perfect = props.perfect, loading = props.loading, refresh = props.refresh, zoom = props.zoom, custom = props.custom, className = props.className; var vSize = computeSize.value; var refreshOpts = computeRefreshOpts.value; var importOpts = computeImportOpts.value; var exportOpts = computeExportOpts.value; var printOpts = computePrintOpts.value; var zoomOpts = computeZoomOpts.value; return (0, _vue.h)('div', { ref: refElem, class: ['vxe-toolbar', className ? _xeUtils.default.isFunction(className) ? className({ $toolbar: $xetoolbar }) : className : '', (_a = {}, _a["size--".concat(vSize)] = vSize, _a['is--perfect'] = perfect, _a['is--loading'] = loading, _a)] }, [(0, _vue.h)('div', { class: 'vxe-buttons--wrapper' }, renderBtns()), (0, _vue.h)('div', { class: 'vxe-tools--wrapper' }, renderRightTools()), (0, _vue.h)('div', { class: 'vxe-tools--operate' }, [props.import ? (0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { circle: true, icon: importOpts.icon || _conf.default.icon.TOOLBAR_TOOLS_IMPORT, title: _conf.default.i18n('vxe.toolbar.import'), onClick: importEvent }) : (0, _vue.createCommentVNode)(), props.export ? (0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { circle: true, icon: exportOpts.icon || _conf.default.icon.TOOLBAR_TOOLS_EXPORT, title: _conf.default.i18n('vxe.toolbar.export'), onClick: exportEvent }) : (0, _vue.createCommentVNode)(), props.print ? (0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { circle: true, icon: printOpts.icon || _conf.default.icon.TOOLBAR_TOOLS_PRINT, title: _conf.default.i18n('vxe.toolbar.print'), onClick: printEvent }) : (0, _vue.createCommentVNode)(), refresh ? (0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { circle: true, icon: reactData.isRefresh ? refreshOpts.iconLoading || _conf.default.icon.TOOLBAR_TOOLS_REFRESH_LOADING : refreshOpts.icon || _conf.default.icon.TOOLBAR_TOOLS_REFRESH, title: _conf.default.i18n('vxe.toolbar.refresh'), onClick: refreshEvent }) : (0, _vue.createCommentVNode)(), zoom && $xegrid ? (0, _vue.h)((0, _vue.resolveComponent)('vxe-button'), { circle: true, icon: $xegrid.isMaximized() ? zoomOpts.iconOut || _conf.default.icon.TOOLBAR_TOOLS_MINIMIZE : zoomOpts.iconIn || _conf.default.icon.TOOLBAR_TOOLS_FULLSCREEN, title: _conf.default.i18n("vxe.toolbar.zoom".concat($xegrid.isMaximized() ? 'Out' : 'In')), onClick: zoomEvent }) : (0, _vue.createCommentVNode)(), custom ? renderCustoms() : (0, _vue.createCommentVNode)()])]); }; $xetoolbar.renderVN = renderVN; return $xetoolbar; }, render: function () { return this.renderVN(); } }); exports.default = _default;