Move config.service to _services/ Rationalise bootstrap and conf (WIP) Fix auth: - Add HTTP interceptor - Bootstrap after login/logout Some cleanups
187 lines
No EOL
6.3 KiB
TypeScript
187 lines
No EOL
6.3 KiB
TypeScript
import { Component, OnInit } from '@angular/core'
|
|
|
|
import { FormControl } from '@angular/forms'
|
|
import { MatSnackBar } from '@angular/material/snack-bar'
|
|
|
|
import { ConfigService } from '../../_services/config.service'
|
|
import { MapControlService } from '../map-control.service'
|
|
import { TreeLayerItemComponent } from '../tree-layer-item/tree-layer-item.component'
|
|
import { InfoDataService, TaggedLayer } from '../../info/info-data.service'
|
|
import { MapDataService, BaseStyle } from '../map-data.service'
|
|
import { LayerNode } from '../models'
|
|
import { AuthenticationService } from '../../_services/authentication.service'
|
|
import { CreateBaseMapDialogComponent } from './create-base-map-dialog'
|
|
import { MatDialog } from '@angular/material/dialog'
|
|
import { BaseMapWithStores } from '../../openapi'
|
|
|
|
@Component({
|
|
selector: 'gisaf-map-controls',
|
|
templateUrl: './map-controls.component.html',
|
|
styleUrls: ['./map-controls.component.css'],
|
|
})
|
|
export class MapControlsComponent implements OnInit {
|
|
baseUrl: string = '/gj/'
|
|
simplify: number = 2
|
|
simplify_max: number = 100
|
|
simplify_step: number = 1
|
|
|
|
searchText: string
|
|
tagsFilterText: string
|
|
|
|
baseStyles: BaseStyle[]
|
|
|
|
baseStyleOpacity: number = this.configService.conf.value.bsData?.map.opacity
|
|
|
|
status = new FormControl([])
|
|
|
|
// canCreateBaseMap: boolean = false
|
|
|
|
constructor(
|
|
public snackBar: MatSnackBar,
|
|
public configService: ConfigService,
|
|
public mapControlService: MapControlService,
|
|
protected infoDataService: InfoDataService,
|
|
public mapDataService: MapDataService,
|
|
public authenticationService: AuthenticationService,
|
|
public dialog: MatDialog,
|
|
) {
|
|
}
|
|
|
|
|
|
ngOnInit() {
|
|
this.mapControlService.layerLoaded$.subscribe({
|
|
next: layerNode => {
|
|
let item = layerNode.treeElement
|
|
item.checked = true
|
|
item.indeterminate = false
|
|
item.cdr.markForCheck()
|
|
},
|
|
error: err => {
|
|
/*
|
|
item.checked = false
|
|
item.indeterminate = false
|
|
item.cdr.markForCheck()
|
|
if (err.status == 401) {
|
|
this.openSnackBar('Not authorized')
|
|
}
|
|
else if (err.error) {
|
|
this.openSnackBar(err.error)
|
|
}
|
|
else {
|
|
this.openSnackBar("Unexpected problem: " + err.message)
|
|
}
|
|
*/
|
|
console.error(err)
|
|
}
|
|
})
|
|
|
|
this.mapControlService.baseStyleOpacitySlider$.subscribe(
|
|
value => {
|
|
this.baseStyleOpacity = value
|
|
}
|
|
)
|
|
|
|
this.mapControlService.search$.subscribe(
|
|
forceReload => this.filter(forceReload)
|
|
)
|
|
|
|
/*
|
|
for (let s in this.baseStyles) {
|
|
if ('openmaptiles' in this.baseStyles[s]['sources']) {
|
|
this.baseStyles[s]['sources']['openmaptiles']['url'] = 'https://free.tilehosting.com/data/v3.json?key=' + this.conf['map']['openMapTilesKey']
|
|
}
|
|
else if ('gisafTiles' in this.baseStyles[s]['sources']) {
|
|
this.baseStyles[s]['sources']['gisafTiles']['url'] = this.conf['map']['tilesUrl']
|
|
this.baseStyles[s]['sprite'] = this.conf['map']['spriteUrl']
|
|
}
|
|
}
|
|
*/
|
|
|
|
this.status.valueChanges.subscribe(
|
|
value => {
|
|
this.mapControlService.status.next(value)
|
|
}
|
|
)
|
|
this.status.setValue(this.configService.conf.value.bsData?.map['defaultStatus'])
|
|
|
|
this.mapControlService.baseStyleOpacity.next(this.baseStyleOpacity)
|
|
|
|
// this.canCreateBaseMap = this.authenticationService.isAuthorized(['base_map_creator'])
|
|
}
|
|
|
|
openSnackBar(msg: string):void {
|
|
this.snackBar.open(msg, 'close', {duration: 3000})
|
|
}
|
|
|
|
showLayer(item: TreeLayerItemComponent): void {
|
|
item.indeterminate = true
|
|
this.mapControlService.addLayer(<LayerNode>item.node, this.simplify)
|
|
}
|
|
|
|
hideLayer(item: TreeLayerItemComponent) {
|
|
this.mapControlService.removeLayer(item.node as LayerNode)
|
|
item.indeterminate = false
|
|
item.checked = false
|
|
}
|
|
|
|
toggleInfo(event) {
|
|
this.mapControlService.toggleInfo(event.checked)
|
|
}
|
|
|
|
filter(forceReload: boolean = false) {
|
|
if (this.tagsFilterText && this.mapControlService.hasTags.getValue()) {
|
|
this.infoDataService.getTaggedLayers(
|
|
this.mapControlService.selectedLayers,
|
|
forceReload
|
|
).subscribe(
|
|
(taggedLayers: TaggedLayer[]) => {
|
|
this.mapControlService.filter(this.searchText, taggedLayers, this.tagsFilterText)
|
|
}
|
|
)
|
|
}
|
|
else {
|
|
this.mapControlService.filter(this.searchText)
|
|
}
|
|
}
|
|
|
|
downloadSelectedLayers(format: String='gpkg', reproject: Boolean=false) {
|
|
let selectedLayersStores = this.mapControlService.selectedLayers.map(
|
|
(l: LayerNode) => l.store
|
|
)
|
|
if (selectedLayersStores.length == 0) {
|
|
this.openSnackBar("There's no layer to download, please make a selection")
|
|
}
|
|
else {
|
|
window.open('/download/layers/' + format + '/' + selectedLayersStores.join(',')
|
|
+ '?reproject=' + reproject)
|
|
}
|
|
}
|
|
|
|
createBaseMap() {
|
|
let selectedLayersStores = this.mapControlService.selectedLayers.map(
|
|
(l: LayerNode) => l.store
|
|
)
|
|
|
|
let instruction = selectedLayersStores.length == 0 ?
|
|
"There's no layer selected, give a base map name to delete it." :
|
|
"Give a name of a base map name to create or update it."
|
|
|
|
const dialogRef = this.dialog.open(CreateBaseMapDialogComponent, {
|
|
width: '25em',
|
|
data: {
|
|
instruction: instruction,
|
|
stores: selectedLayersStores
|
|
}
|
|
})
|
|
|
|
dialogRef.afterClosed().subscribe(
|
|
result => result &&
|
|
this.mapDataService.createBaseMap(
|
|
result.baseMapName,
|
|
result.stores
|
|
).subscribe(
|
|
(baseMap: BaseMapWithStores) => this.mapControlService.addBaseMap.next(baseMap)
|
|
)
|
|
)
|
|
}
|
|
} |