UNPKG

vxe-table-demonic

Version:

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

357 lines (356 loc) 15.5 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 _utils = require("../../tools/utils"); var _modal = _interopRequireDefault(require("../../modal/src/modal")); var _input = _interopRequireDefault(require("../../input/src/input")); var _checkbox = _interopRequireDefault(require("../../checkbox/src/checkbox")); var _select = _interopRequireDefault(require("../../select/src/select")); var _button = _interopRequireDefault(require("../../button/src/button")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _default = (0, _vue.defineComponent)({ name: 'VxeExportPanel', props: { defaultOptions: Object, storeData: Object }, setup: function (props) { var $xetable = (0, _vue.inject)('$xetable', {}); var _a = $xetable.getComputeMaps(), computeExportOpts = _a.computeExportOpts, computePrintOpts = _a.computePrintOpts; var reactData = (0, _vue.reactive)({ isAll: false, isIndeterminate: false, loading: false }); var xButtonConfirm = (0, _vue.ref)(); var xInputFilename = (0, _vue.ref)(); var xInputSheetname = (0, _vue.ref)(); var computeCheckedAll = (0, _vue.computed)(function () { var storeData = props.storeData; return storeData.columns.every(function (column) { return column.checked; }); }); var computeShowSheet = (0, _vue.computed)(function () { var defaultOptions = props.defaultOptions; return ['html', 'xml', 'xlsx', 'pdf'].indexOf(defaultOptions.type) > -1; }); var computeSupportMerge = (0, _vue.computed)(function () { var storeData = props.storeData, defaultOptions = props.defaultOptions; return !defaultOptions.original && defaultOptions.mode === 'current' && (storeData.isPrint || ['html', 'xlsx'].indexOf(defaultOptions.type) > -1); }); var computeSupportStyle = (0, _vue.computed)(function () { var defaultOptions = props.defaultOptions; return !defaultOptions.original && ['xlsx'].indexOf(defaultOptions.type) > -1; }); var handleOptionCheck = function (column) { var storeData = props.storeData; var matchObj = _xeUtils.default.findTree(storeData.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.checked = parent_1.children.every(function (column) { return column.checked; }); parent_1.halfChecked = !parent_1.checked && parent_1.children.some(function (column) { return column.checked || column.halfChecked; }); handleOptionCheck(parent_1); } } }; var checkStatus = function () { var storeData = props.storeData; var columns = storeData.columns; reactData.isAll = columns.every(function (column) { return column.disabled || column.checked; }); reactData.isIndeterminate = !reactData.isAll && columns.some(function (column) { return !column.disabled && (column.checked || column.halfChecked); }); }; var changeOption = function (column) { var isChecked = !column.checked; _xeUtils.default.eachTree([column], function (item) { item.checked = isChecked; item.halfChecked = false; }); handleOptionCheck(column); checkStatus(); }; var allColumnEvent = function () { var storeData = props.storeData; var isAll = !reactData.isAll; _xeUtils.default.eachTree(storeData.columns, function (column) { if (!column.disabled) { column.checked = isAll; column.halfChecked = false; } }); reactData.isAll = isAll; checkStatus(); }; var showEvent = function () { (0, _vue.nextTick)(function () { var filenameInp = xInputFilename.value; var sheetnameInp = xInputSheetname.value; var confirmBtn = xButtonConfirm.value; var targetElem = filenameInp || sheetnameInp || confirmBtn; if (targetElem) { targetElem.focus(); } }); checkStatus(); }; var getExportOption = function () { var storeData = props.storeData, defaultOptions = props.defaultOptions; var hasMerge = storeData.hasMerge, columns = storeData.columns; var checkedAll = computeCheckedAll.value; var supportMerge = computeSupportMerge.value; var expColumns = _xeUtils.default.searchTree(columns, function (column) { return column.checked; }, { children: 'children', mapChildren: 'childNodes', original: true }); return Object.assign({}, defaultOptions, { columns: expColumns, isMerge: hasMerge && supportMerge && checkedAll ? defaultOptions.isMerge : false }); }; var printEvent = function () { var storeData = props.storeData; var printOpts = computePrintOpts.value; storeData.visible = false; $xetable.print(Object.assign({}, printOpts, getExportOption())); }; var exportEvent = function () { var storeData = props.storeData; var exportOpts = computeExportOpts.value; reactData.loading = true; $xetable.exportData(Object.assign({}, exportOpts, getExportOption())).then(function () { reactData.loading = false; storeData.visible = false; }).catch(function () { reactData.loading = false; }); }; var cancelEvent = function () { var storeData = props.storeData; storeData.visible = false; }; var confirmEvent = function () { var storeData = props.storeData; if (storeData.isPrint) { printEvent(); } else { exportEvent(); } }; var renderVN = function () { var defaultOptions = props.defaultOptions, storeData = props.storeData; var isAllChecked = reactData.isAll, isAllIndeterminate = reactData.isIndeterminate; var hasTree = storeData.hasTree, hasMerge = storeData.hasMerge, isPrint = storeData.isPrint, hasColgroup = storeData.hasColgroup; var isHeader = defaultOptions.isHeader; var cols = []; var checkedAll = computeCheckedAll.value; var showSheet = computeShowSheet.value; var supportMerge = computeSupportMerge.value; var supportStyle = computeSupportStyle.value; _xeUtils.default.eachTree(storeData.columns, function (column) { var colTitle = (0, _utils.formatText)(column.getTitle(), 1); var isColGroup = column.children && column.children.length; var isChecked = column.checked; var indeterminate = column.halfChecked; cols.push((0, _vue.h)('li', { class: ['vxe-export--panel-column-option', "level--".concat(column.level), { 'is--group': isColGroup, 'is--checked': isChecked, 'is--indeterminate': indeterminate, 'is--disabled': column.disabled }], title: colTitle, onClick: function () { if (!column.disabled) { changeOption(column); } } }, [(0, _vue.h)('span', { class: ['vxe-checkbox--icon', indeterminate ? _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)])); }); return (0, _vue.h)(_modal.default, { modelValue: storeData.visible, title: _conf.default.i18n(isPrint ? 'vxe.export.printTitle' : 'vxe.export.expTitle'), width: 660, mask: true, lockView: true, showFooter: false, escClosable: true, maskClosable: true, loading: reactData.loading, 'onUpdate:modelValue': function (value) { storeData.visible = value; }, onShow: showEvent }, { default: function () { return (0, _vue.h)('div', { class: 'vxe-export--panel' }, [(0, _vue.h)('table', { cellspacing: 0, cellpadding: 0, border: 0 }, [(0, _vue.h)('tbody', [[isPrint ? (0, _vue.createCommentVNode)() : (0, _vue.h)('tr', [(0, _vue.h)('td', _conf.default.i18n('vxe.export.expName')), (0, _vue.h)('td', [(0, _vue.h)(_input.default, { ref: xInputFilename, modelValue: defaultOptions.filename, type: 'text', clearable: true, placeholder: _conf.default.i18n('vxe.export.expNamePlaceholder'), 'onUpdate:modelValue': function (value) { defaultOptions.filename = value; } })])]), isPrint ? (0, _vue.createCommentVNode)() : (0, _vue.h)('tr', [(0, _vue.h)('td', _conf.default.i18n('vxe.export.expType')), (0, _vue.h)('td', [(0, _vue.h)(_select.default, { modelValue: defaultOptions.type, options: storeData.typeList.map(function (item) { return { value: item.value, label: _conf.default.i18n(item.label) }; }), 'onUpdate:modelValue': function (value) { defaultOptions.type = value; } })])]), isPrint || showSheet ? (0, _vue.h)('tr', [(0, _vue.h)('td', _conf.default.i18n('vxe.export.expSheetName')), (0, _vue.h)('td', [(0, _vue.h)(_input.default, { ref: xInputSheetname, modelValue: defaultOptions.sheetName, type: 'text', clearable: true, placeholder: _conf.default.i18n('vxe.export.expSheetNamePlaceholder'), 'onUpdate:modelValue': function (value) { defaultOptions.sheetName = value; } })])]) : (0, _vue.createCommentVNode)(), (0, _vue.h)('tr', [(0, _vue.h)('td', _conf.default.i18n('vxe.export.expMode')), (0, _vue.h)('td', [(0, _vue.h)(_select.default, { modelValue: defaultOptions.mode, options: storeData.modeList.map(function (item) { return { value: item.value, label: _conf.default.i18n(item.label) }; }), 'onUpdate:modelValue': function (value) { defaultOptions.mode = value; } })])]), (0, _vue.h)('tr', [(0, _vue.h)('td', [_conf.default.i18n('vxe.export.expColumn')]), (0, _vue.h)('td', [(0, _vue.h)('div', { class: 'vxe-export--panel-column' }, [(0, _vue.h)('ul', { class: 'vxe-export--panel-column-header' }, [(0, _vue.h)('li', { class: ['vxe-export--panel-column-option', { 'is--checked': isAllChecked, 'is--indeterminate': isAllIndeterminate }], title: _conf.default.i18n('vxe.table.allTitle'), onClick: allColumnEvent }, [(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.export.expCurrentColumn'))])]), (0, _vue.h)('ul', { class: 'vxe-export--panel-column-body' }, cols)])])]), (0, _vue.h)('tr', [(0, _vue.h)('td', _conf.default.i18n('vxe.export.expOpts')), (0, _vue.h)('td', [(0, _vue.h)('div', { class: 'vxe-export--panel-option-row' }, [(0, _vue.h)(_checkbox.default, { modelValue: defaultOptions.isHeader, title: _conf.default.i18n('vxe.export.expHeaderTitle'), content: _conf.default.i18n('vxe.export.expOptHeader'), 'onUpdate:modelValue': function (value) { defaultOptions.isHeader = value; } }), (0, _vue.h)(_checkbox.default, { modelValue: defaultOptions.isFooter, disabled: !storeData.hasFooter, title: _conf.default.i18n('vxe.export.expFooterTitle'), content: _conf.default.i18n('vxe.export.expOptFooter'), 'onUpdate:modelValue': function (value) { defaultOptions.isFooter = value; } }), (0, _vue.h)(_checkbox.default, { modelValue: defaultOptions.original, title: _conf.default.i18n('vxe.export.expOriginalTitle'), content: _conf.default.i18n('vxe.export.expOptOriginal'), 'onUpdate:modelValue': function (value) { defaultOptions.original = value; } })]), (0, _vue.h)('div', { class: 'vxe-export--panel-option-row' }, [(0, _vue.h)(_checkbox.default, { modelValue: isHeader && hasColgroup && supportMerge ? defaultOptions.isColgroup : false, title: _conf.default.i18n('vxe.export.expColgroupTitle'), disabled: !isHeader || !hasColgroup || !supportMerge, content: _conf.default.i18n('vxe.export.expOptColgroup'), 'onUpdate:modelValue': function (value) { defaultOptions.isColgroup = value; } }), (0, _vue.h)(_checkbox.default, { modelValue: hasMerge && supportMerge && checkedAll ? defaultOptions.isMerge : false, title: _conf.default.i18n('vxe.export.expMergeTitle'), disabled: !hasMerge || !supportMerge || !checkedAll, content: _conf.default.i18n('vxe.export.expOptMerge'), 'onUpdate:modelValue': function (value) { defaultOptions.isMerge = value; } }), isPrint ? (0, _vue.createCommentVNode)() : (0, _vue.h)(_checkbox.default, { modelValue: supportStyle ? defaultOptions.useStyle : false, disabled: !supportStyle, title: _conf.default.i18n('vxe.export.expUseStyleTitle'), content: _conf.default.i18n('vxe.export.expOptUseStyle'), 'onUpdate:modelValue': function (value) { defaultOptions.useStyle = value; } }), (0, _vue.h)(_checkbox.default, { modelValue: hasTree ? defaultOptions.isAllExpand : false, disabled: !hasTree, title: _conf.default.i18n('vxe.export.expAllExpandTitle'), content: _conf.default.i18n('vxe.export.expOptAllExpand'), 'onUpdate:modelValue': function (value) { defaultOptions.isAllExpand = value; } })])])])]])]), (0, _vue.h)('div', { class: 'vxe-export--panel-btns' }, [(0, _vue.h)(_button.default, { content: _conf.default.i18n('vxe.export.expCancel'), onClick: cancelEvent }), (0, _vue.h)(_button.default, { ref: xButtonConfirm, status: 'primary', content: _conf.default.i18n(isPrint ? 'vxe.export.expPrint' : 'vxe.export.expConfirm'), onClick: confirmEvent })])]); } }); }; return renderVN; } }); exports.default = _default;