Compare commits

..

No commits in common. "main" and "0.5.0-alpha" have entirely different histories.

31 changed files with 4446 additions and 4249 deletions

View file

@ -0,0 +1,107 @@
on:
push:
workflow_dispatch:
inputs:
build:
description: "Build container"
required: true
default: false
type: boolean
jobs:
build:
runs-on: container
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Get the version from git
id: version
run: echo "version=$(git describe --dirty --tags)" >> $GITHUB_OUTPUT
- name: Check if the container should be built
id: builder
env:
RUN: ${{ toJSON(inputs.build || !contains(steps.version.outputs.version, '-')) }}
run: |
echo "run=$RUN" >> $GITHUB_OUTPUT
echo "Run build: $RUN"
- name: Info - version and if the image container should be built
env:
VERSION: ${{ steps.version.outputs.version }}
RUN: ${{ steps.builder.outputs.run }}
FORCE: ${{ toJSON(inputs.build) }}
run: |
echo "Version $VERSION, force (manual input): $FORCE, run the build: $RUN"
- uses: pnpm/action-setup@v4
name: Install pnpm
with:
run_install: false
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 20
cache: "pnpm"
- name: Install dependencies
run: pnpm install
- name: Update version.json from git describe
run: pnpm run version
- name: Set the version in package.json
env:
VERSION: ${{ steps.version.outputs.version }}
run: sed "s/0.0.0/${VERSION}/" -i package.json
- name: Build package (transpile ts => js)
run: ng build
- name: Set registry token for pnpm"
env:
LOCAL_NPM_TOKEN: ${{ secrets.LOCAL_NPM_TOKEN }}
run: pnpm set "//code.philo.ydns.eu/api/packages/philorg/npm/:_authToken=${LOCAL_NPM_TOKEN}"
- name: Publish
if: fromJSON(steps.builder.outputs.run)
run: pnpm publish --no-git-checks
- name: Build container
if: fromJSON(steps.builder.outputs.run)
uses: actions/buildah-build@v1
with:
image: gisaf-frontend
oci: true
labels: gisaf-frontend
tags: latest ${{ steps.version.outputs.version }}
containerfiles: |
./Containerfile
build-args: |
APP_VERSION=${{ steps.version.outputs.version }}
- name: Workaround for bug of podman-login
if: fromJSON(steps.builder.outputs.run)
run: |
mkdir -p $HOME/.docker
echo "{ \"auths\": {} }" > $HOME/.docker/config.json
- name: Log in to container registry (with another workaround)
if: fromJSON(steps.builder.outputs.run)
uses: actions/podman-login@v1
with:
registry: ${{ vars.REGISTRY }}
username: ${{ secrets.REGISTRY_USER }}
password: ${{ secrets.REGISTRY_PASSWORD }}
auth_file_path: /tmp/auth.json
- name: Push the image to the registry
if: fromJSON(steps.builder.outputs.run)
uses: actions/push-to-registry@v2
with:
registry: "docker://${{ vars.REGISTRY }}/${{ vars.ORGANISATION }}"
image: gisaf-frontend
tags: latest ${{ steps.version.outputs.version }}

View file

@ -1,50 +0,0 @@
when:
- event: manual
- event: tag
#depends_on:
#- test
steps:
npm:
image: code.philo.ydns.eu/philorg/pnpm-deb
environment:
ORG: philorg
REGISTRY_TOKEN:
from_secret: registry_token
volumes:
- pnpm:/root/.local/share/pnpm
commands:
- pnpm install --frozen-lockfile
- pnpm set "//code.philo.ydns.eu/api/packages/$ORG/npm/:_authToken=$REGISTRY_TOKEN"
- pnpm publish --no-git-checks
failure: ignore
build:
image: code.philo.ydns.eu/philorg/pnpm-deb
commands:
- pnpm build
build_publish:
image: quay.io/podman/stable:latest
# Caution: This image is built daily. It might fill up your image store quickly.
#pull: true
volumes:
- containers:/var/lib/containers
- pnpm:/root/.local/share/pnpm
# Fill in the trusted checkbox in Woodpecker's settings as well
privileged: true
environment:
registry: code.philo.ydns.eu
org: philorg
container_name: gisaf-frontend
registry_token:
from_secret: registry_token
commands:
# Login at the registry
- podman login -u __token__ --password $registry_token $registry
# Build the container image
- podman build --volume=/var/lib/containers:/var/lib/containers --tag $registry/$org/$container_name:latest --tag $registry/$org/$container_name:$CI_COMMIT_TAG .
# Push the image
- podman push $registry/$org/$container_name:latest
- podman push $registry/$org/$container_name:$CI_COMMIT_TAG

View file

@ -1,7 +0,0 @@
# Build: podman build -t code.philo.ydns.eu/philorg/gisaf-frontend -f Containerfile
FROM docker.io/library/nginx:alpine
EXPOSE 80
COPY nginx.conf /etc/nginx/nginx.conf
COPY dist/gisaf/browser /usr/share/nginx/html

View file

@ -1,7 +1,31 @@
# Gisaf frontend # GisafApp
The web app (front-end, user interface) for Gisaf, This project was generated with [angular-cli](https://github.com/angular/angular-cli) version 1.0.0-beta.24.
a web based GIS initially developed for CSR Geomatics, Auroville.
See the [Gisaf server repository](https://code.philo.ydns.eu/philorg/gisaf-backend) ## Development server
for information about this project. 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.
## 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

@ -1,49 +1,34 @@
{ {
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
"version": 1, "version": 1,
"newProjectRoot": "projects", "newProjectRoot": "projects",
"projects": { "projects": {
"gisaf": { "gisaf-app": {
"projectType": "application",
"schematics": {
"@schematics/angular:component": {
"style": "scss"
},
"@schematics/angular:application": {
"strict": true
}
},
"root": "", "root": "",
"sourceRoot": "src", "projectType": "application",
"prefix": "app",
"architect": { "architect": {
"build": { "build": {
"builder": "@angular-devkit/build-angular:application", "builder": "@angular-devkit/build-angular:browser",
"options": { "options": {
"outputPath": { "outputPath": "dist",
"base": "dist/gisaf"
},
"index": "src/index.html", "index": "src/index.html",
"polyfills": [ "main": "src/main.ts",
"src/polyfills.ts" "tsConfig": "src/tsconfig.app.json",
], "polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.json",
"inlineStyleLanguage": "scss",
"assets": [ "assets": [
{ {
"glob": "**/*", "glob": "**/*",
"input": "src/assets/", "input": "src/assets",
"output": "/assets/" "output": "/assets"
}, },
{ {
"glob": "favicon.ico", "glob": "favicon.ico",
"input": "src/", "input": "src",
"output": "/" "output": "/"
}, },
{ {
"glob": "**/*", "glob": "**/*",
"input": "src/data/", "input": "src/undefined",
"output": "/data/" "output": "/"
} }
], ],
"styles": [ "styles": [
@ -77,8 +62,9 @@
"maplibre-gl", "maplibre-gl",
"@mapbox/point-geometry" "@mapbox/point-geometry"
], ],
"browser": "src/main.ts", "vendorChunk": true,
"extractLicenses": false, "extractLicenses": false,
"buildOptimizer": false,
"sourceMap": true, "sourceMap": true,
"optimization": false, "optimization": false,
"namedChunks": true "namedChunks": true
@ -92,25 +78,20 @@
} }
], ],
"optimization": true, "optimization": true,
"outputHashing": "all",
"sourceMap": false, "sourceMap": false,
"namedChunks": false, "namedChunks": false,
"extractLicenses": true, "extractLicenses": true,
"vendorChunk": false,
"buildOptimizer": true,
"fileReplacements": [ "fileReplacements": [
{ {
"replace": "src/environments/environment.ts", "src": "src/environments/environment.ts",
"with": "src/environments/environment.prod.ts" "replaceWith": "src/environments/environment.prod.ts"
}
]
} }
],
"outputHashing": "all"
},
"development": {
"optimization": false,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true
} }
},
"defaultConfiguration": "production"
}, },
"serve": { "serve": {
"builder": "@angular-devkit/build-angular:dev-server", "builder": "@angular-devkit/build-angular:dev-server",
@ -120,27 +101,23 @@
}, },
"configurations": { "configurations": {
"production": { "production": {
"buildTarget": "gisaf:build:production" "buildTarget": "gisaf-app:build:production"
}, }
"development": {
"buildTarget": "gisaf:build:development"
} }
},
"defaultConfiguration": "development"
}, },
"extract-i18n": { "extract-i18n": {
"builder": "@angular-devkit/build-angular:extract-i18n", "builder": "@angular-devkit/build-angular:extract-i18n",
"options": { "options": {
"buildTarget": "gisaf:build" "buildTarget": "gisaf-app:build"
} }
}, },
"test": { "test": {
"builder": "@angular-devkit/build-angular:karma", "builder": "@angular-devkit/build-angular:karma",
"options": { "options": {
"main": "src/test.ts", "main": "src/test.ts",
"karmaConfig": "./karma.conf.js",
"polyfills": "src/polyfills.ts", "polyfills": "src/polyfills.ts",
"tsConfig": "tsconfig.spec.json", "tsConfig": "src/tsconfig.spec.json",
"karmaConfig": "karma.conf.js",
"scripts": [], "scripts": [],
"styles": [ "styles": [
{ {
@ -203,7 +180,6 @@
} }
}, },
"cli": { "cli": {
"analytics": false, "analytics": false
"packageManager": "pnpm"
} }
} }

View file

@ -1,158 +0,0 @@
events {
worker_connections 1024; ## Default: 1024
}
http {
include /etc/nginx/mime.types;
upstream backend {
server gisaf-backend:8898 fail_timeout=0;
# fail_timeout=0 means we always retry an upstream even if it failed
# to return a good HTTP response
# Unix domain servers
# server unix:/tmp/backend-gisaf-1.sock fail_timeout=0;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
#
#upstream websocket {
# server localhost:8080;
#}
server {
listen 80 default_server;
listen [::]:80 default_server;
gzip on;
gzip_types text/plain application/xml;
gzip_proxied no-cache no-store private expired auth;
gzip_min_length 1000;
charset utf-8;
client_max_body_size 4G;
root /usr/share/nginx/html;
location /tiles/ {
# proxy_pass http://localhost:8080/;
#proxy_pass http://127.0.0.1:3000/;
proxy_pass http://backend;
}
location /api/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
location /gj/live {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_buffering off;
}
location /_sched {
proxy_pass http://localhost:8080;
proxy_http_version 1.1;
proxy_set_header Upgrade "websocket";
proxy_set_header Connection "Upgrade";
proxy_buffering off;
}
location /gj/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
location /auth {
## POST requests for JWT
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
# location /admin {
# proxy_set_header Host $http_host;
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# proxy_http_version 1.1;
# proxy_buffering off;
# proxy_pass http://backend;
# }
location /import/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
location /download/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
location /upload/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
location /embed/ {
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_buffering off;
proxy_pass http://backend;
}
location = /index.html {
root /usr/share/nginx/html;
}
location / {
try_files $uri /index.html;
}
location /dashboard-attachment {
alias /home/phil/gisaf_misc/notebooks;
}
location = /favicon.ico {
root /usr/share/nginx/html;
}
# location /terrain {
# proxy_pass https://stamen-tiles-a.a.ssl.fastly.net/terrain;
# #proxy_set_header Host $host;
# proxy_buffering on;
# proxy_cache STAMEN;
# proxy_cache_valid 200 1d;
# proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
# }
# location "/download/attachment/formidable:trees/Picture/" {
# alias /home/phil/formidable_src/local_data/;
# }
}
}

View file

@ -1,7 +1,7 @@
{ {
"name": "gisaf-frontend", "name": "gisaf-frontend",
"displayName": "Gisaf web front-end", "displayName": "Gisaf web front-end",
"version": "0.5.0", "version": "0.0.0",
"license": "GPL-3.0", "license": "GPL-3.0",
"description": "Gisaf Geomatics", "description": "Gisaf Geomatics",
"repository": { "repository": {
@ -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 --host 0.0.0.0 --watch", "start": "node --max_old_space_size=4096 ./node_modules/@angular/cli/bin/ng serve --proxy-config proxy.conf.json --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:5080/openapi.json -o src/app/openapi --client angular", "openapi-ts": "openapi-ts -i http://127.0.0.1:5000/openapi.json -o src/app/openapi --client angular",
"source-map-explorer": "source-map-explorer dist/*.js" "source-map-explorer": "source-map-explorer dist/*.js"
}, },
"licenses": [ "licenses": [
@ -26,54 +26,56 @@
"url": "https://github.com/angular/angular.io/blob/master/LICENSE" "url": "https://github.com/angular/angular.io/blob/master/LICENSE"
} }
], ],
"private": true,
"dependencies": { "dependencies": {
"@angular/animations": "^18.2.13", "@angular/animations": "^17.3.5",
"@angular/cdk": "^18.2.14", "@angular/cdk": "^17.3.5",
"@angular/common": "^18.2.13", "@angular/common": "^17.3.5",
"@angular/compiler": "^18.2.13", "@angular/compiler": "^17.3.5",
"@angular/core": "^18.2.13", "@angular/core": "^17.3.5",
"@angular/forms": "^18.2.13", "@angular/forms": "^17.3.5",
"@angular/material": "^18.2.14", "@angular/material": "^17.3.5",
"@angular/platform-browser": "^18.2.13", "@angular/platform-browser": "^17.3.5",
"@angular/platform-browser-dynamic": "^18.2.13", "@angular/platform-browser-dynamic": "^17.3.5",
"@angular/platform-server": "^18.2.13", "@angular/platform-server": "^17.3.5",
"@angular/router": "^18.2.13", "@angular/router": "^17.3.5",
"@mapbox/point-geometry": "^0.1.0", "@mapbox/point-geometry": "^0.1.0",
"@maplibre/ngx-maplibre-gl": "^18.1.4", "@maplibre/ngx-maplibre-gl": "^17.4.3",
"@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.7.1", "maplibre-gl": "^4.1.3",
"ngx-flexible-layout": "~18.0.2", "ngx-flexible-layout": "~17.0.4",
"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.10" "zone.js": "~0.14.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/build-angular": "^18.2.12", "@angular-devkit/build-angular": "^17.3.5",
"@angular/cli": "^18.2.12", "@angular/cli": "^17.3.5",
"@angular/compiler-cli": "^18.2.13", "@angular/compiler-cli": "^17.3.5",
"@angular/language-service": "^18.2.13", "@angular/language-service": "^17.3.5",
"@hey-api/openapi-ts": "^0.45.1", "@hey-api/openapi-ts": "^0.45",
"@types/geojson": "^7946.0.15", "@types/geojson": "^7946.0.14",
"@types/jasmine": "~5.1.5", "@types/jasmine": "~5.1.4",
"@types/jasminewd2": "^2.0.13", "@types/jasminewd2": "^2.0.13",
"@types/node": "^20.17.10", "@types/node": "^20.12.7",
"@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.4", "karma": "~6.4.3",
"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.8.1", "tslib": "^2.6.2",
"typescript": "~5.4.5" "typescript": "~5.4.5"
}, },
"packageManager": "pnpm@9.15", "packageManager": "pnpm@9.15",

4744
pnpm-lock.yaml generated

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@
"/docs", "/docs",
"/api" "/api"
], ],
"target": "http://127.0.0.1:5080", "target": "http://127.0.0.1:5000",
"secure": false, "secure": false,
"ws": true "ws": true
}, },

View file

@ -12,6 +12,7 @@ export interface DialogData {
@Component({ @Component({
selector: 'gisaf-admin-access-role-dialog', selector: 'gisaf-admin-access-role-dialog',
templateUrl: 'role-dialog.component.html', templateUrl: 'role-dialog.component.html',
styleUrls: ['role-dialog.component.css'],
}) })
export class GisafAdminAccessRoleDialogComponent implements OnInit { export class GisafAdminAccessRoleDialogComponent implements OnInit {
formGroup: UntypedFormGroup = new UntypedFormGroup({}) formGroup: UntypedFormGroup = new UntypedFormGroup({})

View file

@ -7,6 +7,7 @@ import { AdminManageDataService } from '../data.service'
@Component({ @Component({
selector: 'gisaf-admin-maintenance', selector: 'gisaf-admin-maintenance',
templateUrl: './maintenance.component.html', templateUrl: './maintenance.component.html',
styleUrls: ['./maintenance.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class AdminMaintenanceComponent implements OnInit { export class AdminMaintenanceComponent implements OnInit {

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 version: backend {{ version.backend }}, frontend {{ version.frontend }}" matTooltip="Gisaf v. {{ (configService.conf | async).bsData?.version }}"
matTooltipPosition="below" matTooltipPosition="below"
class='gisafIcon' class='gisafIcon'
> >

View file

@ -1,7 +1,5 @@
import { import { Component, OnInit,
Component, OnInit, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'
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'
@ -10,12 +8,6 @@ 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 packageJson from '../../package.json'
export class Version {
public backend: string
public frontend: string
}
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
@ -24,8 +16,8 @@ export class Version {
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class AppComponent implements OnInit { export class AppComponent implements OnInit {
title: string = 'Gisaf' title = 'Gisaf'
version: Version = new Version() version: string
routes = [ routes = [
{ {
@ -60,8 +52,7 @@ export class AppComponent implements OnInit {
// Bootstrap: set app wide configuration // Bootstrap: set app wide configuration
this.bootstrapService.get().subscribe({ this.bootstrapService.get().subscribe({
next: res => { next: res => {
this.version.backend = res.version this.version = res.version
this.version.frontend = packageJson["version"]
this.title = res.title || this.title this.title = res.title || this.title
this.titleService.setTitle(res.windowTitle || this.title) this.titleService.setTitle(res.windowTitle || this.title)
this.configService.setConf(res) this.configService.setConf(res)

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 { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' import { HttpClientModule } 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,26 +32,34 @@ import { HtmlSnackbarComponent } from './custom-snackbar/custom-snackbar.compone
import { AppRoutingModule } from './app-routing.module' import { AppRoutingModule } from './app-routing.module'
@NgModule({ declarations: [ @NgModule({
declarations: [
AppComponent, AppComponent,
PageNotFoundComponent, PageNotFoundComponent,
HtmlSnackbarComponent, HtmlSnackbarComponent,
], ],
bootstrap: [ imports: [
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], providers: [ LoginModule,
],
providers: [
ActionsService, ActionsService,
AuthenticationService, AuthenticationService,
BootstrapService, BootstrapService,
@ -67,6 +75,9 @@ 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

@ -4,5 +4,6 @@ import { Component } from '@angular/core'
@Component({ @Component({
selector: 'gisaf-info-home', selector: 'gisaf-info-home',
templateUrl: './info-home.component.html', templateUrl: './info-home.component.html',
styleUrls: ['./info-home.component.css']
}) })
export class InfoHomeComponent {} export class InfoHomeComponent {}

View file

@ -1,7 +1,5 @@
import { import { Component, Input,
Component, Input, ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'
ChangeDetectionStrategy, ChangeDetectorRef
} from '@angular/core'
import { Tag } from './tags.service' import { Tag } from './tags.service'
import { FullInfo, InfoDataService, FormField } from '../info-data.service' import { FullInfo, InfoDataService, FormField } from '../info-data.service'
@ -14,6 +12,7 @@ import { MapControlService } from '../../map/map-control.service'
@Component({ @Component({
selector: 'gisaf-tag-action', selector: 'gisaf-tag-action',
templateUrl: './tag-action.component.html', templateUrl: './tag-action.component.html',
styleUrls: ['./tag-action.component.css'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
}) })
export class TagActionComponent { export class TagActionComponent {

View file

@ -8,6 +8,7 @@ import { Downloader } from '../../openapi'
@Component({ @Component({
selector: 'gisaf-downloader', selector: 'gisaf-downloader',
templateUrl: './downloader.component.html', templateUrl: './downloader.component.html',
styleUrls: ['./downloader.component.css']
}) })
export class DownloaderComponent implements OnInit { export class DownloaderComponent implements OnInit {
@Input() source: FullInfo @Input() source: FullInfo

View file

@ -1,7 +1,5 @@
import { import { Component, OnInit, OnDestroy, Input, ViewChild, NgZone,
Component, OnInit, OnDestroy, Input, ViewChild, NgZone, ChangeDetectionStrategy, ChangeDetectorRef, ElementRef } from '@angular/core'
ChangeDetectionStrategy, ChangeDetectorRef, ElementRef
} from '@angular/core'
import { ActivatedRoute, Params, Router } from '@angular/router' import { ActivatedRoute, Params, Router } from '@angular/router'
import { Observable } from 'rxjs' import { Observable } from 'rxjs'
@ -10,11 +8,9 @@ import { WebSocketSubject } from 'rxjs/webSocket'
import { MatSnackBar } from '@angular/material/snack-bar' import { MatSnackBar } from '@angular/material/snack-bar'
import { import { Map, MapMouseEvent, LayerSpecification,
Map, MapMouseEvent, LayerSpecification,
GeoJSONSourceSpecification, FitBoundsOptions, GeoJSONSourceSpecification, FitBoundsOptions,
ExpressionSpecification, Source, GeoJSONSource ExpressionSpecification, Source, GeoJSONSource } from 'maplibre-gl'
} from 'maplibre-gl'
import Point from '@mapbox/point-geometry' import Point from '@mapbox/point-geometry'
import * as bbox from '@turf/bbox' import * as bbox from '@turf/bbox'
@ -197,18 +193,9 @@ export class GisafMapboxComponent implements OnInit, OnDestroy {
} }
_getNewSingleOpacity(layerId: string, originalOpacity: number | object): number | object { _getNewSingleOpacity(layerId: string, originalOpacity: number | object): number | object {
if (originalOpacity === undefined) { if (typeof(originalOpacity) === 'number') {
return undefined
}
else if (typeof originalOpacity === 'number') {
return originalOpacity * this._baseStyleOpacity return originalOpacity * this._baseStyleOpacity
} }
else if (typeof originalOpacity === 'object') { // Also matches array
if (originalOpacity[0] == 'interpolate') {
// Change the last interpolation point
originalOpacity[Object.values(originalOpacity).length - 1] = this._baseStyleOpacity
return originalOpacity
}
else { else {
let newOpacity = {} let newOpacity = {}
for (const k in originalOpacity) { for (const k in originalOpacity) {
@ -223,38 +210,28 @@ export class GisafMapboxComponent implements OnInit, OnDestroy {
return newOpacity return newOpacity
} }
} }
else {
console.log(`Cannot process opacity of layer ${layerId}, unknown type ${typeof originalOpacity}`)
return originalOpacity
}
}
_getNewOpacity(layer: object): object { _getNewOpacity(layer: object): object {
let originalStyle = this.originalBaseStyle.style['layers'].find( let originalStyle = this.originalBaseStyle.style['layers'].find(
(_layer: object) => layer['id'] == _layer['id'] (_layer: object) => layer['id'] == _layer['id']
) )
let originalPaint = originalStyle['paint'] || {} if (!('paint' in originalStyle)) {
if (layer['type'] == 'symbol') { originalStyle['paint'] = {}
let prop1 = 'text-opacity'
let prop2 = 'icon-opacity'
let newOpacity1 = this._getNewSingleOpacity(layer['id'], originalPaint[prop1] || 1.0)
let newOpacity2 = this._getNewSingleOpacity(layer['id'], originalPaint[prop2] || 1.0)
return {
[prop1]: newOpacity1,
[prop2]: newOpacity2,
} }
} if (['raster', 'background', 'fill', 'line'].indexOf(layer['type']) != -1) {
else if (layer['type'] == 'line') {
let prop = layer['type'] + '-opacity' let prop = layer['type'] + '-opacity'
return { return {
[prop]: this._getNewSingleOpacity(layer['id'], originalPaint[prop] || 1.0) [prop]: this._getNewSingleOpacity(layer['id'], originalStyle['paint'][prop] || 1.0)
} }
} }
else { else {
// layer['type'] in ['raster', 'background', 'fill', 'line', 'fill-extrusion'] let prop1 = 'text-opacity'
let prop = layer['type'] + '-opacity' let prop2 = 'icon-opacity'
let newOpacity1 = this._getNewSingleOpacity(layer['id'], originalStyle['paint'][prop1] || 1.0)
let newOpacity2 = this._getNewSingleOpacity(layer['id'], originalStyle['paint'][prop2] || 1.0)
return { return {
[prop]: this._getNewSingleOpacity(layer['id'], originalPaint[prop] || 1.0), [prop1]: newOpacity1,
[prop2]: newOpacity2,
} }
} }
} }
@ -266,12 +243,10 @@ export class GisafMapboxComponent implements OnInit, OnDestroy {
continue continue
} }
for (const [key, value] of Object.entries(this._getNewOpacity(bsLayer))) { for (const [key, value] of Object.entries(this._getNewOpacity(bsLayer))) {
if (value !== undefined) {
this.map.setPaintProperty(bsLayer.id, key, value) this.map.setPaintProperty(bsLayer.id, key, value)
} }
} }
} }
}
/* /*
* For reference: * For reference:

View file

@ -1,4 +1,6 @@
import { ElementRef, Input, ViewChild, Directive, HostListener, OutputRefSubscription } from '@angular/core' import { ElementRef, Input, ViewChild, Directive, HostListener } from '@angular/core'
import { Subscription } from 'rxjs'
import { MatButton } from '@angular/material/button' import { MatButton } from '@angular/material/button'
@ -39,7 +41,7 @@ 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: OutputRefSubscription clickSubscription: Subscription
lineDrawn: boolean lineDrawn: boolean
constructor( constructor(

View file

@ -90,7 +90,7 @@ export class MapDataService {
getBaseStyle(styleName: string): Observable<BaseStyle> { getBaseStyle(styleName: string): Observable<BaseStyle> {
return this.mapService.getBaseStyleApiMapBaseStyleNameGet({name: styleName}).pipe(map( return this.mapService.getBaseStyleApiMapBaseStyleNameGet({name: styleName}).pipe(map(
(data: OApiBaseStyle) => new BaseStyle(data.name, <any>data.style) data => new BaseStyle(data.name, <any>data.style)
)) ))
} }

View file

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

View file

@ -259,26 +259,12 @@ export const $BaseStyle = {
title: 'Style' title: 'Style'
}, },
mbtiles: { mbtiles: {
anyOf: [ type: 'string',
{
type: 'string'
},
{
type: 'null'
}
],
title: 'Mbtiles' title: 'Mbtiles'
}, },
static_url: { static_tiles_url: {
anyOf: [ type: 'string',
{ title: 'Static Tiles Url'
type: 'string'
},
{
type: 'null'
}
],
title: 'Static Url'
}, },
enabled: { enabled: {
type: 'boolean', type: 'boolean',
@ -287,7 +273,7 @@ export const $BaseStyle = {
} }
}, },
type: 'object', type: 'object',
required: ['name'], required: ['name', 'style', 'mbtiles', 'static_tiles_url'],
title: 'BaseStyle' title: 'BaseStyle'
} as const; } as const;
@ -325,6 +311,7 @@ export const $BasketDefault = {
title: 'Store' title: 'Store'
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'BasketDefault' title: 'BasketDefault'
} as const; } as const;
@ -527,43 +514,52 @@ export const $BootstrapData = {
version: { version: {
type: 'string', type: 'string',
title: 'Version', title: 'Version',
default: '0.6.0a0' default: '0.1.dev85+g41e92fa.d20240509'
}, },
title: { title: {
type: 'string', type: 'string',
title: 'Title', title: 'Title',
default: 'Gisaf' default: 'Auroville Geomatics Studio (Me)'
}, },
windowTitle: { windowTitle: {
type: 'string', type: 'string',
title: 'Windowtitle', title: 'Windowtitle',
default: 'Gisaf' default: 'AV Geomatics Studio (Me)'
}, },
map: { map: {
'$ref': '#/components/schemas/Map', allOf: [
{
'$ref': '#/components/schemas/Map'
}
],
default: { default: {
tileServer: { attribution: '© Auroville CSR Geomatics',
baseDir: '/home/phil/.local/share/gisaf/mbtiles_files_dir',
spriteBaseDir: '/home/phil/.local/share/gisaf/mbtiles_sprites_dir',
spriteBaseUrl: 'https://gisaf.example.org',
spriteUrl: '/tiles/sprite/sprite',
useRequestUrl: false
},
zoom: 14,
pitch: 45,
lat: 12,
lng: 79.8106,
bearing: 0, bearing: 0,
style: 'OpenFreeMap',
opacity: 1,
attribution: '',
status: ['E', 'F', 'D'],
defaultStatus: ['E'], defaultStatus: ['E'],
tagKeys: ['source'] lat: 12.007,
lng: 79.8098,
opacity: 0.4,
pitch: 0,
status: ['E', 'F', 'D'],
style: 'No base map',
tagKeys: ['source'],
tileServer: {
baseDir: '/home/phil/gisaf_misc/map',
openMapTilesKey: 'cS3lrAfYXoM4MDooT6aS',
spriteBaseDir: '/home/phil/gisaf_misc/map/sprite',
spriteBaseUrl: 'https://gis.auroville.org.in',
spriteUrl: '/tiles/sprite/sprite',
useRequestUrl: true
},
zoom: 14
} }
}, },
geo: { geo: {
'$ref': '#/components/schemas/Geo', allOf: [
{
'$ref': '#/components/schemas/Geo'
}
],
default: { default: {
raw_survey: { raw_survey: {
spatial_sys_ref: { spatial_sys_ref: {
@ -588,13 +584,19 @@ export const $BootstrapData = {
} }
}, },
measures: { measures: {
'$ref': '#/components/schemas/Measures', allOf: [
default: {} {
'$ref': '#/components/schemas/Measures'
}
],
default: {
defaultStore: 'avsm_water.well'
}
}, },
redirect: { redirect: {
type: 'string', type: 'string',
title: 'Redirect', title: 'Redirect',
default: '' default: 'http://gis.auroville.org.in'
}, },
user: { user: {
anyOf: [ anyOf: [
@ -1440,7 +1442,11 @@ export const $FormFieldInput = {
export const $Geo = { export const $Geo = {
properties: { properties: {
raw_survey: { raw_survey: {
'$ref': '#/components/schemas/RawSurvey', allOf: [
{
'$ref': '#/components/schemas/RawSurvey'
}
],
default: { default: {
spatial_sys_ref: { spatial_sys_ref: {
author: 'AVSM', author: 'AVSM',
@ -1479,6 +1485,7 @@ export const $Geo = {
default: 32644 default: 32644
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'Geo' title: 'Geo'
} as const; } as const;
@ -1561,13 +1568,17 @@ export const $LegendItem = {
export const $Map = { export const $Map = {
properties: { properties: {
tileServer: { tileServer: {
'$ref': '#/components/schemas/TileServer', allOf: [
{
'$ref': '#/components/schemas/TileServer'
}
],
default: { default: {
baseDir: '/home/phil/.local/share/gisaf/mbtiles_files_dir', baseDir: '/path/to/mbtiles_files_dir',
useRequestUrl: false, spriteBaseDir: '/path/to/mbtiles_sprites_dir',
spriteBaseDir: '/home/phil/.local/share/gisaf/mbtiles_sprites_dir', spriteBaseUrl: 'https://gisaf.example.org',
spriteUrl: '/tiles/sprite/sprite', spriteUrl: '/tiles/sprite/sprite',
spriteBaseUrl: 'https://gisaf.example.org' useRequestUrl: false
} }
}, },
zoom: { zoom: {
@ -1598,7 +1609,7 @@ export const $Map = {
style: { style: {
type: 'string', type: 'string',
title: 'Style', title: 'Style',
default: 'OpenFreeMap' default: 'OSM (vector)'
}, },
opacity: { opacity: {
type: 'number', type: 'number',
@ -1635,6 +1646,7 @@ export const $Map = {
default: ['source'] default: ['source']
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'Map' title: 'Map'
} as const; } as const;
@ -1778,6 +1790,7 @@ export const $Measures = {
title: 'Defaultstore' title: 'Defaultstore'
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'Measures' title: 'Measures'
} as const; } as const;
@ -2096,7 +2109,11 @@ export const $Project = {
export const $RawSurvey = { export const $RawSurvey = {
properties: { properties: {
spatial_sys_ref: { spatial_sys_ref: {
'$ref': '#/components/schemas/SpatialSysRef', allOf: [
{
'$ref': '#/components/schemas/SpatialSysRef'
}
],
default: { default: {
author: 'AVSM', author: 'AVSM',
ellps: 'WGS84', ellps: 'WGS84',
@ -2117,6 +2134,7 @@ export const $RawSurvey = {
default: 910001 default: 910001
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'RawSurvey' title: 'RawSurvey'
} as const; } as const;
@ -2219,6 +2237,7 @@ export const $SpatialSysRef = {
default: 1328608.994 default: 1328608.994
} }
}, },
additionalProperties: false,
type: 'object', type: 'object',
title: 'SpatialSysRef' title: 'SpatialSysRef'
} as const; } as const;
@ -2367,12 +2386,11 @@ 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'], 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'],
title: 'Store' title: 'Store'
} as const; } as const;
@ -2630,9 +2648,8 @@ export const $TileServer = {
properties: { properties: {
baseDir: { baseDir: {
type: 'string', type: 'string',
format: 'path',
title: 'Basedir', title: 'Basedir',
default: '/home/phil/.local/share/gisaf/mbtiles_files_dir' default: '/path/to/mbtiles_files_dir'
}, },
useRequestUrl: { useRequestUrl: {
type: 'boolean', type: 'boolean',
@ -2641,9 +2658,8 @@ export const $TileServer = {
}, },
spriteBaseDir: { spriteBaseDir: {
type: 'string', type: 'string',
format: 'path',
title: 'Spritebasedir', title: 'Spritebasedir',
default: '/home/phil/.local/share/gisaf/mbtiles_sprites_dir' default: '/path/to/mbtiles_sprites_dir'
}, },
spriteUrl: { spriteUrl: {
type: 'string', type: 'string',
@ -2667,6 +2683,7 @@ 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 | null; mbtiles: string;
static_url?: string | null; static_tiles_url: string;
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,7 +751,9 @@ export type $OpenApiTs = {
}; };
'/api/token': { '/api/token': {
post: { post: {
req: LoginForAccessTokenApiTokenPostData; req: {
formData: Body_login_for_access_token_api_token_post;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -868,7 +870,9 @@ export type $OpenApiTs = {
}; };
'/api/data-provider/{store}': { '/api/data-provider/{store}': {
get: { get: {
req: GetModelListApiDataProviderStoreGetData; req: {
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -887,7 +891,12 @@ export type $OpenApiTs = {
}; };
'/api/{store_name}/values/{value}': { '/api/{store_name}/values/{value}': {
get: { get: {
req: GetModelValuesApiStoreNameValuesValueGetData; req: {
resample?: string | null;
storeName: string;
value: string;
where: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -948,7 +957,10 @@ export type $OpenApiTs = {
}; };
'/api/feature-info/{store}/{id}': { '/api/feature-info/{store}/{id}': {
get: { get: {
req: GetFeatureInfoApiFeatureInfoStoreIdGetData; req: {
id: string;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -967,7 +979,9 @@ export type $OpenApiTs = {
}; };
'/api/model-info/{store}': { '/api/model-info/{store}': {
get: { get: {
req: GetModelInfoApiModelInfoStoreGetData; req: {
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -986,7 +1000,11 @@ export type $OpenApiTs = {
}; };
'/api/plot-params/{store}': { '/api/plot-params/{store}': {
get: { get: {
req: GetPlotParamsApiPlotParamsStoreGetData; req: {
id: string;
store: string;
value: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1019,7 +1037,9 @@ export type $OpenApiTs = {
}; };
'/api/execTagActions': { '/api/execTagActions': {
post: { post: {
req: ExecuteTagActionApiExecTagActionsPostData; req: {
requestBody: Body_execute_tag_action_api_execTagActions_post;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1038,7 +1058,12 @@ export type $OpenApiTs = {
}; };
'/api/gj/{store_name}': { '/api/gj/{store_name}': {
get: { get: {
req: GetGeojsonApiGjStoreNameGetData; req: {
ifNoneMatch?: string | null;
preserveTopology?: boolean | null;
simplify?: number | null;
storeName: unknown;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1071,7 +1096,9 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/{name}': { '/api/admin/basket/{name}': {
get: { get: {
req: GetBasketApiAdminBasketNameGetData; req: {
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1090,7 +1117,14 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/upload/{name}': { '/api/admin/basket/upload/{name}': {
post: { post: {
req: UploadBasketFileApiAdminBasketUploadNamePostData; req: {
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
@ -1109,7 +1143,11 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/download/{name}/{file_id}/{file_name}': { '/api/admin/basket/download/{name}/{file_id}/{file_name}': {
get: { get: {
req: DownloadBasketFileApiAdminBasketDownloadNameFileIdFileNameGetData; req: {
fileId: number;
fileName: string;
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1128,7 +1166,11 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/import/{basket}/{file_id}': { '/api/admin/basket/import/{basket}/{file_id}': {
get: { get: {
req: ImportBasketFileApiAdminBasketImportBasketFileIdGetData; req: {
basket: string;
dryRun?: boolean;
fileId: number;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1147,7 +1189,10 @@ export type $OpenApiTs = {
}; };
'/api/admin/basket/delete/{basket}/{file_id}': { '/api/admin/basket/delete/{basket}/{file_id}': {
get: { get: {
req: DeleteBasketFileApiAdminBasketDeleteBasketFileIdGetData; req: {
basket: string;
fileId: number;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1194,7 +1239,10 @@ export type $OpenApiTs = {
}; };
'/api/dashboard/page/{group}/{name}': { '/api/dashboard/page/{group}/{name}': {
get: { get: {
req: GetDashboardPageApiDashboardPageGroupNameGetData; req: {
group: string;
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1223,7 +1271,9 @@ export type $OpenApiTs = {
}; };
'/api/map/base_style/{name}': { '/api/map/base_style/{name}': {
get: { get: {
req: GetBaseStyleApiMapBaseStyleNameGetData; req: {
name: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1238,7 +1288,9 @@ export type $OpenApiTs = {
}; };
'/api/map/layer_style/{store}': { '/api/map/layer_style/{store}': {
get: { get: {
req: GetLayerStyleApiMapLayerStyleStoreGetData; req: {
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1253,7 +1305,12 @@ export type $OpenApiTs = {
}; };
'/api/download/csv/{store}/{model_id}/{value}/{resample}': { '/api/download/csv/{store}/{model_id}/{value}/{resample}': {
get: { get: {
req: DownloadCsvApiDownloadCsvStoreModelIdValueResampleGetData; req: {
modelId: number;
resample: string;
store: string;
value: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1272,7 +1329,11 @@ export type $OpenApiTs = {
}; };
'/api/download/geodata/{stores}': { '/api/download/geodata/{stores}': {
get: { get: {
req: DownloadGeodataApiDownloadGeodataStoresGetData; req: {
format?: string;
reproject?: boolean;
stores: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response
@ -1291,7 +1352,11 @@ export type $OpenApiTs = {
}; };
'/api/download/plugin/{name}/{store}/{id}': { '/api/download/plugin/{name}/{store}/{id}': {
get: { get: {
req: ExecuteActionApiDownloadPluginNameStoreIdGetData; req: {
id: number;
name: string;
store: string;
};
res: { res: {
/** /**
* Successful Response * Successful Response

0
src/assets/.gitkeep Normal file
View file

View file

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