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); |