Compare commits
20 commits
0.5.0-alph
...
main
Author | SHA1 | Date | |
---|---|---|---|
4c19a4c0a0 | |||
5535df0334 | |||
bbffcd5aed | |||
4c4dc3fc5c | |||
5ff197ad49 | |||
c890800454 | |||
ea82f02f51 | |||
230dddbfd6 | |||
5479be90b8 | |||
7c9a057d32 | |||
8edcf1c9f4 | |||
f7629e36e0 | |||
1f16faf060 | |||
5e8a6ab7db | |||
c7a0ae934a | |||
f737fd2ce9 | |||
0acf593279 | |||
2663ad478b | |||
a3340c406c | |||
a8de19625e |
31 changed files with 4240 additions and 4437 deletions
|
@ -1,107 +0,0 @@
|
||||||
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 }}
|
|
50
.woodpecker/build.yaml
Normal file
50
.woodpecker/build.yaml
Normal file
|
@ -0,0 +1,50 @@
|
||||||
|
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
|
7
Containerfile
Normal file
7
Containerfile
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# 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
|
34
README.md
34
README.md
|
@ -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).
|
|
||||||
|
|
78
angular.json
78
angular.json
|
@ -1,34 +1,49 @@
|
||||||
{
|
{
|
||||||
|
"$schema": "./node_modules/@angular/cli/lib/config/schema.json",
|
||||||
"version": 1,
|
"version": 1,
|
||||||
"newProjectRoot": "projects",
|
"newProjectRoot": "projects",
|
||||||
"projects": {
|
"projects": {
|
||||||
"gisaf-app": {
|
"gisaf": {
|
||||||
"root": "",
|
|
||||||
"projectType": "application",
|
"projectType": "application",
|
||||||
|
"schematics": {
|
||||||
|
"@schematics/angular:component": {
|
||||||
|
"style": "scss"
|
||||||
|
},
|
||||||
|
"@schematics/angular:application": {
|
||||||
|
"strict": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "",
|
||||||
|
"sourceRoot": "src",
|
||||||
|
"prefix": "app",
|
||||||
"architect": {
|
"architect": {
|
||||||
"build": {
|
"build": {
|
||||||
"builder": "@angular-devkit/build-angular:browser",
|
"builder": "@angular-devkit/build-angular:application",
|
||||||
"options": {
|
"options": {
|
||||||
"outputPath": "dist",
|
"outputPath": {
|
||||||
|
"base": "dist/gisaf"
|
||||||
|
},
|
||||||
"index": "src/index.html",
|
"index": "src/index.html",
|
||||||
"main": "src/main.ts",
|
"polyfills": [
|
||||||
"tsConfig": "src/tsconfig.app.json",
|
"src/polyfills.ts"
|
||||||
"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/undefined",
|
"input": "src/data/",
|
||||||
"output": "/"
|
"output": "/data/"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
|
@ -62,9 +77,8 @@
|
||||||
"maplibre-gl",
|
"maplibre-gl",
|
||||||
"@mapbox/point-geometry"
|
"@mapbox/point-geometry"
|
||||||
],
|
],
|
||||||
"vendorChunk": true,
|
"browser": "src/main.ts",
|
||||||
"extractLicenses": false,
|
"extractLicenses": false,
|
||||||
"buildOptimizer": false,
|
|
||||||
"sourceMap": true,
|
"sourceMap": true,
|
||||||
"optimization": false,
|
"optimization": false,
|
||||||
"namedChunks": true
|
"namedChunks": true
|
||||||
|
@ -78,20 +92,25 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"optimization": true,
|
"optimization": true,
|
||||||
"outputHashing": "all",
|
|
||||||
"sourceMap": false,
|
"sourceMap": false,
|
||||||
"namedChunks": false,
|
"namedChunks": false,
|
||||||
"extractLicenses": true,
|
"extractLicenses": true,
|
||||||
"vendorChunk": false,
|
|
||||||
"buildOptimizer": true,
|
|
||||||
"fileReplacements": [
|
"fileReplacements": [
|
||||||
{
|
{
|
||||||
"src": "src/environments/environment.ts",
|
"replace": "src/environments/environment.ts",
|
||||||
"replaceWith": "src/environments/environment.prod.ts"
|
"with": "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",
|
||||||
|
@ -101,23 +120,27 @@
|
||||||
},
|
},
|
||||||
"configurations": {
|
"configurations": {
|
||||||
"production": {
|
"production": {
|
||||||
"buildTarget": "gisaf-app:build:production"
|
"buildTarget": "gisaf: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-app:build"
|
"buildTarget": "gisaf: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": "src/tsconfig.spec.json",
|
"tsConfig": "tsconfig.spec.json",
|
||||||
|
"karmaConfig": "karma.conf.js",
|
||||||
"scripts": [],
|
"scripts": [],
|
||||||
"styles": [
|
"styles": [
|
||||||
{
|
{
|
||||||
|
@ -180,6 +203,7 @@
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"cli": {
|
"cli": {
|
||||||
"analytics": false
|
"analytics": false,
|
||||||
|
"packageManager": "pnpm"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
158
nginx.conf
Normal file
158
nginx.conf
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
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/;
|
||||||
|
# }
|
||||||
|
}
|
||||||
|
}
|
58
package.json
58
package.json
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "gisaf-frontend",
|
"name": "gisaf-frontend",
|
||||||
"displayName": "Gisaf web front-end",
|
"displayName": "Gisaf web front-end",
|
||||||
"version": "0.0.0",
|
"version": "0.5.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 --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"
|
||||||
},
|
},
|
||||||
"licenses": [
|
"licenses": [
|
||||||
|
@ -26,56 +26,54 @@
|
||||||
"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": "^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
4852
pnpm-lock.yaml
generated
File diff suppressed because it is too large
Load diff
|
@ -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
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
|
@ -6,29 +6,28 @@ import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'
|
||||||
import { Role } from './models'
|
import { Role } from './models'
|
||||||
|
|
||||||
export interface DialogData {
|
export interface DialogData {
|
||||||
role: Role
|
role: Role
|
||||||
}
|
}
|
||||||
|
|
||||||
@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({})
|
||||||
constructor(
|
constructor(
|
||||||
public dialogRef: MatDialogRef<GisafAdminAccessRoleDialogComponent>,
|
public dialogRef: MatDialogRef<GisafAdminAccessRoleDialogComponent>,
|
||||||
@Inject(MAT_DIALOG_DATA) public data: DialogData
|
@Inject(MAT_DIALOG_DATA) public data: DialogData
|
||||||
) {}
|
) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
let role: Role = this.data['role'] || new Role(undefined, '', '')
|
let role: Role = this.data['role'] || new Role(undefined, '', '')
|
||||||
this.formGroup.addControl('id', new UntypedFormControl(role.id))
|
this.formGroup.addControl('id', new UntypedFormControl(role.id))
|
||||||
this.formGroup.addControl('name', new UntypedFormControl(role.name, [Validators.required]))
|
this.formGroup.addControl('name', new UntypedFormControl(role.name, [Validators.required]))
|
||||||
this.formGroup.addControl('description', new UntypedFormControl(role.description, [Validators.required]))
|
this.formGroup.addControl('description', new UntypedFormControl(role.description, [Validators.required]))
|
||||||
}
|
}
|
||||||
|
|
||||||
save() {
|
save() {
|
||||||
this.dialogRef.close(this.formGroup.value);
|
this.dialogRef.close(this.formGroup.value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,28 +5,27 @@ import { MatSnackBar } from '@angular/material/snack-bar'
|
||||||
import { AdminManageDataService } from '../data.service'
|
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 {
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private adminManageDataService: AdminManageDataService,
|
private adminManageDataService: AdminManageDataService,
|
||||||
private snackBar: MatSnackBar,
|
private snackBar: MatSnackBar,
|
||||||
private cdr: ChangeDetectorRef,
|
private cdr: ChangeDetectorRef,
|
||||||
) { }
|
) { }
|
||||||
|
|
||||||
ngOnInit(): void {
|
ngOnInit(): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
vacuumDb() {
|
vacuumDb() {
|
||||||
this.adminManageDataService.vacuumDb().subscribe(
|
this.adminManageDataService.vacuumDb().subscribe(
|
||||||
resp => this.snackBar.open(
|
resp => this.snackBar.open(
|
||||||
'Database vacuum OK',
|
'Database vacuum OK',
|
||||||
'Close',
|
'Close',
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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 packageJson from '../../package.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 = packageJson["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 => {}
|
||||||
// )
|
// )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {}
|
|
@ -2,8 +2,7 @@ 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 { }
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import { Component, Input,
|
import {
|
||||||
ChangeDetectionStrategy, ChangeDetectorRef } from '@angular/core'
|
Component, Input,
|
||||||
|
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'
|
||||||
|
@ -10,64 +12,63 @@ import { AuthenticationService } from '../../_services/authentication.service'
|
||||||
import { MapControlService } from '../../map/map-control.service'
|
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 {
|
||||||
@Input() source: FullInfo
|
@Input() source: FullInfo
|
||||||
@Input() action: Action
|
@Input() action: Action
|
||||||
constructor(
|
constructor(
|
||||||
private actionsService: ActionsService,
|
private actionsService: ActionsService,
|
||||||
private infoDataService: InfoDataService,
|
private infoDataService: InfoDataService,
|
||||||
private snackBar: MatSnackBar,
|
private snackBar: MatSnackBar,
|
||||||
public authenticationService: AuthenticationService,
|
public authenticationService: AuthenticationService,
|
||||||
protected mapControlService: MapControlService,
|
protected mapControlService: MapControlService,
|
||||||
private cdr: ChangeDetectorRef,
|
private cdr: ChangeDetectorRef,
|
||||||
) {}
|
) { }
|
||||||
|
|
||||||
execute() {
|
execute() {
|
||||||
this.actionsService.execute(
|
this.actionsService.execute(
|
||||||
[this.source.modelInfo.store],
|
[this.source.modelInfo.store],
|
||||||
[[this.source.featureInfo.id.toString()]],
|
[[this.source.featureInfo.id.toString()]],
|
||||||
[this.action.name],
|
[this.action.name],
|
||||||
this.action.params,
|
this.action.params,
|
||||||
).subscribe(
|
).subscribe(
|
||||||
results => {
|
results => {
|
||||||
// Update the tags in the info source
|
// Update the tags in the info source
|
||||||
let result = results[0].actionResults[0]
|
let result = results[0].actionResults[0]
|
||||||
if (result.message) {
|
if (result.message) {
|
||||||
this.snackBar.open(result.message, 'Close', {duration: 3000})
|
this.snackBar.open(result.message, 'Close', { duration: 3000 })
|
||||||
}
|
}
|
||||||
if (!result.actionResults || result.actionResults.length == 0) {
|
if (!result.actionResults || result.actionResults.length == 0) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let layer = result.actionResults[0].taggedLayers.find(
|
let layer = result.actionResults[0].taggedLayers.find(
|
||||||
tl => tl.store == this.source.modelInfo.store
|
tl => tl.store == this.source.modelInfo.store
|
||||||
)
|
|
||||||
let feature = layer.features.find(f=>f.id == this.source.featureInfo.id)
|
|
||||||
if (feature) {
|
|
||||||
feature.tags.forEach(
|
|
||||||
tag => {
|
|
||||||
let existingTag = this.source.featureInfo.tags.find(t => t.key == tag.key)
|
|
||||||
if (existingTag) {
|
|
||||||
console.log("Tag update: test me!")
|
|
||||||
existingTag.value = tag.value
|
|
||||||
this.infoDataService.dataProviderService.next(this.source)
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this.source.featureInfo.tags.push({key: tag.key, value: tag.value})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
this.infoDataService.dataProviderService.next(this.source)
|
|
||||||
}
|
|
||||||
// Trick to refresh the tags on the map
|
|
||||||
if (this.mapControlService.hasTags.value) {
|
|
||||||
this.mapControlService.hasTags.next(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
let feature = layer.features.find(f => f.id == this.source.featureInfo.id)
|
||||||
}
|
if (feature) {
|
||||||
|
feature.tags.forEach(
|
||||||
|
tag => {
|
||||||
|
let existingTag = this.source.featureInfo.tags.find(t => t.key == tag.key)
|
||||||
|
if (existingTag) {
|
||||||
|
console.log("Tag update: test me!")
|
||||||
|
existingTag.value = tag.value
|
||||||
|
this.infoDataService.dataProviderService.next(this.source)
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.source.featureInfo.tags.push({ key: tag.key, value: tag.value })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
this.infoDataService.dataProviderService.next(this.source)
|
||||||
|
}
|
||||||
|
// Trick to refresh the tags on the map
|
||||||
|
if (this.mapControlService.hasTags.value) {
|
||||||
|
this.mapControlService.hasTags.next(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -6,25 +6,24 @@ import { FullInfo } from '../info-data.service'
|
||||||
import { Downloader } from '../../openapi'
|
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
|
||||||
@Input() downloader: Downloader
|
@Input() downloader: Downloader
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private snackBar: MatSnackBar,
|
private snackBar: MatSnackBar,
|
||||||
) {}
|
) { }
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
execute() {
|
execute() {
|
||||||
window.open('/api/download/plugin/'
|
window.open('/api/download/plugin/'
|
||||||
+ '/' + this.downloader.name
|
+ '/' + this.downloader.name
|
||||||
+ '/' + this.source.modelInfo.store
|
+ '/' + this.source.modelInfo.store
|
||||||
+ '/' + this.source.featureInfo.id)
|
+ '/' + this.source.featureInfo.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
@ -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, {
|
||||||
|
|
|
@ -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']
|
||||||
|
// )
|
||||||
|
// )
|
||||||
|
// ))
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue