UNPKG

ten-design-vue

Version:

ten-vue

573 lines (502 loc) 17.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _loading = _interopRequireDefault(require("../loading")); var _tableTable = _interopRequireDefault(require("./table-table.js")); var _emitter = _interopRequireDefault(require("../scripts/mixins/emitter")); var _util = require("./util"); var _resizeObserver = require("../scripts/utils/resize-observer"); var _helper = require("../scripts/utils/helper"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; } function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } var name = 'ten-table'; var _default2 = { name: name, provide: function provide() { return { table: this }; }, mixins: [_emitter.default], props: { /** * 表格数据 */ data: { type: Array, default: function _default() { return []; } }, /** * column配置对象数组 * 与使用<ten-table-column>效果相同 */ columns: { type: Array, default: function _default() { return []; } }, /** * 行的唯一标识,必填, * 展开时候需要通过 rowKe y获取指定的折叠行 * 字符串支持 data.rowKey */ rowKey: { type: [String, Function], default: 'id' }, /** * 自定义行配置,可以配置对象或者是返回配置的函数 (row, $index) => rowProps */ rowProps: [Object, Function], /** * 最小宽度,小于时才触发折叠 */ minWidth: Number, /** * 表格高度。 * 合法的值为数字或者单位为 px 的高度。 */ height: [Number, String], /** * Table 的最大高度。 * 合法的值为数字或者单位为 px 的高度。 */ maxHeight: [Number, String], /** * 是否加载中 */ loading: Boolean, /** * 无数据提醒, * 支持同名slot */ emptyText: { type: String, default: '暂无数据' }, /** * 已选中的行rowKey数组, * 支持.sync */ selectedRowKeys: { type: Array, default: function _default() { return []; } }, /** * 隐藏表头 */ hideHeader: Boolean, /** * 已展开的行rowKey数组, * 有列配置设置了type="expand"有效, * 支持.sync */ expandedRowKeys: { type: Array, default: function _default() { return []; } }, /** * 是否可伸缩列 */ resizable: { type: Boolean, default: false }, /** * resizable 光标类名 */ resizableHandleClass: { type: String, default: 'resizable-handle' }, /** * 拖拽排序(行) */ dragSort: { type: Boolean, default: false } }, data: function data() { return { tbodyScrollTop: 0, tableWrapperWidth: undefined, sortOrder: undefined, sortColumn: {}, scrollStatus: undefined, hoverRowIndex: undefined, cells: {}, selectionMap: {} }; }, computed: { className: function className() { return ['ten-table', 'ten-table--vue']; }, innderTableWidth: function innderTableWidth() { return this.scrollableX ? this.minWidth : this.tableWrapperWidth; }, scrollableX: function scrollableX() { return this.tableWrapperWidth < this.minWidth; }, sortedData: function sortedData() { var _this = this; if (typeof this.sortColumn.sorter === 'function' && this.sortOrder && this.sortColumn.sortable) { return this.data.slice(0).sort(function (a, b) { return _this.sortColumn.sorter(a, b, _this.sortOrder); }); } return this.data; } }, watch: { scrollStatus: function scrollStatus(newStatus, oldStatus) { this.$refs["".concat(oldStatus, "Table")] && this.$refs["".concat(oldStatus, "Table")].onResize(); this.$refs["".concat(oldStatus, "Table")] && this.$refs["".concat(oldStatus, "Table")].$el.classList.remove("is-scrolling--".concat(oldStatus)); this.$refs["".concat(newStatus, "Table")] && this.$refs["".concat(newStatus, "Table")].$el.classList.add("is-scrolling--".concat(newStatus)); }, minWidth: function minWidth() { this.resize(); }, height: function height() { this.resize(); }, maxHeight: function maxHeight() { this.resize(); } }, created: function created() { this.$on('sort-change', this.onSortChange); }, mounted: function mounted() { if (this.$el) { (0, _resizeObserver.addResizeListener)(this.$el, this.resize); } }, beforeDestroy: function beforeDestroy() { if (this.$el) { (0, _resizeObserver.removeResizeListener)(this.$el, this.resize); } }, render: function render() { var h = arguments[0]; var columnsTree = []; var defaultSlots; var sortInfo = { order: this.sortOrder, column: this.sortColumn }; if (this.$scopedSlots.default) { defaultSlots = this.$scopedSlots.default(); columnsTree = (0, _util.getColumnsTree)(defaultSlots, { sortInfo: sortInfo }); } else if (this.columns && this.columns.length > 0) { columnsTree = (0, _util.getColumnsTreeByProps)(this.columns, { sortInfo: sortInfo }); } if (this.resizable) { columnsTree = this._resizableColumns(columnsTree); } if (columnsTree.length > 0) { // 只允许第一层表头设置fixed,其子节点跟随父节点 var fixedLeft = columnsTree.filter(function (v) { return v.fixed === 'left'; }); var fixedRight = columnsTree.filter(function (v) { return v.fixed === 'right'; }); columnsTree = fixedLeft.concat(columnsTree.filter(function (v) { return v.fixed === undefined; }), fixedRight); var columns = []; var columnDepth = (0, _util.traverseTree)(columnsTree, 1, columns); return h("div", { "class": this.className }, [defaultSlots ? h("div", [defaultSlots]) : null, h(_loading.default, { attrs: { loading: this.loading } }, [h(_tableTable.default, { ref: "baseTable", attrs: { columnsTree: columnsTree, columns: columns, depth: columnDepth, data: this.sortedData, rowProps: this.rowPropsFun, emptyText: this.$scopedSlots.emptyText || this.emptyText, scrollTop: this.tbodyScrollTop, innderTableWidth: this.innderTableWidth, hoverRowIndex: this.hoverRowIndex }, on: { "scroll": this.onScroll, "resize": this.onResize, "hoverChange": this.onHoverChange } }), fixedLeft.length > 0 && this.scrollableX ? h(_tableTable.default, { ref: "leftTable", attrs: { columnsTree: columnsTree, columns: columns, depth: columnDepth, data: this.sortedData, rowProps: this.rowPropsFun, emptyText: this.$scopedSlots.emptyText || this.emptyText, scrollTop: this.tbodyScrollTop, innderTableWidth: this.innderTableWidth, hoverRowIndex: this.hoverRowIndex, fixedColumns: fixedLeft, fixed: "left", sizeData: this.sizeData }, on: { "scroll": this.onScroll, "hoverChange": this.onHoverChange } }) : null, fixedRight.length > 0 && this.scrollableX ? h(_tableTable.default, { ref: "rightTable", attrs: { columnsTree: columnsTree, columns: columns, depth: columnDepth, data: this.sortedData, rowProps: this.rowPropsFun, emptyText: this.$scopedSlots.emptyText || this.emptyText, scrollTop: this.tbodyScrollTop, innderTableWidth: this.innderTableWidth, hoverRowIndex: this.hoverRowIndex, fixedColumns: fixedRight, fixed: "right", sizeData: this.sizeData }, on: { "scroll": this.onScroll, "hoverChange": this.onHoverChange } }) : null])]); } return null; }, methods: { getRowKey: function getRowKey(row) { if (typeof this.rowKey === 'function') { return this.rowKey(row); } if (typeof this.rowKey === 'string') { var path = "".concat(this.rowKey); return (0, _helper.getValueByPath)(row, path); } }, changeSelected: function changeSelected(selectedKeys) { var _this2 = this; var data = this.data, getRowKey = this.getRowKey, selectionMap = this.selectionMap; var selections = selectedKeys.map(function (key) { if (typeof key === 'undefined') return undefined; // 缓存之前获取到的值 防止 data 更改后获取不到 var value = data.find(function (row) { return getRowKey(row) === key; }) || undefined; if (value) { _this2.selectionMap[key] = value; } else { value = selectionMap[key]; } return value; }); /** * 选中变化事件 * @param {Array} selectedKeys 选中的 keys * @param {Array} selections 选中值对应的数据,如果没有则是 undefined */ this.$emit('selectedChange', selectedKeys, selections); }, rowPropsFun: function rowPropsFun() { if (_typeof(this.rowProps) === 'object') { return this.rowProps; } if (typeof this.rowProps === 'function') { return this.rowProps.apply(this, arguments); } return this.rowProps; }, setRefTables: function setRefTables(fn) { var _this3 = this; var refTables = ['baseTable', 'leftTable', 'rightTable']; refTables.forEach(function (refTable) { if (_this3.$refs[refTable]) { fn(_this3.$refs[refTable]); } }); }, /** * @public * * Table 隐藏切换为显示时,需要重新计算尺寸。默认已经对 ten 组件触发的切换(如 modal, tabs )与路由切换做了处理 */ resize: function resize() { this.broadcastAll('do-layout'); }, addCell: function addCell(cell) { this.cells[cell.id] = cell; }, removeCell: function removeCell(cell) { if (cell === this.cells[cell.id]) { delete this.cells[cell.id]; } }, updateInvisibleCell: function updateInvisibleCell(pureId, visibleCell) { var _this4 = this; var ids = ['base', 'left', 'right'].map(function (item) { return "".concat(item, "-").concat(pureId); }); ids.forEach(function (id) { if (_this4.cells[id] && _this4.cells[id].invisible && visibleCell.$el) { _this4.cells[id].syncFromVisibleCell(visibleCell); } }); }, onScroll: function onScroll(_ref) { var tbodyScrollTop = _ref.tbodyScrollTop, scrollStatus = _ref.scrollStatus, target = _ref.target; if (scrollStatus && this.scrollStatus !== scrollStatus) { this.scrollStatus = scrollStatus; } this.setRefTables(function (refTable) { if (refTable !== target) { refTable.setScrollTop(tbodyScrollTop); } }); }, onResize: function onResize(tableWrapperEl) { if (tableWrapperEl) { this.tableWrapperWidth = tableWrapperEl.offsetWidth; } }, onSortChange: function onSortChange(order, column) { this.sortOrder = order; this.sortColumn = column; /** * 排序改变事件 * @param {Object} column 触发排序的列 * @param {String} order 新的排序方式 */ this.$emit('sort', column, order); }, onHoverChange: function onHoverChange(i) { // this.hoverRowIndex = i; this.setRefTables(function (refTable) { refTable.setBodyHover(i); }); }, // 增强 columns 的功能,让其适合控制单元格的宽度 _resizableColumns: function _resizableColumns() { var _this5 = this; var columns = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : []; // 为了适配带 children 的 column 而另外计算下标 var colIndex = 0; var enhanceColumns = function enhanceColumns(columns) { return columns.map(function (_column) { var column = _column; if (!column.children) { // 给表头的 th 节点添加 resizable 的 class 名 var _className = column.className; if (_className === undefined) { column.className = 'resizable'; } else if (typeof _className === 'string') { column.className += ' resizable'; } else { column.className = [].concat(_toConsumableArray(_className), ['resizable']); } // 这是为了在不改变原有数据的情况下,增强 title var _title = column.title; // 保存当前的 col 下标 var _i = colIndex; colIndex += 1; column.title = function (h) { return h('div', { class: 'resizable-content' }, [typeof _title === 'function' ? _title(h) : _title, _this5._resizableDom(column, _i)]); }; } else { column.children = enhanceColumns(column.children); } return column; }); }; return enhanceColumns(columns); }, // 单元格边界的节点 _resizableDom: function _resizableDom(column, i) { var _this6 = this; var h = this.$createElement; return h("span", { "class": this.resizableHandleClass, on: { "click": function click(e) { return e.stopPropagation(); }, "mousedown": function mousedown(e) { return _this6._handelResizableWidth(e, i, column); } } }); }, // 控制宽度变化 _handelResizableWidth: function _handelResizableWidth(event, index, _column) { var _this7 = this; var column = _column; event.stopPropagation(); // col 的节点 var colgroups = []; this.$el.querySelectorAll('colgroup').forEach(function (colgroup) { colgroups.push(colgroup.querySelectorAll('col')); }); // 获取节点实际宽度 var thDom = event.path.find(function (dom) { return dom.className.indexOf('resizable') > 0; }); column.width = thDom.offsetWidth; var initailWidth = column.width; var startX = event.pageX; // 监听位置的变化,并计算长度 var stop = true; var mousemoveFn = function mousemoveFn(e) { if (!stop) return false; // 控制宽度变化度的关键 colgroups.forEach(function (_colgroup) { var colgroup = _colgroup; column.width = "".concat(initailWidth + e.pageX - startX, "px"); colgroup[index].style.width = column.width; }); }; var mouseupFn = function mouseupFn() { stop = false; /** * 可伸缩列在拖拽结束后的事件 * @param {string} width 拖拽后的列宽 * @param {object} column 发生拖拽所在列 */ _this7.$emit('columnWidthChange', column.width, column); document.removeEventListener('mousemove', mousemoveFn); document.removeEventListener('mouseup', mouseupFn); }; document.addEventListener('mousemove', mousemoveFn); document.addEventListener('mouseup', mouseupFn); } } }; exports.default = _default2;