import Vue from 'vue';
|
import Watcher from './watcher';
|
import { arrayFind } from 'element-ui/src/utils/util';
|
|
Watcher.prototype.mutations = {
|
setData(states, data) {
|
const dataInstanceChanged = states._data !== data;
|
states._data = data;
|
|
this.execQuery();
|
// 数据变化,更新部分数据。
|
// 没有使用 computed,而是手动更新部分数据 https://github.com/vuejs/vue/issues/6660#issuecomment-331417140
|
this.updateCurrentRowData();
|
this.updateExpandRows();
|
if (states.reserveSelection) {
|
this.assertRowKey();
|
this.updateSelectionByRowKey();
|
} else {
|
if (dataInstanceChanged) {
|
this.clearSelection();
|
} else {
|
this.cleanSelection();
|
}
|
}
|
this.updateAllSelected();
|
|
this.updateTableScrollY();
|
},
|
|
insertColumn(states, column, index, parent) {
|
let array = states._columns;
|
if (parent) {
|
array = parent.children;
|
if (!array) array = parent.children = [];
|
}
|
|
if (typeof index !== 'undefined') {
|
array.splice(index, 0, column);
|
} else {
|
array.push(column);
|
}
|
|
if (column.type === 'selection') {
|
states.selectable = column.selectable;
|
states.reserveSelection = column.reserveSelection;
|
}
|
|
if (this.table.$ready) {
|
this.updateColumns(); // hack for dynamics insert column
|
this.scheduleLayout();
|
}
|
},
|
|
removeColumn(states, column, parent) {
|
let array = states._columns;
|
if (parent) {
|
array = parent.children;
|
if (!array) array = parent.children = [];
|
}
|
if (array) {
|
array.splice(array.indexOf(column), 1);
|
}
|
|
if (this.table.$ready) {
|
this.updateColumns(); // hack for dynamics remove column
|
this.scheduleLayout();
|
}
|
},
|
|
sort(states, options) {
|
const { prop, order, init } = options;
|
if (prop) {
|
const column = arrayFind(states.columns, column => column.property === prop);
|
if (column) {
|
column.order = order;
|
this.updateSort(column, prop, order);
|
this.commit('changeSortCondition', { init });
|
}
|
}
|
},
|
|
changeSortCondition(states, options) {
|
// 修复 pr https://github.com/ElemeFE/element/pull/15012 导致的 bug
|
const { sortingColumn: column, sortProp: prop, sortOrder: order } = states;
|
if (order === null) {
|
states.sortingColumn = null;
|
states.sortProp = null;
|
}
|
const ingore = { filter: true };
|
this.execQuery(ingore);
|
|
if (!options || !(options.silent || options.init)) {
|
this.table.$emit('sort-change', {
|
column,
|
prop,
|
order
|
});
|
}
|
|
this.updateTableScrollY();
|
},
|
|
filterChange(states, options) {
|
let { column, values, silent } = options;
|
const newFilters = this.updateFilters(column, values);
|
|
this.execQuery();
|
|
if (!silent) {
|
this.table.$emit('filter-change', newFilters);
|
}
|
|
this.updateTableScrollY();
|
},
|
|
toggleAllSelection() {
|
this.toggleAllSelection();
|
},
|
|
rowSelectedChanged(states, row) {
|
this.toggleRowSelection(row);
|
this.updateAllSelected();
|
},
|
|
setHoverRow(states, row) {
|
states.hoverRow = row;
|
},
|
|
setCurrentRow(states, row) {
|
this.updateCurrentRow(row);
|
}
|
};
|
|
Watcher.prototype.commit = function(name, ...args) {
|
const mutations = this.mutations;
|
if (mutations[name]) {
|
mutations[name].apply(this, [this.states].concat(args));
|
} else {
|
throw new Error(`Action not found: ${name}`);
|
}
|
};
|
|
Watcher.prototype.updateTableScrollY = function() {
|
Vue.nextTick(this.table.updateScrollY);
|
};
|
|
export default Watcher;
|