UNPKG

vxe-table

Version:

一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟滚动、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、虚拟列表、模态窗口、自定义模板、渲染器、贼灵活的配置项、扩展接口等...

757 lines (658 loc) 22.6 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ctor = _interopRequireDefault(require("xe-utils/ctor")); var _conf = _interopRequireDefault(require("../../conf")); var _tools = require("../../tools"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var inputEventTypes = ['input', 'textarea', '$input', '$textarea']; var defaultCompProps = { transfer: true }; function isEmptyValue(cellValue) { return cellValue === null || cellValue === undefined || cellValue === ''; } function getChangeEvent(renderOpts) { return inputEventTypes.indexOf(renderOpts.name) > -1 ? 'input' : 'change'; } function parseDate(value, props) { return value && props.valueFormat ? _ctor.default.toStringDate(value, props.valueFormat) : value; } function getFormatDate(value, props, defaultFormat) { var _props$dateConfig = props.dateConfig, dateConfig = _props$dateConfig === void 0 ? {} : _props$dateConfig; return _ctor.default.toDateString(parseDate(value, props), dateConfig.labelFormat || defaultFormat); } function getLabelFormatDate(value, props) { return getFormatDate(value, props, _conf.default.i18n("vxe.input.date.labelFormat.".concat(props.type))); } function getDefaultComponentName(_ref) { var name = _ref.name; return "vxe-".concat(name.replace('$', '')); } function handleConfirmFilter(params, checked, option) { var $panel = params.$panel; $panel.changeOption({}, checked, option); } function getNativeAttrs(_ref2) { var name = _ref2.name, attrs = _ref2.attrs; if (name === 'input') { attrs = Object.assign({ type: 'text' }, attrs); } return attrs; } function getCellEditFilterProps(renderOpts, params, value, defaultProps) { var vSize = params.$table.vSize; return _ctor.default.assign(vSize ? { size: vSize } : {}, defaultCompProps, defaultProps, renderOpts.props, { value: value }); } function getItemProps(renderOpts, params, value, defaultProps) { var vSize = params.$form.vSize; return _ctor.default.assign(vSize ? { size: vSize } : {}, defaultCompProps, defaultProps, renderOpts.props, { value: value }); } function getNativeOns(renderOpts, params) { var nativeEvents = renderOpts.nativeEvents; var nativeOns = {}; _ctor.default.objectEach(nativeEvents, function (func, key) { nativeOns[key] = function () { for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } func.apply(void 0, [params].concat(args)); }; }); return nativeOns; } function getOns(renderOpts, params, inputFunc, changeFunc) { var events = renderOpts.events; var modelEvent = 'input'; var changeEvent = getChangeEvent(renderOpts); var isSameEvent = changeEvent === modelEvent; var ons = {}; _ctor.default.objectEach(events, function (func, key) { ons[key] = function () { for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } func.apply(void 0, [params].concat(args)); }; }); if (inputFunc) { ons[modelEvent] = function (targetEvnt) { inputFunc(targetEvnt); if (events && events[modelEvent]) { events[modelEvent](params, targetEvnt); } if (isSameEvent && changeFunc) { changeFunc(targetEvnt); } }; } if (!isSameEvent && changeFunc) { ons[changeEvent] = function () { for (var _len3 = arguments.length, args = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { args[_key3] = arguments[_key3]; } changeFunc.apply(void 0, args); if (events && events[changeEvent]) { events[changeEvent].apply(events, [params].concat(args)); } }; } return ons; } function getEditOns(renderOpts, params) { var $table = params.$table, row = params.row, column = params.column; return getOns(renderOpts, params, function (value) { // 处理 model 值双向绑定 _ctor.default.set(row, column.property, value); }, function () { // 处理 change 事件相关逻辑 $table.updateStatus(params); }); } function getFilterOns(renderOpts, params, option) { return getOns(renderOpts, params, function (value) { // 处理 model 值双向绑定 option.data = value; }, function () { handleConfirmFilter(params, !_ctor.default.eqNull(option.data), option); }); } function getItemOns(renderOpts, params) { var $form = params.$form, data = params.data, property = params.property; return getOns(renderOpts, params, function (value) { // 处理 model 值双向绑定 _ctor.default.set(data, property, value); }, function () { // 处理 change 事件相关逻辑 $form.updateStatus(params); }); } function isSyncCell(renderOpts, params) { return renderOpts.immediate || params.$type === 'cell'; } function getNativeEditOns(renderOpts, params) { var $table = params.$table, row = params.row, column = params.column; var model = column.model; return getOns(renderOpts, params, function (evnt) { // 处理 model 值双向绑定 var cellValue = evnt.target.value; if (isSyncCell(renderOpts, params)) { _tools.UtilTools.setCellValue(row, column, cellValue); } else { model.update = true; model.value = cellValue; } }, function (evnt) { // 处理 change 事件相关逻辑 var cellValue = evnt.target.value; $table.updateStatus(params, cellValue); }); } function getNativeFilterOns(renderOpts, params, option) { return getOns(renderOpts, params, function (evnt) { // 处理 model 值双向绑定 option.data = evnt.target.value; }, function () { handleConfirmFilter(params, !_ctor.default.eqNull(option.data), option); }); } function getNativeItemOns(renderOpts, params) { var $form = params.$form, data = params.data, property = params.property; return getOns(renderOpts, params, function (evnt) { // 处理 model 值双向绑定 var itemValue = evnt.target.value; _ctor.default.set(data, property, itemValue); }, function () { // 处理 change 事件相关逻辑 $form.updateStatus(params); }); } /** * 单元格可编辑渲染-原生的标签 * input、textarea、select */ function nativeEditRender(h, renderOpts, params) { var row = params.row, column = params.column; var name = renderOpts.name; var attrs = getNativeAttrs(renderOpts); var cellValue = isSyncCell(renderOpts, params) ? _tools.UtilTools.getCellValue(row, column) : column.model.value; return [h(name, { class: "vxe-default-".concat(name), attrs: attrs, domProps: { value: cellValue }, on: getNativeEditOns(renderOpts, params) })]; } function defaultEditRender(h, renderOpts, params) { var row = params.row, column = params.column; var cellValue = _tools.UtilTools.getCellValue(row, column); return [h(getDefaultComponentName(renderOpts), { props: getCellEditFilterProps(renderOpts, params, cellValue), on: getEditOns(renderOpts, params), nativeOn: getNativeOns(renderOpts, params) })]; } function defaultButtonEditRender(h, renderOpts, params) { return [h('vxe-button', { props: getCellEditFilterProps(renderOpts, params), on: getOns(renderOpts, params), nativeOn: getNativeOns(renderOpts, params) })]; } function defaultButtonsEditRender(h, renderOpts, params) { return renderOpts.children.map(function (childRenderOpts) { return defaultButtonEditRender(h, childRenderOpts, params)[0]; }); } function renderNativeOptgroups(h, renderOpts, params, renderOptionsMethods) { var optionGroups = renderOpts.optionGroups, _renderOpts$optionGro = renderOpts.optionGroupProps, optionGroupProps = _renderOpts$optionGro === void 0 ? {} : _renderOpts$optionGro; var groupOptions = optionGroupProps.options || 'options'; var groupLabel = optionGroupProps.label || 'label'; return optionGroups.map(function (group, gIndex) { return h('optgroup', { key: gIndex, domProps: { label: group[groupLabel] } }, renderOptionsMethods(h, group[groupOptions], renderOpts, params)); }); } /** * 渲染原生的 option 标签 */ function renderNativeOptions(h, options, renderOpts, params) { var _renderOpts$optionPro = renderOpts.optionProps, optionProps = _renderOpts$optionPro === void 0 ? {} : _renderOpts$optionPro; var row = params.row, column = params.column; var labelProp = optionProps.label || 'label'; var valueProp = optionProps.value || 'value'; var disabledProp = optionProps.disabled || 'disabled'; var cellValue = isSyncCell(renderOpts, params) ? _tools.UtilTools.getCellValue(row, column) : column.model.value; return options.map(function (option, oIndex) { return h('option', { key: oIndex, attrs: { value: option[valueProp], disabled: option[disabledProp] }, domProps: { /* eslint-disable eqeqeq */ selected: option[valueProp] == cellValue } }, option[labelProp]); }); } function nativeFilterRender(h, renderOpts, params) { var column = params.column; var name = renderOpts.name; var attrs = getNativeAttrs(renderOpts); return column.filters.map(function (option, oIndex) { return h(name, { key: oIndex, class: "vxe-default-".concat(name), attrs: attrs, domProps: { value: option.data }, on: getNativeFilterOns(renderOpts, params, option) }); }); } function defaultFilterRender(h, renderOpts, params) { var column = params.column; return column.filters.map(function (option, oIndex) { var optionValue = option.data; return h(getDefaultComponentName(renderOpts), { key: oIndex, props: getCellEditFilterProps(renderOpts, renderOpts, optionValue), on: getFilterOns(renderOpts, params, option) }); }); } function handleFilterMethod(_ref3) { var option = _ref3.option, row = _ref3.row, column = _ref3.column; var data = option.data; var cellValue = _ctor.default.get(row, column.property); /* eslint-disable eqeqeq */ return cellValue == data; } function nativeSelectEditRender(h, renderOpts, params) { return [h('select', { class: 'vxe-default-select', attrs: getNativeAttrs(renderOpts), on: getNativeEditOns(renderOpts, params) }, renderOpts.optionGroups ? renderNativeOptgroups(h, renderOpts, params, renderNativeOptions) : renderNativeOptions(h, renderOpts.options, renderOpts, params))]; } function defaultSelectEditRender(h, renderOpts, params) { var row = params.row, column = params.column; var options = renderOpts.options, optionProps = renderOpts.optionProps, optionGroups = renderOpts.optionGroups, optionGroupProps = renderOpts.optionGroupProps; var cellValue = _tools.UtilTools.getCellValue(row, column); return [h(getDefaultComponentName(renderOpts), { props: getCellEditFilterProps(renderOpts, params, cellValue, { options: options, optionProps: optionProps, optionGroups: optionGroups, optionGroupProps: optionGroupProps }), on: getEditOns(renderOpts, params) })]; } function getSelectCellValue(renderOpts, _ref4) { var row = _ref4.row, column = _ref4.column; var _renderOpts$props = renderOpts.props, props = _renderOpts$props === void 0 ? {} : _renderOpts$props, options = renderOpts.options, optionGroups = renderOpts.optionGroups, _renderOpts$optionPro2 = renderOpts.optionProps, optionProps = _renderOpts$optionPro2 === void 0 ? {} : _renderOpts$optionPro2, _renderOpts$optionGro2 = renderOpts.optionGroupProps, optionGroupProps = _renderOpts$optionGro2 === void 0 ? {} : _renderOpts$optionGro2; var cellValue = _ctor.default.get(row, column.property); var selectItem; var labelProp = optionProps.label || 'label'; var valueProp = optionProps.value || 'value'; if (!isEmptyValue(cellValue)) { return _ctor.default.map(props.multiple ? cellValue : [cellValue], optionGroups ? function (value) { var groupOptions = optionGroupProps.options || 'options'; for (var index = 0; index < optionGroups.length; index++) { /* eslint-disable eqeqeq */ selectItem = _ctor.default.find(optionGroups[index][groupOptions], function (item) { return item[valueProp] == value; }); if (selectItem) { break; } } return selectItem ? selectItem[labelProp] : value; } : function (value) { /* eslint-disable eqeqeq */ selectItem = _ctor.default.find(options, function (item) { return item[valueProp] == value; }); return selectItem ? selectItem[labelProp] : value; }).join(', '); } return null; } /** * 渲染表单-项 * 用于渲染原生的标签 */ function nativeItemRender(h, renderOpts, params) { var data = params.data, property = params.property; var name = renderOpts.name; var attrs = getNativeAttrs(renderOpts); var itemValue = _ctor.default.get(data, property); return [h(name, { class: "vxe-default-".concat(name), attrs: attrs, domProps: attrs && name === 'input' && (attrs.type === 'submit' || attrs.type === 'reset') ? null : { value: itemValue }, on: getNativeItemOns(renderOpts, params) })]; } function defaultItemRender(h, renderOpts, params) { var data = params.data, property = params.property; var itemValue = _ctor.default.get(data, property); return [h(getDefaultComponentName(renderOpts), { props: getItemProps(renderOpts, params, itemValue), on: getItemOns(renderOpts, params), nativeOn: getNativeOns(renderOpts, params) })]; } function defaultButtonItemRender(h, renderOpts, params) { return [h('vxe-button', { props: getItemProps(renderOpts, params), on: getOns(renderOpts, params), nativeOn: getNativeOns(renderOpts, params) })]; } function defaultButtonsItemRender(h, renderOpts, params) { return renderOpts.children.map(function (childRenderOpts) { return defaultButtonItemRender(h, childRenderOpts, params)[0]; }); } /** * 渲染原生的 select 标签 */ function renderNativeFormOptions(h, options, renderOpts, params) { var data = params.data, property = params.property; var _renderOpts$optionPro3 = renderOpts.optionProps, optionProps = _renderOpts$optionPro3 === void 0 ? {} : _renderOpts$optionPro3; var labelProp = optionProps.label || 'label'; var valueProp = optionProps.value || 'value'; var disabledProp = optionProps.disabled || 'disabled'; var cellValue = _ctor.default.get(data, property); return options.map(function (item, oIndex) { return h('option', { key: oIndex, attrs: { value: item[valueProp], disabled: item[disabledProp] }, domProps: { /* eslint-disable eqeqeq */ selected: item[valueProp] == cellValue } }, item[labelProp]); }); } function handleExportSelectMethod(params) { var row = params.row, column = params.column, options = params.options; return options.original ? _tools.UtilTools.getCellValue(row, column) : getSelectCellValue(column.editRender || column.cellRender, params); } /** * 渲染表单-项中 * 单选框和复选框 */ function defaultFormItemRadioAndCheckboxRender(h, renderOpts, params) { var options = renderOpts.options, _renderOpts$optionPro4 = renderOpts.optionProps, optionProps = _renderOpts$optionPro4 === void 0 ? {} : _renderOpts$optionPro4; var data = params.data, property = params.property; var labelProp = optionProps.label || 'label'; var valueProp = optionProps.value || 'value'; var disabledProp = optionProps.disabled || 'disabled'; var itemValue = _ctor.default.get(data, property); var name = getDefaultComponentName(renderOpts); return [h("".concat(name, "-group"), { props: getItemProps(renderOpts, params, itemValue), on: getItemOns(renderOpts, params), nativeOn: getNativeOns(renderOpts, params) }, options.map(function (item, index) { return h(name, { key: index, props: { label: item[valueProp], content: item[labelProp], disabled: item[disabledProp] } }); }))]; } /** * 内置的组件渲染 */ var renderMap = { input: { autofocus: 'input', renderEdit: nativeEditRender, renderDefault: nativeEditRender, renderFilter: nativeFilterRender, filterMethod: handleFilterMethod, renderItemContent: nativeItemRender }, textarea: { autofocus: 'textarea', renderEdit: nativeEditRender, renderItemContent: nativeItemRender }, select: { renderEdit: nativeSelectEditRender, renderDefault: nativeSelectEditRender, renderCell: function renderCell(h, renderOpts, params) { return getSelectCellValue(renderOpts, params); }, renderFilter: function renderFilter(h, renderOpts, params) { var column = params.column; return column.filters.map(function (option, oIndex) { return h('select', { key: oIndex, class: 'vxe-default-select', attrs: getNativeAttrs(renderOpts), on: getNativeFilterOns(renderOpts, params, option) }, renderOpts.optionGroups ? renderNativeOptgroups(h, renderOpts, params, renderNativeOptions) : renderNativeOptions(h, renderOpts.options, renderOpts, params)); }); }, filterMethod: handleFilterMethod, renderItemContent: function renderItemContent(h, renderOpts, params) { return [h('select', { class: 'vxe-default-select', attrs: getNativeAttrs(renderOpts), on: getNativeItemOns(renderOpts, params) }, renderOpts.optionGroups ? renderNativeOptgroups(h, renderOpts, params, renderNativeFormOptions) : renderNativeFormOptions(h, renderOpts.options, renderOpts, params))]; }, cellExportMethod: handleExportSelectMethod }, $input: { autofocus: '.vxe-input--inner', renderEdit: defaultEditRender, renderCell: function renderCell(h, renderOpts, params) { var _renderOpts$props2 = renderOpts.props, props = _renderOpts$props2 === void 0 ? {} : _renderOpts$props2; var row = params.row, column = params.column; var digits = props.digits || _conf.default.input.digits; var cellValue = _ctor.default.get(row, column.property); if (cellValue) { switch (props.type) { case 'date': case 'week': case 'month': case 'year': cellValue = getLabelFormatDate(cellValue, props); break; case 'float': cellValue = _ctor.default.toFixed(_ctor.default.floor(cellValue, digits), digits); break; } } return cellValue; }, renderDefault: defaultEditRender, renderFilter: defaultFilterRender, filterMethod: handleFilterMethod, renderItemContent: defaultItemRender }, $textarea: { autofocus: '.vxe-textarea--inner', renderItemContent: defaultItemRender }, $button: { renderDefault: defaultButtonEditRender, renderItemContent: defaultButtonItemRender }, $buttons: { renderDefault: defaultButtonsEditRender, renderItemContent: defaultButtonsItemRender }, $select: { autofocus: '.vxe-input--inner', renderEdit: defaultSelectEditRender, renderDefault: defaultSelectEditRender, renderCell: function renderCell(h, renderOpts, params) { return getSelectCellValue(renderOpts, params); }, renderFilter: function renderFilter(h, renderOpts, params) { var column = params.column; var options = renderOpts.options, optionProps = renderOpts.optionProps, optionGroups = renderOpts.optionGroups, optionGroupProps = renderOpts.optionGroupProps; var nativeOn = getNativeOns(renderOpts, params); return column.filters.map(function (option, oIndex) { var optionValue = option.data; return h(getDefaultComponentName(renderOpts), { key: oIndex, props: getCellEditFilterProps(renderOpts, params, optionValue, { options: options, optionProps: optionProps, optionGroups: optionGroups, optionGroupProps: optionGroupProps }), on: getFilterOns(renderOpts, params, option), nativeOn: nativeOn }); }); }, filterMethod: handleFilterMethod, renderItemContent: function renderItemContent(h, renderOpts, params) { var data = params.data, property = params.property; var options = renderOpts.options, optionProps = renderOpts.optionProps, optionGroups = renderOpts.optionGroups, optionGroupProps = renderOpts.optionGroupProps; var itemValue = _ctor.default.get(data, property); return [h(getDefaultComponentName(renderOpts), { props: getItemProps(renderOpts, params, itemValue, { options: options, optionProps: optionProps, optionGroups: optionGroups, optionGroupProps: optionGroupProps }), on: getItemOns(renderOpts, params), nativeOn: getNativeOns(renderOpts, params) })]; }, cellExportMethod: handleExportSelectMethod }, $radio: { autofocus: '.vxe-radio--input', renderItemContent: defaultFormItemRadioAndCheckboxRender }, $checkbox: { autofocus: '.vxe-checkbox--input', renderItemContent: defaultFormItemRadioAndCheckboxRender }, $switch: { autofocus: '.vxe-switch--button', renderEdit: defaultEditRender, renderDefault: defaultEditRender, renderItemContent: defaultItemRender } }; /** * 全局渲染器 */ var renderer = { mixin: function mixin(map) { _ctor.default.each(map, function (options, name) { return renderer.add(name, options); }); return renderer; }, get: function get(name) { return renderMap[name] || null; }, add: function add(name, options) { if (name && options) { var renders = renderMap[name]; if (renders) { Object.assign(renders, options); } else { renderMap[name] = options; } } return renderer; }, delete: function _delete(name) { delete renderMap[name]; return renderer; } }; var _default = renderer; exports.default = _default;