Compare commits

..

11 commits

Author SHA1 Message Date
4c4dc3fc5c Display frontend and backend version
All checks were successful
/ build (push) Successful in 29s
2024-12-25 17:09:41 +01:00
5ff197ad49 Fix link in README doc
All checks were successful
/ build (push) Successful in 30s
2024-12-24 03:49:04 +01:00
c890800454 Initial README doc
All checks were successful
/ build (push) Successful in 30s
2024-12-24 03:46:27 +01:00
ea82f02f51 Fix background opacity adjustment
All checks were successful
/ build (push) Successful in 30s
2024-12-24 03:33:22 +01:00
230dddbfd6 Bump @maplibre/ngx-maplibre-gl
All checks were successful
/ build (push) Successful in 30s
2024-12-23 13:40:34 +01:00
5479be90b8 Bump Angular to 18 2024-12-23 13:17:31 +01:00
7c9a057d32 Cleanup and update packages 2024-12-23 13:00:57 +01:00
8edcf1c9f4 Update openapi, fixing display of map basestyle with static_url
All checks were successful
/ build (push) Successful in 30s
2024-12-22 02:45:41 +01:00
f7629e36e0 proxy (for dev): use server default port 5080 2024-12-22 02:44:04 +01:00
1f16faf060 Tweak package.json for easier development 2024-12-22 02:43:07 +01:00
5e8a6ab7db Container: update nginx config
All checks were successful
/ build (push) Successful in 29s
2024-12-17 18:54:43 +01:00
18 changed files with 3863 additions and 4184 deletions

View file

@ -1,3 +1,4 @@
# Build: podman build -t code.philo.ydns.eu/philorg/gisaf-frontend -f Containerfile
FROM docker.io/library/nginx:alpine FROM docker.io/library/nginx:alpine
EXPOSE 80 EXPOSE 80

View file

@ -1,31 +1,7 @@
# GisafApp # Gisaf frontend
This project was generated with [angular-cli](https://github.com/angular/angular-cli) version 1.0.0-beta.24. The web app (front-end, user interface) for Gisaf,
a web based GIS initially developed for CSR Geomatics, Auroville.
## Development server See the [Gisaf server repository](https://code.philo.ydns.eu/philorg/gisaf-backend)
Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. for information about this project.
## Code scaffolding
Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive/pipe/service/class/module`.
## Build
Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `-prod` flag for a production build.
## Running unit tests
Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io).
## Running end-to-end tests
Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/).
Before running the tests make sure you are serving the app via `ng serve`.
## Deploying to Github Pages
Run `ng github-pages:deploy` to deploy to Github Pages.
## Further help
To get more help on the `angular-cli` use `ng help` or go check out the [Angular-CLI README](https://github.com/angular/angular-cli/blob/master/README.md).

View file

@ -25,14 +25,14 @@ http {
server { server {
listen 8899; listen 80 default_server;
listen [::]:80 default_server;
gzip on; gzip on;
gzip_types text/plain application/xml; gzip_types text/plain application/xml;
gzip_proxied no-cache no-store private expired auth; gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000; gzip_min_length 1000;
server_name localhost;
charset utf-8; charset utf-8;
client_max_body_size 4G; client_max_body_size 4G;

View file

@ -12,12 +12,12 @@
"angular-cli": {}, "angular-cli": {},
"scripts": { "scripts": {
"ng": "ng", "ng": "ng",
"start": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng serve --proxy-config proxy.conf.json --watch", "start": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng serve --proxy-config proxy.conf.json --host 0.0.0.0 --watch",
"build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build", "build": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng build",
"test": "ng test", "test": "ng test",
"lint": "ng lint", "lint": "ng lint",
"e2e": "ng e2e", "e2e": "ng e2e",
"openapi-ts": "openapi-ts -i http://127.0.0.1:5000/openapi.json -o src/app/openapi --client angular", "openapi-ts": "openapi-ts -i http://127.0.0.1:5080/openapi.json -o src/app/openapi --client angular",
"source-map-explorer": "source-map-explorer dist/*.js", "source-map-explorer": "source-map-explorer dist/*.js",
"version": "echo \"{\\\"version\\\":\\\"$(git describe --tags --dirty --always)\\\"}\" > src/version.json" "version": "echo \"{\\\"version\\\":\\\"$(git describe --tags --dirty --always)\\\"}\" > src/version.json"
}, },
@ -28,54 +28,53 @@
} }
], ],
"dependencies": { "dependencies": {
"@angular/animations": "^17.3.5", "@angular/animations": "^18.2.13",
"@angular/cdk": "^17.3.5", "@angular/cdk": "^18.2.14",
"@angular/common": "^17.3.5", "@angular/common": "^18.2.13",
"@angular/compiler": "^17.3.5", "@angular/compiler": "^18.2.13",
"@angular/core": "^17.3.5", "@angular/core": "^18.2.13",
"@angular/forms": "^17.3.5", "@angular/forms": "^18.2.13",
"@angular/material": "^17.3.5", "@angular/material": "^18.2.14",
"@angular/platform-browser": "^17.3.5", "@angular/platform-browser": "^18.2.13",
"@angular/platform-browser-dynamic": "^17.3.5", "@angular/platform-browser-dynamic": "^18.2.13",
"@angular/platform-server": "^17.3.5", "@angular/platform-server": "^18.2.13",
"@angular/router": "^17.3.5", "@angular/router": "^18.2.13",
"@mapbox/point-geometry": "^0.1.0", "@mapbox/point-geometry": "^0.1.0",
"@maplibre/ngx-maplibre-gl": "^17.4.3", "@maplibre/ngx-maplibre-gl": "^18.1.4",
"@turf/bbox": "^7.1.0", "@turf/bbox": "^7.1.0",
"@turf/distance": "^7.1.0", "@turf/distance": "^7.1.0",
"@turf/helpers": "^7.1.0", "@turf/helpers": "^7.1.0",
"angular-plotly.js": "^5.2.2", "angular-plotly.js": "^5.2.2",
"maplibre-gl": "^4.1.3", "maplibre-gl": "^4.7.1",
"ngx-flexible-layout": "~17.0.4", "ngx-flexible-layout": "~18.0.2",
"plotly.js-basic-dist-min": "2.31.1", "plotly.js-basic-dist-min": "2.31.1",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"ts-helpers": "^1.1.2", "ts-helpers": "^1.1.2",
"zone.js": "~0.14.4" "zone.js": "~0.14.10"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^17.3.5", "@angular-devkit/build-angular": "^18.2.12",
"@angular/cli": "^17.3.5", "@angular/cli": "^18.2.12",
"@angular/compiler-cli": "^17.3.5", "@angular/compiler-cli": "^18.2.13",
"@angular/language-service": "^17.3.5", "@angular/language-service": "^18.2.13",
"@hey-api/openapi-ts": "^0.45", "@hey-api/openapi-ts": "^0.45.1",
"@types/geojson": "^7946.0.14", "@types/geojson": "^7946.0.15",
"@types/jasmine": "~5.1.4", "@types/jasmine": "~5.1.5",
"@types/jasminewd2": "^2.0.13", "@types/jasminewd2": "^2.0.13",
"@types/node": "^20.12.7", "@types/node": "^20.17.10",
"@types/plotly.js-dist-min": "^2.3.4", "@types/plotly.js-dist-min": "^2.3.4",
"codelyzer": "^6.0.2",
"eslint": "^9.17.0", "eslint": "^9.17.0",
"fontnik": "^0.7.2", "fontnik": "^0.7.2",
"jasmine-core": "~5.1.2", "jasmine-core": "~5.1.2",
"jasmine-spec-reporter": "~7.0.0", "jasmine-spec-reporter": "~7.0.0",
"karma": "~6.4.3", "karma": "~6.4.4",
"karma-chrome-launcher": "~3.2.0", "karma-chrome-launcher": "~3.2.0",
"karma-cli": "^2.0.0", "karma-cli": "^2.0.0",
"karma-coverage-istanbul-reporter": "~3.0.3", "karma-coverage-istanbul-reporter": "~3.0.3",
"karma-jasmine": "~5.1.0", "karma-jasmine": "~5.1.0",
"source-map-explorer": "^2.5.3", "source-map-explorer": "^2.5.3",
"ts-node": "^10.9.2", "ts-node": "^10.9.2",
"tslib": "^2.6.2", "tslib": "^2.8.1",
"typescript": "~5.4.5" "typescript": "~5.4.5"
}, },
"packageManager": "pnpm@9.15", "packageManager": "pnpm@9.15",

4852
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -1,41 +1,41 @@
[ [
{ {
"context": [ "context": [
"/static", "/static",
"/gj", "/gj",
"/openapi.json", "/openapi.json",
"/docs", "/docs",
"/api" "/api"
], ],
"target": "http://127.0.0.1:5000", "target": "http://127.0.0.1:5080",
"secure": false, "secure": false,
"ws": true "ws": true
}, },
{ {
"context": [ "context": [
"/sched", "/sched",
"/_sched" "/_sched"
], ],
"target": "http://127.0.0.1:8000", "target": "http://127.0.0.1:8000",
"secure": false, "secure": false,
"ws": true "ws": true
}, },
{ {
"context": [ "context": [
"/static/tiles" "/static/tiles"
], ],
"target": "/home/phil/gisaf_misc/map/tiles", "target": "/home/phil/gisaf_misc/map/tiles",
"secure": false, "secure": false,
"changeOrigin": true, "changeOrigin": true,
"pathRewrite": { "pathRewrite": {
"^/static/tiles" : "" "^/static/tiles": ""
}
},
{
"context": [
"/terrain"
],
"target": "http://127.0.0.1:8899",
"secure": false
} }
] },
{
"context": [
"/terrain"
],
"target": "http://127.0.0.1:8899",
"secure": false
}
]

View file

@ -2,7 +2,7 @@
<mat-toolbar fxFlex="2em" id='top-toolbar'> <mat-toolbar fxFlex="2em" id='top-toolbar'>
<span <span
style='font-family:GisafSymbols' style='font-family:GisafSymbols'
matTooltip="Gisaf v. {{ (configService.conf | async).bsData?.version }}" matTooltip="Gisaf version: backend {{ version.backend }}, frontend {{ version.frontend }}"
matTooltipPosition="below" matTooltipPosition="below"
class='gisafIcon' class='gisafIcon'
> >
@ -47,4 +47,4 @@
<mat-icon>account_circle</mat-icon> <mat-icon>account_circle</mat-icon>
</a> </a>
</nav> </nav>
</ng-template> </ng-template>

View file

@ -1,5 +1,7 @@
import { Component, OnInit, import {
ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core' Component, OnInit,
ChangeDetectionStrategy, ChangeDetectorRef
} from '@angular/core'
import { Title } from '@angular/platform-browser' import { Title } from '@angular/platform-browser'
import { BootstrapService } from './_services/bootstrap.service' import { BootstrapService } from './_services/bootstrap.service'
import { ConfigService } from './_services/config.service' import { ConfigService } from './_services/config.service'
@ -8,80 +10,87 @@ import { MatDialog, MatDialogRef } from '@angular/material/dialog'
import { AuthenticationService } from './_services/authentication.service' import { AuthenticationService } from './_services/authentication.service'
import { LoginDialogComponent } from './login/login.component' import { LoginDialogComponent } from './login/login.component'
import versionJson from '../version.json'
export class Version {
public backend: string
public frontend: string
}
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: './app.component.html', templateUrl: './app.component.html',
styleUrls: ['./app.component.css'], styleUrls: ['./app.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class AppComponent implements OnInit { export class AppComponent implements OnInit {
title = 'Gisaf' title: string = 'Gisaf'
version: string version: Version = new Version()
routes = [ routes = [
{ {
'target': 'dashboard', 'target': 'dashboard',
'icon': 'home', 'icon': 'home',
'text': 'Home', 'text': 'Home',
}, },
{ {
'target': 'map', 'target': 'map',
'icon': 'map', 'icon': 'map',
'text': 'Map', 'text': 'Map',
}, },
{ {
'target': 'measures', 'target': 'measures',
'icon': 'insert_chart', 'icon': 'insert_chart',
'text': 'Measures', 'text': 'Measures',
}, },
] ]
constructor( constructor(
public configService: ConfigService, public configService: ConfigService,
private titleService: Title, private titleService: Title,
private bootstrapService: BootstrapService, private bootstrapService: BootstrapService,
public authenticationService: AuthenticationService, public authenticationService: AuthenticationService,
private snackBar: MatSnackBar, private snackBar: MatSnackBar,
private cdr: ChangeDetectorRef, private cdr: ChangeDetectorRef,
public dialogRef: MatDialogRef<LoginDialogComponent>, public dialogRef: MatDialogRef<LoginDialogComponent>,
public dialog: MatDialog public dialog: MatDialog
) {} ) { }
ngOnInit() { ngOnInit() {
// Bootstrap: set app wide configuration // Bootstrap: set app wide configuration
this.bootstrapService.get().subscribe({ this.bootstrapService.get().subscribe({
next: res => { next: res => {
this.version = res.version this.version.backend = res.version
this.title = res.title || this.title this.version.frontend = versionJson["version"]
this.titleService.setTitle(res.windowTitle || this.title) this.title = res.title || this.title
this.configService.setConf(res) this.titleService.setTitle(res.windowTitle || this.title)
if (res.redirect && (window != window.top)) { this.configService.setConf(res)
// Refusing to be embedded in an iframe if (res.redirect && (window != window.top)) {
let loc = res.redirect + window.location.pathname // Refusing to be embedded in an iframe
window.document.body.innerHTML = ` let loc = res.redirect + window.location.pathname
window.document.body.innerHTML = `
The web site you are visiting is trying to embed Gisaf (${this.title}) in an iFrame, it isn't a nice thing to do.</br> The web site you are visiting is trying to embed Gisaf (${this.title}) in an iFrame, it isn't a nice thing to do.</br>
Please click this link to go to the real site: <span style='cursor:pointer' onclick="window.open('${loc}')"><b>${loc}</b></span> Please click this link to go to the real site: <span style='cursor:pointer' onclick="window.open('${loc}')"><b>${loc}</b></span>
` `
} }
}, },
error: err => { error: err => {
this.snackBar.open( this.snackBar.open(
'Cannot connect to the server (' + err.statusText + '). Please retry later.', 'Cannot connect to the server (' + err.statusText + '). Please retry later.',
'OK' 'OK'
) )
} }
}) })
} }
openLoginDialog() { openLoginDialog() {
const dialogRef = this.dialog.open(LoginDialogComponent, { const dialogRef = this.dialog.open(LoginDialogComponent, {
height: '24em', height: '24em',
width: '21em' width: '21em'
}) })
// dialogRef.afterClosed().subscribe( // dialogRef.afterClosed().subscribe(
// result => {} // result => {}
// ) // )
} }
} }

View file

@ -2,7 +2,7 @@ import { BrowserModule } from '@angular/platform-browser'
import { BrowserAnimationsModule } from '@angular/platform-browser/animations' import { BrowserAnimationsModule } from '@angular/platform-browser/animations'
import { NgModule, LOCALE_ID } from '@angular/core' import { NgModule, LOCALE_ID } from '@angular/core'
import { FormsModule } from '@angular/forms' import { FormsModule } from '@angular/forms'
import { HttpClientModule } from '@angular/common/http' import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'
import { MatButtonModule } from '@angular/material/button' import { MatButtonModule } from '@angular/material/button'
import { MatIconModule } from '@angular/material/icon' import { MatIconModule } from '@angular/material/icon'
@ -32,34 +32,26 @@ import { HtmlSnackbarComponent } from './custom-snackbar/custom-snackbar.compone
import { AppRoutingModule } from './app-routing.module' import { AppRoutingModule } from './app-routing.module'
@NgModule({ @NgModule({ declarations: [
declarations: [
AppComponent, AppComponent,
PageNotFoundComponent, PageNotFoundComponent,
HtmlSnackbarComponent, HtmlSnackbarComponent,
], ],
imports: [ bootstrap: [
AppComponent
], imports: [
// ApolloModule, // ApolloModule,
BrowserModule, BrowserModule,
BrowserAnimationsModule, BrowserAnimationsModule,
FormsModule, FormsModule,
HttpClientModule,
MatToolbarModule, MatToolbarModule,
MatButtonModule, MatButtonModule,
MatIconModule, MatIconModule,
MatSnackBarModule, MatSnackBarModule,
MatTooltipModule, MatTooltipModule,
FlexLayoutModule, FlexLayoutModule,
AppRoutingModule, AppRoutingModule,
LoginModule, LoginModule], providers: [
],
providers: [
ActionsService, ActionsService,
AuthenticationService, AuthenticationService,
BootstrapService, BootstrapService,
@ -75,9 +67,6 @@ import { AppRoutingModule } from './app-routing.module'
provide: LOCALE_ID, provide: LOCALE_ID,
useValue: "en-IN" useValue: "en-IN"
}, },
], provideHttpClient(withInterceptorsFromDi()),
bootstrap: [ ] })
AppComponent
]
})
export class AppModule {} export class AppModule {}

View file

@ -94,4 +94,4 @@
<gisaf-mgl-control position="bottom-left"> <gisaf-mgl-control position="bottom-left">
<div #featureInfo class='featureInfoInner'></div> <div #featureInfo class='featureInfoInner'></div>
</gisaf-mgl-control> </gisaf-mgl-control>
</mgl-map> </mgl-map>

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,4 @@
import { ElementRef, Input, ViewChild, Directive, HostListener } from '@angular/core' import { ElementRef, Input, ViewChild, Directive, HostListener, OutputRefSubscription } from '@angular/core'
import { Subscription } from 'rxjs'
import { MatButton } from '@angular/material/button' import { MatButton } from '@angular/material/button'
@ -41,13 +39,13 @@ export class GisafRulerDirective {
@Input() secondaryColor: string = 'white' @Input() secondaryColor: string = 'white'
@Input() fontHalo: number = 2 @Input() fontHalo: number = 2
@ViewChild(MatButton) button: MatButton @ViewChild(MatButton) button: MatButton
clickSubscription: Subscription clickSubscription: OutputRefSubscription
lineDrawn: boolean lineDrawn: boolean
constructor( constructor(
public elementRef: ElementRef, public elementRef: ElementRef,
private mapService: MapService private mapService: MapService
) {} ) { }
@HostListener('click') @HostListener('click')
onClick() { onClick() {
@ -103,7 +101,7 @@ export class GisafRulerDirective {
*/ */
labelFormat(n) { labelFormat(n) {
return n == 0 ? '0' : n < 1 ? `${(n * 1000).toFixed(2)} m`: `${n.toFixed(3)} km` return n == 0 ? '0' : n < 1 ? `${(n * 1000).toFixed(2)} m` : `${n.toFixed(3)} km`
} }
onMapClick(evt: MapMouseEvent) { onMapClick(evt: MapMouseEvent) {
@ -149,9 +147,9 @@ export class GisafRulerDirective {
addLayers() { addLayers() {
const map = this.mapService.mapInstance const map = this.mapService.mapInstance
map.addSource(SOURCE_LINE, { map.addSource(SOURCE_LINE, {
type: 'geojson', type: 'geojson',
data: this.getLineStringFeatures() data: this.getLineStringFeatures()
} }
) )
map.addSource(SOURCE_SYMBOL, { map.addSource(SOURCE_SYMBOL, {

View file

@ -8,130 +8,130 @@ import { MapControlService } from './map-control.service'
import { MapService, MapInitData, BaseMapWithStores, BaseStyle as OApiBaseStyle } from '../openapi' import { MapService, MapInitData, BaseMapWithStores, BaseStyle as OApiBaseStyle } from '../openapi'
export class BaseStyle { export class BaseStyle {
constructor( constructor(
public name: string, public name: string,
public style?: StyleSpecification, public style?: StyleSpecification,
) {} ) { }
} }
@Injectable() @Injectable()
export class MapDataService { export class MapDataService {
constructor( constructor(
// private apollo: Apollo, // private apollo: Apollo,
protected mapControlService: MapControlService, protected mapControlService: MapControlService,
public mapService: MapService, public mapService: MapService,
) { ) {
// Get the data on init, as it is (most probably) immutable // Get the data on init, as it is (most probably) immutable
this.getMapInitData().subscribe( this.getMapInitData().subscribe(
data => { data => {
this.mapInitDataLoaded.next(true) this.mapInitDataLoaded.next(true)
this.mapInitDataLoaded.complete() this.mapInitDataLoaded.complete()
} }
) )
} }
public mapInitDataLoaded = new BehaviorSubject<boolean>(false) public mapInitDataLoaded = new BehaviorSubject<boolean>(false)
mapInitDataLoaded$ = this.mapInitDataLoaded.asObservable() mapInitDataLoaded$ = this.mapInitDataLoaded.asObservable()
mapInitData: MapInitData = {} mapInitData: MapInitData = {}
getMapInitData(): Observable<MapInitData> { getMapInitData(): Observable<MapInitData> {
return this.mapService.getInitDataApiMapInitDataGet().pipe(map( return this.mapService.getInitDataApiMapInitDataGet().pipe(map(
data => this.mapInitData = data data => this.mapInitData = data
)) ))
} }
// getBaseMaps(): Observable<BaseMap[]> { // getBaseMaps(): Observable<BaseMap[]> {
// return this.apollo.query({ // return this.apollo.query({
// query: baseMapQuery, // query: baseMapQuery,
// }).pipe(map( // }).pipe(map(
// res => { // res => {
// let bms: object = res['data']['baseMap'] // let bms: object = res['data']['baseMap']
// return bms['map']( // return bms['map'](
// (bm: object) => new BaseMap( // (bm: object) => new BaseMap(
// bm['name'], // bm['name'],
// bm['stores'].map( // bm['stores'].map(
// (store: object) => new Store(store['name']) // (store: object) => new Store(store['name'])
// ) // )
// ) // )
// ) // )
// } // }
// )) // ))
// } // }
public createBaseMap(baseMapName: string, stores: string[]): Observable<BaseMapWithStores> { public createBaseMap(baseMapName: string, stores: string[]): Observable<BaseMapWithStores> {
console.log('TODO: Migrate Graphql createBaseMap') console.log('TODO: Migrate Graphql createBaseMap')
return of({name: '', stores:[]}) return of({ name: '', stores: [] })
// return this.apollo.mutate({ // return this.apollo.mutate({
// mutation: createBaseMapQuery, // mutation: createBaseMapQuery,
// variables: { // variables: {
// baseMapName: baseMapName, // baseMapName: baseMapName,
// stores: stores // stores: stores
// } // }
// }).pipe(map( // }).pipe(map(
// res => { // res => {
// let bm: object = res['data']['createBaseMap']['baseMap'] // let bm: object = res['data']['createBaseMap']['baseMap']
// return new BaseMap( // return new BaseMap(
// bm['name'], // bm['name'],
// bm['stores'].map((store: object) => new Store(store['name'])) // bm['stores'].map((store: object) => new Store(store['name']))
// )
// }
// ))
}
// XXX: unused
// getBaseStyleList(): Observable<BaseStyle[]> {
// return this.apollo.query({query: baseStyleListQuery}).pipe(map(
// data => data['data']['base_style_list'].map(
// (baseStyle: string) => new BaseStyle(baseStyle['name'])
// ) // )
// )) // }
// } // ))
}
getBaseStyle(styleName: string): Observable<BaseStyle> { // XXX: unused
return this.mapService.getBaseStyleApiMapBaseStyleNameGet({name: styleName}).pipe(map( // getBaseStyleList(): Observable<BaseStyle[]> {
data => new BaseStyle(data.name, <any>data.style) // return this.apollo.query({query: baseStyleListQuery}).pipe(map(
)) // data => data['data']['base_style_list'].map(
} // (baseStyle: string) => new BaseStyle(baseStyle['name'])
// )
// ))
// }
// getStores(): Observable<LayerNode[]> { getBaseStyle(styleName: string): Observable<BaseStyle> {
// return this.apollo.query({ return this.mapService.getBaseStyleApiMapBaseStyleNameGet({ name: styleName }).pipe(map(
// query: storeQuery, (data: OApiBaseStyle) => new BaseStyle(data.name, <any>data.style)
// }).pipe(map( ))
// res => res['data']['stores'].map( }
// (layer: Object) => new LayerNode(
// layer['name'],
// layer['group'],
// layer['icon'],
// layer['symbol'] || gisTypeSymbolMap[layer['gisType']],
// layer['store'],
// layer['rawSurveyStore'],
// layer['type'],
// layer['gisType'],
// layer['style'],
// layer['zIndex'],
// layer['count'],
// layer['description'],
// layer['live'],
// layer['custom'],
// layer['tagPlugins'],
// layer['viewableRole']
// )
// )
// ))
// }
// getPrimaryGroups(): Observable<PrimaryGroupNode[]> { // getStores(): Observable<LayerNode[]> {
// return this.apollo.query({ // return this.apollo.query({
// query: geomGroupQuery, // query: storeQuery,
// }).pipe(map( // }).pipe(map(
// res => res['data']['geomGroup'] && res['data']['geomGroup'].map( // res => res['data']['stores'].map(
// (gg: Object) => new PrimaryGroupNode( // (layer: Object) => new LayerNode(
// gg['name'], // layer['name'],
// gg['title'], // layer['group'],
// gg['description'] // layer['icon'],
// ) // layer['symbol'] || gisTypeSymbolMap[layer['gisType']],
// ) // layer['store'],
// )) // layer['rawSurveyStore'],
// } // layer['type'],
} // layer['gisType'],
// layer['style'],
// layer['zIndex'],
// layer['count'],
// layer['description'],
// layer['live'],
// layer['custom'],
// layer['tagPlugins'],
// layer['viewableRole']
// )
// )
// ))
// }
// getPrimaryGroups(): Observable<PrimaryGroupNode[]> {
// return this.apollo.query({
// query: geomGroupQuery,
// }).pipe(map(
// res => res['data']['geomGroup'] && res['data']['geomGroup'].map(
// (gg: Object) => new PrimaryGroupNode(
// gg['name'],
// gg['title'],
// gg['description']
// )
// )
// ))
// }
}

View file

@ -47,7 +47,7 @@ export const OpenAPI: OpenAPIConfig = {
PASSWORD: undefined, PASSWORD: undefined,
TOKEN: undefined, TOKEN: undefined,
USERNAME: undefined, USERNAME: undefined,
VERSION: '0.1.dev85+g41e92fa.d20240509', VERSION: '0.6.0a0',
WITH_CREDENTIALS: false, WITH_CREDENTIALS: false,
interceptors: { interceptors: {
response: new Interceptors(), response: new Interceptors(),

View file

@ -259,12 +259,26 @@ export const $BaseStyle = {
title: 'Style' title: 'Style'
}, },
mbtiles: { mbtiles: {
type: 'string', anyOf: [
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Mbtiles' title: 'Mbtiles'
}, },
static_tiles_url: { static_url: {
type: 'string', anyOf: [
title: 'Static Tiles Url' {
type: 'string'
},
{
type: 'null'
}
],
title: 'Static Url'
}, },
enabled: { enabled: {
type: 'boolean', type: 'boolean',
@ -273,7 +287,7 @@ export const $BaseStyle = {
} }
}, },
type: 'object', type: 'object',
required: ['name', 'style', 'mbtiles', 'static_tiles_url'], required: ['name'],
title: 'BaseStyle' title: 'BaseStyle'
} as const; } as const;
@ -311,7 +325,6 @@ export const $BasketDefault = {
title: 'Store' title: 'Store'
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'BasketDefault' title: 'BasketDefault'
} as const; } as const;
@ -514,52 +527,43 @@ export const $BootstrapData = {
version: { version: {
type: 'string', type: 'string',
title: 'Version', title: 'Version',
default: '0.1.dev85+g41e92fa.d20240509' default: '0.6.0a0'
}, },
title: { title: {
type: 'string', type: 'string',
title: 'Title', title: 'Title',
default: 'Auroville Geomatics Studio (Me)' default: 'Gisaf'
}, },
windowTitle: { windowTitle: {
type: 'string', type: 'string',
title: 'Windowtitle', title: 'Windowtitle',
default: 'AV Geomatics Studio (Me)' default: 'Gisaf'
}, },
map: { map: {
allOf: [ '$ref': '#/components/schemas/Map',
{
'$ref': '#/components/schemas/Map'
}
],
default: { default: {
attribution: '© Auroville CSR Geomatics',
bearing: 0,
defaultStatus: ['E'],
lat: 12.007,
lng: 79.8098,
opacity: 0.4,
pitch: 0,
status: ['E', 'F', 'D'],
style: 'No base map',
tagKeys: ['source'],
tileServer: { tileServer: {
baseDir: '/home/phil/gisaf_misc/map', baseDir: '/home/phil/.local/share/gisaf/mbtiles_files_dir',
openMapTilesKey: 'cS3lrAfYXoM4MDooT6aS', spriteBaseDir: '/home/phil/.local/share/gisaf/mbtiles_sprites_dir',
spriteBaseDir: '/home/phil/gisaf_misc/map/sprite', spriteBaseUrl: 'https://gisaf.example.org',
spriteBaseUrl: 'https://gis.auroville.org.in',
spriteUrl: '/tiles/sprite/sprite', spriteUrl: '/tiles/sprite/sprite',
useRequestUrl: true useRequestUrl: false
}, },
zoom: 14 zoom: 14,
pitch: 45,
lat: 12,
lng: 79.8106,
bearing: 0,
style: 'OpenFreeMap',
opacity: 1,
attribution: '',
status: ['E', 'F', 'D'],
defaultStatus: ['E'],
tagKeys: ['source']
} }
}, },
geo: { geo: {
allOf: [ '$ref': '#/components/schemas/Geo',
{
'$ref': '#/components/schemas/Geo'
}
],
default: { default: {
raw_survey: { raw_survey: {
spatial_sys_ref: { spatial_sys_ref: {
@ -584,19 +588,13 @@ export const $BootstrapData = {
} }
}, },
measures: { measures: {
allOf: [ '$ref': '#/components/schemas/Measures',
{ default: {}
'$ref': '#/components/schemas/Measures'
}
],
default: {
defaultStore: 'avsm_water.well'
}
}, },
redirect: { redirect: {
type: 'string', type: 'string',
title: 'Redirect', title: 'Redirect',
default: 'http://gis.auroville.org.in' default: ''
}, },
user: { user: {
anyOf: [ anyOf: [
@ -1442,11 +1440,7 @@ export const $FormFieldInput = {
export const $Geo = { export const $Geo = {
properties: { properties: {
raw_survey: { raw_survey: {
allOf: [ '$ref': '#/components/schemas/RawSurvey',
{
'$ref': '#/components/schemas/RawSurvey'
}
],
default: { default: {
spatial_sys_ref: { spatial_sys_ref: {
author: 'AVSM', author: 'AVSM',
@ -1485,7 +1479,6 @@ export const $Geo = {
default: 32644 default: 32644
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'Geo' title: 'Geo'
} as const; } as const;
@ -1568,17 +1561,13 @@ export const $LegendItem = {
export const $Map = { export const $Map = {
properties: { properties: {
tileServer: { tileServer: {
allOf: [ '$ref': '#/components/schemas/TileServer',
{
'$ref': '#/components/schemas/TileServer'
}
],
default: { default: {
baseDir: '/path/to/mbtiles_files_dir', baseDir: '/home/phil/.local/share/gisaf/mbtiles_files_dir',
spriteBaseDir: '/path/to/mbtiles_sprites_dir', useRequestUrl: false,
spriteBaseUrl: 'https://gisaf.example.org', spriteBaseDir: '/home/phil/.local/share/gisaf/mbtiles_sprites_dir',
spriteUrl: '/tiles/sprite/sprite', spriteUrl: '/tiles/sprite/sprite',
useRequestUrl: false spriteBaseUrl: 'https://gisaf.example.org'
} }
}, },
zoom: { zoom: {
@ -1609,7 +1598,7 @@ export const $Map = {
style: { style: {
type: 'string', type: 'string',
title: 'Style', title: 'Style',
default: 'OSM (vector)' default: 'OpenFreeMap'
}, },
opacity: { opacity: {
type: 'number', type: 'number',
@ -1646,7 +1635,6 @@ export const $Map = {
default: ['source'] default: ['source']
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'Map' title: 'Map'
} as const; } as const;
@ -1790,7 +1778,6 @@ export const $Measures = {
title: 'Defaultstore' title: 'Defaultstore'
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'Measures' title: 'Measures'
} as const; } as const;
@ -2109,11 +2096,7 @@ export const $Project = {
export const $RawSurvey = { export const $RawSurvey = {
properties: { properties: {
spatial_sys_ref: { spatial_sys_ref: {
allOf: [ '$ref': '#/components/schemas/SpatialSysRef',
{
'$ref': '#/components/schemas/SpatialSysRef'
}
],
default: { default: {
author: 'AVSM', author: 'AVSM',
ellps: 'WGS84', ellps: 'WGS84',
@ -2134,7 +2117,6 @@ export const $RawSurvey = {
default: 910001 default: 910001
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'RawSurvey' title: 'RawSurvey'
} as const; } as const;
@ -2237,7 +2219,6 @@ export const $SpatialSysRef = {
default: 1328608.994 default: 1328608.994
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'SpatialSysRef' title: 'SpatialSysRef'
} as const; } as const;
@ -2386,11 +2367,12 @@ export const $Store = {
}, },
z_index: { z_index: {
type: 'integer', type: 'integer',
title: 'Z Index' title: 'Z Index',
default: 500
} }
}, },
type: 'object', type: 'object',
required: ['name', 'auto_import', 'custom', 'description', 'gis_type', 'group', 'in_menu', 'is_db', 'is_line_work', 'is_live', 'long_name', 'type', 'minor_group_1', 'minor_group_2', 'status', 'style', 'symbol', 'title', 'viewable_role', 'z_index'], required: ['name', 'auto_import', 'custom', 'description', 'gis_type', 'group', 'in_menu', 'is_db', 'is_line_work', 'is_live', 'long_name', 'type', 'minor_group_1', 'minor_group_2', 'status', 'style', 'symbol', 'title'],
title: 'Store' title: 'Store'
} as const; } as const;
@ -2648,8 +2630,9 @@ export const $TileServer = {
properties: { properties: {
baseDir: { baseDir: {
type: 'string', type: 'string',
format: 'path',
title: 'Basedir', title: 'Basedir',
default: '/path/to/mbtiles_files_dir' default: '/home/phil/.local/share/gisaf/mbtiles_files_dir'
}, },
useRequestUrl: { useRequestUrl: {
type: 'boolean', type: 'boolean',
@ -2658,8 +2641,9 @@ export const $TileServer = {
}, },
spriteBaseDir: { spriteBaseDir: {
type: 'string', type: 'string',
format: 'path',
title: 'Spritebasedir', title: 'Spritebasedir',
default: '/path/to/mbtiles_sprites_dir' default: '/home/phil/.local/share/gisaf/mbtiles_sprites_dir'
}, },
spriteUrl: { spriteUrl: {
type: 'string', type: 'string',
@ -2683,7 +2667,6 @@ export const $TileServer = {
title: 'Openmaptileskey' title: 'Openmaptileskey'
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'TileServer' title: 'TileServer'
} as const; } as const;

View file

@ -54,11 +54,11 @@ export type BaseMapWithStores = {
export type BaseStyle = { export type BaseStyle = {
id?: number | null; id?: number | null;
name: string; name: string;
style: { style?: {
[key: string]: unknown; [key: string]: unknown;
} | null; } | null;
mbtiles: string; mbtiles?: string | null;
static_tiles_url: string; static_url?: string | null;
enabled?: boolean; enabled?: boolean;
}; };
@ -457,8 +457,8 @@ export type Store = {
style: string | null; style: string | null;
symbol: string | null; symbol: string | null;
title: string; title: string;
viewable_role: string | null; viewable_role?: string | null;
z_index: number; z_index?: number;
}; };
export type StoreNameOnly = { export type StoreNameOnly = {
@ -751,9 +751,7 @@ export type $OpenApiTs = {
}; };
'/api/token': { '/api/token': {
post: { post: {
req: { req: LoginForAccessTokenApiTokenPostData;
formData: Body_login_for_access_token_api_token_post;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -870,9 +868,7 @@ export type $OpenApiTs = {
}; };
'/api/data-provider/{store}': { '/api/data-provider/{store}': {
get: { get: {
req: { req: GetModelListApiDataProviderStoreGetData;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -891,12 +887,7 @@ export type $OpenApiTs = {
}; };
'/api/{store_name}/values/{value}': { '/api/{store_name}/values/{value}': {
get: { get: {
req: { req: GetModelValuesApiStoreNameValuesValueGetData;
resample?: string | null;
storeName: string;
value: string;
where: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -957,10 +948,7 @@ export type $OpenApiTs = {
}; };
'/api/feature-info/{store}/{id}': { '/api/feature-info/{store}/{id}': {
get: { get: {
req: { req: GetFeatureInfoApiFeatureInfoStoreIdGetData;
id: string;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -979,9 +967,7 @@ export type $OpenApiTs = {
}; };
'/api/model-info/{store}': { '/api/model-info/{store}': {
get: { get: {
req: { req: GetModelInfoApiModelInfoStoreGetData;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1000,11 +986,7 @@ export type $OpenApiTs = {
}; };
'/api/plot-params/{store}': { '/api/plot-params/{store}': {
get: { get: {
req: { req: GetPlotParamsApiPlotParamsStoreGetData;
id: string;
store: string;
value: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1037,9 +1019,7 @@ export type $OpenApiTs = {
}; };
'/api/execTagActions': { '/api/execTagActions': {
post: { post: {
req: { req: ExecuteTagActionApiExecTagActionsPostData;
requestBody: Body_execute_tag_action_api_execTagActions_post;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1058,12 +1038,7 @@ export type $OpenApiTs = {
}; };
'/api/gj/{store_name}': { '/api/gj/{store_name}': {
get: { get: {
req: { req: GetGeojsonApiGjStoreNameGetData;
ifNoneMatch?: string | null;
preserveTopology?: boolean | null;
simplify?: number | null;
storeName: unknown;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1096,9 +1071,7 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/{name}': { '/api/admin/basket/{name}': {
get: { get: {
req: { req: GetBasketApiAdminBasketNameGetData;
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1117,14 +1090,7 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/upload/{name}': { '/api/admin/basket/upload/{name}': {
post: { post: {
req: { req: UploadBasketFileApiAdminBasketUploadNamePostData;
autoImport?: boolean;
equipmentId?: number | null;
formData: Body_upload_basket_file_api_admin_basket_upload__name__post;
name: string;
projectId?: number | null;
surveyorId?: number | null;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1143,11 +1109,7 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/download/{name}/{file_id}/{file_name}': { '/api/admin/basket/download/{name}/{file_id}/{file_name}': {
get: { get: {
req: { req: DownloadBasketFileApiAdminBasketDownloadNameFileIdFileNameGetData;
fileId: number;
fileName: string;
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1166,11 +1128,7 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/import/{basket}/{file_id}': { '/api/admin/basket/import/{basket}/{file_id}': {
get: { get: {
req: { req: ImportBasketFileApiAdminBasketImportBasketFileIdGetData;
basket: string;
dryRun?: boolean;
fileId: number;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1189,10 +1147,7 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/delete/{basket}/{file_id}': { '/api/admin/basket/delete/{basket}/{file_id}': {
get: { get: {
req: { req: DeleteBasketFileApiAdminBasketDeleteBasketFileIdGetData;
basket: string;
fileId: number;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1239,10 +1194,7 @@ export type $OpenApiTs = {
}; };
'/api/dashboard/page/{group}/{name}': { '/api/dashboard/page/{group}/{name}': {
get: { get: {
req: { req: GetDashboardPageApiDashboardPageGroupNameGetData;
group: string;
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1271,9 +1223,7 @@ export type $OpenApiTs = {
}; };
'/api/map/base_style/{name}': { '/api/map/base_style/{name}': {
get: { get: {
req: { req: GetBaseStyleApiMapBaseStyleNameGetData;
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1288,9 +1238,7 @@ export type $OpenApiTs = {
}; };
'/api/map/layer_style/{store}': { '/api/map/layer_style/{store}': {
get: { get: {
req: { req: GetLayerStyleApiMapLayerStyleStoreGetData;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1305,12 +1253,7 @@ export type $OpenApiTs = {
}; };
'/api/download/csv/{store}/{model_id}/{value}/{resample}': { '/api/download/csv/{store}/{model_id}/{value}/{resample}': {
get: { get: {
req: { req: DownloadCsvApiDownloadCsvStoreModelIdValueResampleGetData;
modelId: number;
resample: string;
store: string;
value: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1329,11 +1272,7 @@ export type $OpenApiTs = {
}; };
'/api/download/geodata/{stores}': { '/api/download/geodata/{stores}': {
get: { get: {
req: { req: DownloadGeodataApiDownloadGeodataStoresGetData;
format?: string;
reproject?: boolean;
stores: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1352,11 +1291,7 @@ export type $OpenApiTs = {
}; };
'/api/download/plugin/{name}/{store}/{id}': { '/api/download/plugin/{name}/{store}/{id}': {
get: { get: {
req: { req: ExecuteActionApiDownloadPluginNameStoreIdGetData;
id: number;
name: string;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response

3
src/version.json Normal file
View file

@ -0,0 +1,3 @@
{
"version": "0.0.0"
}

View file

@ -1,27 +1,28 @@
{ {
"compileOnSave": false, "compileOnSave": false,
"compilerOptions": { "compilerOptions": {
"importHelpers": true,
"module": "es2020",
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false, "declaration": false,
"moduleResolution": "node", "esModuleInterop": true,
"experimentalDecorators": true, "experimentalDecorators": true,
"target": "ES2022", "importHelpers": true,
"typeRoots": [
"node_modules/@types",
"@types"
],
"lib": [ "lib": [
"es2019", "es2019",
"dom", "dom",
"esnext.asynciterable" "esnext.asynciterable"
], ],
"allowSyntheticDefaultImports": true, "module": "es2020",
"moduleResolution": "node",
"resolveJsonModule": true,
"outDir": "./dist/out-tsc",
"sourceMap": true,
"target": "ES2022",
"typeRoots": [
"node_modules/@types",
"@types"
],
"useDefineForClassFields": false "useDefineForClassFields": false
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"strictTemplates": true "strictTemplates": true
} }
} }