Commit 9aa4a0cc72965c5a2f9a9475f57980b63f147d6d
Merge branch 'master' of gitlab.artweb.com.ua:root/maps-admin
Showing
3 changed files
with
86 additions
and
57 deletions
Show diff stats
src/app/data/bus-stop/bus-stop.component.html
| @@ -2,11 +2,11 @@ | @@ -2,11 +2,11 @@ | ||
| 2 | <ag-grid-ng2 #agGrid style="width: 100%; height: 100%;" class="ag-blue" [gridOptions]="gridOptions" [columnDefs]="columnDefs" [rowData]="rowData" enableColResize enableSorting enableFilter groupHeaders suppressRowClickSelection toolPanelSuppressGroups | 2 | <ag-grid-ng2 #agGrid style="width: 100%; height: 100%;" class="ag-blue" [gridOptions]="gridOptions" [columnDefs]="columnDefs" [rowData]="rowData" enableColResize enableSorting enableFilter groupHeaders suppressRowClickSelection toolPanelSuppressGroups |
| 3 | toolPanelSuppressValues debug rowHeight="22" rowSelection="multiple" (cellClicked)="onCellClicked($event)" (cellDoubleClicked)="onCellDoubleClicked($event)" (cellContextMenu)="onCellContextMenu($event)" (cellValueChanged)="onCellValueChanged($event)" | 3 | toolPanelSuppressValues debug rowHeight="22" rowSelection="multiple" (cellClicked)="onCellClicked($event)" (cellDoubleClicked)="onCellDoubleClicked($event)" (cellContextMenu)="onCellContextMenu($event)" (cellValueChanged)="onCellValueChanged($event)" |
| 4 | (cellFocused)="onCellFocused($event)" (rowSelected)="onRowSelected($event)" (selectionChanged)="onSelectionChanged()" (beforeFilterChanged)="onBeforeFilterChanged()" (afterFilterChanged)="onAfterFilterChanged()" (filterModified)="onFilterModified()" | 4 | (cellFocused)="onCellFocused($event)" (rowSelected)="onRowSelected($event)" (selectionChanged)="onSelectionChanged()" (beforeFilterChanged)="onBeforeFilterChanged()" (afterFilterChanged)="onAfterFilterChanged()" (filterModified)="onFilterModified()" |
| 5 | - (beforeSortChanged)="onBeforeSortChanged()" (afterSortChanged)="onAfterSortChanged()" (virtualRowRemoved)="onVirtualRowRemoved($event)" (rowClicked)="onRowClicked($event)"> | 5 | + (beforeSortChanged)="onBeforeSortChanged()" (afterSortChanged)="onAfterSortChanged($event)" (virtualRowRemoved)="onVirtualRowRemoved($event)" (rowClicked)="onRowClicked($event)"> |
| 6 | </ag-grid-ng2> | 6 | </ag-grid-ng2> |
| 7 | <div class="control_button"> | 7 | <div class="control_button"> |
| 8 | <div *tdLoading="'loading'; mode:'indeterminate'; type:'circle'; strategy:'replace'; color:'accent'"></div> | 8 | <div *tdLoading="'loading'; mode:'indeterminate'; type:'circle'; strategy:'replace'; color:'accent'"></div> |
| 9 | - <button md-fab color="accent" (click)="addNewRow()" type="button"><md-icon>add</md-icon></button> | ||
| 10 | - <button md-fab color="warn" (click)="deleteRows()" type="button"><md-icon>delete</md-icon></button> | 9 | + <button md-fab color="accent" [disabled]="isNew || isSelected" (click)="addNewRow()" type="button"><md-icon>add</md-icon></button> |
| 10 | + <button md-fab color="warn" [disabled]="!isSelected" (click)="deleteRows()" type="button"><md-icon>delete</md-icon></button> | ||
| 11 | </div> | 11 | </div> |
| 12 | </div> | 12 | </div> |
| 13 | \ No newline at end of file | 13 | \ No newline at end of file |
src/app/data/bus-stop/bus-stop.component.ts
| 1 | -import { Component, ViewEncapsulation } from '@angular/core'; | 1 | +import { Component, ViewEncapsulation, AfterViewInit } from '@angular/core'; |
| 2 | import { TdLoadingService } from '@covalent/core'; | 2 | import { TdLoadingService } from '@covalent/core'; |
| 3 | -import { GridOptions } from 'ag-grid/main'; | 3 | +import { GridOptions, IGetRowsParams, IRowModel } from 'ag-grid/main'; |
| 4 | 4 | ||
| 5 | import { BusStopService } from '../../../services/bus-stop.service'; | 5 | import { BusStopService } from '../../../services/bus-stop.service'; |
| 6 | import { BusStop } from '../../../models/bus-stop'; | 6 | import { BusStop } from '../../../models/bus-stop'; |
| @@ -26,12 +26,11 @@ import { routerTransition } from '../../../animations/router.animation'; | @@ -26,12 +26,11 @@ import { routerTransition } from '../../../animations/router.animation'; | ||
| 26 | styleUrls: ['bus-stop.scss'], | 26 | styleUrls: ['bus-stop.scss'], |
| 27 | encapsulation: ViewEncapsulation.None, | 27 | encapsulation: ViewEncapsulation.None, |
| 28 | }) | 28 | }) |
| 29 | -export class BusStopComponent { | 29 | +export class BusStopComponent implements AfterViewInit { |
| 30 | 30 | ||
| 31 | private columnDefs: any[]; | 31 | private columnDefs: any[]; |
| 32 | private gridOptions: GridOptions; | 32 | private gridOptions: GridOptions; |
| 33 | public showGrid: boolean; | 33 | public showGrid: boolean; |
| 34 | - public rowData: any[]; | ||
| 35 | public rowCount: string; | 34 | public rowCount: string; |
| 36 | public regions: RegionSelectList[]; | 35 | public regions: RegionSelectList[]; |
| 37 | public states: StateCommonSelectList[]; | 36 | public states: StateCommonSelectList[]; |
| @@ -41,7 +40,8 @@ export class BusStopComponent { | @@ -41,7 +40,8 @@ export class BusStopComponent { | ||
| 41 | public boolean: BooleanSelectList[]; | 40 | public boolean: BooleanSelectList[]; |
| 42 | public isLoading: boolean = false; | 41 | public isLoading: boolean = false; |
| 43 | public isBootstrapping: boolean = true; | 42 | public isBootstrapping: boolean = true; |
| 44 | - public isSelected: boolean = true; | 43 | + public isSelected: boolean = false; |
| 44 | + public isNew: boolean = false; | ||
| 45 | 45 | ||
| 46 | constructor( | 46 | constructor( |
| 47 | protected service: BusStopService, | 47 | protected service: BusStopService, |
| @@ -51,6 +51,8 @@ export class BusStopComponent { | @@ -51,6 +51,8 @@ export class BusStopComponent { | ||
| 51 | ) { | 51 | ) { |
| 52 | this.gridOptions = <GridOptions>{}; | 52 | this.gridOptions = <GridOptions>{}; |
| 53 | this.gridOptions.enableSorting = true; | 53 | this.gridOptions.enableSorting = true; |
| 54 | + this.gridOptions.suppressMultiSort = true; | ||
| 55 | + this.gridOptions.enableServerSideSorting = true; | ||
| 54 | this.showGrid = true; | 56 | this.showGrid = true; |
| 55 | this.gridOptions.rowModelType = 'virtual'; | 57 | this.gridOptions.rowModelType = 'virtual'; |
| 56 | this.booleanService.getModels().then((models) => this.boolean = models); | 58 | this.booleanService.getModels().then((models) => this.boolean = models); |
| @@ -64,33 +66,31 @@ export class BusStopComponent { | @@ -64,33 +66,31 @@ export class BusStopComponent { | ||
| 64 | this.createColumnDefs(); | 66 | this.createColumnDefs(); |
| 65 | this.isBootstrapping = false; | 67 | this.isBootstrapping = false; |
| 66 | }); | 68 | }); |
| 67 | - this.service.getData().then((data) => { | ||
| 68 | - if (data.length){ | ||
| 69 | - this.rowData = data; | ||
| 70 | - } else { | ||
| 71 | - this.rowData = [new BusStop()]; | ||
| 72 | - } | ||
| 73 | - }).then(() => { | ||
| 74 | - this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); | ||
| 75 | - this.gridOptions.api.refreshVirtualPageCache(); | ||
| 76 | - }); | ||
| 77 | } | 69 | } |
| 78 | - setRowData(allOfTheData) { | 70 | + |
| 71 | + ngAfterViewInit() { | ||
| 72 | + this.gridOptions.api.setDatasource(this.setRowData()); | ||
| 73 | + } | ||
| 74 | + | ||
| 75 | + setRowData(): any { | ||
| 79 | // tslint:disable-next-line:typedef | 76 | // tslint:disable-next-line:typedef |
| 80 | let dataSource = { | 77 | let dataSource = { |
| 81 | rowCount: null, // behave as infinite scroll | 78 | rowCount: null, // behave as infinite scroll |
| 82 | - getRows: function (params) { | ||
| 83 | - // At this point in your code, you would call the server, using $http if in AngularJS. | ||
| 84 | - // To make the demo look real, wait for 500ms before returning | ||
| 85 | - // take a slice of the total rows | ||
| 86 | - let rowsThisPage = allOfTheData.slice(params.startRow, params.endRow); | ||
| 87 | - // if on or after the last page, work out the last row. | ||
| 88 | - let lastRow = -1; | ||
| 89 | - if (allOfTheData.length <= params.endRow) { | ||
| 90 | - lastRow = allOfTheData.length; | 79 | + getRows: (params: IGetRowsParams) => { |
| 80 | + let sort = null; | ||
| 81 | + if (params.sortModel.length) { | ||
| 82 | + sort = this.parseSort(params.sortModel[0]); | ||
| 91 | } | 83 | } |
| 92 | - // call the success callback | ||
| 93 | - params.successCallback(rowsThisPage, lastRow); | 84 | + this.service.getData(params.startRow, params.endRow, sort).then((data) => { |
| 85 | + if (!data.length) { | ||
| 86 | + data = [new BusStop()]; | ||
| 87 | + } | ||
| 88 | + let lastRow = -1; | ||
| 89 | + if (data.length <= params.endRow) { | ||
| 90 | + lastRow = data.length; | ||
| 91 | + } | ||
| 92 | + params.successCallback(data, lastRow); | ||
| 93 | + }); | ||
| 94 | }, | 94 | }, |
| 95 | }; | 95 | }; |
| 96 | return dataSource; | 96 | return dataSource; |
| @@ -114,12 +114,31 @@ export class BusStopComponent { | @@ -114,12 +114,31 @@ export class BusStopComponent { | ||
| 114 | event.confirm.reject(); | 114 | event.confirm.reject(); |
| 115 | } | 115 | } |
| 116 | } | 116 | } |
| 117 | - public addNewRow() { | ||
| 118 | - this.rowData.unshift(new BusStop()); | ||
| 119 | - this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); | ||
| 120 | - this.gridOptions.api.refreshVirtualPageCache(); | 117 | + public addNewRow(): void { |
| 118 | + if (this.getFirstRowID()) { | ||
| 119 | + this.gridOptions.api.insertItemsAtIndex(0, [new BusStop()]); | ||
| 120 | + this.isNew = true; | ||
| 121 | + } | ||
| 122 | + } | ||
| 123 | + private parseSort(sort: any): string { | ||
| 124 | + if (sort.colId && sort.sort) { | ||
| 125 | + let result = sort.colId; | ||
| 126 | + if (sort.sort === 'desc') { | ||
| 127 | + result = '-' + result; | ||
| 128 | + } | ||
| 129 | + return result; | ||
| 130 | + } | ||
| 131 | + return null; | ||
| 132 | + } | ||
| 133 | + private getFirstRowID(): number { | ||
| 134 | + let model = this.gridOptions.api.getModel().getRow(0); | ||
| 135 | + let id: number = model.data.busStopId; | ||
| 136 | + if (id) { | ||
| 137 | + return id; | ||
| 138 | + } else { | ||
| 139 | + return null; | ||
| 140 | + } | ||
| 121 | } | 141 | } |
| 122 | - | ||
| 123 | private createColumnDefs() { | 142 | private createColumnDefs() { |
| 124 | this.columnDefs = [ | 143 | this.columnDefs = [ |
| 125 | { | 144 | { |
| @@ -273,10 +292,10 @@ export class BusStopComponent { | @@ -273,10 +292,10 @@ export class BusStopComponent { | ||
| 273 | } | 292 | } |
| 274 | this.enableLoader(); | 293 | this.enableLoader(); |
| 275 | result = this.service.create(data).then((busStop) => { | 294 | result = this.service.create(data).then((busStop) => { |
| 276 | - this.rowData[$event.node.rowIndex] = busStop; | ||
| 277 | - this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); | 295 | + this.gridOptions.api.setDatasource(this.setRowData()); |
| 278 | this.gridOptions.api.refreshVirtualPageCache(); | 296 | this.gridOptions.api.refreshVirtualPageCache(); |
| 279 | this.disableLoader(); | 297 | this.disableLoader(); |
| 298 | + this.isNew = false; | ||
| 280 | }); | 299 | }); |
| 281 | } | 300 | } |
| 282 | } | 301 | } |
| @@ -285,28 +304,24 @@ export class BusStopComponent { | @@ -285,28 +304,24 @@ export class BusStopComponent { | ||
| 285 | private deleteRows() { | 304 | private deleteRows() { |
| 286 | let rows = this.gridOptions.api.getSelectedNodes(); | 305 | let rows = this.gridOptions.api.getSelectedNodes(); |
| 287 | if (!rows.length) { | 306 | if (!rows.length) { |
| 307 | + this.isSelected = false; | ||
| 288 | return ; | 308 | return ; |
| 289 | } | 309 | } |
| 290 | - rows.forEach((element) => { | 310 | + rows.forEach((element, index, array) => { |
| 291 | let id = element.data.busStopId; | 311 | let id = element.data.busStopId; |
| 292 | if (id) { | 312 | if (id) { |
| 293 | this.enableLoader(); | 313 | this.enableLoader(); |
| 294 | - this.service.delete(id).then(() => this.disableLoader()); | 314 | + this.service.delete(id).then(() => { |
| 315 | + if (index === (array.length - 1)) { | ||
| 316 | + this.disableLoader(); | ||
| 317 | + this.gridOptions.api.setDatasource(this.setRowData()); | ||
| 318 | + this.gridOptions.api.refreshVirtualPageCache(); | ||
| 319 | + this.gridOptions.api.deselectAll(); | ||
| 320 | + this.isNew = false; | ||
| 321 | + } | ||
| 322 | + }); | ||
| 295 | } | 323 | } |
| 296 | }); | 324 | }); |
| 297 | - // Sort in order to protect array from reindexing (remove rear elements first) | ||
| 298 | - let sorted = rows.sort((a, b) => { | ||
| 299 | - if (a > b) { | ||
| 300 | - return -1; | ||
| 301 | - } else { | ||
| 302 | - return 1; | ||
| 303 | - } | ||
| 304 | - }); | ||
| 305 | - sorted.forEach((item) => { | ||
| 306 | - this.rowData.splice(item.rowIndex, 1); | ||
| 307 | - }); | ||
| 308 | - this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); | ||
| 309 | - this.gridOptions.api.refreshVirtualPageCache(); | ||
| 310 | } | 325 | } |
| 311 | 326 | ||
| 312 | private onCellDoubleClicked($event) { | 327 | private onCellDoubleClicked($event) { |
| @@ -327,7 +342,16 @@ export class BusStopComponent { | @@ -327,7 +342,16 @@ export class BusStopComponent { | ||
| 327 | } | 342 | } |
| 328 | 343 | ||
| 329 | private onSelectionChanged() { | 344 | private onSelectionChanged() { |
| 330 | - console.log('selectionChanged'); | 345 | + let selection = this.gridOptions.api.getSelectedNodes(); |
| 346 | + if (selection.length) { | ||
| 347 | + if (selection.length === 1) { | ||
| 348 | + this.gridOptions.api.refreshVirtualPageCache(); | ||
| 349 | + this.isNew = false; | ||
| 350 | + } | ||
| 351 | + this.isSelected = true; | ||
| 352 | + } else { | ||
| 353 | + this.isSelected = false; | ||
| 354 | + } | ||
| 331 | } | 355 | } |
| 332 | 356 | ||
| 333 | private onBeforeFilterChanged() { | 357 | private onBeforeFilterChanged() { |
| @@ -342,11 +366,11 @@ export class BusStopComponent { | @@ -342,11 +366,11 @@ export class BusStopComponent { | ||
| 342 | console.log('onFilterModified'); | 366 | console.log('onFilterModified'); |
| 343 | } | 367 | } |
| 344 | 368 | ||
| 345 | - private onBeforeSortChanged() { | 369 | + private onBeforeSortChanged(event) { |
| 346 | console.log('onBeforeSortChanged'); | 370 | console.log('onBeforeSortChanged'); |
| 347 | } | 371 | } |
| 348 | 372 | ||
| 349 | - private onAfterSortChanged() { | 373 | + private onAfterSortChanged($event) { |
| 350 | console.log('onAfterSortChanged'); | 374 | console.log('onAfterSortChanged'); |
| 351 | } | 375 | } |
| 352 | 376 |
src/services/bus-stop.service.ts
| @@ -10,8 +10,13 @@ export class BusStopService { | @@ -10,8 +10,13 @@ export class BusStopService { | ||
| 10 | private url = 'http://localhost:5000/busstop'; | 10 | private url = 'http://localhost:5000/busstop'; |
| 11 | private headers = new Headers({'Content-Type': 'application/json'}); | 11 | private headers = new Headers({'Content-Type': 'application/json'}); |
| 12 | constructor(private http: Http) { } | 12 | constructor(private http: Http) { } |
| 13 | - getData(): Promise<BusStop[]> { | ||
| 14 | - return this.http.get(this.url) | 13 | + getData(from: number = 0, to: number = 100, sort: string = null): Promise<BusStop[]> { |
| 14 | + let url = this.url; | ||
| 15 | + url += '?from=' + from + '&to=' + to; | ||
| 16 | + if (sort) { | ||
| 17 | + url += '&sort=' + sort; | ||
| 18 | + } | ||
| 19 | + return this.http.get(url) | ||
| 15 | .toPromise() | 20 | .toPromise() |
| 16 | .then(response => response.json().busStopEditDsM as BusStop[]) | 21 | .then(response => response.json().busStopEditDsM as BusStop[]) |
| 17 | .catch(this.handleError); | 22 | .catch(this.handleError); |