diff --git a/src/app/data/bus-stop/bus-stop.component.html b/src/app/data/bus-stop/bus-stop.component.html index 06c57f9..511e5c1 100644 --- a/src/app/data/bus-stop/bus-stop.component.html +++ b/src/app/data/bus-stop/bus-stop.component.html @@ -1,16 +1,14 @@ - -
-
- - -
-
- ...Loading -
- - +
+
+ ...Loading
- \ No newline at end of file + + +
+ + +
+
\ No newline at end of file diff --git a/src/app/data/bus-stop/bus-stop.component.ts b/src/app/data/bus-stop/bus-stop.component.ts index c29529f..a8bff77 100644 --- a/src/app/data/bus-stop/bus-stop.component.ts +++ b/src/app/data/bus-stop/bus-stop.component.ts @@ -18,7 +18,7 @@ import { SurfaceTypeSelectList } from '../../../models/surface-type-select-list' // only import this if you are using the ag-Grid-Enterprise @Component({ - selector: 'rich-grid', + selector: 'bus-grid', templateUrl: 'bus-stop.component.html', styleUrls: ['bus-stop.scss'], encapsulation: ViewEncapsulation.None diff --git a/src/app/data/bus-stop/bus-stop.scss b/src/app/data/bus-stop/bus-stop.scss index e09afa5..de4dc3d 100644 --- a/src/app/data/bus-stop/bus-stop.scss +++ b/src/app/data/bus-stop/bus-stop.scss @@ -1,10 +1,4 @@ .toolbar button { margin: 2px; padding: 0; -} - -.control_button { - position: fixed; - bottom: 10px; - right: 10px; } \ No newline at end of file diff --git a/src/app/data/service-object/service-object.component.html b/src/app/data/service-object/service-object.component.html new file mode 100644 index 0000000..511e5c1 --- /dev/null +++ b/src/app/data/service-object/service-object.component.html @@ -0,0 +1,14 @@ +
+
+ ...Loading +
+ + +
+ + +
+
\ No newline at end of file diff --git a/src/app/data/service-object/service-object.component.ts b/src/app/data/service-object/service-object.component.ts new file mode 100644 index 0000000..ba58cad --- /dev/null +++ b/src/app/data/service-object/service-object.component.ts @@ -0,0 +1,298 @@ +import {Component, ViewEncapsulation} from "@angular/core"; +import {GridOptions} from "ag-grid/main"; + +import { ServiceObjectService } from '../../../services/service-object.service'; +import { ServiceObject } from '../../../models/service-object'; +import { EditorComponent } from '../../../helpers/editor.component'; +import { RendererComponent } from '../../../helpers/renderer.component'; +import { ServiceObjectCreateService } from '../../../services/service-object-create.service'; +import { BooleanSelectListService } from '../../../services/boolean-select-list.service'; +import { RegionSelectList } from '../../../models/region-select-list'; +import { StateCommonSelectList } from '../../../models/state-common-select-list'; +import { RoadSelectList } from '../../../models/road-select-list'; +import { BooleanSelectList } from '../../../models/boolean-select-list'; +import { SettlementSelectList } from '../../../models/settlement-select-list'; +import { SurfaceTypeSelectList } from '../../../models/surface-type-select-list'; + + +// only import this if you are using the ag-Grid-Enterprise + +@Component({ + selector: 'service-object', + templateUrl: 'service-object.component.html', + styleUrls: ['service-object.scss'], + encapsulation: ViewEncapsulation.None +}) +export class BusStopComponent { + + public showGrid: boolean; + public rowData: any[]; + public rowCount: string; + public regions: RegionSelectList[]; + public states: StateCommonSelectList[]; + public surfaceTypes: SurfaceTypeSelectList[]; + public settlements: SettlementSelectList[]; + public roads: RoadSelectList[]; + public boolean: BooleanSelectList[]; + public isLoading: boolean = false; + public isBootstrapping: boolean = true; + public isSelected: boolean = true; + private columnDefs: any[]; + private gridOptions: GridOptions; + + constructor( + protected service: ServiceObjectService, + private dataService: ServiceObjectCreateService, + private booleanService: BooleanSelectListService + ) { + this.gridOptions = {}; + this.gridOptions.enableSorting = true; + this.showGrid = true; + this.gridOptions.rowModelType = 'virtual'; + this.booleanService.getModels().then((models) => this.boolean = models); + this.dataService.getModels().then(models => { + this.regions = models.regionSelectListDsM as RegionSelectList[]; + this.states = models.stateCommonSelectListDsM as StateCommonSelectList[]; + this.surfaceTypes = models.surfaceTypeSelectListDsM as SurfaceTypeSelectList[]; + this.settlements = models.settlementSelectListDsM as SettlementSelectList[]; + this.roads = models.roadSelectListDsM as RoadSelectList[]; + }).then(() => { + this.createColumnDefs(); + this.isBootstrapping = false; + }); + this.service.getData().then((data) => { + if (data.length){ + this.rowData = data; + } else { + this.rowData = [new ServiceObject]; + } + }).then(() => { + this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); + this.gridOptions.api.refreshVirtualPageCache(); + }); + } + setRowData(allOfTheData) { + let dataSource = { + rowCount: null, // behave as infinite scroll + getRows: function (params) { + console.log('asking for ' + params.startRow + ' to ' + params.endRow); + // At this point in your code, you would call the server, using $http if in AngularJS. + // To make the demo look real, wait for 500ms before returning + // take a slice of the total rows + let rowsThisPage = allOfTheData.slice(params.startRow, params.endRow); + // if on or after the last page, work out the last row. + let lastRow = -1; + if (allOfTheData.length <= params.endRow) { + lastRow = allOfTheData.length; + } + // call the success callback + params.successCallback(rowsThisPage, lastRow); + } + }; + return dataSource; + + } + onDeleteConfirm(event): void { + if (window.confirm('Вы уверены что хотите удалить??')) { + event.confirm.resolve(); + } else { + event.confirm.reject(); + } + } + public addNewRow() { + this.rowData.unshift(new ServiceObject()); + this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); + this.gridOptions.api.refreshVirtualPageCache(); + } + + private createColumnDefs() { + this.columnDefs = [ + { + headerName: '#', + width: 30, + checkboxSelection: true, + suppressSorting: true, + suppressMenu: true, + pinned: true + }, + { + headerName: 'ID', + field: 'busStopId', + }, + { + headerName: 'Назва дороги', + field: 'roadId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.roads, + valueCol: 'roadId', + labelCol: 'name' + } + }, + { + headerName: 'Область', + field: 'regionId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.regions, + valueCol: 'regionId', + labelCol: 'name' + } + }, + { + headerName: 'Місцезнаходження, км+ справа', + field: 'locationRight', + editable: true, + }, + { + headerName: 'Місцезнаходження, км+ зліва', + field: 'locationLeft', + editable: true, + }, + { + headerName: 'Технічний стан', + field: 'stateCommonId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.states, + valueCol: 'stateCommonId', + labelCol: 'value' + } + }, + { + headerName: 'Наявність туалету', + field: 'toiletAvailability', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.boolean, + valueCol: 'value', + labelCol: 'label' + } + } + ]; + } + + private onCellClicked($event) { + console.log('onCellClicked: ' + $event.rowIndex + ' ' + $event.colDef.field); + } + + private onCellValueChanged($event) { + if ($event.oldValue !== $event.newValue) { + let data = JSON.stringify($event.data); + let id = $event.data.busStopId; + let result = null; + if (id) { + this.isLoading = true; + result = this.service.update(id, data).then(() => this.isLoading = false); + } else { + // Protection of posting new row being already sent. + if (this.isLoading) { + return ; + } + this.isLoading = true; + result = this.service.create(data).then((busStop) => { + this.rowData[$event.node.rowIndex] = busStop; + this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); + this.gridOptions.api.refreshVirtualPageCache(); + this.isLoading = false; + }); + } + } + } + + private deleteRows() { + let rows = this.gridOptions.api.getSelectedNodes(); + if (!rows.length) { + return ; + } + rows.forEach(element => { + let id = element.data.busStopId; + if (id) { + this.isLoading = true; + this.service.delete(id).then(() => this.isLoading = false); + } + }); + // Sort in order to protect array from reindexing (remove rear elements first) + let sorted = rows.sort((a, b) => { + if (a > b) { + return -1; + } else { + return 1; + } + }); + sorted.forEach(item => { + this.rowData.splice(item.rowIndex, 1); + }); + this.gridOptions.api.setDatasource(this.setRowData(this.rowData)); + this.gridOptions.api.refreshVirtualPageCache(); + } + + private onCellDoubleClicked($event) { + console.log('onCellDoubleClicked: ' + $event.rowIndex + ' ' + $event.colDef.field); + } + + private onCellContextMenu($event) { + console.log('onCellContextMenu: ' + $event.rowIndex + ' ' + $event.colDef.field); + } + + private onCellFocused($event) { + console.log('onCellFocused: (' + $event.rowIndex + ',' + $event.colIndex + ')'); + } + + private onRowSelected($event) { + // taking out, as when we 'select all', it prints to much to the console!! + // console.log('onRowSelected: ' + $event.node.data.name); + } + + private onSelectionChanged() { + console.log('selectionChanged'); + } + + private onBeforeFilterChanged() { + console.log('beforeFilterChanged'); + } + + private onAfterFilterChanged() { + console.log('afterFilterChanged'); + } + + private onFilterModified() { + console.log('onFilterModified'); + } + + private onBeforeSortChanged() { + console.log('onBeforeSortChanged'); + } + + private onAfterSortChanged() { + console.log('onAfterSortChanged'); + } + + private onVirtualRowRemoved($event) { + // because this event gets fired LOTS of times, we don't print it to the + // console. if you want to see it, just uncomment out this line + // console.log('onVirtualRowRemoved: ' + $event.rowIndex); + } + + private onRowClicked($event) { + console.log('onRowClicked: ' + $event.node.data.name); + } + + public onQuickFilterChanged($event) { + this.gridOptions.api.setQuickFilter($event.target.value); + } + + // here we use one generic event to handle all the column type events. + // the method just prints the event name + private onColumnEvent($event) { + console.log('onColumnEvent: ' + $event); + } +} diff --git a/src/app/data/service-object/service-object.scss b/src/app/data/service-object/service-object.scss new file mode 100644 index 0000000..de4dc3d --- /dev/null +++ b/src/app/data/service-object/service-object.scss @@ -0,0 +1,4 @@ +.toolbar button { + margin: 2px; + padding: 0; +} \ No newline at end of file diff --git a/src/models/department-affiliation-lis.ts b/src/models/department-affiliation-lis.ts new file mode 100644 index 0000000..8a507ff --- /dev/null +++ b/src/models/department-affiliation-lis.ts @@ -0,0 +1,4 @@ +export class DepartmentAffiliationLis { + departmentAffiliationId: number; + name: string; + } diff --git a/src/models/service-object.ts b/src/models/service-object.ts new file mode 100644 index 0000000..f786448 --- /dev/null +++ b/src/models/service-object.ts @@ -0,0 +1,14 @@ +export class ServiceObject{ + serviceObjectID: number; + roadId: number; + regionId: number; + serviceObjectTypeId: number; + settlementId: number; + departmentAffiliationId: number; + locationLeft: string; + locationRight: string; + locationAxis: number; + distance: number; + capacity: number; + arrangementElements: string; +} diff --git a/src/services/region-select-list.service.ts b/src/services/region-select-list.service.ts deleted file mode 100644 index 53125c2..0000000 --- a/src/services/region-select-list.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Headers, Http } from '@angular/http'; - -import 'rxjs/add/operator/toPromise'; - -import { RegionSelectList } from '../models/region-select-list'; - -@Injectable() -export class RegionSelectListService { - private apiUrl = 'http://localhost:5000/directory/regionds'; - private headers = new Headers({'Content-Type': 'applicaton/json'}); - constructor(private http: Http) { } - getModels(): Promise { - return this.http.get(this.apiUrl) - .toPromise() - .then(response => response.json().regionSelectListDsM as RegionSelectList[]) - .catch(this.handleError); - } - private handleError(error: any): Promise { - console.error('An error occured', error); - return Promise.reject(error.message || error); - } -} diff --git a/src/services/road-select-list.service.ts b/src/services/road-select-list.service.ts deleted file mode 100644 index e69de29..0000000 --- a/src/services/road-select-list.service.ts +++ /dev/null diff --git a/src/services/service-object-create.service.ts b/src/services/service-object-create.service.ts new file mode 100644 index 0000000..52f72aa --- /dev/null +++ b/src/services/service-object-create.service.ts @@ -0,0 +1,21 @@ +import { Injectable } from '@angular/core'; +import { Headers, Http } from '@angular/http'; + +import 'rxjs/add/operator/toPromise'; + +@Injectable() +export class ServiceObjectCreateService { + private apiUrl = 'http://localhost:5000/serviceobject/directory'; + private headers = new Headers({'Content-Type': 'applicaton/json'}); + constructor(private http: Http) { } + getModels(): Promise { + return this.http.get(this.apiUrl) + .toPromise() + .then(response => response.json()) + .catch(this.handleError); + } + private handleError(error: any): Promise { + console.error('An error occured', error); + return Promise.reject(error.message || error); + } +} diff --git a/src/services/service-object.service.ts b/src/services/service-object.service.ts new file mode 100644 index 0000000..964257a --- /dev/null +++ b/src/services/service-object.service.ts @@ -0,0 +1,41 @@ +import { Injectable } from '@angular/core'; +import { Headers, Http } from '@angular/http'; + +import 'rxjs/add/operator/toPromise'; + +import { ServiceObject } from '../models/service-object'; + +@Injectable() +export class ServiceObjectService { + private url = 'http://localhost:5000/serviceobject'; + private headers = new Headers({'Content-Type': 'application/json'}); + constructor(private http: Http) { } + getData(): Promise { + return this.http.get(this.url) + .toPromise() + .then(response => response.json().busStopEditDsM as ServiceObject[]) + .catch(this.handleError); + } + update(id: number, data: string): Promise { + return this.http.post(this.url + '/update?id=' + id, data, { headers: this.headers }) + .toPromise() + .then(response => response.json()) + .catch(this.handleError); + } + create(data: string): Promise { + return this.http.post(this.url + '/create', data, { headers: this.headers }) + .toPromise() + .then(response => response.json() as ServiceObject) + .catch(this.handleError); + } + delete(id: number): Promise { + return this.http.delete(this.url + '/delete?id=' + id, { headers: this.headers }) + .toPromise() + .then(response => response.json()) + .catch(this.handleError); + } + private handleError(error: any): Promise { + console.error('An error occured', error); + return Promise.reject(error.message || error); + } +} diff --git a/src/services/settlement-select-list.service.ts b/src/services/settlement-select-list.service.ts deleted file mode 100644 index e69de29..0000000 --- a/src/services/settlement-select-list.service.ts +++ /dev/null diff --git a/src/services/state-common-selectlist.service.ts b/src/services/state-common-selectlist.service.ts deleted file mode 100644 index af33b7c..0000000 --- a/src/services/state-common-selectlist.service.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { Injectable } from '@angular/core'; -import { Headers, Http } from '@angular/http'; - -import 'rxjs/add/operator/toPromise'; - -import { StateCommonSelectList } from '../models/state-common-select-list'; - -@Injectable() -export class StateCommonSelectListService { - private apiUrl = 'http://localhost:5000/directory/statecommonds'; - private headers = new Headers({'Content-Type': 'applicaton/json'}); - constructor(private http: Http) { } - getModels(): Promise { - return this.http.get(this.apiUrl) - .toPromise() - .then(response => response.json().stateCommonSelectListDsM as StateCommonSelectList[]) - .catch(this.handleError); - } - private handleError(error: any): Promise { - console.error('An error occured', error); - return Promise.reject(error.message || error); - } -} diff --git a/src/services/surface-type-select-list.service.ts b/src/services/surface-type-select-list.service.ts deleted file mode 100644 index e69de29..0000000 --- a/src/services/surface-type-select-list.service.ts +++ /dev/null diff --git a/src/styles.scss b/src/styles.scss index 00e5f0c..27d4ff4 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -2,6 +2,7 @@ .will-load { min-height: 80px; } + // Href line height wasn't right for md-icon-button a[md-icon-button] { line-height: 36px; @@ -9,5 +10,15 @@ a[md-icon-button] { // Capitalize .text-capital { - text-transform: capitalize; + text-transform: capitalize; +} + +.grid_containert { + height: 100%; +} + +.control_button { + position: fixed; + bottom: 40px; + right: 40px; } \ No newline at end of file -- libgit2 0.21.4