UNPKG

vxe-table

Version:

A PC-end table component based on Vxe UI, supporting copy-paste, data pivot table, and high-performance virtual list table solution.

468 lines (467 loc) • 19 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _comp = require("../../../ui/src/comp"); var _ui = require("../../../ui"); var _xeUtils = _interopRequireDefault(require("xe-utils")); var _utils = require("../../../ui/src/utils"); var _log = require("../../../ui/src/log"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const { getI18n, getIcon, renderEmptyElement } = _ui.VxeUI; var _default = exports.default = (0, _comp.defineVxeComponent)({ name: 'VxeTableExportPanel', props: { defaultOptions: Object, storeData: Object }, setup(props) { const VxeUIModalComponent = _ui.VxeUI.getComponent('VxeModal'); const VxeUIButtonComponent = _ui.VxeUI.getComponent('VxeButton'); const VxeUISelectComponent = _ui.VxeUI.getComponent('VxeSelect'); const VxeUIInputComponent = _ui.VxeUI.getComponent('VxeInput'); const VxeUICheckboxComponent = _ui.VxeUI.getComponent('VxeCheckbox'); const $xeTable = (0, _vue.inject)('$xeTable', {}); const { computeExportOpts, computePrintOpts } = $xeTable.getComputeMaps(); const reactData = (0, _vue.reactive)({ isAll: false, isIndeterminate: false, loading: false }); const xButtonConfirm = (0, _vue.ref)(); const xInputFilename = (0, _vue.ref)(); const xInputSheetname = (0, _vue.ref)(); const computeCheckedAll = (0, _vue.computed)(() => { const { storeData } = props; return storeData.columns.every(column => column.checked); }); const computeShowSheet = (0, _vue.computed)(() => { const { defaultOptions } = props; return ['html', 'xml', 'xlsx', 'pdf'].indexOf(defaultOptions.type) > -1; }); const computeSupportMerge = (0, _vue.computed)(() => { const { storeData, defaultOptions } = props; return !defaultOptions.original && defaultOptions.mode === 'current' && (storeData.isPrint || ['html', 'xlsx'].indexOf(defaultOptions.type) > -1); }); // const computeSupportGroup = computed(() => { // const { defaultOptions } = props // return ['html', 'xlsx', 'csv', 'txt'].indexOf(defaultOptions.type) > -1 // }) const computeSupportStyle = (0, _vue.computed)(() => { const { defaultOptions } = props; return !defaultOptions.original && ['xlsx'].indexOf(defaultOptions.type) > -1; }); const handleOptionCheck = column => { const { storeData } = props; const matchObj = _xeUtils.default.findTree(storeData.columns, item => item === column); if (matchObj && matchObj.parent) { const { parent } = matchObj; if (parent.children && parent.children.length) { parent.checked = parent.children.every(column => column.checked); parent.halfChecked = !parent.checked && parent.children.some(column => column.checked || column.halfChecked); handleOptionCheck(parent); } } }; const checkStatus = () => { const { storeData } = props; const columns = storeData.columns; reactData.isAll = columns.every(column => column.disabled || column.checked); reactData.isIndeterminate = !reactData.isAll && columns.some(column => !column.disabled && (column.checked || column.halfChecked)); }; const changeOption = column => { const isChecked = !column.checked; _xeUtils.default.eachTree([column], item => { item.checked = isChecked; item.halfChecked = false; }); handleOptionCheck(column); checkStatus(); }; const allColumnEvent = () => { const { storeData } = props; const isAll = !reactData.isAll; _xeUtils.default.eachTree(storeData.columns, column => { if (!column.disabled) { column.checked = isAll; column.halfChecked = false; } }); reactData.isAll = isAll; checkStatus(); }; const showEvent = () => { (0, _vue.nextTick)(() => { const filenameInp = xInputFilename.value; const sheetnameInp = xInputSheetname.value; const confirmBtn = xButtonConfirm.value; const targetElem = filenameInp || sheetnameInp || confirmBtn; if (targetElem) { targetElem.focus(); } }); checkStatus(); }; const getExportOption = () => { const { storeData, defaultOptions } = props; const { hasMerge, columns } = storeData; const checkedAll = computeCheckedAll.value; const supportMerge = computeSupportMerge.value; const expColumns = _xeUtils.default.searchTree(columns, column => column.checked, { children: 'children', mapChildren: 'childNodes', original: true }); return Object.assign({}, defaultOptions, { columns: expColumns, isMerge: hasMerge && supportMerge && checkedAll ? defaultOptions.isMerge : false }); }; const printEvent = () => { const { storeData } = props; const printOpts = computePrintOpts.value; storeData.visible = false; $xeTable.print(Object.assign({}, printOpts, getExportOption())); }; const exportEvent = () => { const { storeData } = props; const exportOpts = computeExportOpts.value; reactData.loading = true; $xeTable.exportData(Object.assign({}, exportOpts, getExportOption())).then(() => { reactData.loading = false; storeData.visible = false; }).catch(() => { reactData.loading = false; }); }; const cancelEvent = () => { const { storeData } = props; storeData.visible = false; }; const confirmEvent = () => { const { storeData } = props; if (storeData.isPrint) { printEvent(); } else { exportEvent(); } }; const renderVN = () => { const $xeGrid = $xeTable.xeGrid; const $xeGantt = $xeTable.xeGantt; const { defaultOptions, storeData } = props; const { isAll: isAllChecked, isIndeterminate: isAllIndeterminate } = reactData; const { hasTree, hasMerge, isPrint, hasColgroup, columns } = storeData; const { isHeader } = defaultOptions; const cols = []; const checkedAll = computeCheckedAll.value; const showSheet = computeShowSheet.value; const supportMerge = computeSupportMerge.value; const supportStyle = computeSupportStyle.value; // const supportGroup = computeSupportGroup.value const slots = defaultOptions.slots || {}; const topSlot = slots.top; const bottomSlot = slots.bottom; const defaultSlot = slots.default; const footerSlot = slots.footer; const parameterSlot = slots.parameter; _xeUtils.default.eachTree(columns, column => { const colTitle = (0, _utils.formatText)(column.getTitle(), 1); const isColGroup = column.children && column.children.length; const isChecked = column.checked; const indeterminate = column.halfChecked; const isHtml = column.type === 'html'; cols.push((0, _vue.h)('li', { key: column.id, class: ['vxe-table-export--panel-column-option', `level--${column.level}`, { 'is--group': isColGroup, 'is--checked': isChecked, 'is--indeterminate': indeterminate, 'is--disabled': column.disabled }], title: isHtml ? '' : colTitle, onClick: () => { if (!column.disabled) { changeOption(column); } } }, [(0, _vue.h)('span', { class: ['vxe-checkbox--icon', indeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : isChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED] }), isHtml ? (0, _vue.h)('span', { key: '1', class: 'vxe-checkbox--label', innerHTML: colTitle }) : (0, _vue.h)('span', { key: '0', class: 'vxe-checkbox--label' }, colTitle)])); }); return VxeUIModalComponent ? (0, _vue.h)(VxeUIModalComponent, { id: 'VXE_EXPORT_MODAL', modelValue: storeData.visible, title: getI18n(isPrint ? 'vxe.export.printTitle' : 'vxe.export.expTitle'), className: 'vxe-table-export-popup-wrapper', width: 660, minWidth: 500, minHeight: 400, mask: true, lockView: true, showFooter: true, escClosable: true, maskClosable: true, showMaximize: true, resize: true, loading: reactData.loading, 'onUpdate:modelValue'(value) { storeData.visible = value; }, onShow: showEvent }, { default: () => { const params = { $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, options: defaultOptions, columns, params: defaultOptions.params }; const hasEmptyData = defaultOptions.mode === 'empty'; return (0, _vue.h)('div', { class: 'vxe-table-export--panel' }, [topSlot ? (0, _vue.h)('div', { class: 'vxe-table-export--panel-top' }, $xeTable.callSlot(topSlot, params)) : renderEmptyElement($xeTable), (0, _vue.h)('div', { class: 'vxe-table-export--panel-body' }, defaultSlot ? $xeTable.callSlot(defaultSlot, params) : [(0, _vue.h)('table', { class: 'vxe-table-export--panel-table', cellspacing: 0, cellpadding: 0, border: 0 }, [(0, _vue.h)('tbody', [[isPrint ? renderEmptyElement($xeTable) : (0, _vue.h)('tr', [(0, _vue.h)('td', getI18n('vxe.export.expName')), (0, _vue.h)('td', [VxeUIInputComponent ? (0, _vue.h)(VxeUIInputComponent, { ref: xInputFilename, modelValue: defaultOptions.filename, type: 'text', clearable: true, placeholder: getI18n('vxe.export.expNamePlaceholder'), 'onUpdate:modelValue'(value) { defaultOptions.filename = value; } }) : renderEmptyElement($xeTable)])]), isPrint ? renderEmptyElement($xeTable) : (0, _vue.h)('tr', [(0, _vue.h)('td', getI18n('vxe.export.expType')), (0, _vue.h)('td', [VxeUISelectComponent ? (0, _vue.h)(VxeUISelectComponent, { modelValue: defaultOptions.type, options: storeData.typeList, 'onUpdate:modelValue'(value) { defaultOptions.type = value; } }) : renderEmptyElement($xeTable)])]), isPrint || showSheet ? (0, _vue.h)('tr', [(0, _vue.h)('td', getI18n('vxe.export.expSheetName')), (0, _vue.h)('td', [VxeUIInputComponent ? (0, _vue.h)(VxeUIInputComponent, { ref: xInputSheetname, modelValue: defaultOptions.sheetName, type: 'text', clearable: true, placeholder: getI18n('vxe.export.expSheetNamePlaceholder'), 'onUpdate:modelValue'(value) { defaultOptions.sheetName = value; } }) : renderEmptyElement($xeTable)])]) : renderEmptyElement($xeTable), (0, _vue.h)('tr', [(0, _vue.h)('td', getI18n('vxe.export.expMode')), (0, _vue.h)('td', [VxeUISelectComponent ? (0, _vue.h)(VxeUISelectComponent, { modelValue: defaultOptions.mode, options: storeData.modeList.map(item => { return { value: item.value, label: getI18n(item.label) }; }), 'onUpdate:modelValue'(value) { defaultOptions.mode = value; } }) : renderEmptyElement($xeTable)])]), (0, _vue.h)('tr', [(0, _vue.h)('td', [getI18n('vxe.export.expColumn')]), (0, _vue.h)('td', [(0, _vue.h)('div', { class: 'vxe-table-export--panel-column' }, [(0, _vue.h)('ul', { class: 'vxe-table-export--panel-column-header' }, [(0, _vue.h)('li', { class: ['vxe-table-export--panel-column-option', { 'is--checked': isAllChecked, 'is--indeterminate': isAllIndeterminate }], title: getI18n('vxe.table.allTitle'), onClick: allColumnEvent }, [(0, _vue.h)('span', { class: ['vxe-checkbox--icon', isAllIndeterminate ? getIcon().TABLE_CHECKBOX_INDETERMINATE : isAllChecked ? getIcon().TABLE_CHECKBOX_CHECKED : getIcon().TABLE_CHECKBOX_UNCHECKED] }), (0, _vue.h)('span', { class: 'vxe-checkbox--label' }, getI18n('vxe.export.expCurrentColumn'))])]), (0, _vue.h)('ul', { class: 'vxe-table-export--panel-column-body' }, cols)])])]), (0, _vue.h)('tr', [(0, _vue.h)('td', getI18n('vxe.export.expOpts')), parameterSlot ? (0, _vue.h)('td', [(0, _vue.h)('div', { class: 'vxe-table-export--panel-option-row' }, $xeTable.callSlot(parameterSlot, params))]) : (0, _vue.h)('td', [(0, _vue.h)('div', { class: 'vxe-table-export--panel-option-row' }, [VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: hasEmptyData || isHeader, disabled: hasEmptyData, title: getI18n('vxe.export.expHeaderTitle'), content: getI18n('vxe.export.expOptHeader'), 'onUpdate:modelValue'(value) { defaultOptions.isHeader = value; } }) : renderEmptyElement($xeTable), VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: isHeader ? defaultOptions.isTitle : false, disabled: !isHeader, title: getI18n('vxe.export.expTitleTitle'), content: getI18n('vxe.export.expOptTitle'), 'onUpdate:modelValue'(value) { defaultOptions.isTitle = value; } }) : renderEmptyElement($xeTable), VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: isHeader && hasColgroup && supportMerge ? defaultOptions.isColgroup : false, title: getI18n('vxe.export.expColgroupTitle'), disabled: !isHeader || !hasColgroup || !supportMerge, content: getI18n('vxe.export.expOptColgroup'), 'onUpdate:modelValue'(value) { defaultOptions.isColgroup = value; } }) : renderEmptyElement($xeTable)]), (0, _vue.h)('div', { class: 'vxe-table-export--panel-option-row' }, [VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: hasEmptyData ? false : defaultOptions.original, disabled: hasEmptyData, title: getI18n('vxe.export.expOriginalTitle'), content: getI18n('vxe.export.expOptOriginal'), 'onUpdate:modelValue'(value) { defaultOptions.original = value; } }) : renderEmptyElement($xeTable), VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: hasMerge && supportMerge && checkedAll ? defaultOptions.isMerge : false, title: getI18n('vxe.export.expMergeTitle'), disabled: hasEmptyData || !hasMerge || !supportMerge || !checkedAll, content: getI18n('vxe.export.expOptMerge'), 'onUpdate:modelValue'(value) { defaultOptions.isMerge = value; } }) : renderEmptyElement($xeTable), isPrint || !VxeUICheckboxComponent ? renderEmptyElement($xeTable) : (0, _vue.h)(VxeUICheckboxComponent, { modelValue: supportStyle ? defaultOptions.useStyle : false, disabled: !supportStyle, title: getI18n('vxe.export.expUseStyleTitle'), content: getI18n('vxe.export.expOptUseStyle'), 'onUpdate:modelValue'(value) { defaultOptions.useStyle = value; } }), VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: hasTree ? defaultOptions.isAllExpand : false, disabled: hasEmptyData || !hasTree, title: getI18n('vxe.export.expAllExpandTitle'), content: getI18n('vxe.export.expOptAllExpand'), 'onUpdate:modelValue'(value) { defaultOptions.isAllExpand = value; } }) : renderEmptyElement($xeTable)]), (0, _vue.h)('div', { class: 'vxe-table-export--panel-option-row' }, [VxeUICheckboxComponent ? (0, _vue.h)(VxeUICheckboxComponent, { modelValue: defaultOptions.isFooter, disabled: !storeData.hasFooter, title: getI18n('vxe.export.expFooterTitle'), content: getI18n('vxe.export.expOptFooter'), 'onUpdate:modelValue'(value) { defaultOptions.isFooter = value; } }) : renderEmptyElement($xeTable)])])])]])])]), bottomSlot ? (0, _vue.h)('div', { class: 'vxe-table-export--panel-bottom' }, $xeTable.callSlot(bottomSlot, params)) : renderEmptyElement($xeTable)]); }, footer() { const params = { $table: $xeTable, $grid: $xeGrid, $gantt: $xeGantt, options: defaultOptions, columns, params: defaultOptions.params }; return (0, _vue.h)('div', { class: 'vxe-table-export--panel-footer' }, footerSlot ? $xeTable.callSlot(footerSlot, params) : [(0, _vue.h)('div', { class: 'vxe-table-export--panel-btns' }, [VxeUIButtonComponent ? (0, _vue.h)(VxeUIButtonComponent, { content: getI18n('vxe.export.expCancel'), onClick: cancelEvent }) : renderEmptyElement($xeTable), VxeUIButtonComponent ? (0, _vue.h)(VxeUIButtonComponent, { ref: xButtonConfirm, status: 'primary', content: getI18n(isPrint ? 'vxe.export.expPrint' : 'vxe.export.expConfirm'), onClick: confirmEvent }) : renderEmptyElement($xeTable)])]); } }) : renderEmptyElement($xeTable); }; (0, _vue.nextTick)(() => { if (!VxeUIModalComponent) { (0, _log.errLog)('vxe.error.reqComp', ['vxe-modal']); } if (!VxeUIButtonComponent) { (0, _log.errLog)('vxe.error.reqComp', ['vxe-button']); } if (!VxeUISelectComponent) { (0, _log.errLog)('vxe.error.reqComp', ['vxe-select']); } if (!VxeUIInputComponent) { (0, _log.errLog)('vxe.error.reqComp', ['vxe-input']); } if (!VxeUICheckboxComponent) { (0, _log.errLog)('vxe.error.reqComp', ['vxe-checkbox']); } }); return renderVN; } });