123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387 |
- import ElCheckbox from 'element-ui/packages/checkbox';
- import ElTag from 'element-ui/packages/tag';
- import objectAssign from 'element-ui/src/utils/merge';
- import { getValueByPath } from './util';
- let columnIdSeed = 1;
- const defaults = {
- default: {
- order: ''
- },
- selection: {
- width: 48,
- minWidth: 48,
- realWidth: 48,
- order: '',
- className: 'el-table-column--selection'
- },
- expand: {
- width: 48,
- minWidth: 48,
- realWidth: 48,
- order: ''
- },
- index: {
- width: 48,
- minWidth: 48,
- realWidth: 48,
- order: ''
- }
- };
- const forced = {
- selection: {
- renderHeader: function(h) {
- return <el-checkbox
- nativeOn-click={ this.toggleAllSelection }
- domProps-value={ this.isAllSelected } />;
- },
- renderCell: function(h, { row, column, store, $index }) {
- return <el-checkbox
- domProps-value={ store.isSelected(row) }
- disabled={ column.selectable ? !column.selectable.call(null, row, $index) : false }
- on-input={ () => { store.commit('rowSelectedChanged', row); } } />;
- },
- sortable: false,
- resizable: false
- },
- index: {
- renderHeader: function(h, { column }) {
- return column.label || '#';
- },
- renderCell: function(h, { $index }) {
- return <div>{ $index + 1 }</div>;
- },
- sortable: false
- },
- expand: {
- renderHeader: function(h, {}) {
- return '';
- },
- renderCell: function(h, { row, store }, proxy) {
- const expanded = store.states.expandRows.indexOf(row) > -1;
- return <div class={ 'el-table__expand-icon ' + (expanded ? 'el-table__expand-icon--expanded' : '') }
- on-click={ () => proxy.handleExpandClick(row) }>
- <i class='el-icon el-icon-arrow-right'></i>
- </div>;
- },
- sortable: false,
- resizable: false,
- className: 'el-table__expand-column'
- }
- };
- const getDefaultColumn = function(type, options) {
- const column = {};
- objectAssign(column, defaults[type || 'default']);
- for (let name in options) {
- if (options.hasOwnProperty(name)) {
- const value = options[name];
- if (typeof value !== 'undefined') {
- column[name] = value;
- }
- }
- }
- if (!column.minWidth) {
- column.minWidth = 80;
- }
- column.realWidth = column.width || column.minWidth;
- return column;
- };
- const DEFAULT_RENDER_CELL = function(h, { row, column }) {
- const property = column.property;
- if (column && column.formatter) {
- return column.formatter(row, column);
- }
- if (property && property.indexOf('.') === -1) {
- return row[property];
- }
- return getValueByPath(row, property);
- };
- export default {
- name: 'ElTableColumn',
- props: {
- type: {
- type: String,
- default: 'default'
- },
- label: String,
- className: String,
- property: String,
- prop: String,
- width: {},
- minWidth: {},
- renderHeader: Function,
- sortable: {
- type: [String, Boolean],
- default: false
- },
- sortMethod: Function,
- resizable: {
- type: Boolean,
- default: true
- },
- context: {},
- columnKey: String,
- align: String,
- headerAlign: String,
- showTooltipWhenOverflow: Boolean,
- showOverflowTooltip: Boolean,
- fixed: [Boolean, String],
- formatter: Function,
- selectable: Function,
- reserveSelection: Boolean,
- filterMethod: Function,
- filteredValue: Array,
- filters: Array,
- filterMultiple: {
- type: Boolean,
- default: true
- }
- },
- data() {
- return {
- isSubColumn: false,
- columns: []
- };
- },
- beforeCreate() {
- this.row = {};
- this.column = {};
- this.$index = 0;
- },
- components: {
- ElCheckbox,
- ElTag
- },
- computed: {
- owner() {
- let parent = this.$parent;
- while (parent && !parent.tableId) {
- parent = parent.$parent;
- }
- return parent;
- }
- },
- created() {
- this.customRender = this.$options.render;
- this.$options.render = h => h('div', this.$slots.default);
- let columnId = this.columnId = this.columnKey || ((this.$parent.tableId || (this.$parent.columnId + '_')) + 'column_' + columnIdSeed++);
- let parent = this.$parent;
- let owner = this.owner;
- this.isSubColumn = owner !== parent;
- let type = this.type;
- let width = this.width;
- if (width !== undefined) {
- width = parseInt(width, 10);
- if (isNaN(width)) {
- width = null;
- }
- }
- let minWidth = this.minWidth;
- if (minWidth !== undefined) {
- minWidth = parseInt(minWidth, 10);
- if (isNaN(minWidth)) {
- minWidth = 80;
- }
- }
- let isColumnGroup = false;
- let column = getDefaultColumn(type, {
- id: columnId,
- label: this.label,
- className: this.className,
- property: this.prop || this.property,
- type,
- renderCell: null,
- renderHeader: this.renderHeader,
- minWidth,
- width,
- isColumnGroup,
- context: this.context,
- align: this.align ? 'is-' + this.align : null,
- headerAlign: this.headerAlign ? 'is-' + this.headerAlign : (this.align ? 'is-' + this.align : null),
- sortable: this.sortable === '' ? true : this.sortable,
- sortMethod: this.sortMethod,
- resizable: this.resizable,
- showOverflowTooltip: this.showOverflowTooltip || this.showTooltipWhenOverflow,
- formatter: this.formatter,
- selectable: this.selectable,
- reserveSelection: this.reserveSelection,
- fixed: this.fixed === '' ? true : this.fixed,
- filterMethod: this.filterMethod,
- filters: this.filters,
- filterable: this.filters || this.filterMethod,
- filterMultiple: this.filterMultiple,
- filterOpened: false,
- filteredValue: this.filteredValue || []
- });
- objectAssign(column, forced[type] || {});
- this.columnConfig = column;
- let renderCell = column.renderCell;
- let _self = this;
- if (type === 'expand') {
- owner.renderExpanded = function(h, data) {
- return _self.$scopedSlots.default
- ? _self.$scopedSlots.default(data)
- : _self.$slots.default;
- };
- column.renderCell = function(h, data) {
- return <div class="cell">{ renderCell(h, data, this._renderProxy) }</div>;
- };
- return;
- }
- column.renderCell = function(h, data) {
- // 未来版本移除
- if (_self.$vnode.data.inlineTemplate) {
- renderCell = function() {
- data._self = _self.context || data._self;
- if (Object.prototype.toString.call(data._self) === '[object Object]') {
- for (let prop in data._self) {
- if (!data.hasOwnProperty(prop)) {
- data[prop] = data._self[prop];
- }
- }
- }
- // 静态内容会缓存到 _staticTrees 内,不改的话获取的静态数据就不是内部 context
- data._staticTrees = _self._staticTrees;
- data.$options.staticRenderFns = _self.$options.staticRenderFns;
- return _self.customRender.call(data);
- };
- } else if (_self.$scopedSlots.default) {
- renderCell = () => _self.$scopedSlots.default(data);
- }
- if (!renderCell) {
- renderCell = DEFAULT_RENDER_CELL;
- }
- return _self.showOverflowTooltip || _self.showTooltipWhenOverflow
- ? <el-tooltip
- effect={ this.effect }
- placement="top"
- disabled={ this.tooltipDisabled }>
- <div class="cell">{ renderCell(h, data) }</div>
- <span slot="content">{ renderCell(h, data) }</span>
- </el-tooltip>
- : <div class="cell">{ renderCell(h, data) }</div>;
- };
- },
- destroyed() {
- if (!this.$parent) return;
- this.owner.store.commit('removeColumn', this.columnConfig);
- },
- watch: {
- label(newVal) {
- if (this.columnConfig) {
- this.columnConfig.label = newVal;
- }
- },
- prop(newVal) {
- if (this.columnConfig) {
- this.columnConfig.property = newVal;
- }
- },
- property(newVal) {
- if (this.columnConfig) {
- this.columnConfig.property = newVal;
- }
- },
- filters(newVal) {
- if (this.columnConfig) {
- this.columnConfig.filters = newVal;
- }
- },
- filterMultiple(newVal) {
- if (this.columnConfig) {
- this.columnConfig.filterMultiple = newVal;
- }
- },
- align(newVal) {
- if (this.columnConfig) {
- this.columnConfig.align = newVal ? 'is-' + newVal : null;
- if (!this.headerAlign) {
- this.columnConfig.headerAlign = newVal ? 'is-' + newVal : null;
- }
- }
- },
- headerAlign(newVal) {
- if (this.columnConfig) {
- this.columnConfig.headerAlign = 'is-' + (newVal ? newVal : this.align);
- }
- },
- width(newVal) {
- if (this.columnConfig) {
- this.columnConfig.width = newVal;
- this.owner.store.scheduleLayout();
- }
- },
- minWidth(newVal) {
- if (this.columnConfig) {
- this.columnConfig.minWidth = newVal;
- this.owner.store.scheduleLayout();
- }
- },
- fixed(newVal) {
- if (this.columnConfig) {
- this.columnConfig.fixed = newVal;
- this.owner.store.scheduleLayout();
- }
- }
- },
- mounted() {
- const owner = this.owner;
- const parent = this.$parent;
- let columnIndex;
- if (!this.isSubColumn) {
- columnIndex = [].indexOf.call(parent.$refs.hiddenColumns.children, this.$el);
- } else {
- columnIndex = [].indexOf.call(parent.$el.children, this.$el);
- }
- owner.store.commit('insertColumn', this.columnConfig, columnIndex, this.isSubColumn ? parent.columnConfig : null);
- }
- };
|