Mercurial > hg > ng2-query-ismi
diff app/query-result-table.component.ts @ 25:0795207f3b90
ng2-table now with pager, sorting and styling.
author | casties |
---|---|
date | Tue, 26 Jan 2016 19:19:23 +0100 |
parents | f6f4177d0a81 |
children | 991bf349bb04 |
line wrap: on
line diff
--- a/app/query-result-table.component.ts Tue Jan 26 16:54:38 2016 +0100 +++ b/app/query-result-table.component.ts Tue Jan 26 19:19:23 2016 +0100 @@ -1,6 +1,7 @@ import {Component, OnInit} from 'angular2/core'; import {NG_TABLE_DIRECTIVES} from 'ng2-table/ng2-table'; +import {PAGINATION_DIRECTIVES} from 'ng2-bootstrap/ng2-bootstrap'; import {QueryState} from './query-state'; @@ -9,23 +10,52 @@ template: ` <div *ngIf="queryState && queryState.results"> <pre>{{queryState.resultCypherQuery}}</pre> - <p>Query results ({{queryState.resultInfo}}):</p> - <ngTable - (tableChanged)="onChangeTable(config)" - [rows]="queryState.results" [columns]="queryState.resultColumns"> + <h2>Query result</h2> + <pre *ngIf="config.paging">{{queryState.resultInfo}}: page {{page}} of {{numPages}}</pre> + <pagination *ngIf="config.paging" + class="pagination-sm" + [(ngModel)]="page" + [totalItems]="length" + [itemsPerPage]="itemsPerPage" + [maxSize]="maxSize" + [boundaryLinks]="true" + [rotate]="false" + (pageChanged)="onChangeTable(config, $event)" + (numPages)="numPages = $event"> + </pagination> + <ngTable [config]="config.sorting" + (tableChanged)="onChangeTable(config)" + [rows]="rows" [columns]="columns"> </ngTable> </div> `, - inputs: ['queryState'], - directives: [NG_TABLE_DIRECTIVES] + inputs: ['queryState', 'data', 'columns'], + directives: [NG_TABLE_DIRECTIVES, PAGINATION_DIRECTIVES] }) export class QueryResultTableComponent implements OnInit { public queryState: QueryState; + public data: Array<any>; + public columns: Array<any>; + + public rows: Array<any>; + + public page: number = 1; + public itemsPerPage: number = 10; + public maxSize: number = 5; + public numPages: number = 1; + public length: number = 0; + + public config: any = { + paging: true, + sorting: {'columns': this.columns}, + //filtering: {filterString: '', columnName: 'position'} + }; ngOnChanges() { console.debug("result table changed! queryState=", this.queryState?this.queryState.resultColumns:''); + this.config.sorting = this.queryState.resultColumns; } ngOnInit() { @@ -36,4 +66,61 @@ console.debug("result table init!"); } + changePage(page:any, data:Array<any> = this.data):Array<any> { + let start = (page.page - 1) * page.itemsPerPage; + let end = page.itemsPerPage > -1 ? (start + page.itemsPerPage) : data.length; + return data.slice(start, end); + } + + changeSort(data: any, config: any) { + if (!config.sorting) { + return data; + } + let columns = this.columns.filter(c => c.sort); + + // simple sorting + return data.sort((previous: any, current: any) => { + //let columns = this.config.sorting.columns || []; + for (let i = 0; i < columns.length; i++) { + let sort = columns[i].sort; + if (!sort) continue; + let columnName = columns[i].name; + + if (previous[columnName] > current[columnName]) { + return sort === 'desc' ? -1 : 1; + } else if (previous[columnName] < current[columnName]) { + return sort === 'asc' ? -1 : 1; + } + } + return 0; + }); + } + + changeFilter(data: any, config: any): any { + if (!config.filtering) { + return data; + } + + let filteredData: Array<any> = data.filter((item: any) => + item[config.filtering.columnName].match(this.config.filtering.filterString)); + + return filteredData; + } + + onChangeTable(config, page: any = config.paging) { + //console.debug("onChangeTable config=", config); + if (config.filtering) { + Object.assign(this.config.filtering, config.filtering); + } + if (config.sorting) { + Object.assign(this.config.sorting, config.sorting); + } + + let filteredData = this.changeFilter(this.data, this.config); + let sortedData = this.changeSort(filteredData, this.config); + + this.rows = (page && config.paging) ? this.changePage(page, sortedData) : sortedData; + this.length = sortedData.length; + } + }