diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 99f29ab..34d316b 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -1,155 +1,171 @@ -import { NgModule, Type } from '@angular/core'; -import { BrowserModule, Title } from '@angular/platform-browser'; +import {NgModule, Type} from '@angular/core'; +import {BrowserModule, Title} from '@angular/platform-browser'; -import { CovalentCoreModule, CovalentLoadingModule } from '@covalent/core'; -import { CovalentHttpModule, IHttpInterceptor } from '@covalent/http'; -import { CovalentHighlightModule } from '@covalent/highlight'; -import { CovalentMarkdownModule } from '@covalent/markdown'; -import { CovalentChartsModule } from '@covalent/charts'; +import {CovalentCoreModule, CovalentLoadingModule} from '@covalent/core'; +import {CovalentHttpModule, IHttpInterceptor} from '@covalent/http'; +import {CovalentHighlightModule} from '@covalent/highlight'; +import {CovalentMarkdownModule} from '@covalent/markdown'; +import {CovalentChartsModule} from '@covalent/charts'; -import { AppComponent } from './app.component'; -import { MainComponent } from './main/main.component'; -import { LoginComponent } from './login/login.component'; -import { DataComponent } from './data/data.component'; -import { TemplatesComponent } from './templates/templates.component'; -import { appRoutes, appRoutingProviders } from './app.routes'; -import { AgGridModule } from 'ag-grid-ng2/main'; -import { ChartComponent } from '../components/chart/chart.component'; +import {AppComponent} from './app.component'; +import {MainComponent} from './main/main.component'; +import {LoginComponent} from './login/login.component'; +import {DataComponent} from './data/data.component'; +import {TemplatesComponent} from './templates/templates.component'; +import {appRoutes, appRoutingProviders} from './app.routes'; +import {AgGridModule} from 'ag-grid-ng2/main'; +import {ChartComponent} from '../components/chart/chart.component'; -import { RequestInterceptor } from '../config/interceptors/request.interceptor'; +import {RequestInterceptor} from '../config/interceptors/request.interceptor'; -import { NgxChartsModule } from '@swimlane/ngx-charts'; +import {NgxChartsModule} from '@swimlane/ngx-charts'; -import { BusStopComponent } from './data/bus-stop/bus-stop.component'; -import { ServiceObjectComponent } from './data/service-object/service-object.component'; -import { RoadSurfaceComponent } from './data/road-surface/road-surface.component'; -import { RoadWidthComponent } from './data/road-width/road-width.component'; -import { RoadToCategoryComponent } from './data/road-to-category/road-to-category.component'; -import { CrossSectionComponent } from './data/cross-section/cross-section.component'; -import { EditorComponent } from '../helpers/editor.component'; -import { RendererComponent } from '../helpers/renderer.component'; -import { MapEditorComponent } from '../helpers/map-editor.component'; -import { MapRendererComponent } from '../helpers/map-renderer.component'; -import { FlowIntensityComponent } from './data/flow-intensity/flow-intensity.component'; -import { RoadComponent } from './data/road/road.component'; -import { RoadServiceComponent } from './data/road-service/road-service.component'; -import { SettlementAddressLinkComponent } from './data/settlement-address-link/settlement-address-link.component'; -import { MapComponent } from './data/map/map.component'; -import { MapItemsComponent } from './data/map-items/map-items.component'; -import { RoadMapComponent } from '../components/road-map.component'; +import {BusStopComponent} from './data/bus-stop/bus-stop.component'; +import {ServiceObjectComponent} from './data/service-object/service-object.component'; +import {RoadSurfaceComponent} from './data/road-surface/road-surface.component'; +import {RoadWidthComponent} from './data/road-width/road-width.component'; +import {RoadToCategoryComponent} from './data/road-to-category/road-to-category.component'; +import {CrossSectionComponent} from './data/cross-section/cross-section.component'; +import {EditorComponent} from '../helpers/editor.component'; +import {RendererComponent} from '../helpers/renderer.component'; +import {MapEditorComponent} from '../helpers/map-editor.component'; +import {MapRendererComponent} from '../helpers/map-renderer.component'; +import {FlowIntensityComponent} from './data/flow-intensity/flow-intensity.component'; +import {RoadComponent} from './data/road/road.component'; +import {RoadServiceComponent} from './data/road-service/road-service.component'; +import {SettlementAddressLinkComponent} from './data/settlement-address-link/settlement-address-link.component'; +import {AuthorityComponent} from './data/authority/authority.component'; +import {MapComponent} from './data/map/map.component'; +import {MapItemsComponent} from './data/map-items/map-items.component'; +import {RoadMapComponent} from '../components/road-map.component'; // Services -import { BusStopCreateService } from '../services/bus-stop-create.service'; -import { BusStopService } from '../services/bus-stop.service'; -import { ServiceObjectCreateService } from '../services/service-object-create.service'; -import { ServiceObjectService } from '../services/service-object.service'; -import { RoadSurfaceService } from '../services/road-surface.service'; -import { RoadSurfaceCreateService } from '../services/road-surface-create.service'; -import { RoadWidthService } from '../services/road-width.service'; -import { RoadWidthCreateService } from '../services/road-width-create.service'; -import { RoadToCategoryService } from '../services/road-to-category.service'; -import { RoadToCategoryCreateService } from '../services/road-to-category-create.service'; -import { CrossSectionService } from '../services/cross-section.service'; -import { CrossSectionCreateService } from '../services/cross-section-create.service'; -import { BooleanSelectListService } from '../services/boolean-select-list.service'; -import { FlowIntensityCreateService } from '../services/flow-intensity-create.service'; -import { FlowIntensityService } from '../services/flow-intensity.service'; -import { RoadCreateService } from '../services/road-create.service'; -import { RoadService } from '../services/road.service'; -import { RoadServiceService } from '../services/road-service.service'; -import { RoadServiceCreateService } from '../services/road-service-create.service'; -import { SettlementAddressLinkService } from '../services/settlement-address-link.service'; -import { SettlementAddressLinkCreateService } from '../services/settlement-address-link-create.service'; +import {BusStopCreateService} from '../services/bus-stop-create.service'; +import {BusStopService} from '../services/bus-stop.service'; +import {ServiceObjectCreateService} from '../services/service-object-create.service'; +import {ServiceObjectService} from '../services/service-object.service'; +import {RoadSurfaceService} from '../services/road-surface.service'; +import {RoadSurfaceCreateService} from '../services/road-surface-create.service'; +import {RoadWidthService} from '../services/road-width.service'; +import {RoadWidthCreateService} from '../services/road-width-create.service'; +import {RoadToCategoryService} from '../services/road-to-category.service'; +import {RoadToCategoryCreateService} from '../services/road-to-category-create.service'; +import {CrossSectionService} from '../services/cross-section.service'; +import {CrossSectionCreateService} from '../services/cross-section-create.service'; +import {BooleanSelectListService} from '../services/boolean-select-list.service'; +import {FlowIntensityCreateService} from '../services/flow-intensity-create.service'; +import {FlowIntensityService} from '../services/flow-intensity.service'; +import {RoadCreateService} from '../services/road-create.service'; +import {RoadService} from '../services/road.service'; +import {RoadServiceService} from '../services/road-service.service'; +import {RoadServiceCreateService} from '../services/road-service-create.service'; +import {SettlementAddressLinkService} from '../services/settlement-address-link.service'; +import {SettlementAddressLinkCreateService} from '../services/settlement-address-link-create.service'; +import {AuthorityService} from '../services/authority.service'; +import {AuthorityCreateService} from '../services/authority-create.service'; +import {ContractorService} from "../services/contractor.service"; +import {ContractorCreateService} from "../services/contractor-create.service"; +import {ContractorComponent} from "./data/contractor/contractor.component"; +import {CovalentExpansionPanelModule} from "@covalent/core/expansion-panel/expansion-panel.module"; const httpInterceptorProviders: Type[] = [ - RequestInterceptor, + RequestInterceptor, ]; @NgModule({ - declarations: [ - AppComponent, - MainComponent, - DataComponent, - LoginComponent, - ChartComponent, - TemplatesComponent, - BusStopComponent, - ServiceObjectComponent, - RoadSurfaceComponent, - EditorComponent, - RendererComponent, - MapEditorComponent, - MapRendererComponent, - MapItemsComponent, - RoadWidthComponent, - RoadToCategoryComponent, - FlowIntensityComponent, - RoadComponent, - CrossSectionComponent, - RoadServiceComponent, - SettlementAddressLinkComponent, - MapComponent, - RoadMapComponent - ], // directives, components, and pipes owned by this NgModule - imports: [ - BrowserModule, - AgGridModule.withComponents([ - BusStopComponent, - ServiceObjectComponent, - EditorComponent, - RendererComponent, - MapEditorComponent, - MapRendererComponent, - RoadSurfaceComponent, - RoadWidthComponent, - RoadToCategoryComponent, - FlowIntensityComponent, - RoadComponent, - CrossSectionComponent, - RoadServiceComponent, - SettlementAddressLinkComponent, - ]), - CovalentCoreModule.forRoot(), - CovalentChartsModule.forRoot(), - CovalentHttpModule.forRoot({ - interceptors: [{ - interceptor: RequestInterceptor, paths: ['**'], - }], - }), - CovalentHighlightModule.forRoot(), - CovalentMarkdownModule.forRoot(), - CovalentLoadingModule.forRoot(), - appRoutes, - NgxChartsModule, - ], // modules needed to run this module - providers: [ - appRoutingProviders, - httpInterceptorProviders, - Title, - BooleanSelectListService, - BusStopCreateService, - BusStopService, - ServiceObjectCreateService, - ServiceObjectService, - RoadSurfaceCreateService, - RoadSurfaceService, - RoadWidthCreateService, - RoadWidthService, - RoadToCategoryCreateService, - RoadToCategoryService, - FlowIntensityCreateService, - FlowIntensityService, - RoadCreateService, - RoadService, - CrossSectionCreateService, - CrossSectionService, - RoadServiceService, - RoadServiceCreateService, - SettlementAddressLinkService, - SettlementAddressLinkCreateService - ], // additional providers needed for this module - entryComponents: [ ], - bootstrap: [ AppComponent ], + declarations: [ + AppComponent, + MainComponent, + DataComponent, + LoginComponent, + ChartComponent, + TemplatesComponent, + BusStopComponent, + ServiceObjectComponent, + RoadSurfaceComponent, + EditorComponent, + RendererComponent, + MapEditorComponent, + MapRendererComponent, + MapItemsComponent, + RoadWidthComponent, + RoadToCategoryComponent, + FlowIntensityComponent, + RoadComponent, + CrossSectionComponent, + RoadServiceComponent, + SettlementAddressLinkComponent, + AuthorityComponent, + ContractorComponent, + MapComponent, + RoadMapComponent + ], // directives, components, and pipes owned by this NgModule + imports: [ + BrowserModule, + AgGridModule.withComponents([ + BusStopComponent, + ServiceObjectComponent, + EditorComponent, + RendererComponent, + MapEditorComponent, + MapRendererComponent, + RoadSurfaceComponent, + RoadWidthComponent, + RoadToCategoryComponent, + FlowIntensityComponent, + RoadComponent, + CrossSectionComponent, + RoadServiceComponent, + SettlementAddressLinkComponent, + AuthorityComponent, + ContractorComponent + ]), + CovalentCoreModule.forRoot(), + CovalentChartsModule.forRoot(), + CovalentHttpModule.forRoot({ + interceptors: [{ + interceptor: RequestInterceptor, paths: ['**'], + }], + }), + CovalentHighlightModule.forRoot(), + CovalentMarkdownModule.forRoot(), + CovalentLoadingModule.forRoot(), + appRoutes, + NgxChartsModule, + ], // modules needed to run this module + providers: [ + appRoutingProviders, + httpInterceptorProviders, + Title, + BooleanSelectListService, + BusStopCreateService, + BusStopService, + ServiceObjectCreateService, + ServiceObjectService, + RoadSurfaceCreateService, + RoadSurfaceService, + RoadWidthCreateService, + RoadWidthService, + RoadToCategoryCreateService, + RoadToCategoryService, + FlowIntensityCreateService, + FlowIntensityService, + RoadCreateService, + RoadService, + CrossSectionCreateService, + CrossSectionService, + RoadServiceService, + RoadServiceCreateService, + SettlementAddressLinkService, + SettlementAddressLinkCreateService, + AuthorityService, + AuthorityCreateService, + ContractorService, + ContractorCreateService + ], // additional providers needed for this module + entryComponents: [], + bootstrap: [AppComponent], }) -export class AppModule {} +export class AppModule { +} diff --git a/src/app/app.routes.ts b/src/app/app.routes.ts index 345801c..f7db3c8 100644 --- a/src/app/app.routes.ts +++ b/src/app/app.routes.ts @@ -15,6 +15,8 @@ import { RoadComponent } from './data/road/road.component'; import { RoadServiceComponent } from './data/road-service/road-service.component'; import { SettlementAddressLinkComponent } from './data/settlement-address-link/settlement-address-link.component'; import { MapComponent } from './data/map/map.component'; +import {AuthorityComponent} from "./data/authority/authority.component"; +import {ContractorComponent} from "./data/contractor/contractor.component"; const routes: Routes = [ {path: 'login', component: LoginComponent}, @@ -31,6 +33,8 @@ const routes: Routes = [ {path: 'road-service', component: RoadServiceComponent}, {path: 'road-to-category', component: RoadToCategoryComponent}, {path: 'settlement-address-link', component: SettlementAddressLinkComponent}, + {path: 'authority', component: AuthorityComponent}, + {path: 'contractor', component: ContractorComponent}, {path: 'map', component: MapComponent}, ]}, ]}, diff --git a/src/app/data/authority/authority.component.html b/src/app/data/authority/authority.component.html new file mode 100644 index 0000000..9dea45e --- /dev/null +++ b/src/app/data/authority/authority.component.html @@ -0,0 +1,12 @@ +
+ + +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/data/authority/authority.component.ts b/src/app/data/authority/authority.component.ts new file mode 100644 index 0000000..285ae23 --- /dev/null +++ b/src/app/data/authority/authority.component.ts @@ -0,0 +1,119 @@ +import {Component, ViewEncapsulation, AfterViewInit, ViewChild} from '@angular/core'; +import {TdLoadingService} from '@covalent/core'; + +import {StatementBase} from '../../../models/statement.base'; + +import {AuthorityService} from '../../../services/authority.service'; +import {EditorComponent} from '../../../helpers/editor.component'; +import {RendererComponent} from '../../../helpers/renderer.component'; +import {AuthorityCreateService} from '../../../services/authority-create.service'; +import {RoadSelectList} from '../../../models/road-select-list'; +import {CrossSectionSelectList} from "../../../models/cross-section-select-list"; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'authority-grid', + templateUrl: 'authority.component.html', + styleUrls: ['authority.scss'], + encapsulation: ViewEncapsulation.None, +}) +export class AuthorityComponent extends StatementBase { + public roads: RoadSelectList[]; + public crosssections: CrossSectionSelectList[]; + + constructor(protected service: AuthorityService, + protected dataService: AuthorityCreateService, + protected loadingService: TdLoadingService,) { + super(); + } + + protected createColumnDefs(): any[] { + return [ + { + headerName: '#', + width: 30, + checkboxSelection: true, + suppressSorting: true, + suppressMenu: true, + pinned: true, + }, + { + headerName: 'ID', + field: 'id', + }, + { + headerName: 'Назва дороги', + field: 'roadId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.roads, + valueCol: 'roadId', + labelCol: 'name', + }, + }, + { + headerName: 'Номер з\'їзду транспортної розв\'язки', + field: 'crossSectionId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.crosssections, + valueCol: 'id', + labelCol: 'name', + }, + }, + { + headerName: 'Назва органу управління (балансоутримувача)', + field: 'authorityName', + editable: true, + }, + { + headerName: 'Номер ділянки дороги', + field: 'roadSectionNumber', + editable: true, + }, + { + headerName: 'Початок (псевдогеодані)', + field: 'begin', + editable: true, + }, + { + headerName: 'Кінець (псевдогеодані)', + field: 'end', + editable: true, + }, + { + headerName: 'Довжина (у метрах)', + field: 'length', + editable: false, + }, + { + headerName: 'Координати вісі правого проїзду', + field: 'rightCoords', + editable: true, + }, + { + headerName: 'Схема початку/межі збірного об’єкту', + field: 'beginScheme', + editable: true, + }, + { + headerName: 'Схема кінця/межі збірного об’єкту', + field: 'endScheme', + editable: true, + }, + ]; + } + + protected initFunction(): void { + this.dataService.getModels().then((models: any) => { + this.roads = models.roadSelectListDsM as RoadSelectList[]; + this.crosssections = models.crossSectionSelectListDsM as CrossSectionSelectList[]; + }).then(() => { + this.bootstrapGrid(); + }); + } +} diff --git a/src/app/data/authority/authority.scss b/src/app/data/authority/authority.scss new file mode 100644 index 0000000..de4dc3d --- /dev/null +++ b/src/app/data/authority/authority.scss @@ -0,0 +1,4 @@ +.toolbar button { + margin: 2px; + padding: 0; +} \ No newline at end of file diff --git a/src/app/data/contractor/contractor.component.html b/src/app/data/contractor/contractor.component.html new file mode 100644 index 0000000..9dea45e --- /dev/null +++ b/src/app/data/contractor/contractor.component.html @@ -0,0 +1,12 @@ +
+ + +
+
+ + +
+
\ No newline at end of file diff --git a/src/app/data/contractor/contractor.component.ts b/src/app/data/contractor/contractor.component.ts new file mode 100644 index 0000000..6516a6a --- /dev/null +++ b/src/app/data/contractor/contractor.component.ts @@ -0,0 +1,119 @@ +import {Component, ViewEncapsulation, AfterViewInit, ViewChild} from '@angular/core'; +import {TdLoadingService} from '@covalent/core'; + +import {StatementBase} from '../../../models/statement.base'; + +import {ContractorService} from '../../../services/contractor.service'; +import {EditorComponent} from '../../../helpers/editor.component'; +import {RendererComponent} from '../../../helpers/renderer.component'; +import {ContractorCreateService} from '../../../services/contractor-create.service'; +import {RoadSelectList} from '../../../models/road-select-list'; +import {CrossSectionSelectList} from "../../../models/cross-section-select-list"; + +@Component({ + // tslint:disable-next-line:component-selector + selector: 'contractor-grid', + templateUrl: 'contractor.component.html', + styleUrls: ['contractor.scss'], + encapsulation: ViewEncapsulation.None, +}) +export class ContractorComponent extends StatementBase { + public roads: RoadSelectList[]; + public crosssections: CrossSectionSelectList[]; + + constructor(protected service: ContractorService, + protected dataService: ContractorCreateService, + protected loadingService: TdLoadingService,) { + super(); + } + + protected createColumnDefs(): any[] { + return [ + { + headerName: '#', + width: 30, + checkboxSelection: true, + suppressSorting: true, + suppressMenu: true, + pinned: true, + }, + { + headerName: 'ID', + field: 'id', + }, + { + headerName: 'Назва дороги', + field: 'roadId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.roads, + valueCol: 'roadId', + labelCol: 'name', + }, + }, + { + headerName: 'Номер з\'їзду транспортної розв\'язки', + field: 'crossSectionId', + editable: true, + cellEditorFramework: EditorComponent, + cellRendererFramework: RendererComponent, + cellEditorParams: { + data: this.crosssections, + valueCol: 'id', + labelCol: 'name', + }, + }, + { + headerName: 'Назва органу управління (балансоутримувача)', + field: 'contractorName', + editable: true, + }, + { + headerName: 'Номер ділянки дороги', + field: 'roadSectionNumber', + editable: true, + }, + { + headerName: 'Початок (псевдогеодані)', + field: 'begin', + editable: true, + }, + { + headerName: 'Кінець (псевдогеодані)', + field: 'end', + editable: true, + }, + { + headerName: 'Довжина (у метрах)', + field: 'length', + editable: false, + }, + { + headerName: 'Координати вісі правого проїзду', + field: 'rightCoords', + editable: true, + }, + { + headerName: 'Схема початку/межі збірного об’єкту', + field: 'beginScheme', + editable: true, + }, + { + headerName: 'Схема кінця/межі збірного об’єкту', + field: 'endScheme', + editable: true, + }, + ]; + } + + protected initFunction(): void { + this.dataService.getModels().then((models: any) => { + this.roads = models.roadSelectListDsM as RoadSelectList[]; + this.crosssections = models.crossSectionSelectListDsM as CrossSectionSelectList[]; + }).then(() => { + this.bootstrapGrid(); + }); + } +} diff --git a/src/app/data/contractor/contractor.scss b/src/app/data/contractor/contractor.scss new file mode 100644 index 0000000..de4dc3d --- /dev/null +++ b/src/app/data/contractor/contractor.scss @@ -0,0 +1,4 @@ +.toolbar button { + margin: 2px; + padding: 0; +} \ No newline at end of file diff --git a/src/app/data/road/road.component.ts b/src/app/data/road/road.component.ts index 2499d6e..1b58fa4 100644 --- a/src/app/data/road/road.component.ts +++ b/src/app/data/road/road.component.ts @@ -38,11 +38,14 @@ export class RoadComponent extends StatementBase { public showOnMap(): void { let selectedRows: any[] = this.gridOptions.api.getSelectedRows(); if (selectedRows.length) { - let id = selectedRows[0].id; - this.service.getRelation(id).then(x => { - this.mapComponent.setWays(x); - return x; + this.mapComponent.clearWays(); + selectedRows.forEach((row) => { + this.service.getRelation(row.id).then(x => { + this.mapComponent.setWays(x); + return x; + }); }); + this.gridOptions.api.deselectAll(); } } diff --git a/src/components/road-map.component.html b/src/components/road-map.component.html new file mode 100644 index 0000000..0f7657e --- /dev/null +++ b/src/components/road-map.component.html @@ -0,0 +1,21 @@ +
+ blur_circular + info +
+
+
+ close +
+
+
+ + +
+
+
+
+
+
\ No newline at end of file diff --git a/src/components/road-map.component.ts b/src/components/road-map.component.ts index dab513c..4b720c6 100644 --- a/src/components/road-map.component.ts +++ b/src/components/road-map.component.ts @@ -1,23 +1,44 @@ -import { Component, Input, AfterViewInit } from '@angular/core'; +import {Component, Input, AfterViewInit, ViewChild} from '@angular/core'; import * as L from 'leaflet'; import { Way } from '../models/way'; +import {WayPolyline} from "../models/way-polyline"; +import {NodeMarker} from "../models/node-marker"; +import {Node} from "../models/node"; +import {RoadService} from "../services/road.service"; +import {TdExpansionPanelComponent} from "@covalent/core/expansion-panel/expansion-panel.component"; @Component({ // tslint:disable-next-line:component-selector selector: 'road-map', - template: '
', + templateUrl: 'road-map.component.html', }) export class RoadMapComponent implements AfterViewInit { protected isVisible: boolean = false; + protected isNodesVisible: boolean = false; + protected isLegend: boolean = false; + protected isExpanded: boolean = false; protected map: L.Map; - protected ways: Way[]; + protected ways: Way[] = []; + protected legend: string; + protected legendSummary: string; @Input() identificator: string = 'mapID'; + constructor( + protected service: RoadService + ) {} + public ngAfterViewInit(): void { this.map = L.map(this.identificator).setView([51.505, -0.09], 13); L.tileLayer('https://a.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 18, }).addTo(this.map); + let controls: L.Control = new L.Control({ + position: 'topright' + }); + controls.onAdd = function (map: L.Map): HTMLElement { + return L.DomUtil.create('md-icon', 'material-icons mat-icon'); + }; + controls.addTo(this.map); } public showMap(): void { this.isVisible = true; @@ -26,16 +47,15 @@ export class RoadMapComponent implements AfterViewInit { return this.isVisible ? '100%' : '100%'; } public setWays(ways: Way[]): void { - this.ways = ways; - this.showWays(); + this.ways = this.ways.concat(ways); + this.showWays(ways); } - protected showWays(): void { + protected showWays(ways: Way[]): void { let minLat: number = 0; let maxLat: number = 0; let minLon: number = 0; let maxLon: number = 0; - console.log(this.ways); - this.ways.forEach((way) => { + ways.forEach((way) => { let nodes: L.LatLng[] = []; way.nodes.forEach((node) => { if (minLat == 0) { @@ -53,16 +73,102 @@ export class RoadMapComponent implements AfterViewInit { maxLon = (maxLon < node.lon)?node.lon:maxLon; } let latLng = node.getLatLng(); + node.marker = new NodeMarker(latLng); + node.marker.node = node; nodes.push(latLng); }); - way.polyline = L.polyline(nodes, {color: 'red'}).addTo(this.map); - console.log(way.polyline); + way.polyline = new WayPolyline(nodes, {color: 'red'}); + way.polyline.way = way; + way.polyline.addTo(this.map).on('click', (event) => { + console.log(event); + this.service.getRoadByWay(event.target.way.id).then(road => { + this.setWaySummary(way); + this.showLegend(road, 'Дорога'); + }); + }); }); this.map.fitBounds([ [minLat, minLon], [maxLat, maxLon] ]); - console.log(minLat, maxLat, minLon, maxLon); this.showMap(); } + protected showNodes(): void { + this.ways.forEach(way => { + way.nodes.forEach(node => { + node.marker.addTo(this.map).on('click', (event) => { + this.service.getRoadByNode(event.target.node.id).then(road => { + this.setNodeSummary(node); + this.showLegend(road, 'Дорога'); + }); + console.log(event); + }); + }); + }); + } + protected hideNodes(): void { + this.ways.forEach(way => { + way.nodes.forEach(node => { + node.marker.remove(); + }); + }); + } + protected toggleNodes(): void { + if (this.isNodesVisible) { + this.hideNodes(); + this.isNodesVisible = false; + } else { + this.showNodes(); + this.isNodesVisible = true + } + } + protected toggleLegend(): void { + this.isLegend = !this.isLegend; + } + protected showLegend(model: Object, name: string): void { + let result: string = ''; + result += '

Информация об объекте ' + name; + if (model.hasOwnProperty('id')) { + result += ' (id: ' + model['id'] + ')'; + } + result += '

'; + this.isLegend = true; + this.legend = result; + } + protected setNodeSummary(node: Node): void { + let result: string = '

Вы нажали на точку с ID = ' + node.id + '.

'; + result += '

Координаты точки: lat = ' + node.lat + ', lon = ' + node.lon + '.

'; + this.legendSummary = result; + } + protected setWaySummary(way: Way): void { + let result: string = '

Вы нажали на линию с ID = ' + way.id + '.

'; + result += '

Количество точек на линии: ' + way.nodes.length + '.

'; + this.legendSummary = result; + } + protected setLegend(legend: string) { + this.legend = legend; + this.isLegend = true; + } + public clearWays(): void { + this.ways.forEach(way => { + way.nodes.forEach(node => { + node.marker.remove(); + }); + way.polyline.remove(); + }); + this.ways = []; + this.legend = undefined; + this.isLegend = false; + this.isNodesVisible = false; + } + protected collapsedEvent() { + this.isExpanded = false; + } + protected expandedEvent() { + this.isExpanded = true; + } } diff --git a/src/models/authority.ts b/src/models/authority.ts new file mode 100644 index 0000000..c6cb9f8 --- /dev/null +++ b/src/models/authority.ts @@ -0,0 +1,14 @@ +export class Authority { + id: number; + roadId: number; + crossSectionId: number; + authorityName: string; + info: string; + roadSectionNumber: number; + begin: number; + end: number; + length: number; + rightCoords: string; + beginScheme: string; + endScheme: string; +} diff --git a/src/models/contractor.ts b/src/models/contractor.ts new file mode 100644 index 0000000..fe499f4 --- /dev/null +++ b/src/models/contractor.ts @@ -0,0 +1,14 @@ +export class Contractor { + id: number; + roadId: number; + crossSectionId: number; + contractorName: string; + info: string; + roadSectionNumber: number; + begin: number; + end: number; + length: number; + rightCoords: string; + beginScheme: string; + endScheme: string; +} diff --git a/src/models/cross-section-select-list.ts b/src/models/cross-section-select-list.ts new file mode 100644 index 0000000..9b83b1c --- /dev/null +++ b/src/models/cross-section-select-list.ts @@ -0,0 +1,4 @@ +export class CrossSectionSelectList { + id: number; + name: number; +} diff --git a/src/models/node-marker.ts b/src/models/node-marker.ts new file mode 100644 index 0000000..e162ec8 --- /dev/null +++ b/src/models/node-marker.ts @@ -0,0 +1,6 @@ +import * as L from 'leaflet'; +import {Node} from "./node"; + +export class NodeMarker extends L.CircleMarker { + node: Node; +} \ No newline at end of file diff --git a/src/models/node.ts b/src/models/node.ts index 0730538..b8f95ad 100644 --- a/src/models/node.ts +++ b/src/models/node.ts @@ -1,4 +1,5 @@ import * as L from 'leaflet'; +import {NodeMarker} from "./node-marker"; export class Node { id: number; @@ -6,6 +7,7 @@ export class Node { lat: number; lon: number; latLng: L.LatLng; + marker: NodeMarker; protected createLatLng(): void { this.latLng = L.latLng(this.lat, this.lon); } diff --git a/src/models/road.ts b/src/models/road.ts index c01562a..d5be406 100644 --- a/src/models/road.ts +++ b/src/models/road.ts @@ -11,4 +11,5 @@ export class Road { authorityAct: string; roadTypeId: number; index: number; + roadType: string; } diff --git a/src/models/way-polyline.ts b/src/models/way-polyline.ts new file mode 100644 index 0000000..c31798f --- /dev/null +++ b/src/models/way-polyline.ts @@ -0,0 +1,6 @@ +import * as L from 'leaflet'; +import {Way} from "./way"; + +export class WayPolyline extends L.Polyline { + way: Way; +} \ No newline at end of file diff --git a/src/models/way.ts b/src/models/way.ts index 6ec6450..23a6d05 100644 --- a/src/models/way.ts +++ b/src/models/way.ts @@ -1,8 +1,9 @@ import { Node } from './node'; import * as L from 'leaflet'; +import {WayPolyline} from "./way-polyline"; export class Way { id: number; nodes: Node[]; - polyline: L.Polyline; + polyline: WayPolyline; } \ No newline at end of file diff --git a/src/services/authority-create.service.ts b/src/services/authority-create.service.ts new file mode 100644 index 0000000..75f9774 --- /dev/null +++ b/src/services/authority-create.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; + +import { CreateBaseService } from './create.base.service'; + +@Injectable() +export class AuthorityCreateService extends CreateBaseService { + protected apiUrl: string = 'http://localhost:5000/authority/directory'; + constructor(protected http: Http) { + super(http); + } +} diff --git a/src/services/authority.service.ts b/src/services/authority.service.ts new file mode 100644 index 0000000..50edba1 --- /dev/null +++ b/src/services/authority.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; + +import { StatementBaseService } from './statement.base.service'; + +import { Authority } from '../models/authority'; + +@Injectable() +export class AuthorityService extends StatementBaseService { + protected url: string = 'http://localhost:5000/authority'; + constructor(protected http: Http) { + super(http); + } + public createModel(): Object { + return new Authority(); + } + protected parseModels(json: any): any[] { + return json.authorityEditDsM as Authority[]; + }; + protected parseModel(json: any): any { + return json as Authority; + }; +} diff --git a/src/services/contractor-create.service.ts b/src/services/contractor-create.service.ts new file mode 100644 index 0000000..ab31981 --- /dev/null +++ b/src/services/contractor-create.service.ts @@ -0,0 +1,12 @@ +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; + +import { CreateBaseService } from './create.base.service'; + +@Injectable() +export class ContractorCreateService extends CreateBaseService { + protected apiUrl: string = 'http://localhost:5000/contractor/directory'; + constructor(protected http: Http) { + super(http); + } +} diff --git a/src/services/contractor.service.ts b/src/services/contractor.service.ts new file mode 100644 index 0000000..0ca01fa --- /dev/null +++ b/src/services/contractor.service.ts @@ -0,0 +1,23 @@ +import { Injectable } from '@angular/core'; +import { Http } from '@angular/http'; + +import { StatementBaseService } from './statement.base.service'; + +import { Contractor } from '../models/contractor'; + +@Injectable() +export class ContractorService extends StatementBaseService { + protected url: string = 'http://localhost:5000/contractor'; + constructor(protected http: Http) { + super(http); + } + public createModel(): Object { + return new Contractor(); + } + protected parseModels(json: any): any[] { + return json.contractorEditDsM as Contractor[]; + }; + protected parseModel(json: any): any { + return json as Contractor; + }; +} diff --git a/src/services/road.service.ts b/src/services/road.service.ts index e6270c6..78e3f6b 100644 --- a/src/services/road.service.ts +++ b/src/services/road.service.ts @@ -1,51 +1,71 @@ -import { Injectable } from '@angular/core'; -import { Http } from '@angular/http'; +import {Injectable} from '@angular/core'; +import {Http} from '@angular/http'; -import { StatementBaseService } from './statement.base.service'; +import {StatementBaseService} from './statement.base.service'; -import { Road } from '../models/road'; +import {Road} from '../models/road'; import {Way} from "../models/way"; import {Node} from "../models/node"; import {id} from "@swimlane/ngx-charts/release/utils/id"; @Injectable() export class RoadService extends StatementBaseService { - protected url: string = 'http://localhost:5000/road'; - constructor(protected http: Http) { - super(http); - } - public createModel(): Object { - return new Road(); - } - public getRelation(id: number): Promise { - return this.http.get(this.url + '/relation?id=' + id, { headers: this.headers }) - .toPromise() - .then(x => this.decodeWays(x.json())) - .catch(this.handleError); - } - protected parseModels(json: any): any[] { - return json.roadEditDsM as Road[]; - }; - protected parseModel(json: any): any { - return json as Road; - }; - protected decodeWays(json: Object[]): Way[] { - let result: Way[] = []; - json.forEach((way: Way) => { - let nodes: Node[] = []; - way.nodes.forEach((node: Node) => { - let nodeObj: Node = new Node(); - nodeObj.id = node.id; - nodeObj.index = node.index; - nodeObj.lat = node.lat; - nodeObj.lon = node.lon; - nodes.push(nodeObj); - }); - let wayObj: Way = new Way(); - wayObj.id = way.id; - wayObj.nodes = nodes; - result.push(wayObj); - }); - return result; - } + protected url: string = 'http://localhost:5000/road'; + + constructor(protected http: Http) { + super(http); + } + + public createModel(): Object { + return new Road(); + } + + public getRelation(id: number): Promise { + return this.http.get(this.url + '/relation?id=' + id, {headers: this.headers}) + .toPromise() + .then(x => this.decodeWays(x.json())) + .catch(this.handleError); + } + + public getRoadByWay(id: number): Promise { + return this.http.get(this.url + '/roadbyway?id=' + id, {headers: this.headers}) + .toPromise() + .then(x => this.parseModel(x.json())) + .catch(this.handleError); + }; + + public getRoadByNode(id: number): Promise { + return this.http.get(this.url + '/roadbynode?id=' + id, {headers: this.headers}) + .toPromise() + .then(x => this.parseModel(x.json())) + .catch(this.handleError); + }; + + protected parseModels(json: any): any[] { + return json.roadEditDsM as Road[]; + }; + + protected parseModel(json: any): any { + return json as Road; + }; + + protected decodeWays(json: Object[]): Way[] { + let result: Way[] = []; + json.forEach((way: Way) => { + let nodes: Node[] = []; + way.nodes.forEach((node: Node) => { + let nodeObj: Node = new Node(); + nodeObj.id = node.id; + nodeObj.index = node.index; + nodeObj.lat = node.lat; + nodeObj.lon = node.lon; + nodes.push(nodeObj); + }); + let wayObj: Way = new Way(); + wayObj.id = way.id; + wayObj.nodes = nodes; + result.push(wayObj); + }); + return result; + } } diff --git a/src/styles.scss b/src/styles.scss index 7161341..92ebd1c 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1,47 +1,93 @@ // Custom style for loading elements without height .will-load { - min-height: 80px; + min-height: 80px; } // Href line height wasn't right for md-icon-button a[md-icon-button] { - line-height: 36px; + line-height: 36px; } // Capitalize .text-capital { - text-transform: capitalize; + text-transform: capitalize; } .grid_containert { - height: 100%; + height: 100%; } .control_button { - position: fixed; - bottom: 40px; - right: 40px; - td-loading { - width: 56px; - height: 56px; - float: left; - margin-right: 20px; - .td-loading-wrapper { - margin-top: -10px; - } + position: fixed; + bottom: 40px; + right: 40px; + td-loading { + width: 56px; + height: 56px; + float: left; + margin-right: 20px; + .td-loading-wrapper { + margin-top: -10px; } + } } .map-container { - height: 400px; - width: 400px; + height: 400px; + width: 400px; } #mapId { - height: 400px; - width: 400px; + height: 400px; + width: 400px; } -road-map>div { - transition: height 1s ease-out; +road-map > div { + transition: height 1s ease-out; +} + +.map-controls { + z-index: 1500; + position: absolute; + right: 10px; + top: 10px; + padding: 10px; + background: rgba(255,255,255,0.7); + border-radius: 5px; + md-icon { + cursor: pointer; + margin: 0 5px; + } +} +.map-legend { + z-index: 700; + position: absolute; + left: 60px; + top: 10px; + max-width: 300px; + padding: 10px; + background: rgba(255,255,255,0.7); + border-radius: 5px; + max-height: calc(100% - 50px); + overflow-y: auto; + td-expansion-panel { + text-align: center; + .expansion-header { + width: 100%; + } + } + .legend-summary { + .expansion-header { + text-align: center; + font-size: 15px; + margin: 5px 0; + } + } + .legend-header { + width: 100%; + md-icon { + float: right; + cursor: pointer; + } + } } \ No newline at end of file -- libgit2 0.21.4