Table: support manually sorting. Resolves #9495 (#11311)

* Table: support manually sorting. Resolves #9495

* Table: add parameters for sort api

* Docs: improve docs
pull/11330/head
Jikkai Xiao 2018-05-24 18:01:02 +08:00 committed by 杨奕
parent ada80e6862
commit f18bbeb473
8 changed files with 74 additions and 21 deletions

View File

@ -2007,7 +2007,8 @@ You can customize row index in `type=index` columns.
| setCurrentRow | used in single selection Table, set a certain row selected. If called without any parameter, it will clear selection. | row |
| clearSort | clear sorting, restore data to the original order | — |
| clearFilter | clear filter | — |
| doLayout | Refresh the layout of Table. When the visibility of Table changes, you may need to call this method to get a correct layout | — |
| doLayout | refresh the layout of Table. When the visibility of Table changes, you may need to call this method to get a correct layout | — |
| sort | sort Table manually. Property `prop` is used to set sort column, property `order` is used to set sort order | prop: string, order: string |
### Table Slot
| Name | Description |

View File

@ -2010,6 +2010,8 @@ Puede personalizar el índice de la fila con la propiedad `type=index` de las co
| setCurrentRow | utilizado en tabla con selección sencilla, establece una cierta fila seleccionada. Si es llamado sin ningún parámetro, este puede limpiar la selección | row |
| clearSort | limpiar ordenamiento, restaurar datos a orden original | — |
| clearFilter | limpiar filtros | — |
| doLayout | refresh the layout of Table. When the visibility of Table changes, you may need to call this method to get a correct layout | — |
| sort | sort Table manually. Property `prop` is used to set sort column, property `order` is used to set sort order | prop: string, order: string |
### Slots de la tabla
| Nombre | Descripción |

View File

@ -2068,6 +2068,7 @@
| clearSort | 用于清空排序条件,数据会恢复成未排序的状态 | — |
| clearFilter | 用于清空过滤条件,数据会恢复成未过滤的状态 | — |
| doLayout | 对 Table 进行重新布局。当 Table 或其祖先元素由隐藏切换为显示时,可能需要调用此方法 | — |
| sort | 手动对 Table 进行排序。参数`prop`属性指定排序列,`order`指定排序顺序。 | prop: string, order: string |
### Table Slot
| name | 说明 |

View File

@ -208,25 +208,8 @@ export default {
},
mounted() {
if (this.defaultSort.prop) {
const states = this.store.states;
states.sortProp = this.defaultSort.prop;
states.sortOrder = this.defaultSort.order || 'ascending';
this.$nextTick(_ => {
for (let i = 0, length = this.columns.length; i < length; i++) {
let column = this.columns[i];
if (column.property === states.sortProp) {
column.order = states.sortOrder;
states.sortingColumn = column;
break;
}
}
if (states.sortingColumn) {
this.store.commit('changeSortCondition');
}
});
}
const { prop, order } = this.defaultSort;
this.store.commit('sort', { prop, order });
},
beforeDestroy() {

View File

@ -203,6 +203,28 @@ TableStore.prototype.mutations = {
Vue.nextTick(() => this.table.updateScrollY());
},
sort(states, options) {
const { prop, order } = options;
if (prop) {
states.sortProp = prop;
states.sortOrder = order || 'ascending';
Vue.nextTick(() => {
for (let i = 0, length = states.columns.length; i < length; i++) {
let column = states.columns[i];
if (column.property === states.sortProp) {
column.order = states.sortOrder;
states.sortingColumn = column;
break;
}
}
if (states.sortingColumn) {
this.commit('changeSortCondition');
}
});
}
},
filterChange(states, options) {
let { column, values, silent } = options;
if (values && !Array.isArray(values)) {

View File

@ -443,6 +443,10 @@
if (this.shouldUpdateHeight) {
this.layout.updateElsHeight();
}
},
sort(prop, order) {
this.store.commit('sort', { prop, order });
}
},

View File

@ -1709,6 +1709,43 @@ describe('Table', () => {
destroyVM(vm);
});
it('sort', done => {
const vm = createVue({
template: `
<el-table ref="table" :data="testData" :default-sort = "{prop: 'runtime', order: 'ascending'}">
<el-table-column prop="name" />
<el-table-column prop="release" />
<el-table-column prop="director" />
<el-table-column prop="runtime"/>
</el-table>
`,
created() {
this.testData = getTestData();
},
data() {
return { testData: this.testData };
}
});
setTimeout(() => {
const lastCells = vm.$el.querySelectorAll('.el-table__body-wrapper tbody tr td:last-child');
expect(toArray(lastCells).map(node => node.textContent))
.to.eql(['80', '92', '92', '95', '100']);
vm.$nextTick(() => {
vm.testData = vm.testData.map(data => Object.assign(data, { runtime: -data.runtime }));
vm.$refs.table.sort('runtime', 'ascending');
vm.$nextTick(() => {
expect(toArray(lastCells).map(node => node.textContent))
.to.eql(['-100', '-95', '-92', '-92', '-80']);
done();
});
});
}, DELAY);
});
});
it('hover', done => {

3
types/table.d.ts vendored
View File

@ -116,4 +116,7 @@ export declare class ElTable extends ElementUIComponent {
/** Relayout the table, maybe needed when change the table or it's ancestors visibility */
doLayout (): void
/** Sort Table manually */
sort (prop: string, order: string): void
}