#429 preserve sorting on navigation and paging

This commit is contained in:
Denys Vuika 2016-09-01 14:26:36 +01:00
parent ba72034b3d
commit 3cc94345d7
3 changed files with 67 additions and 31 deletions

View File

@ -72,7 +72,7 @@ module.exports = function (config) {
],
// Coverage reporter generates the coverage
reporters: ['mocha', 'coverage', 'coveralls', 'kjhtml'],
reporters: ['mocha', 'coverage', 'kjhtml'],
// Source files that you wanna generate coverage for.
// Do not include tests or libraries (these files will be instrumented by Istanbul)

View File

@ -400,6 +400,34 @@ describe('ShareDataTableAdapter', () => {
expect((<ShareDataRow> rows[0]).node).toBe(file2);
expect((<ShareDataRow> rows[1]).node).toBe(file1);
});
it('should preserve sorting on navigation', () => {
let file1 = new FileNode('file1');
let file2 = new FileNode('file2');
let file3 = new FileNode('file3');
let file4 = new FileNode('file4');
let col = <DataColumn> { key: 'name' };
let adapter = new ShareDataTableAdapter(documentListService, null, [col]);
adapter.setSorting(new DataSorting('name', 'asc'));
let page1 = new PageNode([file2, file1]);
let page2 = new PageNode([file4, file3]);
documentListService.getFolderResult = page1;
adapter.loadPath('/page1');
let sorted = adapter.getRows();
expect((<ShareDataRow> sorted[0]).node).toBe(file1);
expect((<ShareDataRow> sorted[1]).node).toBe(file2);
documentListService.getFolderResult = page2;
adapter.loadPath('/page2');
sorted = adapter.getRows();
expect((<ShareDataRow> sorted[0]).node).toBe(file3);
expect((<ShareDataRow> sorted[1]).node).toBe(file4);
});
});
describe('ShareDataRow', () => {

View File

@ -181,32 +181,7 @@ export class ShareDataTableAdapter implements DataTableAdapter, PaginationProvid
setSorting(sorting: DataSorting): void {
this.sorting = sorting;
if (sorting && sorting.key && this.rows && this.rows.length > 0) {
this.rows.sort((a: ShareDataRow, b: ShareDataRow) => {
if (a.node.entry.isFolder !== b.node.entry.isFolder) {
return a.node.entry.isFolder ? -1 : 1;
}
let left = a.getValue(sorting.key);
if (left) {
left = (left instanceof Date) ? left.valueOf().toString() : left.toString();
} else {
left = '';
}
let right = b.getValue(sorting.key);
if (right) {
right = (right instanceof Date) ? right.valueOf().toString() : right.toString();
} else {
right = '';
}
return sorting.direction === 'asc'
? left.localeCompare(right)
: right.localeCompare(left);
});
}
this.sortRows(this.rows, this.sorting);
}
sort(key?: string, direction?: string): void {
@ -243,6 +218,34 @@ export class ShareDataTableAdapter implements DataTableAdapter, PaginationProvid
this.imageResolver = resolver;
}
private sortRows(rows: DataRow[], sorting: DataSorting) {
if (sorting && sorting.key && rows && rows.length > 0) {
rows.sort((a: ShareDataRow, b: ShareDataRow) => {
if (a.node.entry.isFolder !== b.node.entry.isFolder) {
return a.node.entry.isFolder ? -1 : 1;
}
let left = a.getValue(sorting.key);
if (left) {
left = (left instanceof Date) ? left.valueOf().toString() : left.toString();
} else {
left = '';
}
let right = b.getValue(sorting.key);
if (right) {
right = (right instanceof Date) ? right.valueOf().toString() : right.toString();
} else {
right = '';
}
return sorting.direction === 'asc'
? left.localeCompare(right)
: right.localeCompare(left);
});
}
}
private loadPage(page: NodePaging) {
this.page = page;
this.resetPagination();
@ -260,11 +263,16 @@ export class ShareDataTableAdapter implements DataTableAdapter, PaginationProvid
// Sort by first sortable or just first column
if (this.columns && this.columns.length > 0) {
let sortable = this.columns.filter(c => c.sortable);
if (sortable.length > 0) {
this.sort(sortable[0].key, 'asc');
let sorting = this.getSorting();
if (sorting) {
this.sortRows(rows, sorting);
} else {
this.sort(this.columns[0].key, 'asc');
let sortable = this.columns.filter(c => c.sortable);
if (sortable.length > 0) {
this.sort(sortable[0].key, 'asc');
} else {
this.sort(this.columns[0].key, 'asc');
}
}
}
}