Commit 74a2441cad6e76dd21d3141882a99342fb083e49

Authored by Administrator
1 parent f4c3aace

Add ServiceObject

src/app/data/bus-stop/bus-stop.component.html
1 -<md-card tdMediaToggle="gt-xs" [mediaClasses]="['push']">  
2 - <div *ngIf="showGrid">  
3 - <div class="control_button">  
4 - <button md-fab color="accent" (click)="addNewRow()" type="button"><md-icon>add</md-icon></button>  
5 - <button md-fab color="warn" (click)="deleteRows()" type="button"><md-icon>delete</md-icon></button>  
6 - </div>  
7 - <div *ngIf="isLoading" class="">  
8 - ...Loading  
9 - </div>  
10 - <ag-grid-ng2 #agGrid style="width: 100%; height: 350px;" class="ag-dark" [gridOptions]="gridOptions" [columnDefs]="columnDefs" [rowData]="rowData" enableColResize enableSorting enableFilter groupHeaders suppressRowClickSelection toolPanelSuppressGroups  
11 - toolPanelSuppressValues debug rowHeight="22" rowSelection="multiple" (cellClicked)="onCellClicked($event)" (cellDoubleClicked)="onCellDoubleClicked($event)" (cellContextMenu)="onCellContextMenu($event)" (cellValueChanged)="onCellValueChanged($event)"  
12 - (cellFocused)="onCellFocused($event)" (rowSelected)="onRowSelected($event)" (selectionChanged)="onSelectionChanged()" (beforeFilterChanged)="onBeforeFilterChanged()" (afterFilterChanged)="onAfterFilterChanged()" (filterModified)="onFilterModified()"  
13 - (beforeSortChanged)="onBeforeSortChanged()" (afterSortChanged)="onAfterSortChanged()" (virtualRowRemoved)="onVirtualRowRemoved($event)" (rowClicked)="onRowClicked($event)">  
14 - </ag-grid-ng2> 1 +<div class="grid_containert" *ngIf="showGrid">
  2 + <div *ngIf="isLoading" class="">
  3 + ...Loading
15 </div> 4 </div>
16 -</md-card>  
17 \ No newline at end of file 5 \ No newline at end of file
  6 + <ag-grid-ng2 #agGrid style="width: 100%; height: 100%;" class="ag-dark" [gridOptions]="gridOptions" [columnDefs]="columnDefs" [rowData]="rowData" enableColResize enableSorting enableFilter groupHeaders suppressRowClickSelection toolPanelSuppressGroups
  7 + toolPanelSuppressValues debug rowHeight="22" rowSelection="multiple" (cellClicked)="onCellClicked($event)" (cellDoubleClicked)="onCellDoubleClicked($event)" (cellContextMenu)="onCellContextMenu($event)" (cellValueChanged)="onCellValueChanged($event)"
  8 + (cellFocused)="onCellFocused($event)" (rowSelected)="onRowSelected($event)" (selectionChanged)="onSelectionChanged()" (beforeFilterChanged)="onBeforeFilterChanged()" (afterFilterChanged)="onAfterFilterChanged()" (filterModified)="onFilterModified()"
  9 + (beforeSortChanged)="onBeforeSortChanged()" (afterSortChanged)="onAfterSortChanged()" (virtualRowRemoved)="onVirtualRowRemoved($event)" (rowClicked)="onRowClicked($event)">
  10 + </ag-grid-ng2>
  11 + <div class="control_button">
  12 + <button md-fab color="accent" (click)="addNewRow()" type="button"><md-icon>add</md-icon></button>
  13 + <button md-fab color="warn" (click)="deleteRows()" type="button"><md-icon>delete</md-icon></button>
  14 + </div>
  15 +</div>
18 \ No newline at end of file 16 \ No newline at end of file
src/app/data/bus-stop/bus-stop.component.ts
@@ -18,7 +18,7 @@ import { SurfaceTypeSelectList } from &#39;../../../models/surface-type-select-list&#39; @@ -18,7 +18,7 @@ import { SurfaceTypeSelectList } from &#39;../../../models/surface-type-select-list&#39;
18 // only import this if you are using the ag-Grid-Enterprise 18 // only import this if you are using the ag-Grid-Enterprise
19 19
20 @Component({ 20 @Component({
21 - selector: 'rich-grid', 21 + selector: 'bus-grid',
22 templateUrl: 'bus-stop.component.html', 22 templateUrl: 'bus-stop.component.html',
23 styleUrls: ['bus-stop.scss'], 23 styleUrls: ['bus-stop.scss'],
24 encapsulation: ViewEncapsulation.None 24 encapsulation: ViewEncapsulation.None
src/app/data/bus-stop/bus-stop.scss
1 .toolbar button { 1 .toolbar button {
2 margin: 2px; 2 margin: 2px;
3 padding: 0; 3 padding: 0;
4 -}  
5 -  
6 -.control_button {  
7 - position: fixed;  
8 - bottom: 10px;  
9 - right: 10px;  
10 } 4 }
11 \ No newline at end of file 5 \ No newline at end of file
src/app/data/service-object/service-object.component.html 0 → 100644
  1 +<div class="grid_containert" *ngIf="showGrid">
  2 + <div *ngIf="isLoading" class="">
  3 + ...Loading
  4 + </div>
  5 + <ag-grid-ng2 #agGrid style="width: 100%; height: 100%;" class="ag-dark" [gridOptions]="gridOptions" [columnDefs]="columnDefs" [rowData]="rowData" enableColResize enableSorting enableFilter groupHeaders suppressRowClickSelection toolPanelSuppressGroups
  6 + toolPanelSuppressValues debug rowHeight="22" rowSelection="multiple" (cellClicked)="onCellClicked($event)" (cellDoubleClicked)="onCellDoubleClicked($event)" (cellContextMenu)="onCellContextMenu($event)" (cellValueChanged)="onCellValueChanged($event)"
  7 + (cellFocused)="onCellFocused($event)" (rowSelected)="onRowSelected($event)" (selectionChanged)="onSelectionChanged()" (beforeFilterChanged)="onBeforeFilterChanged()" (afterFilterChanged)="onAfterFilterChanged()" (filterModified)="onFilterModified()"
  8 + (beforeSortChanged)="onBeforeSortChanged()" (afterSortChanged)="onAfterSortChanged()" (virtualRowRemoved)="onVirtualRowRemoved($event)" (rowClicked)="onRowClicked($event)">
  9 + </ag-grid-ng2>
  10 + <div class="control_button">
  11 + <button md-fab color="accent" (click)="addNewRow()" type="button"><md-icon>add</md-icon></button>
  12 + <button md-fab color="warn" (click)="deleteRows()" type="button"><md-icon>delete</md-icon></button>
  13 + </div>
  14 +</div>
0 \ No newline at end of file 15 \ No newline at end of file
src/app/data/service-object/service-object.component.ts 0 → 100644
  1 +import {Component, ViewEncapsulation} from "@angular/core";
  2 +import {GridOptions} from "ag-grid/main";
  3 +
  4 +import { ServiceObjectService } from '../../../services/service-object.service';
  5 +import { ServiceObject } from '../../../models/service-object';
  6 +import { EditorComponent } from '../../../helpers/editor.component';
  7 +import { RendererComponent } from '../../../helpers/renderer.component';
  8 +import { ServiceObjectCreateService } from '../../../services/service-object-create.service';
  9 +import { BooleanSelectListService } from '../../../services/boolean-select-list.service';
  10 +import { RegionSelectList } from '../../../models/region-select-list';
  11 +import { StateCommonSelectList } from '../../../models/state-common-select-list';
  12 +import { RoadSelectList } from '../../../models/road-select-list';
  13 +import { BooleanSelectList } from '../../../models/boolean-select-list';
  14 +import { SettlementSelectList } from '../../../models/settlement-select-list';
  15 +import { SurfaceTypeSelectList } from '../../../models/surface-type-select-list';
  16 +
  17 +
  18 +// only import this if you are using the ag-Grid-Enterprise
  19 +
  20 +@Component({
  21 + selector: 'service-object',
  22 + templateUrl: 'service-object.component.html',
  23 + styleUrls: ['service-object.scss'],
  24 + encapsulation: ViewEncapsulation.None
  25 +})
  26 +export class BusStopComponent {
  27 +
  28 + public showGrid: boolean;
  29 + public rowData: any[];
  30 + public rowCount: string;
  31 + public regions: RegionSelectList[];
  32 + public states: StateCommonSelectList[];
  33 + public surfaceTypes: SurfaceTypeSelectList[];
  34 + public settlements: SettlementSelectList[];
  35 + public roads: RoadSelectList[];
  36 + public boolean: BooleanSelectList[];
  37 + public isLoading: boolean = false;
  38 + public isBootstrapping: boolean = true;
  39 + public isSelected: boolean = true;
  40 + private columnDefs: any[];
  41 + private gridOptions: GridOptions;
  42 +
  43 + constructor(
  44 + protected service: ServiceObjectService,
  45 + private dataService: ServiceObjectCreateService,
  46 + private booleanService: BooleanSelectListService
  47 + ) {
  48 + this.gridOptions = <GridOptions>{};
  49 + this.gridOptions.enableSorting = true;
  50 + this.showGrid = true;
  51 + this.gridOptions.rowModelType = 'virtual';
  52 + this.booleanService.getModels().then((models) => this.boolean = models);
  53 + this.dataService.getModels().then(models => {
  54 + this.regions = models.regionSelectListDsM as RegionSelectList[];
  55 + this.states = models.stateCommonSelectListDsM as StateCommonSelectList[];
  56 + this.surfaceTypes = models.surfaceTypeSelectListDsM as SurfaceTypeSelectList[];
  57 + this.settlements = models.settlementSelectListDsM as SettlementSelectList[];
  58 + this.roads = models.roadSelectListDsM as RoadSelectList[];
  59 + }).then(() => {
  60 + this.createColumnDefs();
  61 + this.isBootstrapping = false;
  62 + });
  63 + this.service.getData().then((data) => {
  64 + if (data.length){
  65 + this.rowData = data;
  66 + } else {
  67 + this.rowData = [new ServiceObject];
  68 + }
  69 + }).then(() => {
  70 + this.gridOptions.api.setDatasource(this.setRowData(this.rowData));
  71 + this.gridOptions.api.refreshVirtualPageCache();
  72 + });
  73 + }
  74 + setRowData(allOfTheData) {
  75 + let dataSource = {
  76 + rowCount: null, // behave as infinite scroll
  77 + getRows: function (params) {
  78 + console.log('asking for ' + params.startRow + ' to ' + params.endRow);
  79 + // At this point in your code, you would call the server, using $http if in AngularJS.
  80 + // To make the demo look real, wait for 500ms before returning
  81 + // take a slice of the total rows
  82 + let rowsThisPage = allOfTheData.slice(params.startRow, params.endRow);
  83 + // if on or after the last page, work out the last row.
  84 + let lastRow = -1;
  85 + if (allOfTheData.length <= params.endRow) {
  86 + lastRow = allOfTheData.length;
  87 + }
  88 + // call the success callback
  89 + params.successCallback(rowsThisPage, lastRow);
  90 + }
  91 + };
  92 + return dataSource;
  93 +
  94 + }
  95 + onDeleteConfirm(event): void {
  96 + if (window.confirm('Вы уверены что хотите удалить??')) {
  97 + event.confirm.resolve();
  98 + } else {
  99 + event.confirm.reject();
  100 + }
  101 + }
  102 + public addNewRow() {
  103 + this.rowData.unshift(new ServiceObject());
  104 + this.gridOptions.api.setDatasource(this.setRowData(this.rowData));
  105 + this.gridOptions.api.refreshVirtualPageCache();
  106 + }
  107 +
  108 + private createColumnDefs() {
  109 + this.columnDefs = [
  110 + {
  111 + headerName: '#',
  112 + width: 30,
  113 + checkboxSelection: true,
  114 + suppressSorting: true,
  115 + suppressMenu: true,
  116 + pinned: true
  117 + },
  118 + {
  119 + headerName: 'ID',
  120 + field: 'busStopId',
  121 + },
  122 + {
  123 + headerName: 'Назва дороги',
  124 + field: 'roadId',
  125 + editable: true,
  126 + cellEditorFramework: EditorComponent,
  127 + cellRendererFramework: RendererComponent,
  128 + cellEditorParams: {
  129 + data: this.roads,
  130 + valueCol: 'roadId',
  131 + labelCol: 'name'
  132 + }
  133 + },
  134 + {
  135 + headerName: 'Область',
  136 + field: 'regionId',
  137 + editable: true,
  138 + cellEditorFramework: EditorComponent,
  139 + cellRendererFramework: RendererComponent,
  140 + cellEditorParams: {
  141 + data: this.regions,
  142 + valueCol: 'regionId',
  143 + labelCol: 'name'
  144 + }
  145 + },
  146 + {
  147 + headerName: 'Місцезнаходження, км+ справа',
  148 + field: 'locationRight',
  149 + editable: true,
  150 + },
  151 + {
  152 + headerName: 'Місцезнаходження, км+ зліва',
  153 + field: 'locationLeft',
  154 + editable: true,
  155 + },
  156 + {
  157 + headerName: 'Технічний стан',
  158 + field: 'stateCommonId',
  159 + editable: true,
  160 + cellEditorFramework: EditorComponent,
  161 + cellRendererFramework: RendererComponent,
  162 + cellEditorParams: {
  163 + data: this.states,
  164 + valueCol: 'stateCommonId',
  165 + labelCol: 'value'
  166 + }
  167 + },
  168 + {
  169 + headerName: 'Наявність туалету',
  170 + field: 'toiletAvailability',
  171 + editable: true,
  172 + cellEditorFramework: EditorComponent,
  173 + cellRendererFramework: RendererComponent,
  174 + cellEditorParams: {
  175 + data: this.boolean,
  176 + valueCol: 'value',
  177 + labelCol: 'label'
  178 + }
  179 + }
  180 + ];
  181 + }
  182 +
  183 + private onCellClicked($event) {
  184 + console.log('onCellClicked: ' + $event.rowIndex + ' ' + $event.colDef.field);
  185 + }
  186 +
  187 + private onCellValueChanged($event) {
  188 + if ($event.oldValue !== $event.newValue) {
  189 + let data = JSON.stringify($event.data);
  190 + let id = $event.data.busStopId;
  191 + let result = null;
  192 + if (id) {
  193 + this.isLoading = true;
  194 + result = this.service.update(id, data).then(() => this.isLoading = false);
  195 + } else {
  196 + // Protection of posting new row being already sent.
  197 + if (this.isLoading) {
  198 + return ;
  199 + }
  200 + this.isLoading = true;
  201 + result = this.service.create(data).then((busStop) => {
  202 + this.rowData[$event.node.rowIndex] = busStop;
  203 + this.gridOptions.api.setDatasource(this.setRowData(this.rowData));
  204 + this.gridOptions.api.refreshVirtualPageCache();
  205 + this.isLoading = false;
  206 + });
  207 + }
  208 + }
  209 + }
  210 +
  211 + private deleteRows() {
  212 + let rows = this.gridOptions.api.getSelectedNodes();
  213 + if (!rows.length) {
  214 + return ;
  215 + }
  216 + rows.forEach(element => {
  217 + let id = element.data.busStopId;
  218 + if (id) {
  219 + this.isLoading = true;
  220 + this.service.delete(id).then(() => this.isLoading = false);
  221 + }
  222 + });
  223 + // Sort in order to protect array from reindexing (remove rear elements first)
  224 + let sorted = rows.sort((a, b) => {
  225 + if (a > b) {
  226 + return -1;
  227 + } else {
  228 + return 1;
  229 + }
  230 + });
  231 + sorted.forEach(item => {
  232 + this.rowData.splice(item.rowIndex, 1);
  233 + });
  234 + this.gridOptions.api.setDatasource(this.setRowData(this.rowData));
  235 + this.gridOptions.api.refreshVirtualPageCache();
  236 + }
  237 +
  238 + private onCellDoubleClicked($event) {
  239 + console.log('onCellDoubleClicked: ' + $event.rowIndex + ' ' + $event.colDef.field);
  240 + }
  241 +
  242 + private onCellContextMenu($event) {
  243 + console.log('onCellContextMenu: ' + $event.rowIndex + ' ' + $event.colDef.field);
  244 + }
  245 +
  246 + private onCellFocused($event) {
  247 + console.log('onCellFocused: (' + $event.rowIndex + ',' + $event.colIndex + ')');
  248 + }
  249 +
  250 + private onRowSelected($event) {
  251 + // taking out, as when we 'select all', it prints to much to the console!!
  252 + // console.log('onRowSelected: ' + $event.node.data.name);
  253 + }
  254 +
  255 + private onSelectionChanged() {
  256 + console.log('selectionChanged');
  257 + }
  258 +
  259 + private onBeforeFilterChanged() {
  260 + console.log('beforeFilterChanged');
  261 + }
  262 +
  263 + private onAfterFilterChanged() {
  264 + console.log('afterFilterChanged');
  265 + }
  266 +
  267 + private onFilterModified() {
  268 + console.log('onFilterModified');
  269 + }
  270 +
  271 + private onBeforeSortChanged() {
  272 + console.log('onBeforeSortChanged');
  273 + }
  274 +
  275 + private onAfterSortChanged() {
  276 + console.log('onAfterSortChanged');
  277 + }
  278 +
  279 + private onVirtualRowRemoved($event) {
  280 + // because this event gets fired LOTS of times, we don't print it to the
  281 + // console. if you want to see it, just uncomment out this line
  282 + // console.log('onVirtualRowRemoved: ' + $event.rowIndex);
  283 + }
  284 +
  285 + private onRowClicked($event) {
  286 + console.log('onRowClicked: ' + $event.node.data.name);
  287 + }
  288 +
  289 + public onQuickFilterChanged($event) {
  290 + this.gridOptions.api.setQuickFilter($event.target.value);
  291 + }
  292 +
  293 + // here we use one generic event to handle all the column type events.
  294 + // the method just prints the event name
  295 + private onColumnEvent($event) {
  296 + console.log('onColumnEvent: ' + $event);
  297 + }
  298 +}
src/app/data/service-object/service-object.scss 0 → 100644
  1 +.toolbar button {
  2 + margin: 2px;
  3 + padding: 0;
  4 +}
0 \ No newline at end of file 5 \ No newline at end of file
src/models/department-affiliation-lis.ts 0 → 100644
  1 +export class DepartmentAffiliationLis {
  2 + departmentAffiliationId: number;
  3 + name: string;
  4 + }
src/models/service-object.ts 0 → 100644
  1 +export class ServiceObject{
  2 + serviceObjectID: number;
  3 + roadId: number;
  4 + regionId: number;
  5 + serviceObjectTypeId: number;
  6 + settlementId: number;
  7 + departmentAffiliationId: number;
  8 + locationLeft: string;
  9 + locationRight: string;
  10 + locationAxis: number;
  11 + distance: number;
  12 + capacity: number;
  13 + arrangementElements: string;
  14 +}
src/services/road-select-list.service.ts deleted
src/services/region-select-list.service.ts renamed to src/services/service-object-create.service.ts
@@ -3,17 +3,15 @@ import { Headers, Http } from &#39;@angular/http&#39;; @@ -3,17 +3,15 @@ import { Headers, Http } from &#39;@angular/http&#39;;
3 3
4 import 'rxjs/add/operator/toPromise'; 4 import 'rxjs/add/operator/toPromise';
5 5
6 -import { RegionSelectList } from '../models/region-select-list';  
7 -  
8 @Injectable() 6 @Injectable()
9 -export class RegionSelectListService {  
10 - private apiUrl = 'http://localhost:5000/directory/regionds'; 7 +export class ServiceObjectCreateService {
  8 + private apiUrl = 'http://localhost:5000/serviceobject/directory';
11 private headers = new Headers({'Content-Type': 'applicaton/json'}); 9 private headers = new Headers({'Content-Type': 'applicaton/json'});
12 constructor(private http: Http) { } 10 constructor(private http: Http) { }
13 - getModels(): Promise<RegionSelectList[]> { 11 + getModels(): Promise<any> {
14 return this.http.get(this.apiUrl) 12 return this.http.get(this.apiUrl)
15 .toPromise() 13 .toPromise()
16 - .then(response => response.json().regionSelectListDsM as RegionSelectList[]) 14 + .then(response => response.json())
17 .catch(this.handleError); 15 .catch(this.handleError);
18 } 16 }
19 private handleError(error: any): Promise<any> { 17 private handleError(error: any): Promise<any> {
src/services/service-object.service.ts 0 → 100644
  1 +import { Injectable } from '@angular/core';
  2 +import { Headers, Http } from '@angular/http';
  3 +
  4 +import 'rxjs/add/operator/toPromise';
  5 +
  6 +import { ServiceObject } from '../models/service-object';
  7 +
  8 +@Injectable()
  9 +export class ServiceObjectService {
  10 + private url = 'http://localhost:5000/serviceobject';
  11 + private headers = new Headers({'Content-Type': 'application/json'});
  12 + constructor(private http: Http) { }
  13 + getData(): Promise<ServiceObject[]> {
  14 + return this.http.get(this.url)
  15 + .toPromise()
  16 + .then(response => response.json().busStopEditDsM as ServiceObject[])
  17 + .catch(this.handleError);
  18 + }
  19 + update(id: number, data: string): Promise<any> {
  20 + return this.http.post(this.url + '/update?id=' + id, data, { headers: this.headers })
  21 + .toPromise()
  22 + .then(response => response.json())
  23 + .catch(this.handleError);
  24 + }
  25 + create(data: string): Promise<ServiceObject> {
  26 + return this.http.post(this.url + '/create', data, { headers: this.headers })
  27 + .toPromise()
  28 + .then(response => response.json() as ServiceObject)
  29 + .catch(this.handleError);
  30 + }
  31 + delete(id: number): Promise<any> {
  32 + return this.http.delete(this.url + '/delete?id=' + id, { headers: this.headers })
  33 + .toPromise()
  34 + .then(response => response.json())
  35 + .catch(this.handleError);
  36 + }
  37 + private handleError(error: any): Promise<any> {
  38 + console.error('An error occured', error);
  39 + return Promise.reject(error.message || error);
  40 + }
  41 +}
src/services/settlement-select-list.service.ts deleted
src/services/state-common-selectlist.service.ts deleted
1 -import { Injectable } from '@angular/core';  
2 -import { Headers, Http } from '@angular/http';  
3 -  
4 -import 'rxjs/add/operator/toPromise';  
5 -  
6 -import { StateCommonSelectList } from '../models/state-common-select-list';  
7 -  
8 -@Injectable()  
9 -export class StateCommonSelectListService {  
10 - private apiUrl = 'http://localhost:5000/directory/statecommonds';  
11 - private headers = new Headers({'Content-Type': 'applicaton/json'});  
12 - constructor(private http: Http) { }  
13 - getModels(): Promise<StateCommonSelectList[]> {  
14 - return this.http.get(this.apiUrl)  
15 - .toPromise()  
16 - .then(response => response.json().stateCommonSelectListDsM as StateCommonSelectList[])  
17 - .catch(this.handleError);  
18 - }  
19 - private handleError(error: any): Promise<any> {  
20 - console.error('An error occured', error);  
21 - return Promise.reject(error.message || error);  
22 - }  
23 -}  
src/services/surface-type-select-list.service.ts deleted
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 .will-load { 2 .will-load {
3 min-height: 80px; 3 min-height: 80px;
4 } 4 }
  5 +
5 // Href line height wasn't right for md-icon-button 6 // Href line height wasn't right for md-icon-button
6 a[md-icon-button] { 7 a[md-icon-button] {
7 line-height: 36px; 8 line-height: 36px;
@@ -9,5 +10,15 @@ a[md-icon-button] { @@ -9,5 +10,15 @@ a[md-icon-button] {
9 10
10 // Capitalize 11 // Capitalize
11 .text-capital { 12 .text-capital {
12 - text-transform: capitalize; 13 + text-transform: capitalize;
  14 +}
  15 +
  16 +.grid_containert {
  17 + height: 100%;
  18 +}
  19 +
  20 +.control_button {
  21 + position: fixed;
  22 + bottom: 40px;
  23 + right: 40px;
13 } 24 }
14 \ No newline at end of file 25 \ No newline at end of file