UNPKG

vxe-table-demonic

Version:

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

211 lines (210 loc) 8.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _vue = require("vue"); var _conf = _interopRequireDefault(require("../../v-x-e-table/src/conf")); var _vXETable = require("../../v-x-e-table"); var _utils = require("../../tools/utils"); var _dom = require("../../tools/dom"); var _vn = require("../../tools/vn"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var _default = (0, _vue.defineComponent)({ name: 'VxeTableFilter', props: { filterStore: Object }, setup: function (props) { var $xetable = (0, _vue.inject)('$xetable', {}); var tableReactData = $xetable.reactData, tableInternalData = $xetable.internalData, getComputeMaps = $xetable.getComputeMaps; var computeFilterOpts = getComputeMaps().computeFilterOpts; var computeHasCheckOption = (0, _vue.computed)(function () { var filterStore = props.filterStore; return filterStore && filterStore.options.some(function (option) { return option.checked; }); }); // 全部筛选事件 var filterCheckAllEvent = function (evnt, value) { var filterStore = props.filterStore; filterStore.options.forEach(function (option) { option._checked = value; option.checked = value; }); filterStore.isAllSelected = value; filterStore.isIndeterminate = false; }; /************************* * Publish methods *************************/ // 确认筛选 var confirmFilter = function (evnt) { var filterStore = props.filterStore; filterStore.options.forEach(function (option) { option.checked = option._checked; }); $xetable.confirmFilterEvent(evnt); }; // (单选)筛选发生改变 var changeRadioOption = function (evnt, checked, item) { var filterStore = props.filterStore; filterStore.options.forEach(function (option) { option._checked = false; }); item._checked = checked; $xetable.checkFilterOptions(); confirmFilter(evnt); }; /** * 重置筛选 * 当筛选面板中的重置按钮被按下时触发 * @param {Event} evnt 事件 */ var resetFilter = function (evnt) { var filterStore = props.filterStore; $xetable.handleClearFilter(filterStore.column); $xetable.confirmFilterEvent(evnt); }; // (多选)筛选发生改变 var changeMultipleOption = function (evnt, checked, item) { item._checked = checked; $xetable.checkFilterOptions(); }; // 筛选发生改变 var changeOption = function (evnt, checked, item) { var filterStore = props.filterStore; if (filterStore.multiple) { changeMultipleOption(evnt, checked, item); } else { changeRadioOption(evnt, checked, item); } }; var changeAllOption = function (evnt, checked) { var filterStore = props.filterStore; if (filterStore.multiple) { filterCheckAllEvent(evnt, checked); } else { resetFilter(evnt); } }; /************************* * Publish methods *************************/ var $panel = { changeRadioOption: changeRadioOption, changeMultipleOption: changeMultipleOption, changeAllOption: changeAllOption, changeOption: changeOption, confirmFilter: confirmFilter, resetFilter: resetFilter }; var renderOptions = function (filterRender, compConf) { var filterStore = props.filterStore; var column = filterStore.column, multiple = filterStore.multiple, maxHeight = filterStore.maxHeight; var slots = column.slots; var filterSlot = slots ? slots.filter : null; var params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $panel, $table: $xetable }); if (filterSlot) { return [(0, _vue.h)('div', { class: 'vxe-table--filter-template' }, $xetable.callSlot(filterSlot, params))]; } else if (compConf && compConf.renderFilter) { return [(0, _vue.h)('div', { class: 'vxe-table--filter-template' }, (0, _vn.getSlotVNs)(compConf.renderFilter(filterRender, params)))]; } var isAllChecked = multiple ? filterStore.isAllSelected : !filterStore.options.some(function (item) { return item._checked; }); var isAllIndeterminate = multiple && filterStore.isIndeterminate; return [(0, _vue.h)('ul', { class: 'vxe-table--filter-header' }, [(0, _vue.h)('li', { class: ['vxe-table--filter-option', { 'is--checked': isAllChecked, 'is--indeterminate': isAllIndeterminate }], title: _conf.default.i18n(multiple ? 'vxe.table.allTitle' : 'vxe.table.allFilter'), onClick: function (evnt) { changeAllOption(evnt, !filterStore.isAllSelected); } }, (multiple ? [(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] })] : []).concat([(0, _vue.h)('span', { class: 'vxe-checkbox--label' }, _conf.default.i18n('vxe.table.allFilter'))]))]), (0, _vue.h)('ul', { class: 'vxe-table--filter-body', style: maxHeight ? { maxHeight: "".concat(maxHeight, "px") } : {} }, filterStore.options.map(function (item) { var isChecked = item._checked; var isIndeterminate = false; return (0, _vue.h)('li', { class: ['vxe-table--filter-option', { 'is--checked': item._checked }], title: item.label, onClick: function (evnt) { changeOption(evnt, !item._checked, item); } }, (multiple ? [(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] })] : []).concat([(0, _vue.h)('span', { class: 'vxe-checkbox--label' }, (0, _utils.formatText)(item.label, 1))])); }))]; }; var renderFooters = function () { var filterStore = props.filterStore; var column = filterStore.column, multiple = filterStore.multiple; var filterOpts = computeFilterOpts.value; var hasCheckOption = computeHasCheckOption.value; var filterRender = column.filterRender; var compConf = filterRender ? _vXETable.VXETable.renderer.get(filterRender.name) : null; var isDisabled = !hasCheckOption && !filterStore.isAllSelected && !filterStore.isIndeterminate; return multiple && (!compConf || compConf.showFilterFooter !== false) ? [(0, _vue.h)('div', { class: 'vxe-table--filter-footer' }, [(0, _vue.h)('button', { class: { 'is--disabled': isDisabled }, disabled: isDisabled, onClick: confirmFilter }, filterOpts.confirmButtonText || _conf.default.i18n('vxe.table.confirmFilter')), (0, _vue.h)('button', { onClick: resetFilter }, filterOpts.resetButtonText || _conf.default.i18n('vxe.table.resetFilter'))])] : []; }; var renderVN = function () { var filterStore = props.filterStore; var initStore = tableReactData.initStore; var column = filterStore.column; var filterRender = column ? column.filterRender : null; var compConf = filterRender ? _vXETable.VXETable.renderer.get(filterRender.name) : null; var filterClassName = compConf ? compConf.filterClassName : ''; var params = Object.assign({}, tableInternalData._currFilterParams, { $panel: $panel, $table: $xetable }); return (0, _vue.h)('div', { class: ['vxe-table--filter-wrapper', 'filter--prevent-default', (0, _dom.getPropClass)(filterClassName, params), { 'is--animat': $xetable.props.animat, 'is--multiple': filterStore.multiple, 'is--active': filterStore.visible }], style: filterStore.style }, initStore.filter && filterStore.visible ? renderOptions(filterRender, compConf).concat(renderFooters()) : []); }; return renderVN; } }); exports.default = _default;